.reg файл: Код (Text): Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\winrsc] "DisplayName"="winrsc" "ErrorControl"=dword:00000000 "ImagePath"=hex(2):73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,44,00,\ 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,\ 00,2e,00,73,00,79,00,73,00,00,00 "Restart"=hex:0a,07,14,08 "Start"=dword:00000002 "Type"=dword:00000001 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\winrsc\Enum] "0"="Root\\LEGACY_WINRSC\\0000" "Count"=dword:00000001 "NextInstance"=dword:00000001 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\winrsc\Security] "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,\ 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,\ 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,\ 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,\ 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,\ 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,\ 00,00,00,05,12,00,00,00,01,01,00,00,00,00,00,05,12,00,00,00 sys: Код (Text): NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath ){ NTSTATUS st; LARGE_INTEGER CurrentTime; LARGE_INTEGER StopTime; PVOID pInfo = 0; ULONG dwSize = 0x8000; ULONG dwReturn; SYSTEM_TIME_OF_DAY_INFORMATION Date; TIME_FIELDS tFields; TIME_FIELDS tStopFields; UNREFERENCED_PARAMETER (RegistryPath); DbgPrint("---------------DriverEntry-----------------"); RtlZeroMemory(&tStopFields, sizeof (TIME_FIELDS)); tStopFields.Year = 2008; tStopFields.Month = 11; tStopFields.Day = 17; if ( RtlTimeFieldsToTime(&tStopFields, &StopTime) ){ DbgPrint ("Converted"); //expiration time converted to filetime st = ZwQuerySystemInformation (3, &Date, sizeof(SYSTEM_TIME_OF_DAY_INFORMATION), &dwReturn); if (st == STATUS_SUCCESS){ DbgPrint ("Loaded"); DbgPrint ("Date.BootTime.HighPart = %d", Date.BootTime.HighPart); DbgPrint ("StopTime.HighPart = %d", StopTime.HighPart); //system boot time loaded //compare it with converted expiration time if ( Date.BootTime.HighPart > StopTime.HighPart ){ //reboot DbgPrint ("REBOOT"); NtShutdownSystem(1); } else if (Date.BootTime.HighPart == StopTime.HighPart){ if (Date.BootTime.LowPart > StopTime.LowPart ){ //reboot DbgPrint ("REBOOT"); NtShutdownSystem(1); } } } } DriverObject->DriverUnload = DriverUnload; return STATUS_SUCCESS; } При загрузке системы стартует через раз, когда захочет. При запуске вручную (kmdmanager) все нормально. Что может быть неверно в реестре? Или в driverentry?
Думаю, что прибьет на выходе из driver entry. А тогда мне уже всё равно. Всё что нужно уже будет сделано. Хотя сейчас попробую, может не прибивает, а просто не загружает образ
cresta Как ты определяешь, что "стартует через раз, когда захочет"? Какой компилятор используешь? Неужели он не умеет генерировать код для Код (Text): if (Date.BootTime.QuadPart > StopTime.QuadPart)
так не может быть что означает стартует через раз? Вообще не запускается драйвер и его драйвер ентри? Или сервис запускается но в ней внутри чтото не так?
я не совсем верно выразился. Подробней всё выглядит так: Делаю ключ в реестре (тот, что в первом посте), драйвер ложу в system32\drivers и перезапускаю комп. Если драйвер при перезапуске загрузится, то он при входе пользователя в систему перезагрузит ком. И так много раз... Но при перезагрузке юзер спокойно входит в систему и работает. Следовательно, драйвер не загрузился и не отработал. Для контроля пробовал в driverentry создавать лог-файл : файл не создается. После этого я запускаю драйвер через kmdmanager, драйвер запускается и происходит ребут. Все дальнейшие загрузки компа уже приводят в срабатыванию драйвера и получается зацикленный ребут. Т.е. нужен первый толчок от kmdmanager'а, а потом всё идёт как надо. Вот такая картина. q_q Компилятор из ddk (vc) Но дело не в QuadPart /LowPart+HighPart
cresta > Если драйвер при перезапуске загрузится, то он при входе пользователя в систему перезагрузит ком. Это, ясно глядя на NtShutdownSystem. Неясно как перезагрузку компьютера можно использовать в качестве критерия удачной загрузки драйвера? Привилегия на перезагрузку есть? Или она не нужна? > пробовал в driverentry создавать лог-файл : файл не создается Выяснил почему? mc black А описать способ не хочешь?
q_q Поэтому я и пытался создавать лог-файл, как некий индикатор того, что driverentry выполняется. Для создания файла никаких привилегий не нужно, поэтому я могу сделать вывод что драйвер не грузится. Что касается перезагрузки, то под админом думаю что никаких привилегий дополнительных не нужно. Во всяком случае при программном запуске достаточно проверить через CheckTokenMembership принадлежность к группе администраторов. Кроме того, ключ реестра идентичен остальным ключам ветки services (за исключением imagepath). Т.е. проблема с правами может быть только на стадии установки драйвера. Но не на стадии запуска Может есть некие системные настройки, блокирующие запуск драйверов (xpsp2)?
cresta > пытался создавать лог-файл, как некий индикатор того, что driverentry выполняется Теперь понял. Прицепляй минимальный код, который воспроизводит ошибку.
cresta Прошу прощения, не вчитался. Суть твоей проблемы в специфике кода в драйвере, а именно - в перезагрузке. Все дело в организации реестра. CurrentControlSet - это динамическая ветвь реестра, которая формируется из ControlSet00n при старте системы. ControlSet00n -ов может быть несколько, минимум два. в папке Select есть следующие параметры: Default - это n "по умолчанию", Current - n "текущая", LastKnowGood - последняя удачная. Когда ты впервые запускаешь драйвер, твои ключи пишутся в CurrentControlSet, тоесть в ControlSet00n, где n == Current. Система ребутится, LastKnowGood не изменяется на Current. При последующей загрузке используется ControlSet00n, где n == LastKnowGood, в которой нет квоих ключей. Вот собстна и все. Благодарю за внимание)))). ЗЫ: Внимание всем "дровосекам"! Момент скользкий, стоит его учитывать.
Решение м.б. такое(правда корявое): комментишь ребуты, запускаешь драйвер, выкл. машину, вкл. машину, и повторяешь операцию. Потом делаешь в драйвере что хочешь, главное - его просто подменить, а не выгрузить/загрузить. Такой способ не покатит, если не будешь создавать девайс обджект, т.к. драйвер отработает и система его прибьет, т.е. он выгрузится до выключения машины.
Ну логика в этом просматривается. Надо наверное первый запуск драйвера сделать холостым: просто загрузился, оставил метку (файл, ключ реестра и т.п.) и ничего более, чтобы прописаться в LastKnowGood, а при следующей загрузке (если найдена метка) уже полностью реализовывать функционал драйвера. Либо делать ключи во всех разделах, и CurrentControlSet, и ControlSetххх В общем попробую
В общем, дублирование ключа в разных ветках ничего не даёт. Как я понял, в реестре отображается база данных service control manager'а. Созданием ключа изменений в базе данных не сделать. Нужно вносить сервис в базу данных и тогда появится ключ.