Народ, извиняюсь, возможно за банальную тему, - поиск чего-то не помог... Итак, задача - драйвер А должен установить простенький драйвер Б в систему. Драйвер Б должен загрузиться только после ребута. В реестре в службах прописал - CurrentControlSet\Services\<my_driver>\Type = 1 CurrentControlSet\Services\<my_driver>\Start = 1 CurrentControlSet\Services\<my_driver>\ImagePath = system32\drivers\<my_driver>.sys CurrentControlSet\Services\<my_driver>\DisplayName = <my_driver> После ребута, драйвер не загружается ... Определенно что-то надо еще куда-то писать, подскажите плиз. (Драйвер стопудово есть в указанном месте).
Предлагаю попробовать по очереди следующие действия: 1. Сменить Start с 1 на 2 - драйвер будет загружаться позднее, но всё равно на этапе загрузки системы. 2. Сменить ImagePath на полный - \SystemRoot\System32\drivers\<driver>.sys. 3. Попробовать загрузить драйвер B другими методами - может быть, дело в нём самом?
Пробовал... Сейчас кстати, попробовал вот что... - все те же значения в реестре, но, решил запустить драйвер руцями сразу после прописки... - чото типа такого - ZwLoadDriver(&blabla), где blabla - юникод строка \registry\machine\system\currentcontrolset\services\myservice и... получил вот что - STATUS_OBJECT_NAME_NOT_FOUND
А точно драйвер не загружается? Может быть, просто DriverEntry возвращает ошибку? Я писал код для загрузки драйвера вручную, правда, со стартом по запросу и из user-mode, но создавал в реестре только указанные выше 5 значений, и у меня ZwLoadDriver нормально работала...
Стопудово. у меня в DriverEntry дебагпринт. Кстати, вопрос... - а может ли DriverEntry драйвера вызывать ZwLoadDriver ? Просто у меня инсталляция/загрузка драйвера Б идет из DriverEntry драйвера А...
Код, который занимается прописью в реестре - Код (Text): NTSTATUS InstallToControlSet(PUNICODE_STRING ServiceRegPath, wchar_t * ServiceName, PUNICODE_STRING DriverPath) { // ServiceRegPath - \registry\machine\system\currentcontrolset\services\<service_name> // ServiceName - <service_name> // DriverPath - system32\drivers\<service_name>.sys DECLARE_CONST_UNICODE_STRING(TypeUStr, L"Type"); DECLARE_CONST_UNICODE_STRING(ImagePathUStr, L"ImagePath"); DECLARE_CONST_UNICODE_STRING(StartUStr, L"Start"); DECLARE_CONST_UNICODE_STRING(ErrorControlUStr, L"ErrorControl"); DECLARE_CONST_UNICODE_STRING(DisplayNameUStr, L"DisplayName"); OBJECT_ATTRIBUTES Attrs; InitializeObjectAttributes(&Attrs, ServiceRegPath, OBJ_KERNEL_HANDLE | OBJ_CASE_INSENSITIVE, NULL, NULL); HANDLE Handle; ULONG Disposition; NTSTATUS Status = ZwCreateKey(&Handle, KEY_ALL_ACCESS, &Attrs, 0, NULL, REG_OPTION_NON_VOLATILE, &Disposition); if (!NT_SUCCESS(Status)) { return Status; }; ULONG TypeValue = 1; Status = ZwSetValueKey(Handle, (PUNICODE_STRING)&TypeUStr, 0, REG_DWORD, &TypeValue, sizeof(TypeValue)); if (!NT_SUCCESS(Status)) goto close_and_exit; ULONG StartValue = 1; Status = ZwSetValueKey(Handle, (PUNICODE_STRING)&StartUStr, 0, REG_DWORD, &StartValue, sizeof(StartValue)); if (!NT_SUCCESS(Status)) goto close_and_exit; ULONG ErrorControlValue = 1; Status = ZwSetValueKey(Handle, (PUNICODE_STRING)&ErrorControlUStr, 0, REG_DWORD, &ErrorControlValue, sizeof(ErrorControlValue)); if (!NT_SUCCESS(Status)) goto close_and_exit; Status = ZwSetValueKey(Handle, (PUNICODE_STRING)&DisplayNameUStr, 0, REG_SZ, ServiceName, 8*sizeof(wchar_t)); if (!NT_SUCCESS(Status)) goto close_and_exit; Status = ZwSetValueKey(Handle, (PUNICODE_STRING)&ImagePathUStr, 0, REG_EXPAND_SZ, DriverPath->Buffer, DriverPath->Length); if (!NT_SUCCESS(Status)) goto close_and_exit; close_and_exit: h_ZwClose(Handle); return Status; };[/quote] далее просто вызывается так - [quote]Status = InstallToControlSet(&ServicePath, ServiceName, &ImagePath); if (!NT_SUCCESS(Status)) return Status; Status = ZwLoadDriver(&ServicePath); На этом этапе получаю ошибку C0000034 (STATUS_OBJECT_NAME_NOT_FOUND)
Из описания ZwSetValueKey: DataSize: Specifies the size, in bytes, of the Data buffer. If Type is REG_XXX_SZ, this value must include space for any terminating zeroes. При установке ImagePath последним аргументом передавай DriverPath->Length+2. IopLoadDriver после запроса значения ImagePath без размышлений режет последний wchar.