111 (
PVOID *)&PortObject);
121 PortObject->Filter =
Filter;
248 Irp->IoStatus.Information = 0;
280 Irp->IoStatus.Information = 0;
350 if (PortObject->Disconnected ==
FALSE)
353 KeSetEvent(&PortObject->DisconnectEvent, 0, 0);
358 PortObject->Disconnected =
TRUE;
483 &
Irp->Tail.Overlay.ListEntry);
523 NextEntry =
Irp->Tail.Overlay.ListEntry.
Flink;
552 NextEntry = NextEntry->
Flink;
608 Irp->IoStatus.Information = 0;
631 FilterPortData =
Irp->AssociatedIrp.SystemBuffer;
641 (
PVOID *)&ServerPortObject);
649 if (NumConns > ServerPortObject->MaxConnections)
671 (
PVOID *)&ClientPortObject);
685 ClientPortObject->ServerPort = ServerPortObject;
707 ClientPortObject =
NULL;
716 Status = ServerPortObject->ConnectNotify(PortHandle,
717 ServerPortObject->Cookie,
720 &ClientPortObject->Cookie);
728 InsertTailList(&ServerPortObject->Filter->PortList.mList, &ClientPortObject->FilterLink);
740 if (ClientPortObject)
749 else if (ServerPortObject)
792 FltpAcquireMessageWaiterLock,
793 FltpReleaseMessageWaiterLock,
803 MsgWaiterQueue->WaiterQ.mCount = 0;
806 MsgWaiterQueue->MinimumWaiterLength = (
ULONG)-1;
826 PortCCB->
Port = PortObject;
#define STATUS_CONNECTION_COUNT_LIMIT
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
#define FLT_PORT_ALL_ACCESS
NTSTATUS NTAPI ObCreateObjectType(IN PUNICODE_STRING TypeName, IN POBJECT_TYPE_INITIALIZER ObjectTypeInitializer, IN PVOID Reserved, OUT POBJECT_TYPE *ObjectType)
#define STATUS_INSUFFICIENT_RESOURCES
static BOOLEAN FltpDisconnectPort(_In_ PFLT_PORT_OBJECT PortObject)
PIRP NTAPI FltpGetNextMessageWaiter(_In_ PIO_CSQ Csq, _In_ PIRP Irp, _In_ PVOID PeekContext)
static NTSTATUS InitializeMessageWaiterQueue(_Inout_ PFLT_MESSAGE_WAITER_QUEUE MsgWaiterQueue)
#define STANDARD_RIGHTS_WRITE
VOID NTAPI FltpClientPortDelete(PVOID Object)
#define UNREFERENCED_PARAMETER(P)
#define STATUS_INVALID_PARAMETER
NTSYSAPI NTSTATUS NTAPI ZwClose(_In_ HANDLE Handle)
_Must_inspect_result_ _Outptr_ PFLT_PORT * ServerPort
static PVOID Mapping[EMS_PHYSICAL_PAGES]
struct _FLT_PORT_OBJECT FLT_PORT_OBJECT
VOID FLTAPI FltObjectDereference(_Inout_ PVOID Object)
VOID NTAPI FltpServerPortDelete(PVOID Object)
PDEVICE_OBJECT CommsDeviceObject
_Outptr_ PFLT_PORT * ClientPort
KPROCESSOR_MODE NTAPI ExGetPreviousMode(VOID)
NTSTATUS FltpMsgDispatch(_In_ PDEVICE_OBJECT DeviceObject, _Inout_ PIRP Irp)
#define InsertTailList(ListHead, Entry)
#define STANDARD_RIGHTS_EXECUTE
NTKERNELAPI VOID FASTCALL ExInitializeRundownProtection(_Out_ PEX_RUNDOWN_REF RunRef)
LONG NTAPI KeSetEvent(IN PKEVENT Event, IN KPRIORITY Increment, IN BOOLEAN Wait)
#define OBJ_KERNEL_HANDLE
struct _OBJECT_TYPE_INITIALIZER OBJECT_TYPE_INITIALIZER
VOID FASTCALL ExReleaseFastMutex(IN PFAST_MUTEX FastMutex)
UNICODE_STRING CommsDeviceName
NTSTATUS FltpMsgCreate(_In_ PDEVICE_OBJECT DeviceObject, _Inout_ PIRP Irp)
#define _IRQL_raises_(irql)
struct _FLT_PORT * PFLT_PORT
ULONG FltpObjectPointerReference(_In_ PFLT_OBJECT Object)
FORCEINLINE BOOLEAN RemoveEntryList(_In_ PLIST_ENTRY Entry)
_Must_inspect_result_ _In_ PFLT_PORT _In_ ULONG _Out_writes_bytes_opt_ ReplyLength PVOID _Inout_opt_ PULONG ReplyLength
POBJECT_TYPE ClientPortObjectType
_In_ PDEVICE_OBJECT DeviceObject
return STATUS_NOT_IMPLEMENTED
VOID NTAPI FltpRemoveMessageWaiter(_In_ PIO_CSQ Csq, _In_ PIRP Irp)
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
struct _FLT_PORT_OBJECT * PFLT_PORT_OBJECT
_Must_inspect_result_ _In_opt_ PFLT_FILTER Filter
struct _FLT_SERVER_PORT_OBJECT * PFLT_SERVER_PORT_OBJECT
#define IoCompleteRequest
VOID NTAPI FltpServerPortClose(_In_opt_ PEPROCESS Process, _In_ PVOID Object, _In_ ACCESS_MASK GrantedAccess, _In_ ULONG ProcessHandleCount, _In_ ULONG SystemHandleCount)
OB_CLOSE_METHOD CloseProcedure
VOID NTAPI FltpClientPortClose(_In_opt_ PEPROCESS Process, _In_ PVOID Object, _In_ ACCESS_MASK GrantedAccess, _In_ ULONG ProcessHandleCount, _In_ ULONG SystemHandleCount)
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
_In_ WDFREQUEST _In_ WDFFILEOBJECT FileObject
#define _Out_writes_bytes_opt_(size)
_Must_inspect_result_ _In_ PDRIVER_OBJECT DriverObject
NTSTATUS NTAPI ObCreateObject(IN KPROCESSOR_MODE ProbeMode OPTIONAL, IN POBJECT_TYPE Type, IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, IN KPROCESSOR_MODE AccessMode, IN OUT PVOID ParseContext OPTIONAL, IN ULONG ObjectSize, IN ULONG PagedPoolCharge OPTIONAL, IN ULONG NonPagedPoolCharge OPTIONAL, OUT PVOID *Object)
#define _IRQL_requires_(irql)
_In_ PIRP _In_ PVOID InsertContext
struct _LIST_ENTRY * Flink
NTSTATUS NTAPI IoCreateSymbolicLink(IN PUNICODE_STRING SymbolicLinkName, IN PUNICODE_STRING DeviceName)
VOID NTAPI KeInitializeSemaphore(IN PKSEMAPHORE Semaphore, IN LONG Count, IN LONG Limit)
POBJECT_TYPE ServerPortObjectType
#define NT_SUCCESS(StatCode)
_Must_inspect_result_ _IRQL_requires_max_(PASSIVE_LEVEL)
_Must_inspect_result_ _Outptr_ PFLT_PORT _In_ POBJECT_ATTRIBUTES _In_opt_ PVOID _In_ PFLT_CONNECT_NOTIFY _In_ PFLT_DISCONNECT_NOTIFY DisconnectNotifyCallback
NTKERNELAPI NTSTATUS NTAPI IoCsqInitializeEx(_Out_ PIO_CSQ Csq, _In_ PIO_CSQ_INSERT_IRP_EX CsqInsertIrpEx, _In_ PIO_CSQ_REMOVE_IRP CsqRemoveIrp, _In_ PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp, _In_ PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock, _In_ PIO_CSQ_RELEASE_LOCK CsqReleaseLock, _In_ PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp)
Set up a CSQ struct to initialize the queue (extended version)
FORCEINLINE VOID ExInitializeFastMutex(_Out_ PFAST_MUTEX FastMutex)
VOID NTAPI FltpCancelMessageWaiter(_In_ PIO_CSQ Csq, _In_ PIRP Irp)
#define ObDereferenceObject
NTSTATUS(FLTAPI * PFLT_MESSAGE_NOTIFY)(_In_opt_ PVOID PortCookie, _In_reads_bytes_opt_(InputBufferLength) PVOID InputBuffer, _In_ ULONG InputBufferLength, _Out_writes_bytes_to_opt_(OutputBufferLength, *ReturnOutputBufferLength) PVOID OutputBuffer, _In_ ULONG OutputBufferLength, _Out_ PULONG ReturnOutputBufferLength)
VOID FltpObjectPointerDereference(_In_ PFLT_OBJECT Object)
struct _FLT_CCB * PFLT_CCB
#define ExAllocatePoolWithTag(hernya, size, tag)
_Must_inspect_result_ _In_ PFLT_PORT _In_ ULONG _Out_writes_bytes_opt_ ReplyLength PVOID ReplyBuffer
#define _IRQL_restores_global_(kind, param)
#define InterlockedDecrement
static PPORT_CCB CreatePortCCB(_In_ PFLT_PORT_OBJECT PortObject)
_Inout_ PFILE_OBJECT _In_ TYPE_OF_OPEN PFCB _In_opt_ PCCB Ccb
FLT_MUTEX_LIST_HEAD ReplyWaiterList
#define STANDARD_RIGHTS_READ
#define _Must_inspect_result_
_Must_inspect_result_ _Outptr_ PFLT_PORT _In_ POBJECT_ATTRIBUTES _In_opt_ PVOID _In_ PFLT_CONNECT_NOTIFY ConnectNotifyCallback
_Must_inspect_result_ _In_ WDFCOLLECTION _In_ WDFOBJECT Object
FLT_MUTEX_LIST_HEAD WaiterQ
NTSTATUS(FLTAPI * PFLT_CONNECT_NOTIFY)(_In_ PFLT_PORT ClientPort, _In_opt_ PVOID ServerPortCookie, _In_reads_bytes_opt_(SizeOfContext) PVOID ConnectionContext, _In_ ULONG SizeOfContext, _Outptr_result_maybenull_ PVOID *ConnectionPortCookie)
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(_In_ PIRP Irp)
VOID NTAPI IoDeleteDevice(IN PDEVICE_OBJECT DeviceObject)
NTSTATUS NTAPI ObInsertObject(IN PVOID Object, IN PACCESS_STATE AccessState OPTIONAL, IN ACCESS_MASK DesiredAccess, IN ULONG ObjectPointerBias, OUT PVOID *NewObject OPTIONAL, OUT PHANDLE Handle)
#define KeInitializeEvent(pEvt, foo, foo2)
GENERIC_MAPPING GenericMapping
NTSTATUS FltpSetupCommunicationObjects(_In_ PDRIVER_OBJECT DriverObject)
#define InterlockedIncrement
#define STANDARD_RIGHTS_ALL
VOID FASTCALL ExAcquireFastMutex(IN PFAST_MUTEX FastMutex)
NTSTATUS FLTAPI FltObjectReference(_Inout_ PVOID Object)
#define InitializeListHead(ListHead)
_Must_inspect_result_ _In_ PFLT_PORT _In_ ULONG SenderBufferLength
_Must_inspect_result_ _Outptr_ PFLT_PORT _In_ POBJECT_ATTRIBUTES _In_opt_ PVOID ServerPortCookie
VOID(FLTAPI * PFLT_DISCONNECT_NOTIFY)(_In_opt_ PVOID ConnectionCookie)
_In_opt_ PIRP _In_opt_ PVOID PeekContext
_Acquires_lock_(((PFLT_MESSAGE_WAITER_QUEUE) CONTAINING_RECORD(Csq, FLT_MESSAGE_WAITER_QUEUE, Csq)) ->WaiterQ.mLock) _IRQL_saves_global_(Irql
_Must_inspect_result_ _In_ PLARGE_INTEGER _In_ PLARGE_INTEGER _In_ ULONG _In_ PFILE_OBJECT _In_ PVOID Process
_Must_inspect_result_ _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFWAITLOCK * Lock
struct _FLT_SERVER_PORT_OBJECT FLT_SERVER_PORT_OBJECT
NTSTATUS NTAPI IoCreateDevice(IN PDRIVER_OBJECT DriverObject, IN ULONG DeviceExtensionSize, IN PUNICODE_STRING DeviceName, IN DEVICE_TYPE DeviceType, IN ULONG DeviceCharacteristics, IN BOOLEAN Exclusive, OUT PDEVICE_OBJECT *DeviceObject)
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define RtlZeroMemory(Destination, Length)
#define InitializeObjectAttributes(p, n, a, r, s)
_Must_inspect_result_ _Outptr_ PFLT_PORT _In_ POBJECT_ATTRIBUTES _In_opt_ PVOID _In_ PFLT_CONNECT_NOTIFY _In_ PFLT_DISCONNECT_NOTIFY _In_opt_ PFLT_MESSAGE_NOTIFY _In_ LONG MaxConnections
static NTSTATUS CloseClientPort(_In_ PFILE_OBJECT FileObject, _Inout_ PIRP Irp)
static NTSTATUS CreateClientPort(_In_ PFILE_OBJECT FileObject, _Inout_ PIRP Irp)
_Releases_lock_(((PFLT_MESSAGE_WAITER_QUEUE) CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) ->WaiterQ.mLock) _IRQL_restores_global_(Irql
_In_ PSECURITY_SUBJECT_CONTEXT _In_ BOOLEAN _In_ ACCESS_MASK _In_ ACCESS_MASK _Outptr_opt_ PPRIVILEGE_SET _In_ PGENERIC_MAPPING _In_ KPROCESSOR_MODE _Out_ PACCESS_MASK GrantedAccess
OB_DELETE_METHOD DeleteProcedure
#define ExFreePoolWithTag(_P, _T)
NTSTATUS NTAPI ObReferenceObjectByName(IN PUNICODE_STRING ObjectPath, IN ULONG Attributes, IN PACCESS_STATE PassedAccessState, IN ACCESS_MASK DesiredAccess, IN POBJECT_TYPE ObjectType, IN KPROCESSOR_MODE AccessMode, IN OUT PVOID ParseContext, OUT PVOID *ObjectPtr)
_Must_inspect_result_ _Outptr_ PFLT_PORT _In_ POBJECT_ATTRIBUTES _In_opt_ PVOID _In_ PFLT_CONNECT_NOTIFY _In_ PFLT_DISCONNECT_NOTIFY _In_opt_ PFLT_MESSAGE_NOTIFY MessageNotifyCallback
ULONG DefaultNonPagedPoolCharge
NTSTATUS NTAPI FltpAddMessageWaiter(_In_ PIO_CSQ Csq, _In_ PIRP Irp, _In_ PVOID InsertContext)
PFLT_SERVER_PORT_OBJECT ServerPort
#define _IRQL_saves_global_(kind, param)
FLT_MUTEX_LIST_HEAD ConnectionList
#define _In_reads_bytes_(size)
#define RTL_CONSTANT_STRING(s)
VOID NTAPI ObMakeTemporaryObject(IN PVOID ObjectBody)