Почему в DriverEntry нельзя работать с реестром?

Тема в разделе "WASM.NT.KERNEL", создана пользователем Llirik, 5 май 2011.

  1. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Например:
    Код (Text):
    1.  SetValueKey proc
    2.  
    3.  local oa:OBJECT_ATTRIBUTES
    4.  local hKey:HANDLE
    5.  
    6.      lea ecx, oa
    7.      InitializeObjectAttributes ecx, offset g_usUserKeyName, OBJ_CASE_INSENSITIVE, NULL, NULL
    8.      invoke ZwOpenKey, addr hKey, KEY_SET_VALUE, ecx
    9.          invoke ZwSetValueKey, hKey, addr KeyData2ValueName, 0, REG_BINARY, zlpRegScanCode, zlpcbCod
    10.  
    11.  invoke ZwClose, hKey
    12.      ret
    13.  
    14.  SetValueKey endp
    15.  QueryValueKey proc
    16.  local oa:OBJECT_ATTRIBUTES
    17.  local hKey:HANDLE
    18.     lea ecx, oa
    19.      InitializeObjectAttributes ecx, offset g_usUserKeyName, OBJ_CASE_INSENSITIVE, NULL, NULL
    20. invoke ZwOpenKey, addr hKey, KEY_QUERY_VALUE, ecx
    21.          invoke ZwQueryValueKey, hKey, addr zlpKeyDataValueName, \
    22.                                  KeyValuePartialInformation, NULL, 0, addr zlpcbCod
    23.          .if zlpcbCod != 0
    24.              invoke ExAllocatePool, PagedPool, zlpcbCod
    25.              .if eax != NULL
    26.                  mov zlpRegScanCode, eax
    27.                  invoke ZwQueryValueKey, hKey, addr zlpKeyDataValueName, \
    28.                      KeyValuePartialInformation, zlpRegScanCode, zlpcbCod, addr zlpcbCod
    29.  
    30. .endif
    31. .endif
    32.  invoke ZwClose, hKey
    33.      ret
    34.  QueryValueKey endp
    35. .....................
    36. .code INIT
    37. DriverEntry1 proc pDriverObject:PDRIVER_OBJECT, pusRegistryPath:PUNICODE_STRING
    38. local KeyeviceObject:PDEVICE_OBJECT
    39.  local status:NTSTATUS
    40.      mov status, STATUS_DEVICE_CONFIGURATION_ERROR
    41. invoke IoCreateDevice, pDriverObject, sizeof FiDO_DEVICE_EXTENSION, addr Qg_usDeviceName, FILE_DEVICE_UNKNOWN, \
    42.                                               0, TRUE, addr KeyDeviceObject
    43.  .if eax == STATUS_SUCCESS
    44.         invoke IoCreateSymbolicLink, addr g_usSymbolicLinkName, addr Qg_usDeviceName
    45.          .if eax == STATUS_SUCCESS
    46.             mov eax, pDriverObject
    47.              assume eax:PTR DRIVER_OBJECT
    48.     mov ecx, IRP_MJ_MAXIMUM_FUNCTION + 1
    49.     .while ecx
    50.     dec ecx
    51.     mov [eax].MajorFunction[ecx*(sizeof PVOID)], offset FiDO_DispatchPassThrough
    52.     .endw
    53.     mov [eax].MajorFunction[IRP_MJ_DEVICE_CONTROL*(sizeof PVOID)], offset CDO_DispatchDeviceControl
    54.     mov [eax].MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL*(sizeof PVOID)], offset CDO_DispatchDeviceControl
    55.     mov [eax].MajorFunction[IRP_MJ_PNP*(sizeof PVOID)], offset KbFilter_PnP
    56.     mov [eax].MajorFunction[IRP_MJ_POWER*(sizeof PVOID)], offset FiDO_DispatchPower
    57.     mov ecx, [eax].DriverExtension
    58.              assume ecx:PTR DRIVER_EXTENSION
    59.     mov [ecx].AddDevice, offset xKbFilter_AddDevice;
    60.         mov [eax].DriverUnload, offset DriverUnload
    61.              assume eax:nothing
    62.              assume ecx:nothing
    63.             mov status, STATUS_SUCCESS
    64.     call  QueryValueKey
    65. call  SetValueKey
    66.          .else
    67.             mov status, STATUS_DEVICE_NOT_CONNECTED
    68.              invoke IoDeleteDevice, KeyeviceObject
    69.  
    70.      .endif
    71. .endif
    72.      mov eax, status
    73. ret
    74. DriverEntry1 endp
    75.  end DriverEntry1
    ? Я имею ввиду драйверы, загружаемые вместе с виндой. И ещё я где-то допустил небольшую ошибочку и записываемая в реестр строка получается в два раза больше прочитанной из него, причем данные пишутся во вторую половину. Если подскажите где эта ошибка, скажу спасибо)
     
  2. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Сделай стадию запуска драйвера попозже, не 0, а допустим 3
     
  3. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Не могу. он должен обязательно загружаться до Kbdclass.sys. Поэтому я и начал эту тему.
    Хотя работать с реестром можно чуть чуть попозже, но тогда в какой функции это делать?
     
  4. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Можно в таймерной callback-функции. Пусть таймер клацает, пока запись в реестр не завершится успешно, потом прибить его (таймер, а не реестр).
     
  5. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    А ещё варианты? Например может есть сообщение из IRP_MJ_DEVICE_CONTROL или из IRP_MJ_INTERNAL_DEVICE_CONTROL после которого можно юзать реестр?

    И еще вопрос: почему ZwQueryValueKey возвращает в zlpcbCod в два раза больше нужного значения?
     
  6. Babyshamble

    Babyshamble New Member

    Публикаций:
    0
    Регистрация:
    2 май 2010
    Сообщения:
    67
    В воркайтем.
     
  7. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    ??????
     
  8. steelfactor

    steelfactor New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    501
    Llirik
    IoQueueWorkItem и иже с ними имелось ввиду
     
  9. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Раз не хотите мне сказать после какого события возможна работа с реестром, я сам этот IOCTL вычислил. и никакого таймера здесь не надо))
     
  10. Babyshamble

    Babyshamble New Member

    Публикаций:
    0
    Регистрация:
    2 май 2010
    Сообщения:
    67
    IoRegisterBootDriverReinitialization
     
  11. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Во-первых, я не нашёл описания этой функции на русском языке, так что я не знаю, что она делает и как ей пользоваться(
    Во-вторых, зачем вообще использовать какие-то функции, если можно ловить IOCTL?
     
  12. fsd

    fsd New Member

    Публикаций:
    0
    Регистрация:
    4 июл 2010
    Сообщения:
    353
    т.е. если на русском не описано вы лепите костыли?
     
  13. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Прошу мне это перевести на русский или ищу другой способ
     
  14. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    И я никак не понимаю, чем вам мой вариант с IOCTL не угодил?)