0

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は私のドライバーインスタンスではありません...したがって、失敗していました!

4

0 に答える 0