Инсталляция драйвера из режима ядра

Тема в разделе "WASM.NT.KERNEL", создана пользователем hlt, 14 май 2008.

  1. hlt

    hlt Member

    Публикаций:
    0
    Регистрация:
    21 дек 2007
    Сообщения:
    56
    Народ, извиняюсь, возможно за банальную тему, - поиск чего-то не помог...
    Итак, задача - драйвер А должен установить простенький драйвер Б в систему. Драйвер Б должен загрузиться только после ребута.
    В реестре в службах прописал -
    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>

    После ребута, драйвер не загружается :dntknw:... Определенно что-то надо еще куда-то писать, подскажите плиз. (Драйвер стопудово есть в указанном месте).
     
  2. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    По-хорошему нужен ещё параметр ErrorControl=1 типа dword...
     
  3. hlt

    hlt Member

    Публикаций:
    0
    Регистрация:
    21 дек 2007
    Сообщения:
    56
    это тоже есть.... забыл написать тут...
     
  4. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    Предлагаю попробовать по очереди следующие действия:
    1. Сменить Start с 1 на 2 - драйвер будет загружаться позднее, но всё равно на этапе загрузки системы.
    2. Сменить ImagePath на полный - \SystemRoot\System32\drivers\<driver>.sys.
    3. Попробовать загрузить драйвер B другими методами - может быть, дело в нём самом?
     
  5. hlt

    hlt Member

    Публикаций:
    0
    Регистрация:
    21 дек 2007
    Сообщения:
    56
    Пробовал...

    Сейчас кстати, попробовал вот что... - все те же значения в реестре, но, решил запустить драйвер руцями сразу после прописки... - чото типа такого -
    ZwLoadDriver(&blabla), где blabla - юникод строка \registry\machine\system\currentcontrolset\services\myservice
    и... получил вот что - STATUS_OBJECT_NAME_NOT_FOUND
     
  6. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    А точно драйвер не загружается? Может быть, просто DriverEntry возвращает ошибку?
    Я писал код для загрузки драйвера вручную, правда, со стартом по запросу и из user-mode, но создавал в реестре только указанные выше 5 значений, и у меня ZwLoadDriver нормально работала...
     
  7. hlt

    hlt Member

    Публикаций:
    0
    Регистрация:
    21 дек 2007
    Сообщения:
    56
    Стопудово. у меня в DriverEntry дебагпринт.
    Кстати, вопрос... - а может ли DriverEntry драйвера вызывать ZwLoadDriver ? Просто у меня инсталляция/загрузка драйвера Б идет из DriverEntry драйвера А...
     
  8. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    Вроде может.
    Код драйвера A - в студию!
     
  9. hlt

    hlt Member

    Публикаций:
    0
    Регистрация:
    21 дек 2007
    Сообщения:
    56
    Код, который занимается прописью в реестре -
    Код (Text):
    1. NTSTATUS InstallToControlSet(PUNICODE_STRING ServiceRegPath, wchar_t * ServiceName, PUNICODE_STRING DriverPath) {
    2.  
    3.     // ServiceRegPath  - \registry\machine\system\currentcontrolset\services\<service_name>
    4.     // ServiceName - <service_name>
    5.     // DriverPath - system32\drivers\<service_name>.sys
    6.    
    7.     DECLARE_CONST_UNICODE_STRING(TypeUStr, L"Type");
    8.     DECLARE_CONST_UNICODE_STRING(ImagePathUStr, L"ImagePath");
    9.     DECLARE_CONST_UNICODE_STRING(StartUStr, L"Start");
    10.     DECLARE_CONST_UNICODE_STRING(ErrorControlUStr, L"ErrorControl");
    11.     DECLARE_CONST_UNICODE_STRING(DisplayNameUStr, L"DisplayName");
    12.  
    13.     OBJECT_ATTRIBUTES Attrs;
    14.     InitializeObjectAttributes(&Attrs, ServiceRegPath, OBJ_KERNEL_HANDLE | OBJ_CASE_INSENSITIVE, NULL, NULL);
    15.  
    16.     HANDLE Handle;
    17.     ULONG Disposition; 
    18.     NTSTATUS Status = ZwCreateKey(&Handle, KEY_ALL_ACCESS, &Attrs, 0, NULL, REG_OPTION_NON_VOLATILE, &Disposition);
    19.  
    20.     if (!NT_SUCCESS(Status)) {
    21.         return Status;
    22.     };
    23.  
    24.     ULONG TypeValue = 1;
    25.     Status = ZwSetValueKey(Handle, (PUNICODE_STRING)&TypeUStr, 0, REG_DWORD, &TypeValue, sizeof(TypeValue));
    26.     if (!NT_SUCCESS(Status))
    27.         goto close_and_exit;
    28.  
    29.     ULONG StartValue = 1;
    30.     Status = ZwSetValueKey(Handle, (PUNICODE_STRING)&StartUStr, 0, REG_DWORD, &StartValue, sizeof(StartValue));
    31.  
    32.     if (!NT_SUCCESS(Status))
    33.         goto close_and_exit;
    34.  
    35.     ULONG ErrorControlValue = 1;
    36.     Status = ZwSetValueKey(Handle, (PUNICODE_STRING)&ErrorControlUStr, 0, REG_DWORD, &ErrorControlValue, sizeof(ErrorControlValue));
    37.     if (!NT_SUCCESS(Status))
    38.         goto close_and_exit;
    39.  
    40.     Status = ZwSetValueKey(Handle, (PUNICODE_STRING)&DisplayNameUStr, 0, REG_SZ, ServiceName, 8*sizeof(wchar_t));
    41.     if (!NT_SUCCESS(Status))
    42.         goto close_and_exit;
    43.  
    44.     Status = ZwSetValueKey(Handle, (PUNICODE_STRING)&ImagePathUStr, 0, REG_EXPAND_SZ, DriverPath->Buffer, DriverPath->Length);
    45.     if (!NT_SUCCESS(Status))
    46.         goto close_and_exit;
    47.  
    48. close_and_exit:
    49.     h_ZwClose(Handle);
    50.  
    51.     return Status;
    52. };[/quote]
    53. далее просто вызывается так -
    54. [quote]Status = InstallToControlSet(&ServicePath, ServiceName, &ImagePath);
    55.         if (!NT_SUCCESS(Status))
    56.             return Status;
    57.  
    58.         Status = ZwLoadDriver(&ServicePath);
    На этом этапе получаю ошибку C0000034 (STATUS_OBJECT_NAME_NOT_FOUND)
     
  10. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    Из описания 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.
     
  11. hlt

    hlt Member

    Публикаций:
    0
    Регистрация:
    21 дек 2007
    Сообщения:
    56
    Сенкс, точно... попустило...