IoAttachDeviceToDeviceStack & BSOD

Тема в разделе "WASM.ELECTRONICS", создана пользователем ESHV, 9 ноя 2005.

  1. ESHV

    ESHV New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2005
    Сообщения:
    2
    Есть такой код.. драйвер USB для устройства.. 2 дня не могу понять почему драйвер выдает мне BSOD на функции IoAttachDeviceToDeviceStack! Путем комментов и запусков понял что там вылетает...



    #pragma PAGEDCODE



    NTSTATUS USBAddDevice(IN PDRIVER_OBJECT pDriverObject, IN PDEVICE_OBJECT pPhysicalDO)

    {

    // PAGED_CODE(); // что с комментами что без - без толку

    NTSTATUS status;

    PDEVICE_OBJECT pDeviceObject;

    PDEVICE_OBJECT lowerPDO;



    status = IoCreateDevice(pDriverObject,

    sizeof(DEVICE_EXTENSION),

    NULL,//&uDevName

    FILE_DEVICE_UNKNOWN, // or FILE_DEVICE_BUS_EXTENDER??

    FILE_AUTOGENERATED_DEVICE_NAME, FALSE, &pDeviceObject);



    if(!NT_SUCCESS(status))

    {

    #if DBG

    DbgPrint("=USB= ERROR!!! Fail to Create Device with STATUS=0x%X",status);

    #endif

    return status;

    }



    // Take device extension

    PDEVICE_EXTENSION pDEx = (PDEVICE_EXTENSION) pDeviceObject->DeviceExtension;



    #if DBG

    DbgPrint("=USB= IoCreateDevice() --> Created DeviceObject=0x%x\n",pDeviceObject);

    DbgPrint("=USB= Attaching to Driver Stack\n");

    #endif



    pDEx->DeviceObject = pDeviceObject;

    pDEx->Pdo = pPhysicalDO;

    pDeviceObject->Flags |= DO_DIRECT_IO;



    pDEx->LowerDeviceObject = IoAttachDeviceToDeviceStack(pDeviceObject,pPhysicalDO);

    // Здесь BSOD



    if(!pDEx->LowerDeviceObject)

    {

    IoDeleteDevice(pDeviceObject);

    return STATUS_NO_SUCH_DEVICE;

    }



    status = IoRegisterDeviceInterface(pDEx->Pdo,

    &GUID_USB,

    NULL,

    &pDEx->InterfaceName);

    if(!NT_SUCCESS(status))

    {

    IoDetachDevice(pDEx->LowerDeviceObject);

    IoDeleteDevice(pDeviceObject);

    return status;

    }

    pDriverObject->Flags |= DO_POWER_PAGABLE;

    pDriverObject->Flags &= ~DO_DEVICE_INITIALIZING;



    return STATUS_SUCCESS;

    }



    P.S. выдает PAGE_FAULT_IN_NONPAGED_AREA

    и код (в котором я не очень разбираюсь)

    STOP: 0x0000050 (0xBF7F0020,0x00000001,0x80529CED,0x00000002)



    P.S.S. И еще вопрос - есть ли какиенибудь способы разбираться в BSOD. Ну хотя бы для понимания, что, где и изза чего произошло! Или может есть программы которые сохраняют эти логи
     
  2. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    <font color="gray][ ESHV</font><!--color--><font color="gray]: и код (в котором я не очень разбираюсь) ]</font><!--color-->



    Открой доку по ддк и в указателе набери bug - увидишь список всех стоп-кодов с подробным описанием. Либо онлайн на сайте мс в поиске набери "Bug Check Codes" или просто погугли.





    <font color="gray][ ESHV</font><!--color--><font color="gray]: P.S.S. И еще вопрос - есть ли какиенибудь способы разбираться в BSOD. Ну хотя бы для понимания, что, где и изза чего произошло! Или может есть программы которые сохраняют эти логи ]</font><!--color-->



    Способ один - чтение доков и прочего и опыт. На sysinternals.com лежит утилита, делающая принтскрин голубого экрана, но я никогда не пользовался. Проще Mini Crash Dump в отладчик загрузить.





    В чём причина твоего бага я не знаю. Макрос PAGED_CODE тут совершенно не при чём. IMHO, с виду, код правильный. Пройдись пошагово в отладчике и посмотри где именно BSOD: внутри IoAttachDeviceToDeviceStack или в момент записи в pDEx->LowerDeviceObject. Если проблема внутри IoAttachDeviceToDeviceStack, пройдись пошагово внутри неё.





    ЗЫ: Тот код, что на rsdn предлагают, можешь попробовать, но он лажёвый.



    fdo->Flags &= ~DO_DEVICE_INITIALIZING;

    . . .

    IoAttachDeviceToDeviceStack



    Это нонсенс!



    Edited: Насчет нонсенса я гоню, сори. Поскольку вся инициализация девайса происходит до аттача, то можно сбросить этот флаг до вызова IoAttachDeviceToDeviceStack, но правильнее всё же перед самым выходом из AddDevice.
     
  3. ESHV

    ESHV New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2005
    Сообщения:
    2
    fdo->Flags &= ~DO_DEVICE_INITIALIZING;

    . . .

    IoAttachDeviceToDeviceStack



    Ну впринципе да... но ради эксперимента что не поделаешь)



    Вообще я не понимаю в ДДК ж написано SymbolicLink не создавать для PnP драйверов! я впринципе пошел другим путем.. На счет кодов я все разобрал спасибо догадался.. ток мне это пользы не принесло.. висит так и весело! У меня подозрение на IoCreateDevice может там чо не так поставил!



    Да и потом я уже здесь создавал тему... не могу настроить SoftIce.. отлаживаю DbgView 4.5 делаю сообщения и смотрю - впринципе удобно.. но в этом случае не спасает!!!

    У меня в SoftIce почему то драйвер вгрузить не может... хотя SymbolLoader32 загружаю.. все делаю как в хелпе..

    Может есть другой более удобный пошаговый отладчик.. пусть простенький!