Не работает код: Код (Text): WCHAR KeyNameBuffer[] = L"\\Registry\\Machine\\Software"; UNICODE_STRING KeyName; ULONG Status; OBJECT_ATTRIBUTES ObjectAttributes; ULONG Disposition; KeyName.Buffer = KeyNameBuffer; KeyName.Length = (USHORT) wcslen( KeyNameBuffer ) *sizeof(WCHAR); InitializeObjectAttributes( &ObjectAttributes, &KeyName, OBJ_CASE_INSENSITIVE, NULL, NULL ); Status = NtCreateKey( &SoftwareKeyHandle, KEY_ALL_ACCESS, &ObjectAttributes, 0, NULL, REG_OPTION_NON_VOLATILE, &Disposition ); После выполнения в Status оказалось число STATUS_INVALID_PARAMETER - 0xc000000d. Какой параметр я не так указываю?
KeyName.MaximumLength не определено? У тебя ж строка статическая, можно было использовать вместо wcslen - sizeof, а вообще в студии есть макрос UNICODE_STRING KeyName=RTL_CONSTANT_STRING(L"\\Registry\\Machine\\Software");
onSide, Partner Не помогло. Дело в том, что тот код, который я привёл в своём посте, работает в случае компляции обычного юзермодного приложения. Ошибку параметра я получаю, когда пытаюсь выполнить этот код в native приложении, загружающегося до старта эксплорера. Может быть неверен строковый параметр, т.к. нет прав для открытия реестра? Почитал msdn, вроде особых прав для открытия реестра не существует. В чём беда?
Код (Text): void tratata(WCHAR *RegPath) { NTSTATUS status; UNICODE_STRING UnicodeValueName, UnicodeRegPath; HANDLE KeyHandle; OBJECT_ATTRIBUTES ObjectAttributes; ULONG ByteOffset; RtlInitUnicodeString(&UnicodeRegPath,RegPath); RtlInitUnicodeString(&UnicodeValueName, L"ImagePath"); InitializeObjectAttributes(&ObjectAttributes,&UnicodeRegPath,OBJ_CASE_INSENSITIVE|OBJ_KERNEL_HANDLE,NULL,NULL); status = ZwOpenKey(&KeyHandle,KEY_QUERY_VALUE, &ObjectAttributes ); взял из 100% рабочего дрова
Значит ситуация следующая: есть прога autochk. Вот кусок её кода, полученный идой: Код (Text): ; Attributes: bp-based frame sub_100BF4A proc near var_454= dword ptr -454h var_44C= dword ptr -44Ch var_448= dword ptr -448h var_440= dword ptr -440h var_43C= dword ptr -43Ch var_438= dword ptr -438h var_434= dword ptr -434h var_430= dword ptr -430h var_42C= dword ptr -42Ch var_428= dword ptr -428h var_424= dword ptr -424h var_418= dword ptr -418h var_4= dword ptr -4 mov edi, edi push ebp mov ebp, esp sub esp, 454h mov eax, dword_105D00C push esi mov esi, ds:RtlInitUnicodeString mov [ebp+var_4], eax push offset aRegistryMachin ; "\\Registry\\Machine\\System\\CurrentControl"... lea eax, [ebp+var_448] push eax call esi ; RtlInitUnicodeString and [ebp+var_43C], 0 and [ebp+var_430], 0 and [ebp+var_42C], 0 lea eax, [ebp+var_448] mov [ebp+var_438], eax lea eax, [ebp+var_440] push eax push 20019h lea eax, [ebp+var_428] push eax mov [ebp+var_440], 18h mov [ebp+var_434], 40h call ds:NtOpenKey Только вот непонятно, откуда брать значения переменных var_*. Они вроде определены, но не инициализированы.