Не выполняется AddDevice

Тема в разделе "WASM.WIN32", создана пользователем donaire, 6 янв 2006.

  1. donaire

    donaire New Member

    Публикаций:
    0
    Регистрация:
    8 дек 2004
    Сообщения:
    25
    Адрес:
    k-jarve
    Вопрос повторю ещё. Драйвер работает как драйвер NT. Использую Windows Server 2003, VC++6, DDK-2000.

    После DriverEntry сразу вызывается Unload, в AddDevice даже не входит. И драйвер соотв. выгружается. Почему?

    Если использовать код с условными директивами, то работает не ветка #ifdef WIN2K, а #else. Тогда он остаётся в памяти и работает (но выгрузить не получается, сбой на StopService, а ОС при выключении виснет).

    Пришлите пожалуйста кто-нибудь код драйвера, который реально работает в такой конфигурации как у меня. По-правильному, с MJ_POWER и т.п. Благодарю!
     
  2. donaire

    donaire New Member

    Публикаций:
    0
    Регистрация:
    8 дек 2004
    Сообщения:
    25
    Адрес:
    k-jarve
    Для примера использовал обычный драйвер простой с сайта руссиновича.
     
  3. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
  4. donaire

    donaire New Member

    Публикаций:
    0
    Регистрация:
    8 дек 2004
    Сообщения:
    25
    Адрес:
    k-jarve
    И где там ответ на мой вопрос?
     
  5. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    NT-драйвера - они не PnP, т.е. у них нет AddDevice в принципе. PnP драйвера DriverEntry практически ничего не делают. Точно не помню, но кажется если такой драйвер грузить через SCM, то по выходу из DriverEntry система видит, что драйвер не создал DeviceObject и оставил нетронутым массив MajorFunction, то принудительно его выгружает ибо зачем он такой нужен?



    Если уже есть DDK-2000, зачем какие-то исходники? Там их полно. Начни с toaster.
     
  6. donaire

    donaire New Member

    Публикаций:
    0
    Регистрация:
    8 дек 2004
    Сообщения:
    25
    Адрес:
    k-jarve
    Как это "не создал DeviceObject и оставил нетронутым массив MajorFunction", как раз массив он заполнил, и

    DriverObject->DriverExtension->AddDevice = AddDevice;

    создал, теперь по идее должна вызываться AddDevice, где и создаётся объект устройства. Так вот, не вызывается AddDevice, сразу выгружается.
     
  7. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    <font color="gray][ donaire</font><!--color--><font color="gray]: Драйвер работает как драйвер NT. ... в AddDevice даже не входит. ]</font><!--color-->



    Под "Драйвер работает как драйвер NT" я понимаю загрузку PnP драйвера средствами SCM ( StartService ). В этом случае во-первых, AddDevice никто никогда звать и не будет. AddDevice вызывается только если драйвер грузится PnP менеджером. Во-вторых, здесь уже есть противоречие. Драйверы с стиле NT (legacy) создают DeviceObject в DriverEntry, а PnP драйверы создают DeviceObject в AddDevice (исключение Control Device Object, который может быть создан и в DriverEntry). Т.е. получается, что твой драйвер даже если он останется в памяти никогда не создаст DeviceObject, т.к. AddDevice не будет вызвана. Если нет DeviceObject, то нет и target'а для IRP. В этом случае драйвер просто болтается в памяти.





    <font color="gray][ donaire</font><!--color--><font color="gray]: теперь по идее должна вызываться AddDevice, где и создаётся объект устройства. ]</font><!--color-->



    Нет! Почему - только что ответил выше.



    У тебя 99% происходит вот что:
    Код (Text):
    1. BOOLEAN
    2. IopIsLegacyDriver (
    3.     IN PDRIVER_OBJECT DriverObject
    4.     )
    5. {
    6.     . . .
    7.     if (DriverObject->DriverExtension->AddDevice) {
    8.         return FALSE;
    9.     }
    10.     . . .
    11. }
    12.  
    13. NTSTATUS
    14. IopLoadDriver(
    15.     IN HANDLE KeyHandle,
    16.     IN BOOLEAN CheckForSafeBoot
    17.     )
    18. {
    19.     . . .
    20.     status = driverObject->DriverInit( driverObject, &registryPath->Name );
    21.     . . .
    22.  
    23.     if ( NT_SUCCESS(status) && !IopIsLegacyDriver(driverObject) ) {
    24.  
    25.         if ( driverObject->DeviceObject == NULL . . . ) {
    26.  
    27.             IopDriverLoadingFailed(KeyHandle, NULL);
    28.             status = STATUS_PLUGPLAY_NO_DEVICE;
    29.  
    30.         }
    31.         . . .
    32.  
    33.         if ( !NT_SUCCESS(status)) {
    34.  
    35.             . . .
    36.             driverObject->DriverUnload( driverObject );
    37.         }
    38.     }
    39.  
    40.     . . .
    41.     return status;
    42. }


    Сразу по выходу из DriverEntry IopIsLegacyDriver увидит, что DriverObject->DriverExtension->AddDevice != NULL и вернёт FALSE и затем IopLoadDriver видя, что driverObject->DeviceObject == NULL, запихает в status код STATUS_PLUGPLAY_NO_DEVICE. Ну и сразу выгрузит твой драйвер.



    ЗЫ: Как правило, вести настолько удалённую отладку, к тому же практически без входных данных, крайне затруднительно и утомительно :dntknw:
     
  8. donaire

    donaire New Member

    Публикаций:
    0
    Регистрация:
    8 дек 2004
    Сообщения:
    25
    Адрес:
    k-jarve
    А если автоматом из реестра будет его грузить ОС, как он будет выполняться?
     
  9. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Если ты имеешь ввиду SERVICE_BOOT_START / SERVICE_SYSTEM_START / SERVICE_AUTO_START в CreateService, то поведение не изменится. Если же зарегистрировать как PnP-драйвер, например, повесить его как Upper Level Class Filter, прописав в нужную ветвь реестра HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\ ключ UpperFilters = <имя сервиса>, то будет грузится как PnP драйвер с вызовом AddDevice.



    Одно не понятно - нафига это нужно: грузить PnP драйвер как legacy?
     
  10. donaire

    donaire New Member

    Публикаций:
    0
    Регистрация:
    8 дек 2004
    Сообщения:
    25
    Адрес:
    k-jarve
    Да нет, мне вообще нужно просто создать драйвер для работы в ядре. Он должен будет запускаться автоматичеси при старте системы по ключу реестра. А пока я пишу сам код, мне, естественно, надо запускать его для проверки работы, того, что написал. Для этого я по-быстрому написал утилиту с CreateService, StartService и т.д., пользуясь советами из книги Шрайбера. Предполагал, что если определено W2K, то он должен и работать соответственно, а legacy - это для более ранних ОС, оставлено для совместимости. Но тут обнаружил, что он работает, как работает. Вот и спрашиваю в чём проблема, ведь подобное нигде не описано! Теперь оказывается, сто ср-ва СКАМ загружают драйверы не так. Поставил на днях SoftIce, может там есть утилита, которая загружет драйвер "на лету" так, как PnP менеджер? Вообще, как мне запускать драйвер, чтобы он работал так, как предполагается будет работать в конце концов, то есть автозапуском? Или же для таких случаев надо создавать legacy? Но тогда ещё проблема, как его выгружать? Он у меня моей утилитой не выгружается, а при отключении компьютера на последней стадии ОС зависает и отключать приходится кнопкой, то есть и ОС не может его выгрузить.
     
  11. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    <font color="gray][ donaire</font><!--color--><font color="gray]: Предполагал, что если определено W2K, то он должен и работать соответственно, а legacy - это для более ранних ОС, оставлено для совместимости. ]</font><!--color-->



    Определение/неопределение константы W2K никак не влияет на архитектуру и способ загрузки драйвера. Если он был legacy, то так и останется legacy. Если был PnP - останется PnP.





    <font color="gray][ donaire</font><!--color--><font color="gray]: Поставил на днях SoftIce, может там есть утилита, которая загружет драйвер "на лету" так, как PnP менеджер? ]</font><!--color-->



    Там есть EzDriverInstaller, но она тебе не поможет.





    <font color="gray][ donaire</font><!--color--><font color="gray]: Вообще, как мне запускать драйвер, чтобы он работал так, как предполагается будет работать в конце концов, то есть автозапуском? ]</font><!--color-->



    Используй SERVICE_AUTO_START в вызове CreateService.





    <font color="gray][ donaire</font><!--color--><font color="gray]: Или же для таких случаев надо создавать legacy? Но тогда ещё проблема, как его выгружать? Он у меня моей утилитой не выгружается, а при отключении компьютера на последней стадии ОС зависает и отключать приходится кнопкой, то есть и ОС не может его выгрузить. ]</font><!--color-->



    Насколько можно заключить из твоих слов, тебе нужен именно legacy-драйвер. Если всё сделать правильно, то загружаться и выгружаться будет без проблем. То что у тебя косяк, означает только то, что ты где-то накосячил. У того же Шрайбера в книге все дрова legacy. Прекрасно грузятся и выгружаются без проблем. И в книге, кажется, всё подробно расписано. Бери оттуда заготовку драйвера, а не используй PnP-драйвер. Если мало, можешь почитать этот цикл: http://www.wasm.ru/author.php?author=Four-F Заточка под асм, но вся нужная теория там есть.
     
  12. donaire

    donaire New Member

    Публикаций:
    0
    Регистрация:
    8 дек 2004
    Сообщения:
    25
    Адрес:
    k-jarve
    Спасибо за помощь, буду пробовать, а те статьи я читал почти всё. Пожалуй, это лучшее руководство для начинающих, неплохо было бы добавить и вообще издать книгу страниц на 600*))) Я бы сразу такую купил! Успехов!