Hi,
I am writing a Minifilter driver which filters registry and file access.
Now I want to filter process objects using the ObRegisterCallbacks API.
The call fails with BSOD and error 0x000000CE (DRIVER_UNLOADED_WITHOUT_CANCELLING_PENDING_OPERAT IONS). Any idea?
I use windows 7 and the driver uses CmRegisterCallbacks for registry, FltRegisterFilter, device IO controls and PsSetCreateProcessNotifyRoutine (no kind of hook whatsoever).
The relevant code:
Code:
#if (NTDDI_VERSION >= NTDDI_VISTASP1)
USHORT filterVersion = ObGetFilterVersion();
if (filterVersion != OB_FLT_REGISTRATION_VERSION)
rc = STATUS_NOT_SUPPORTED;
if (NT_SUCCESS(rc))
{
OB_OPERATION_REGISTRATION ObOperationRegistration[] =
{
{ PsProcessType, OB_OPERATION_HANDLE_CREATE | OB_OPERATION_HANDLE_DUPLICATE,
&Proc::ObPreCallback, &Proc::ObPostCallback },
{ PsThreadType, OB_OPERATION_HANDLE_CREATE | OB_OPERATION_HANDLE_DUPLICATE,
&Proc::ObPreCallback, &Proc::ObPostCallback },
};
OB_CALLBACK_REGISTRATION ObCallbackRegistration =
{
OB_FLT_REGISTRATION_VERSION,
_countof(ObOperationRegistration),
{ Drv::Altitude.Length, Drv::Altitude.MaximumLength, Drv::Altitude.Buffer },
NULL,
ObOperationRegistration,
};
ObRegistrationHandle = NULL;
rc = ObRegisterCallbacks(&ObCallbackRegistration, &ObRegistrationHandle);
}
#else
#error TODO
#endif
PVOID Proc::ObRegistrationHandle;
OB_PREOP_CALLBACK_STATUS Proc::ObPreCallback(PVOID RegistrationContext,
POB_PRE_OPERATION_INFORMATION OperationInformation)
{
return OB_PREOP_SUCCESS;
}
void Proc::ObPostCallback(PVOID RegistrationContext,
POB_POST_OPERATION_INFORMATION OperationInformation)
{
}