WorkItem (IoQueueWorkItem) выдает BSOD с ошибкой "PAGE_FAULT_IN_NONPAGED_AREA"
Я использую Windows 7 64 бит. WorkItem (IoQueueWorkItem) выдает BSOD с ошибкой "PAGE_FAULT_IN_NONPAGED_AREA". Я тоже освобождаю выделенную память... понятия не имею, что не так:(
Это мой код драйвера:
#ifdef ALLOC_PRAGMA
#pragma alloc_text (INIT, DriverEntry)
#pragma alloc_text (PAGE, DriverCreateClose)
#pragma alloc_text (PAGE, DriverUnload)
#endif
NTSTATUS
DriverEntry(
_In_ PDRIVER_OBJECT DriverObject,
_In_ PUNICODE_STRING RegistryPath
)
{
PDEVICE_OBJECT deviceObject;
UNICODE_STRING ntDeviceName;
NTSTATUS status;
UNICODE_STRING symbolicLinkName;
UNREFERENCED_PARAMETER(RegistryPath);
DbgPrint("*** .SYS: ==>DriverEntry\n");
//
// Create the device object
//
RtlInitUnicodeString(&ntDeviceName, NTDEVICE_NAME_STRING);
status = IoCreateDevice(DriverObject, // DriverObject
sizeof(DEVICE_EXTENSION), // DeviceExtensionSize
&ntDeviceName, // DeviceName
FILE_DEVICE_UNKNOWN, // DeviceType
FILE_DEVICE_SECURE_OPEN, // DeviceCharacteristics
FALSE, // Not Exclusive
&deviceObject // DeviceObject
);
if (!NT_SUCCESS(status)) {
DbgPrint("*** .SYS: IoCreateDevice returned 0x%x\n", status);
return(status);
}
//
// Set up dispatch entry points for the driver.
//
DriverObject->MajorFunction[IRP_MJ_CREATE] = DriverCreateClose;
DriverObject->MajorFunction[IRP_MJ_CLOSE] = DriverCreateClose;
DriverObject->MajorFunction[IRP_MJ_CLEANUP] = DriverCleanup;
DriverObject->DriverUnload = DriverUnload;
//Test WorkItem
test_WorkItem();
//
// Create a symbolic link for userapp to interact with the driver.
//
RtlInitUnicodeString(&symbolicLinkName, SYMBOLIC_NAME_STRING);
status = IoCreateSymbolicLink(&symbolicLinkName, &ntDeviceName);
if (!NT_SUCCESS(status)) {
IoDeleteDevice(deviceObject);
DbgPrint("*** .SYS: IoCreateSymbolicLink returned 0x%x\n", status);
return(status);
}
DbgPrint("*** .SYS: DriverEntry<==\n");
return status;
}
Это мой тестовый код:
typedef struct _WorkItemStruct {
PIO_WORKITEM pio;
VOID (*callback)(PDEVICE_OBJECT DeviceObject, PVOID Context);
} WorkItemStruct;
void WorkItemCallback(PDEVICE_OBJECT DeviceObject, WorkItemStruct *work)
{
PAGED_CODE();
DbgPrint("Hello World!\n");
IoFreeWorkItem( work->pio );
ExFreePool( work );
}
void test_WorkItem()
{
WorkItemStruct *work;
work = (WorkItemStruct *) ExAllocatePool(NonPagedPool, sizeof(WorkItemStruct));
if( work != NULL )
{
work->pio = IoAllocateWorkItem(pDeviceObject);
IoQueueWorkItem( work->pio, (PIO_WORKITEM_ROUTINE)WorkItemCallback, DelayedWorkQueue, work);
}
}
Этот код приводит к сбою моего ноутбука... Я не знаю, в чем я не прав... Я тоже освобождаю память. это нормально без IoQueueWorkItem, если я это прокомментирую.
////////////////// РЕДАКТИРОВАТЬ 1 Решено! Это из-за DeviceObject здесь, work->pio = IoAllocateWorkItem(pDeviceObject);
этот pDeviceObject
это не мой экземпляр драйвера... следовательно, он терпел неудачу!