| use core::mem::size_of; |
| use crate::ntapi_base::{CLIENT_ID, CLIENT_ID64}; |
| use winapi::ctypes::c_double; |
| use winapi::shared::basetsd::{PSIZE_T, SIZE_T, ULONG64, ULONG_PTR}; |
| use winapi::shared::ntdef::{ |
| BOOLEAN, CSHORT, HANDLE, LARGE_INTEGER, NTSTATUS, OBJ_CASE_INSENSITIVE, PHANDLE, |
| PLARGE_INTEGER, POBJECT_ATTRIBUTES, PULONG, PUNICODE_STRING, PVOID, ULONG, ULONGLONG, |
| UNICODE_STRING, |
| }; |
| use winapi::um::winnt::{ |
| ACCESS_MASK, PSECURITY_DESCRIPTOR, PSECURITY_QUALITY_OF_SERVICE, PSID, RTL_SRWLOCK, |
| SECURITY_QUALITY_OF_SERVICE, STANDARD_RIGHTS_REQUIRED, SYNCHRONIZE, |
| }; |
| pub const PORT_CONNECT: u32 = 0x0001; |
| pub const PORT_ALL_ACCESS: u32 = STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x1; |
| STRUCT!{struct PORT_MESSAGE_u1_s { |
| DataLength: CSHORT, |
| TotalLength: CSHORT, |
| }} |
| STRUCT!{struct PORT_MESSAGE_u2_s { |
| Type: CSHORT, |
| DataInfoOffset: CSHORT, |
| }} |
| UNION!{union PORT_MESSAGE_u1 { |
| s: PORT_MESSAGE_u1_s, |
| Length: ULONG, |
| }} |
| UNION!{union PORT_MESSAGE_u2 { |
| s: PORT_MESSAGE_u2_s, |
| ZeroInit: ULONG, |
| }} |
| UNION!{union PORT_MESSAGE_u3 { |
| ClientId: CLIENT_ID, |
| DoNotUseThisField: c_double, |
| }} |
| UNION!{union PORT_MESSAGE_u4 { |
| ClientViewSize: SIZE_T, |
| CallbackId: ULONG, |
| }} |
| STRUCT!{struct PORT_MESSAGE { |
| u1: PORT_MESSAGE_u1, |
| u2: PORT_MESSAGE_u2, |
| u3: PORT_MESSAGE_u3, |
| MessageId: ULONG, |
| u4: PORT_MESSAGE_u4, |
| }} |
| pub type PPORT_MESSAGE = *mut PORT_MESSAGE; |
| STRUCT!{struct PORT_DATA_ENTRY { |
| Base: PVOID, |
| Size: ULONG, |
| }} |
| pub type PPORT_DATA_ENTRY = *mut PORT_DATA_ENTRY; |
| STRUCT!{struct PORT_DATA_INFORMATION { |
| CountDataEntries: ULONG, |
| DataEntries: [PORT_DATA_ENTRY; 1], |
| }} |
| pub type PPORT_DATA_INFORMATION = *mut PORT_DATA_INFORMATION; |
| pub const LPC_REQUEST: ULONG = 1; |
| pub const LPC_REPLY: ULONG = 2; |
| pub const LPC_DATAGRAM: ULONG = 3; |
| pub const LPC_LOST_REPLY: ULONG = 4; |
| pub const LPC_PORT_CLOSED: ULONG = 5; |
| pub const LPC_CLIENT_DIED: ULONG = 6; |
| pub const LPC_EXCEPTION: ULONG = 7; |
| pub const LPC_DEBUG_EVENT: ULONG = 8; |
| pub const LPC_ERROR_EVENT: ULONG = 9; |
| pub const LPC_CONNECTION_REQUEST: ULONG = 10; |
| pub const LPC_KERNELMODE_MESSAGE: CSHORT = 0x8000; |
| pub const LPC_NO_IMPERSONATE: CSHORT = 0x4000; |
| pub const PORT_VALID_OBJECT_ATTRIBUTES: u32 = OBJ_CASE_INSENSITIVE; |
| #[cfg(any(target_arch = "x86_64", target_arch = "aarch64"))] |
| pub const PORT_MAXIMUM_MESSAGE_LENGTH: u32 = 512; |
| #[cfg(target_arch = "x86")] |
| pub const PORT_MAXIMUM_MESSAGE_LENGTH: u32 = 256; |
| pub const LPC_MAX_CONNECTION_INFO_SIZE: u32 = 16 * size_of::<ULONG_PTR>() as u32; |
| pub const PORT_TOTAL_MAXIMUM_MESSAGE_LENGTH: u32 = (PORT_MAXIMUM_MESSAGE_LENGTH |
| + size_of::<PORT_MESSAGE>() as u32 |
| + LPC_MAX_CONNECTION_INFO_SIZE |
| + 0xf) & !0xf; |
| STRUCT!{struct LPC_CLIENT_DIED_MSG { |
| PortMsg: PORT_MESSAGE, |
| CreateTime: LARGE_INTEGER, |
| }} |
| pub type PLPC_CLIENT_DIED_MSG = *mut LPC_CLIENT_DIED_MSG; |
| STRUCT!{struct PORT_VIEW { |
| Length: ULONG, |
| SectionHandle: HANDLE, |
| SectionOffset: ULONG, |
| ViewSize: SIZE_T, |
| ViewBase: PVOID, |
| ViewRemoteBase: PVOID, |
| }} |
| pub type PPORT_VIEW = *mut PORT_VIEW; |
| STRUCT!{struct REMOTE_PORT_VIEW { |
| Length: ULONG, |
| ViewSize: SIZE_T, |
| ViewBase: PVOID, |
| }} |
| pub type PREMOTE_PORT_VIEW = *mut REMOTE_PORT_VIEW; |
| STRUCT!{struct PORT_MESSAGE64_u1_s { |
| DataLength: CSHORT, |
| TotalLength: CSHORT, |
| }} |
| STRUCT!{struct PORT_MESSAGE64_u2_s { |
| Type: CSHORT, |
| DataInfoOffset: CSHORT, |
| }} |
| UNION!{union PORT_MESSAGE64_u1 { |
| s: PORT_MESSAGE64_u1_s, |
| Length: ULONG, |
| }} |
| UNION!{union PORT_MESSAGE64_u2 { |
| s: PORT_MESSAGE64_u2_s, |
| ZeroInit: ULONG, |
| }} |
| UNION!{union PORT_MESSAGE64_u3 { |
| ClientId: CLIENT_ID64, |
| DoNotUseThisField: c_double, |
| }} |
| UNION!{union PORT_MESSAGE64_u4 { |
| ClientViewSize: ULONGLONG, |
| CallbackId: ULONG, |
| }} |
| STRUCT!{struct PORT_MESSAGE64 { |
| u1: PORT_MESSAGE64_u1, |
| u2: PORT_MESSAGE64_u2, |
| u3: PORT_MESSAGE64_u3, |
| MessageId: ULONG, |
| u4: PORT_MESSAGE64_u4, |
| }} |
| pub type PPORT_MESSAGE64 = *mut PORT_MESSAGE64; |
| STRUCT!{struct LPC_CLIENT_DIED_MSG64 { |
| PortMsg: PORT_MESSAGE64, |
| CreateTime: LARGE_INTEGER, |
| }} |
| pub type PLPC_CLIENT_DIED_MSG64 = *mut LPC_CLIENT_DIED_MSG64; |
| STRUCT!{struct PORT_VIEW64 { |
| Length: ULONG, |
| SectionHandle: ULONGLONG, |
| SectionOffset: ULONG, |
| ViewSize: ULONGLONG, |
| ViewBase: ULONGLONG, |
| ViewRemoteBase: ULONGLONG, |
| }} |
| pub type PPORT_VIEW64 = *mut PORT_VIEW64; |
| STRUCT!{struct REMOTE_PORT_VIEW64 { |
| Length: ULONG, |
| ViewSize: ULONGLONG, |
| ViewBase: ULONGLONG, |
| }} |
| pub type PREMOTE_PORT_VIEW64 = *mut REMOTE_PORT_VIEW64; |
| EXTERN!{extern "system" { |
| fn NtCreatePort( |
| PortHandle: PHANDLE, |
| ObjectAttributes: POBJECT_ATTRIBUTES, |
| MaxConnectionInfoLength: ULONG, |
| MaxMessageLength: ULONG, |
| MaxPoolUsage: ULONG, |
| ) -> NTSTATUS; |
| fn NtCreateWaitablePort( |
| PortHandle: PHANDLE, |
| ObjectAttributes: POBJECT_ATTRIBUTES, |
| MaxConnectionInfoLength: ULONG, |
| MaxMessageLength: ULONG, |
| MaxPoolUsage: ULONG, |
| ) -> NTSTATUS; |
| fn NtConnectPort( |
| PortHandle: PHANDLE, |
| PortName: PUNICODE_STRING, |
| SecurityQos: PSECURITY_QUALITY_OF_SERVICE, |
| ClientView: PPORT_VIEW, |
| ServerView: PREMOTE_PORT_VIEW, |
| MaxMessageLength: PULONG, |
| ConnectionInformation: PVOID, |
| ConnectionInformationLength: PULONG, |
| ) -> NTSTATUS; |
| fn NtSecureConnectPort( |
| PortHandle: PHANDLE, |
| PortName: PUNICODE_STRING, |
| SecurityQos: PSECURITY_QUALITY_OF_SERVICE, |
| ClientView: PPORT_VIEW, |
| RequiredServerSid: PSID, |
| ServerView: PREMOTE_PORT_VIEW, |
| MaxMessageLength: PULONG, |
| ConnectionInformation: PVOID, |
| ConnectionInformationLength: PULONG, |
| ) -> NTSTATUS; |
| fn NtListenPort( |
| PortHandle: HANDLE, |
| ConnectionRequest: PPORT_MESSAGE, |
| ) -> NTSTATUS; |
| fn NtAcceptConnectPort( |
| PortHandle: PHANDLE, |
| PortContext: PVOID, |
| ConnectionRequest: PPORT_MESSAGE, |
| AcceptConnection: BOOLEAN, |
| ServerView: PPORT_VIEW, |
| ClientView: PREMOTE_PORT_VIEW, |
| ) -> NTSTATUS; |
| fn NtCompleteConnectPort( |
| PortHandle: HANDLE, |
| ) -> NTSTATUS; |
| fn NtRequestPort( |
| PortHandle: HANDLE, |
| RequestMessage: PPORT_MESSAGE, |
| ) -> NTSTATUS; |
| fn NtRequestWaitReplyPort( |
| PortHandle: HANDLE, |
| RequestMessage: PPORT_MESSAGE, |
| ReplyMessage: PPORT_MESSAGE, |
| ) -> NTSTATUS; |
| fn NtReplyPort( |
| PortHandle: HANDLE, |
| ReplyMessage: PPORT_MESSAGE, |
| ) -> NTSTATUS; |
| fn NtReplyWaitReplyPort( |
| PortHandle: HANDLE, |
| ReplyMessage: PPORT_MESSAGE, |
| ) -> NTSTATUS; |
| fn NtReplyWaitReceivePort( |
| PortHandle: HANDLE, |
| PortContext: *mut PVOID, |
| ReplyMessage: PPORT_MESSAGE, |
| ReceiveMessage: PPORT_MESSAGE, |
| ) -> NTSTATUS; |
| fn NtReplyWaitReceivePortEx( |
| PortHandle: HANDLE, |
| PortContext: *mut PVOID, |
| ReplyMessage: PPORT_MESSAGE, |
| ReceiveMessage: PPORT_MESSAGE, |
| Timeout: PLARGE_INTEGER, |
| ) -> NTSTATUS; |
| fn NtImpersonateClientOfPort( |
| PortHandle: HANDLE, |
| Message: PPORT_MESSAGE, |
| ) -> NTSTATUS; |
| fn NtReadRequestData( |
| PortHandle: HANDLE, |
| Message: PPORT_MESSAGE, |
| DataEntryIndex: ULONG, |
| Buffer: PVOID, |
| BufferSize: SIZE_T, |
| NumberOfBytesRead: PSIZE_T, |
| ) -> NTSTATUS; |
| fn NtWriteRequestData( |
| PortHandle: HANDLE, |
| Message: PPORT_MESSAGE, |
| DataEntryIndex: ULONG, |
| Buffer: PVOID, |
| BufferSize: SIZE_T, |
| NumberOfBytesWritten: PSIZE_T, |
| ) -> NTSTATUS; |
| }} |
| ENUM!{enum PORT_INFORMATION_CLASS { |
| PortBasicInformation = 0, |
| PortDumpInformation = 1, |
| }} |
| EXTERN!{extern "system" { |
| fn NtQueryInformationPort( |
| PortHandle: HANDLE, |
| PortInformationClass: PORT_INFORMATION_CLASS, |
| PortInformation: PVOID, |
| Length: ULONG, |
| ReturnLength: PULONG, |
| ) -> NTSTATUS; |
| }} |
| pub type PALPC_HANDLE = *mut HANDLE; |
| pub type ALPC_HANDLE = HANDLE; |
| pub const ALPC_PORFLG_ALLOW_LPC_REQUESTS: ULONG = 0x20000; |
| pub const ALPC_PORFLG_WAITABLE_PORT: ULONG = 0x40000; |
| pub const ALPC_PORFLG_SYSTEM_PROCESS: ULONG = 0x100000; |
| #[cfg(any(target_arch = "x86_64", target_arch = "aarch64"))] |
| STRUCT!{struct ALPC_PORT_ATTRIBUTES { |
| Flags: ULONG, |
| SecurityQos: SECURITY_QUALITY_OF_SERVICE, |
| MaxMessageLength: SIZE_T, |
| MemoryBandwidth: SIZE_T, |
| MaxPoolUsage: SIZE_T, |
| MaxSectionSize: SIZE_T, |
| MaxViewSize: SIZE_T, |
| MaxTotalSectionSize: SIZE_T, |
| DupObjectTypes: ULONG, |
| Reserved: ULONG, |
| }} |
| #[cfg(target_arch = "x86")] |
| STRUCT!{struct ALPC_PORT_ATTRIBUTES { |
| Flags: ULONG, |
| SecurityQos: SECURITY_QUALITY_OF_SERVICE, |
| MaxMessageLength: SIZE_T, |
| MemoryBandwidth: SIZE_T, |
| MaxPoolUsage: SIZE_T, |
| MaxSectionSize: SIZE_T, |
| MaxViewSize: SIZE_T, |
| MaxTotalSectionSize: SIZE_T, |
| DupObjectTypes: ULONG, |
| }} |
| pub type PALPC_PORT_ATTRIBUTES = *mut ALPC_PORT_ATTRIBUTES; |
| pub const ALPC_MESSAGE_SECURITY_ATTRIBUTE: ULONG = 0x80000000; |
| pub const ALPC_MESSAGE_VIEW_ATTRIBUTE: ULONG = 0x40000000; |
| pub const ALPC_MESSAGE_CONTEXT_ATTRIBUTE: ULONG = 0x20000000; |
| pub const ALPC_MESSAGE_HANDLE_ATTRIBUTE: ULONG = 0x10000000; |
| STRUCT!{struct ALPC_MESSAGE_ATTRIBUTES { |
| AllocatedAttributes: ULONG, |
| ValidAttributes: ULONG, |
| }} |
| pub type PALPC_MESSAGE_ATTRIBUTES = *mut ALPC_MESSAGE_ATTRIBUTES; |
| STRUCT!{struct ALPC_COMPLETION_LIST_STATE { |
| Value: ULONG64, |
| }} |
| BITFIELD!{ALPC_COMPLETION_LIST_STATE Value: ULONG64 [ |
| Head set_Head[0..24], |
| Tail set_Tail[24..48], |
| ActiveThreadCount set_ActiveThreadCount[48..64], |
| ]} |
| pub type PALPC_COMPLETION_LIST_STATE = *mut ALPC_COMPLETION_LIST_STATE; |
| pub const ALPC_COMPLETION_LIST_BUFFER_GRANULARITY_MASK: ULONG = 0x3f; |
| STRUCT!{#[repr(align(128))] struct ALPC_COMPLETION_LIST_HEADER { |
| StartMagic: ULONG64, |
| TotalSize: ULONG, |
| ListOffset: ULONG, |
| ListSize: ULONG, |
| BitmapOffset: ULONG, |
| BitmapSize: ULONG, |
| DataOffset: ULONG, |
| DataSize: ULONG, |
| AttributeFlags: ULONG, |
| AttributeSize: ULONG, |
| __padding0: [u64; 10], |
| State: ALPC_COMPLETION_LIST_STATE, |
| LastMessageId: ULONG, |
| LastCallbackId: ULONG, |
| __padding1: [u32; 28], |
| PostCount: ULONG, |
| __padding2: [u32; 31], |
| ReturnCount: ULONG, |
| __padding3: [u32; 31], |
| LogSequenceNumber: ULONG, |
| __padding4: [u64; 15], |
| UserLock: RTL_SRWLOCK, |
| EndMagic: ULONG64, |
| __padding5: [u64; 14], |
| }} |
| pub type PALPC_COMPLETION_LIST_HEADER = *mut ALPC_COMPLETION_LIST_HEADER; |
| STRUCT!{struct ALPC_CONTEXT_ATTR { |
| PortContext: PVOID, |
| MessageContext: PVOID, |
| Sequence: ULONG, |
| MessageId: ULONG, |
| CallbackId: ULONG, |
| }} |
| pub type PALPC_CONTEXT_ATTR = *mut ALPC_CONTEXT_ATTR; |
| pub const ALPC_HANDLEFLG_DUPLICATE_SAME_ACCESS: ULONG = 0x10000; |
| pub const ALPC_HANDLEFLG_DUPLICATE_SAME_ATTRIBUTES: ULONG = 0x20000; |
| pub const ALPC_HANDLEFLG_DUPLICATE_INHERIT: ULONG = 0x80000; |
| STRUCT!{struct ALPC_HANDLE_ATTR32 { |
| Flags: ULONG, |
| Reserved0: ULONG, |
| SameAccess: ULONG, |
| SameAttributes: ULONG, |
| Indirect: ULONG, |
| Inherit: ULONG, |
| Reserved1: ULONG, |
| Handle: ULONG, |
| ObjectType: ULONG, |
| DesiredAccess: ULONG, |
| GrantedAccess: ULONG, |
| }} |
| pub type PALPC_HANDLE_ATTR32 = *mut ALPC_HANDLE_ATTR32; |
| STRUCT!{struct ALPC_HANDLE_ATTR { |
| Flags: ULONG, |
| Reserved0: ULONG, |
| SameAccess: ULONG, |
| SameAttributes: ULONG, |
| Indirect: ULONG, |
| Inherit: ULONG, |
| Reserved1: ULONG, |
| Handle: HANDLE, |
| HandleAttrArray: PALPC_HANDLE_ATTR32, |
| ObjectType: ULONG, |
| HandleCount: ULONG, |
| DesiredAccess: ACCESS_MASK, |
| GrantedAccess: ACCESS_MASK, |
| }} |
| pub type PALPC_HANDLE_ATTR = *mut ALPC_HANDLE_ATTR; |
| pub const ALPC_SECFLG_CREATE_HANDLE: ULONG = 0x20000; |
| STRUCT!{struct ALPC_SECURITY_ATTR { |
| Flags: ULONG, |
| QoS: PSECURITY_QUALITY_OF_SERVICE, |
| ContextHandle: ALPC_HANDLE, |
| }} |
| pub type PALPC_SECURITY_ATTR = *mut ALPC_SECURITY_ATTR; |
| pub const ALPC_VIEWFLG_NOT_SECURE: ULONG = 0x40000; |
| STRUCT!{struct ALPC_DATA_VIEW_ATTR { |
| Flags: ULONG, |
| SectionHandle: ALPC_HANDLE, |
| ViewBase: PVOID, |
| ViewSize: SIZE_T, |
| }} |
| pub type PALPC_DATA_VIEW_ATTR = *mut ALPC_DATA_VIEW_ATTR; |
| ENUM!{enum ALPC_PORT_INFORMATION_CLASS { |
| AlpcBasicInformation = 0, |
| AlpcPortInformation = 1, |
| AlpcAssociateCompletionPortInformation = 2, |
| AlpcConnectedSIDInformation = 3, |
| AlpcServerInformation = 4, |
| AlpcMessageZoneInformation = 5, |
| AlpcRegisterCompletionListInformation = 6, |
| AlpcUnregisterCompletionListInformation = 7, |
| AlpcAdjustCompletionListConcurrencyCountInformation = 8, |
| AlpcRegisterCallbackInformation = 9, |
| AlpcCompletionListRundownInformation = 10, |
| AlpcWaitForPortReferences = 11, |
| }} |
| STRUCT!{struct ALPC_BASIC_INFORMATION { |
| Flags: ULONG, |
| SequenceNo: ULONG, |
| PortContext: PVOID, |
| }} |
| pub type PALPC_BASIC_INFORMATION = *mut ALPC_BASIC_INFORMATION; |
| STRUCT!{struct ALPC_PORT_ASSOCIATE_COMPLETION_PORT { |
| CompletionKey: PVOID, |
| CompletionPort: HANDLE, |
| }} |
| pub type PALPC_PORT_ASSOCIATE_COMPLETION_PORT = *mut ALPC_PORT_ASSOCIATE_COMPLETION_PORT; |
| STRUCT!{struct ALPC_SERVER_INFORMATION_Out { |
| ThreadBlocked: BOOLEAN, |
| ConnectedProcessId: HANDLE, |
| ConnectionPortName: UNICODE_STRING, |
| }} |
| UNION!{union ALPC_SERVER_INFORMATION { |
| ThreadHandle: HANDLE, |
| Out: ALPC_SERVER_INFORMATION_Out, |
| }} |
| pub type PALPC_SERVER_INFORMATION = *mut ALPC_SERVER_INFORMATION; |
| STRUCT!{struct ALPC_PORT_MESSAGE_ZONE_INFORMATION { |
| Buffer: PVOID, |
| Size: ULONG, |
| }} |
| pub type PALPC_PORT_MESSAGE_ZONE_INFORMATION = *mut ALPC_PORT_MESSAGE_ZONE_INFORMATION; |
| STRUCT!{struct ALPC_PORT_COMPLETION_LIST_INFORMATION { |
| Buffer: PVOID, |
| Size: ULONG, |
| ConcurrencyCount: ULONG, |
| AttributeFlags: ULONG, |
| }} |
| pub type PALPC_PORT_COMPLETION_LIST_INFORMATION = *mut ALPC_PORT_COMPLETION_LIST_INFORMATION; |
| ENUM!{enum ALPC_MESSAGE_INFORMATION_CLASS { |
| AlpcMessageSidInformation = 0, |
| AlpcMessageTokenModifiedIdInformation = 1, |
| AlpcMessageDirectStatusInformation = 2, |
| AlpcMessageHandleInformation = 3, |
| MaxAlpcMessageInfoClass = 4, |
| }} |
| pub type PALPC_MESSAGE_INFORMATION_CLASS = *mut ALPC_MESSAGE_INFORMATION_CLASS; |
| STRUCT!{struct ALPC_MESSAGE_HANDLE_INFORMATION { |
| Index: ULONG, |
| Flags: ULONG, |
| Handle: ULONG, |
| ObjectType: ULONG, |
| GrantedAccess: ACCESS_MASK, |
| }} |
| pub type PALPC_MESSAGE_HANDLE_INFORMATION = *mut ALPC_MESSAGE_HANDLE_INFORMATION; |
| EXTERN!{extern "system" { |
| fn NtAlpcCreatePort( |
| PortHandle: PHANDLE, |
| ObjectAttributes: POBJECT_ATTRIBUTES, |
| PortAttributes: PALPC_PORT_ATTRIBUTES, |
| ) -> NTSTATUS; |
| fn NtAlpcDisconnectPort( |
| PortHandle: HANDLE, |
| Flags: ULONG, |
| ) -> NTSTATUS; |
| fn NtAlpcQueryInformation( |
| PortHandle: HANDLE, |
| PortInformationClass: ALPC_PORT_INFORMATION_CLASS, |
| PortInformation: PVOID, |
| Length: ULONG, |
| ReturnLength: PULONG, |
| ) -> NTSTATUS; |
| fn NtAlpcSetInformation( |
| PortHandle: HANDLE, |
| PortInformationClass: ALPC_PORT_INFORMATION_CLASS, |
| PortInformation: PVOID, |
| Length: ULONG, |
| ) -> NTSTATUS; |
| fn NtAlpcCreatePortSection( |
| PortHandle: HANDLE, |
| Flags: ULONG, |
| SectionHandle: HANDLE, |
| SectionSize: SIZE_T, |
| AlpcSectionHandle: PALPC_HANDLE, |
| ActualSectionSize: PSIZE_T, |
| ) -> NTSTATUS; |
| fn NtAlpcDeletePortSection( |
| PortHandle: HANDLE, |
| Flags: ULONG, |
| SectionHandle: ALPC_HANDLE, |
| ) -> NTSTATUS; |
| fn NtAlpcCreateResourceReserve( |
| PortHandle: HANDLE, |
| Flags: ULONG, |
| MessageSize: SIZE_T, |
| ResourceId: PALPC_HANDLE, |
| ) -> NTSTATUS; |
| fn NtAlpcDeleteResourceReserve( |
| PortHandle: HANDLE, |
| Flags: ULONG, |
| ResourceId: ALPC_HANDLE, |
| ) -> NTSTATUS; |
| fn NtAlpcCreateSectionView( |
| PortHandle: HANDLE, |
| Flags: ULONG, |
| ViewAttributes: PALPC_DATA_VIEW_ATTR, |
| ) -> NTSTATUS; |
| fn NtAlpcDeleteSectionView( |
| PortHandle: HANDLE, |
| Flags: ULONG, |
| ViewBase: PVOID, |
| ) -> NTSTATUS; |
| fn NtAlpcCreateSecurityContext( |
| PortHandle: HANDLE, |
| Flags: ULONG, |
| SecurityAttribute: PALPC_SECURITY_ATTR, |
| ) -> NTSTATUS; |
| fn NtAlpcDeleteSecurityContext( |
| PortHandle: HANDLE, |
| Flags: ULONG, |
| ContextHandle: ALPC_HANDLE, |
| ) -> NTSTATUS; |
| fn NtAlpcRevokeSecurityContext( |
| PortHandle: HANDLE, |
| Flags: ULONG, |
| ContextHandle: ALPC_HANDLE, |
| ) -> NTSTATUS; |
| fn NtAlpcQueryInformationMessage( |
| PortHandle: HANDLE, |
| PortMessage: PPORT_MESSAGE, |
| MessageInformationClass: ALPC_MESSAGE_INFORMATION_CLASS, |
| MessageInformation: PVOID, |
| Length: ULONG, |
| ReturnLength: PULONG, |
| ) -> NTSTATUS; |
| }} |
| pub const ALPC_MSGFLG_REPLY_MESSAGE: ULONG = 0x1; |
| pub const ALPC_MSGFLG_LPC_MODE: ULONG = 0x2; |
| pub const ALPC_MSGFLG_RELEASE_MESSAGE: ULONG = 0x10000; |
| pub const ALPC_MSGFLG_SYNC_REQUEST: ULONG = 0x20000; |
| pub const ALPC_MSGFLG_WAIT_USER_MODE: ULONG = 0x100000; |
| pub const ALPC_MSGFLG_WAIT_ALERTABLE: ULONG = 0x200000; |
| pub const ALPC_MSGFLG_WOW64_CALL: ULONG = 0x80000000; |
| EXTERN!{extern "system" { |
| fn NtAlpcConnectPort( |
| PortHandle: PHANDLE, |
| PortName: PUNICODE_STRING, |
| ObjectAttributes: POBJECT_ATTRIBUTES, |
| PortAttributes: PALPC_PORT_ATTRIBUTES, |
| Flags: ULONG, |
| RequiredServerSid: PSID, |
| ConnectionMessage: PPORT_MESSAGE, |
| BufferLength: PULONG, |
| OutMessageAttributes: PALPC_MESSAGE_ATTRIBUTES, |
| InMessageAttributes: PALPC_MESSAGE_ATTRIBUTES, |
| Timeout: PLARGE_INTEGER, |
| ) -> NTSTATUS; |
| fn NtAlpcConnectPortEx( |
| PortHandle: PHANDLE, |
| ConnectionPortObjectAttributes: POBJECT_ATTRIBUTES, |
| ClientPortObjectAttributes: POBJECT_ATTRIBUTES, |
| PortAttributes: PALPC_PORT_ATTRIBUTES, |
| Flags: ULONG, |
| ServerSecurityRequirements: PSECURITY_DESCRIPTOR, |
| ConnectionMessage: PPORT_MESSAGE, |
| BufferLength: PSIZE_T, |
| OutMessageAttributes: PALPC_MESSAGE_ATTRIBUTES, |
| InMessageAttributes: PALPC_MESSAGE_ATTRIBUTES, |
| Timeout: PLARGE_INTEGER, |
| ) -> NTSTATUS; |
| fn NtAlpcAcceptConnectPort( |
| PortHandle: PHANDLE, |
| ConnectionPortHandle: HANDLE, |
| Flags: ULONG, |
| ObjectAttributes: POBJECT_ATTRIBUTES, |
| PortAttributes: PALPC_PORT_ATTRIBUTES, |
| PortContext: PVOID, |
| ConnectionRequest: PPORT_MESSAGE, |
| ConnectionMessageAttributes: PALPC_MESSAGE_ATTRIBUTES, |
| AcceptConnection: BOOLEAN, |
| ) -> NTSTATUS; |
| fn NtAlpcSendWaitReceivePort( |
| PortHandle: HANDLE, |
| Flags: ULONG, |
| SendMessageA: PPORT_MESSAGE, |
| SendMessageAttributes: PALPC_MESSAGE_ATTRIBUTES, |
| ReceiveMessage: PPORT_MESSAGE, |
| BufferLength: PSIZE_T, |
| ReceiveMessageAttributes: PALPC_MESSAGE_ATTRIBUTES, |
| Timeout: PLARGE_INTEGER, |
| ) -> NTSTATUS; |
| }} |
| pub const ALPC_CANCELFLG_TRY_CANCEL: ULONG = 0x1; |
| pub const ALPC_CANCELFLG_NO_CONTEXT_CHECK: ULONG = 0x8; |
| pub const ALPC_CANCELFLGP_FLUSH: ULONG = 0x10000; |
| EXTERN!{extern "system" { |
| fn NtAlpcCancelMessage( |
| PortHandle: HANDLE, |
| Flags: ULONG, |
| MessageContext: PALPC_CONTEXT_ATTR, |
| ) -> NTSTATUS; |
| fn NtAlpcImpersonateClientOfPort( |
| PortHandle: HANDLE, |
| Message: PPORT_MESSAGE, |
| Flags: PVOID, |
| ) -> NTSTATUS; |
| fn NtAlpcImpersonateClientContainerOfPort( |
| PortHandle: HANDLE, |
| Message: PPORT_MESSAGE, |
| Flags: ULONG, |
| ) -> NTSTATUS; |
| fn NtAlpcOpenSenderProcess( |
| ProcessHandle: PHANDLE, |
| PortHandle: HANDLE, |
| PortMessage: PPORT_MESSAGE, |
| Flags: ULONG, |
| DesiredAccess: ACCESS_MASK, |
| ObjectAttributes: POBJECT_ATTRIBUTES, |
| ) -> NTSTATUS; |
| fn NtAlpcOpenSenderThread( |
| ThreadHandle: PHANDLE, |
| PortHandle: HANDLE, |
| PortMessage: PPORT_MESSAGE, |
| Flags: ULONG, |
| DesiredAccess: ACCESS_MASK, |
| ObjectAttributes: POBJECT_ATTRIBUTES, |
| ) -> NTSTATUS; |
| fn AlpcMaxAllowedMessageLength() -> ULONG; |
| fn AlpcGetHeaderSize( |
| Flags: ULONG, |
| ) -> ULONG; |
| fn AlpcInitializeMessageAttribute( |
| AttributeFlags: ULONG, |
| Buffer: PALPC_MESSAGE_ATTRIBUTES, |
| BufferSize: ULONG, |
| RequiredBufferSize: PULONG, |
| ) -> NTSTATUS; |
| fn AlpcGetMessageAttribute( |
| Buffer: PALPC_MESSAGE_ATTRIBUTES, |
| AttributeFlag: ULONG, |
| ) -> PVOID; |
| fn AlpcRegisterCompletionList( |
| PortHandle: HANDLE, |
| Buffer: PALPC_COMPLETION_LIST_HEADER, |
| Size: ULONG, |
| ConcurrencyCount: ULONG, |
| AttributeFlags: ULONG, |
| ) -> NTSTATUS; |
| fn AlpcUnregisterCompletionList( |
| PortHandle: HANDLE, |
| ) -> NTSTATUS; |
| fn AlpcRundownCompletionList( |
| PortHandle: HANDLE, |
| ) -> NTSTATUS; |
| fn AlpcAdjustCompletionListConcurrencyCount( |
| PortHandle: HANDLE, |
| ConcurrencyCount: ULONG, |
| ) -> NTSTATUS; |
| fn AlpcRegisterCompletionListWorkerThread( |
| CompletionList: PVOID, |
| ) -> BOOLEAN; |
| fn AlpcUnregisterCompletionListWorkerThread( |
| CompletionList: PVOID, |
| ) -> BOOLEAN; |
| fn AlpcGetCompletionListLastMessageInformation( |
| CompletionList: PVOID, |
| LastMessageId: PULONG, |
| LastCallbackId: PULONG, |
| ); |
| fn AlpcGetOutstandingCompletionListMessageCount( |
| CompletionList: PVOID, |
| ) -> ULONG; |
| fn AlpcGetMessageFromCompletionList( |
| CompletionList: PVOID, |
| MessageAttributes: *mut PALPC_MESSAGE_ATTRIBUTES, |
| ) -> PPORT_MESSAGE; |
| fn AlpcFreeCompletionListMessage( |
| CompletionList: PVOID, |
| Message: PPORT_MESSAGE, |
| ); |
| fn AlpcGetCompletionListMessageAttributes( |
| CompletionList: PVOID, |
| Message: PPORT_MESSAGE, |
| ) -> PALPC_MESSAGE_ATTRIBUTES; |
| }} |