36 if (LpcMessage->u2.s2.Type)
66 if (((
ULONG)LpcMessage->u1.s1.TotalLength >
Port->MaxMessageLength) ||
67 ((
ULONG)LpcMessage->u1.s1.TotalLength <= (
ULONG)LpcMessage->u1.s1.DataLength))
95 QueuePort =
Port->ConnectedPort;
102 Message->PortContext = QueuePort->PortContext;
103 ConnectionPort = QueuePort =
Port->ConnectionPort;
114 ConnectionPort = QueuePort =
Port->ConnectionPort;
130 QueuePort = PortObject;
139 Message->Request.CallbackId = 0;
142 Thread->LpcReplyMessageId = 0;
195 "Port: %p. Messages: %p/%p. Type: %lx\n",
232 LpcRequest->u2.s2.Type = MessageType;
235 if (((
ULONG)LpcRequest->u1.s1.TotalLength >
Port->MaxMessageLength) ||
236 ((
ULONG)LpcRequest->u1.s1.TotalLength <= (
ULONG)LpcRequest->u1.s1.DataLength))
277 QueuePort =
Port->ConnectedPort;
286 ReplyPort = QueuePort;
293 ConnectionPort = QueuePort =
Port->ConnectionPort;
305 ConnectionPort = QueuePort =
Port->ConnectionPort;
320 QueuePort = ReplyPort =
Port;
330 Message->Request.CallbackId = 0;
367 Thread->LpcReplyMessageId = 0;
387 "Reply Messages: %p/%p\n",
426 "Port: %p. Status: %d\n",
453 "Handle: %p. Message: %p. Type: %lx\n",
465 CapturedLpcRequest = *(
volatile PORT_MESSAGE*)LpcRequest;
476 CapturedLpcRequest = *LpcRequest;
480 MessageType = CapturedLpcRequest.u2.s2.Type |
LPC_DATAGRAM;
487 (
ULONG)CapturedLpcRequest.u1.s1.TotalLength)
503 if (((
ULONG)CapturedLpcRequest.u1.s1.TotalLength >
Port->MaxMessageLength) ||
504 ((
ULONG)CapturedLpcRequest.u1.s1.TotalLength <= (
ULONG)CapturedLpcRequest.u1.s1.DataLength))
549 QueuePort =
Port->ConnectedPort;
563 ConnectionPort = QueuePort =
Port->ConnectionPort;
575 ConnectionPort = QueuePort =
Port->ConnectionPort;
603 Message->Request.CallbackId = 0;
606 Thread->LpcReplyMessageId = 0;
637 "Port: %p. Status: %d\n",
659 if (
Message->u2.s2.DataInfoOffset == 0)
661 *NumberOfDataEntries = 0;
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)
NTSTATUS NTAPI NtRequestWaitReplyPort(IN HANDLE PortHandle, IN PPORT_MESSAGE LpcRequest, IN OUT PPORT_MESSAGE LpcReply)
#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 LPC_KERNELMODE_MESSAGE
#define InsertTailList(ListHead, Entry)
struct _LPCP_PORT_OBJECT * PLPCP_PORT_OBJECT
#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)
NTSTATUS NTAPI LpcRequestWaitReplyPort(IN PVOID PortObject, IN PPORT_MESSAGE LpcRequest, OUT PPORT_MESSAGE LpcReply)
BOOLEAN FASTCALL ObReferenceObjectSafe(IN PVOID Object)
FORCEINLINE BOOLEAN RemoveEntryList(_In_ PLIST_ENTRY Entry)
return STATUS_NOT_IMPLEMENTED
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)
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
#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)
NTSTATUS NTAPI LpcRequestPort(IN PVOID PortObject, IN PPORT_MESSAGE LpcMessage)
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)
struct _LPCP_DATA_INFO::@1748 Entries[1]
#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(...)
NTSTATUS NTAPI NtRequestPort(IN HANDLE PortHandle, IN PPORT_MESSAGE LpcRequest)
#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,...)