Re: IoAttachDeviceToDeviceStack & BSOD
От: OpenGL  
Дата: 10.11.05 03:48
Оценка:
Здравствуйте, theTrueMayhem, Вы писали:

TM>Есть такой код.. драйвер USB для устройства.. 2 дня не могу понять почему драйвер выдает мне BSOD на функции IoAttachDeviceToDeviceStack! Путем комментов и запусков понял что там вылетает...



TM>P.S. выдает PAGE_FAULT_IN_NONPAGED_AREA

TM>и код (хотя в DDK написаны примеры избавления от ошибок они не помогают)
TM>STOP: 0x0000050 (0xBF7F0020,0x00000001,0x80529CED,0x00000002)
TM>Понять не могу чего он оттуда вылетает! Помоему в AddDevice USB драйверов
TM>нет чегото сверхестесственного.. но видимо я чего то не понимаю!
TM>Помогите плиз!

Не буду ни чего коментировать попробуй вот этот код, сам поймешь надеюсь ))))



NTSTATUS    USB_AddDevice(    IN PDRIVER_OBJECT DriverObject,
                                IN PDEVICE_OBJECT PhysicalDeviceObject)
{
    NTSTATUS            Status = STATUS_SUCCESS;
    PLOCAL_DEVICE_INFO    pLDI;
    PDEVICE_OBJECT        fdo = NULL;
    UNICODE_STRING        NtDeviceName;
    UNICODE_STRING        Win32DeviceName;

    RtlInitUnicodeString(&NtDeviceName, USB_DEVICE_NAME);
    RtlInitUnicodeString(&Win32DeviceName, USB_DOS_DEVICE_NAME);

    Status = IoCreateDevice(
        DriverObject,                   // our driver object
        sizeof(LOCAL_DEVICE_INFO),      // extension size for us
        &NtDeviceName,                  // name for this device
        USB_TYPE,
        0,                              // device characteristics
        FALSE,                          // Not exclusive
        &fdo);                          // Our device object

    if(!NT_SUCCESS(Status))
        return Status;

    Status = IoCreateSymbolicLink(&Win32DeviceName, &NtDeviceName);
    if(!NT_SUCCESS(Status))
    {
        IoDeleteDevice(fdo);
        return Status;
    }

    pLDI = (PLOCAL_DEVICE_INFO) fdo->DeviceExtension;
    pLDI->PhisicalDeviceObject = PhysicalDeviceObject;
    pLDI->NtDeviceName = NtDeviceName;
    pLDI->Win32DeviceName = Win32DeviceName;

    fdo->Flags |= DO_DIRECT_IO;
    fdo->Flags |= DO_POWER_PAGABLE;
    fdo->Flags &= ~DO_DEVICE_INITIALIZING;

    pLDI->DeviceObject = fdo;
    pLDI->Removed = FALSE;
    pLDI->Started = FALSE;
    pLDI->NextLowerDriver = IoAttachDeviceToDeviceStack(fdo, PhysicalDeviceObject);
    if (NULL == pLDI->NextLowerDriver)
    {
        IoDeleteSymbolicLink(&Win32DeviceName);
        IoDeleteDevice(fdo);
        return STATUS_NO_SUCH_DEVICE;
    }

    IoInitializeRemoveLock (&pLDI->RemoveLock , USB_TAG, 1, 5);

    return Status;
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.