For example (in addition to the passthrough example) - this code runs 100% fine on win7/win8 x64 test mode VS2013, but BSOD’s on XP/7 x86 DDK 7600. The pre/post IRP_MJ_CREATE functions do nothing and only return FLT_PREOP_SUCCESS_W/CALLBACK
NTSTATUS
DriverEntry(
__in PDRIVER_OBJECT DriverObject,
__in PUNICODE_STRING RegistryPath
)
{
NTSTATUS status;
PSECURITY_DESCRIPTOR sd;
OBJECT_ATTRIBUTES oa;
UNICODE_STRING uniString; //for communication port name
UNREFERENCED_PARAMETER(RegistryPath);
DbgPrint(“NPminifilter!DriverEntry: Entered\n”);
//
// Register with FltMgr to tell it our callback routines
//
status = FltRegisterFilter(DriverObject,
&FilterRegistration,
&gFilterHandle);
ASSERT(NT_SUCCESS(status));
if (NT_SUCCESS(status)) {
//
// Start filtering i/o
//
status = FltStartFiltering(gFilterHandle);
if (!NT_SUCCESS(status)) {
FltUnregisterFilter(gFilterHandle);
}
}
status = FltBuildDefaultSecurityDescriptor(&sd, FLT_PORT_ALL_ACCESS);
if (!NT_SUCCESS(status)) {
goto final;
}
RtlInitUnicodeString(&uniString, MINISPY_PORT_NAME);
InitializeObjectAttributes(&oa,
&uniString,
OBJ_KERNEL_HANDLE | OBJ_CASE_INSENSITIVE,
NULL,
sd);
status = FltCreateCommunicationPort(gFilterHandle,
&gServerPort,
&oa,
NULL,
NPMiniConnect,
NPMiniDisconnect,
NPMiniMessage,
1);
FltFreeSecurityDescriptor(sd);
if (!NT_SUCCESS(status)) {
goto final;
}
final :
if (!NT_SUCCESS(status)) {
if (NULL != gServerPort) {
FltCloseCommunicationPort(gServerPort);
}
if (NULL != gFilterHandle) {
FltUnregisterFilter(gFilterHandle);
}
}
return status;
}