драйвер не стартует

Тема в разделе "WASM.NT.KERNEL", создана пользователем cresta, 17 ноя 2008.

  1. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    .reg файл:

    Код (Text):
    1. Windows Registry Editor Version 5.00
    2.  
    3. [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\winrsc]
    4. "DisplayName"="winrsc"
    5. "ErrorControl"=dword:00000000
    6. "ImagePath"=hex(2):73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,44,00,\
    7.   52,00,49,00,56,00,45,00,52,00,53,00,5c,00,77,00,69,00,6e,00,72,00,73,00,63,\
    8.   00,2e,00,73,00,79,00,73,00,00,00
    9. "Restart"=hex:0a,07,14,08
    10. "Start"=dword:00000002
    11. "Type"=dword:00000001
    12.  
    13. [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\winrsc\Enum]
    14. "0"="Root\\LEGACY_WINRSC\\0000"
    15. "Count"=dword:00000001
    16. "NextInstance"=dword:00000001
    17.  
    18. [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\winrsc\Security]
    19. "0"=hex:01,00,14,80,90,00,00,00,9c,00,00,00,14,00,00,00,30,00,00,00,02,00,1c,\
    20.   00,01,00,00,00,02,80,14,00,ff,01,0f,00,01,01,00,00,00,00,00,01,00,00,00,00,\
    21.   02,00,60,00,04,00,00,00,00,00,14,00,fd,01,02,00,01,01,00,00,00,00,00,05,12,\
    22.   00,00,00,00,00,18,00,ff,01,0f,00,01,02,00,00,00,00,00,05,20,00,00,00,20,02,\
    23.   00,00,00,00,14,00,8d,01,02,00,01,01,00,00,00,00,00,05,0b,00,00,00,00,00,18,\
    24.   00,fd,01,02,00,01,02,00,00,00,00,00,05,20,00,00,00,23,02,00,00,01,01,00,00,\
    25.   00,00,00,05,12,00,00,00,01,01,00,00,00,00,00,05,12,00,00,00
    sys:

    Код (Text):
    1. NTSTATUS DriverEntry(PDRIVER_OBJECT  DriverObject, PUNICODE_STRING RegistryPath ){
    2.     NTSTATUS                            st;
    3.     LARGE_INTEGER                       CurrentTime;
    4.     LARGE_INTEGER                       StopTime;
    5.     PVOID                               pInfo = 0;
    6.     ULONG                               dwSize = 0x8000;
    7.     ULONG                               dwReturn;
    8.     SYSTEM_TIME_OF_DAY_INFORMATION      Date;
    9.     TIME_FIELDS                         tFields;
    10.    
    11.     TIME_FIELDS                         tStopFields;
    12.    
    13.     UNREFERENCED_PARAMETER  (RegistryPath);
    14.    
    15.  
    16.    
    17.     DbgPrint("---------------DriverEntry-----------------");
    18.  
    19.     RtlZeroMemory(&tStopFields, sizeof (TIME_FIELDS));
    20.     tStopFields.Year = 2008;
    21.     tStopFields.Month = 11;
    22.     tStopFields.Day = 17;
    23.    
    24.     if ( RtlTimeFieldsToTime(&tStopFields, &StopTime) ){
    25.         DbgPrint ("Converted");
    26.         //expiration time converted to filetime
    27.         st = ZwQuerySystemInformation (3, &Date, sizeof(SYSTEM_TIME_OF_DAY_INFORMATION), &dwReturn);
    28.         if (st == STATUS_SUCCESS){
    29.             DbgPrint ("Loaded");
    30.             DbgPrint ("Date.BootTime.HighPart = %d", Date.BootTime.HighPart);
    31.             DbgPrint ("StopTime.HighPart = %d", StopTime.HighPart);
    32.             //system boot time loaded
    33.             //compare it with converted expiration time
    34.             if ( Date.BootTime.HighPart > StopTime.HighPart ){
    35.                 //reboot
    36.                 DbgPrint ("REBOOT");
    37.                 NtShutdownSystem(1);
    38.             }
    39.             else if (Date.BootTime.HighPart == StopTime.HighPart){
    40.                 if (Date.BootTime.LowPart > StopTime.LowPart ){
    41.                     //reboot
    42.                     DbgPrint ("REBOOT");
    43.                     NtShutdownSystem(1);
    44.                 }
    45.             }
    46.         }
    47.     }
    48.    
    49.    
    50.     DriverObject->DriverUnload = DriverUnload;
    51.  
    52.     return STATUS_SUCCESS;
    53. }
    При загрузке системы стартует через раз, когда захочет. При запуске вручную (kmdmanager) все нормально.

    Что может быть неверно в реестре?
    Или в driverentry?
     
  2. ams007

    ams007 New Member

    Публикаций:
    0
    Регистрация:
    28 апр 2007
    Сообщения:
    86
    Где девайс обжект? если не создается девайс обджект - система прибъет драйвер в большинстве случаев.
     
  3. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Думаю, что прибьет на выходе из driver entry.
    А тогда мне уже всё равно. Всё что нужно уже будет сделано.

    Хотя сейчас попробую, может не прибивает, а просто не загружает образ
     
  4. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Нет, дело не в deviceobject...
     
  5. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    cresta
    Как ты определяешь, что "стартует через раз, когда захочет"?

    Какой компилятор используешь? Неужели он не умеет генерировать код для
    Код (Text):
    1. if (Date.BootTime.QuadPart > StopTime.QuadPart)
     
  6. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    так не может быть

    что означает стартует через раз? Вообще не запускается драйвер и его драйвер ентри? Или сервис запускается но в ней внутри чтото не так?
     
  7. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    я не совсем верно выразился. Подробней всё выглядит так:
    Делаю ключ в реестре (тот, что в первом посте), драйвер ложу в system32\drivers и перезапускаю комп.
    Если драйвер при перезапуске загрузится, то он при входе пользователя в систему перезагрузит ком. И так много раз...
    Но при перезагрузке юзер спокойно входит в систему и работает. Следовательно, драйвер не загрузился и не отработал. Для контроля пробовал в driverentry создавать лог-файл : файл не создается.
    После этого я запускаю драйвер через kmdmanager, драйвер запускается и происходит ребут.
    Все дальнейшие загрузки компа уже приводят в срабатыванию драйвера и получается зацикленный ребут.
    Т.е. нужен первый толчок от kmdmanager'а, а потом всё идёт как надо.

    Вот такая картина.

    q_q
    Компилятор из ddk (vc)
    Но дело не в QuadPart /LowPart+HighPart
     
  8. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    cresta
    тебе уголовный кодекс может поможет?
     
  9. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    wsd
    не надо делать выводов.
    Тем более, что тебе абсолютно ничего не известно о применении этого кода
     
  10. mc black

    mc black Member

    Публикаций:
    0
    Регистрация:
    19 янв 2005
    Сообщения:
    213
    Адрес:
    Russia, N.Novgorod
    Хочу сказать, что стоило бы другим способом отлаживать пример )
     
  11. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    cresta
    > Если драйвер при перезапуске загрузится, то он при входе пользователя в систему перезагрузит ком.
    Это, ясно глядя на NtShutdownSystem.
    Неясно как перезагрузку компьютера можно использовать в качестве критерия удачной загрузки драйвера?

    Привилегия на перезагрузку есть? Или она не нужна?

    > пробовал в driverentry создавать лог-файл : файл не создается
    Выяснил почему?

    mc black
    А описать способ не хочешь?
     
  12. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    q_q
    Поэтому я и пытался создавать лог-файл, как некий индикатор того, что driverentry выполняется. Для создания файла никаких привилегий не нужно, поэтому я могу сделать вывод что драйвер не грузится.

    Что касается перезагрузки, то под админом думаю что никаких привилегий дополнительных не нужно.
    Во всяком случае при программном запуске достаточно проверить через CheckTokenMembership принадлежность к группе администраторов.

    Кроме того, ключ реестра идентичен остальным ключам ветки services (за исключением imagepath).
    Т.е. проблема с правами может быть только на стадии установки драйвера. Но не на стадии запуска

    Может есть некие системные настройки, блокирующие запуск драйверов (xpsp2)?
     
  13. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    cresta
    > пытался создавать лог-файл, как некий индикатор того, что driverentry выполняется
    Теперь понял.

    Прицепляй минимальный код, который воспроизводит ошибку.
     
  14. ams007

    ams007 New Member

    Публикаций:
    0
    Регистрация:
    28 апр 2007
    Сообщения:
    86
    cresta
    Прошу прощения, не вчитался. Суть твоей проблемы в специфике кода в драйвере, а именно - в перезагрузке. Все дело в организации реестра. CurrentControlSet - это динамическая ветвь реестра, которая формируется из ControlSet00n при старте системы.
    ControlSet00n -ов может быть несколько, минимум два. в папке Select есть следующие параметры: Default - это n "по умолчанию", Current - n "текущая", LastKnowGood - последняя удачная. Когда ты впервые запускаешь драйвер, твои ключи пишутся в CurrentControlSet, тоесть в ControlSet00n, где n == Current. Система ребутится, LastKnowGood не изменяется на Current. При последующей загрузке используется ControlSet00n, где n == LastKnowGood, в которой нет квоих ключей. Вот собстна и все. Благодарю за внимание)))).
    ЗЫ: Внимание всем "дровосекам"! Момент скользкий, стоит его учитывать.
     
  15. ams007

    ams007 New Member

    Публикаций:
    0
    Регистрация:
    28 апр 2007
    Сообщения:
    86
    Решение м.б. такое(правда корявое): комментишь ребуты, запускаешь драйвер, выкл. машину, вкл. машину, и повторяешь операцию. Потом делаешь в драйвере что хочешь, главное - его просто подменить, а не выгрузить/загрузить.

    Такой способ не покатит, если не будешь создавать девайс обджект, т.к. драйвер отработает и система его прибьет, т.е. он выгрузится до выключения машины.
     
  16. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Ну логика в этом просматривается.
    Надо наверное первый запуск драйвера сделать холостым: просто загрузился, оставил метку (файл, ключ реестра и т.п.) и ничего более, чтобы прописаться в LastKnowGood, а при следующей загрузке (если найдена метка) уже полностью реализовывать функционал драйвера.

    Либо делать ключи во всех разделах, и CurrentControlSet, и ControlSetххх
    В общем попробую
     
  17. Dian

    Dian Member

    Публикаций:
    0
    Регистрация:
    19 июн 2008
    Сообщения:
    222
    cresta, а почему бы просто не прописывать метку в статической части реестра?
     
  18. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    В общем, дублирование ключа в разных ветках ничего не даёт.
    Как я понял, в реестре отображается база данных service control manager'а. Созданием ключа изменений в базе данных не сделать. Нужно вносить сервис в базу данных и тогда появится ключ.