Например: Код (Text): SetValueKey proc local oa:OBJECT_ATTRIBUTES local hKey:HANDLE lea ecx, oa InitializeObjectAttributes ecx, offset g_usUserKeyName, OBJ_CASE_INSENSITIVE, NULL, NULL invoke ZwOpenKey, addr hKey, KEY_SET_VALUE, ecx invoke ZwSetValueKey, hKey, addr KeyData2ValueName, 0, REG_BINARY, zlpRegScanCode, zlpcbCod invoke ZwClose, hKey ret SetValueKey endp QueryValueKey proc local oa:OBJECT_ATTRIBUTES local hKey:HANDLE lea ecx, oa InitializeObjectAttributes ecx, offset g_usUserKeyName, OBJ_CASE_INSENSITIVE, NULL, NULL invoke ZwOpenKey, addr hKey, KEY_QUERY_VALUE, ecx invoke ZwQueryValueKey, hKey, addr zlpKeyDataValueName, \ KeyValuePartialInformation, NULL, 0, addr zlpcbCod .if zlpcbCod != 0 invoke ExAllocatePool, PagedPool, zlpcbCod .if eax != NULL mov zlpRegScanCode, eax invoke ZwQueryValueKey, hKey, addr zlpKeyDataValueName, \ KeyValuePartialInformation, zlpRegScanCode, zlpcbCod, addr zlpcbCod .endif .endif invoke ZwClose, hKey ret QueryValueKey endp ..................... .code INIT DriverEntry1 proc pDriverObject:PDRIVER_OBJECT, pusRegistryPath:PUNICODE_STRING local KeyeviceObject:PDEVICE_OBJECT local status:NTSTATUS mov status, STATUS_DEVICE_CONFIGURATION_ERROR invoke IoCreateDevice, pDriverObject, sizeof FiDO_DEVICE_EXTENSION, addr Qg_usDeviceName, FILE_DEVICE_UNKNOWN, \ 0, TRUE, addr KeyDeviceObject .if eax == STATUS_SUCCESS invoke IoCreateSymbolicLink, addr g_usSymbolicLinkName, addr Qg_usDeviceName .if eax == STATUS_SUCCESS mov eax, pDriverObject assume eax:PTR DRIVER_OBJECT mov ecx, IRP_MJ_MAXIMUM_FUNCTION + 1 .while ecx dec ecx mov [eax].MajorFunction[ecx*(sizeof PVOID)], offset FiDO_DispatchPassThrough .endw mov [eax].MajorFunction[IRP_MJ_DEVICE_CONTROL*(sizeof PVOID)], offset CDO_DispatchDeviceControl mov [eax].MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL*(sizeof PVOID)], offset CDO_DispatchDeviceControl mov [eax].MajorFunction[IRP_MJ_PNP*(sizeof PVOID)], offset KbFilter_PnP mov [eax].MajorFunction[IRP_MJ_POWER*(sizeof PVOID)], offset FiDO_DispatchPower mov ecx, [eax].DriverExtension assume ecx:PTR DRIVER_EXTENSION mov [ecx].AddDevice, offset xKbFilter_AddDevice; mov [eax].DriverUnload, offset DriverUnload assume eax:nothing assume ecx:nothing mov status, STATUS_SUCCESS call QueryValueKey call SetValueKey .else mov status, STATUS_DEVICE_NOT_CONNECTED invoke IoDeleteDevice, KeyeviceObject .endif .endif mov eax, status ret DriverEntry1 endp end DriverEntry1 ? Я имею ввиду драйверы, загружаемые вместе с виндой. И ещё я где-то допустил небольшую ошибочку и записываемая в реестр строка получается в два раза больше прочитанной из него, причем данные пишутся во вторую половину. Если подскажите где эта ошибка, скажу спасибо)
Не могу. он должен обязательно загружаться до Kbdclass.sys. Поэтому я и начал эту тему. Хотя работать с реестром можно чуть чуть попозже, но тогда в какой функции это делать?
Можно в таймерной callback-функции. Пусть таймер клацает, пока запись в реестр не завершится успешно, потом прибить его (таймер, а не реестр).
А ещё варианты? Например может есть сообщение из IRP_MJ_DEVICE_CONTROL или из IRP_MJ_INTERNAL_DEVICE_CONTROL после которого можно юзать реестр? И еще вопрос: почему ZwQueryValueKey возвращает в zlpcbCod в два раза больше нужного значения?
Раз не хотите мне сказать после какого события возможна работа с реестром, я сам этот IOCTL вычислил. и никакого таймера здесь не надо))
Во-первых, я не нашёл описания этой функции на русском языке, так что я не знаю, что она делает и как ей пользоваться( Во-вторых, зачем вообще использовать какие-то функции, если можно ловить IOCTL?