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 это не мой экземпляр драйвера... следовательно, он терпел неудачу!

0 ответов

Другие вопросы по тегам