Windows7 64ビットを使用しています。WorkItem (IoQueueWorkItem) がエラー「PAGE_FAULT_IN_NONPAGED_AREA」で BSOD を返す 割り当てられたメモリも解放しています...何が問題なのかわかりません :(
これは私のドライバーコードです:
#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 がなくても問題ありません。
////////////////// EDIT 1
解決しました!ここの DeviceObject が原因で、work->pio = IoAllocateWorkItem(pDeviceObject);
これpDeviceObject
は私のドライバーインスタンスではありません...したがって、失敗していました!