701 ULONG NumberOfDataEntries;
713 "Handle: %p. Messages: %p/%p. Type: %lx\n",
729 CapturedLpcRequest = *(
volatile PORT_MESSAGE*)LpcRequest;
738 DPRINT1(
"LpcpVerifyMessageDataInfo failed\n");
751 CapturedLpcRequest = *LpcRequest;
755 DPRINT1(
"LpcpVerifyMessageDataInfo failed\n");
761 CapturedLpcRequest.u2.s2.Type &= ~0x4000;
772 DPRINT1(
"Not a kernel-mode message!\n");
783 MessageType = CapturedLpcRequest.u2.s2.Type;
786 ASSERT(CapturedLpcRequest.u1.s1.TotalLength >= 0);
790 (
ULONG)CapturedLpcRequest.u1.s1.TotalLength))
793 DPRINT1(
"Invalid message length: %u, %u\n",
794 CapturedLpcRequest.u1.s1.DataLength,
795 CapturedLpcRequest.u1.s1.TotalLength);
809 if (((
ULONG)CapturedLpcRequest.u1.s1.TotalLength >
Port->MaxMessageLength) ||
810 ((
ULONG)CapturedLpcRequest.u1.s1.TotalLength <= (
ULONG)CapturedLpcRequest.u1.s1.DataLength))
813 DPRINT1(
"Invalid message length: %u, %u\n",
814 CapturedLpcRequest.u1.s1.DataLength,
815 CapturedLpcRequest.u1.s1.TotalLength);
825 DPRINT1(
"Failed to allocate a message!\n");
843 if (LpcRequest->u2.s2.DataInfoOffset != 0)
852 DPRINT1(
"NumberOfEntries has changed: %u, %u\n",
885 QueuePort =
Port->ConnectedPort;
889 DPRINT1(
"No connected port\n");
896 ReplyPort = QueuePort;
908 ConnectionPort = QueuePort =
Port->ConnectionPort;
912 DPRINT1(
"No connection port\n");
925 QueuePort = ReplyPort =
Port;
935 Message->Request.CallbackId = 0;
972 Thread->LpcReplyMessageId = 0;
992 "Reply Messages: %p/%p\n",
1014 (
Message->Request.u2.s2.DataInfoOffset))
1039 "Port: %p. Status: %d\n",
#define LpcpGetMessageType(x)
FORCEINLINE PLPCP_DATA_INFO LpcpGetDataInfoFromMessage(PPORT_MESSAGE Message)
FORCEINLINE VOID LpcpSetPortToThread(IN PETHREAD Thread, IN PLPCP_PORT_OBJECT Port)
#define PsGetCurrentThread()
VOID FASTCALL KeAcquireGuardedMutex(IN PKGUARDED_MUTEX GuardedMutex)
#define STATUS_INVALID_PARAMETER
#define LpcpCompleteWait(s)
VOID NTAPI LpcpMoveMessage(IN PPORT_MESSAGE Destination, IN PPORT_MESSAGE Origin, IN PVOID Data, IN ULONG MessageType, IN PCLIENT_ID ClientId)
#define STATUS_THREAD_IS_TERMINATING
#define KeGetPreviousMode()
#define LPCP_LOCK_RELEASE
#define InsertTailList(ListHead, Entry)
#define LPCP_PORT_TYPE_MASK
LONG NTAPI KeSetEvent(IN PKEVENT Event, IN KPRIORITY Increment, IN BOOLEAN Wait)
_Must_inspect_result_ FORCEINLINE BOOLEAN IsListEmpty(_In_ const LIST_ENTRY *ListHead)
VOID NTAPI ProbeForWrite(IN PVOID Address, IN SIZE_T Length, IN ULONG Alignment)
FORCEINLINE BOOLEAN RemoveEntryList(_In_ PLIST_ENTRY Entry)
NTSTATUS NTAPI ObReferenceObjectByHandle(IN HANDLE Handle, IN ACCESS_MASK DesiredAccess, IN POBJECT_TYPE ObjectType, IN KPROCESSOR_MODE AccessMode, OUT PVOID *Object, OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL)
#define LPCP_CONNECTION_PORT
FORCEINLINE PLPCP_MESSAGE LpcpGetMessageFromThread(IN PETHREAD Thread)
NTSTATUS NTAPI LpcpVerifyMessageDataInfo(_In_ PPORT_MESSAGE Message, _Out_ PULONG NumberOfDataEntries)
static __inline PLPCP_MESSAGE LpcpAllocateFromPortZone(VOID)
POBJECT_TYPE LpcPortObjectType
_In_ KPROCESSOR_MODE PreviousMode
#define LpcpReplyWait(s, w)
#define NT_SUCCESS(StatCode)
#define EXCEPTION_EXECUTE_HANDLER
#define ObDereferenceObject
_In_opt_ PFILE_OBJECT _In_opt_ PETHREAD Thread
VOID NTAPI ProbeForRead(IN CONST VOID *Address, IN SIZE_T Length, IN ULONG Alignment)
#define KeEnterCriticalRegion()
#define LPCP_WAITABLE_PORT
_In_ WDFINTERRUPT _In_ PFN_WDF_INTERRUPT_SYNCHRONIZE Callback
VOID NTAPI LpcpFreeToPortZone(IN PLPCP_MESSAGE Message, IN ULONG LockFlags)
#define KeLeaveCriticalRegion()
ULONG LpcExitThreadCalled
#define InitializeListHead(ListHead)
#define STATUS_LPC_REPLY_LOST
#define STATUS_PORT_MESSAGE_TOO_LONG
VOID FASTCALL KeReleaseGuardedMutex(IN OUT PKGUARDED_MUTEX GuardedMutex)
#define ObReferenceObject
#define LPCP_COMMUNICATION_PORT
#define STATUS_PORT_DISCONNECTED
#define _SEH2_EXCEPT(...)
#define _SEH2_GetExceptionCode()
#define _SEH2_YIELD(__stmt)
LIST_ENTRY LpcReplyChainHead
VOID NTAPI LpcpSaveDataInfoMessage(IN PLPCP_PORT_OBJECT Port, IN PLPCP_MESSAGE Message, IN ULONG LockFlags)
#define LPCTRACE(x, fmt,...)