Код (Text): .386 .model flat,stdcall option casemap:none include \masm32\include\w2k\ntdll.inc include \masm32\include\w2k\ntstatus.inc include \masm32\include\w2k\ntddk.inc include \masm32\Macros\Strings.mac includelib \masm32\lib\ntdll.lib .const .data? .data szKeyName db "\\Registry\\Machine\\Software\\мой раздел\\мой раздел1\\моя папка ",0 WndProc pro local oa:OBJECT_ATTRIBUTES local dwDisposition:DWORD local hKey:HANDLE local as:ANSI_STRING local us:UNICODE_STRING mov eax,sizeof szKeyName mov as._Length,ax mov as.MaximumLength,ax mov eax,offset szKeyName mov as.Buffer,eax invoke RtlInitUnicodeString ,addr as ,addr as.Buffer invoke RtlAnsiStringToUnicodeString,addr us,addr as,TRUE lea ecx, oa InitializeObjectAttributes ecx, us.Buffer, OBJ_CASE_INSENSITIVE, NULL, NULL invoke ZwCreateKey, addr hKey,KEY_ALL_ACCESS, addr oa, 0,0,REG_OPTION_NON_VOLATILE, addr dwDisposition invoke ZwClose, hKey WndProc endp НЕ получается перевести из ansi в unicode-строку (ключ не создаётся) Подскажите пожалуйста в чем может быть здесь проблема???
В упор не понимаю - ты сначала инициализируешь (причем, неверно) структуру ANSI_STRING, потом передаешь ее в RtlInitUnicodeString (Как не бсодит - не знаю), а потом ее преобразовать еще и в другую UNICODE_STRING. Вообщем, чтобы работало.. убери цепочку mov-ов для "инициализации" твоей (ошибочной) и замени RtlInitUnicodeString на RtlInitAnsiString
Код (Text): .386 .model flat,stdcall option casemap:none include \masm32\include\w2k\ntdll.inc include \masm32\include\w2k\ntstatus.inc include \masm32\include\w2k\ntddk.inc include \masm32\Macros\Strings.mac includelib \masm32\lib\ntdll.lib .const .data? .data szKeyName db "\\Registry\\Machine\\Software\\мой раздел\\мой раздел1\\моя папка ",0 WndProc pro local oa:OBJECT_ATTRIBUTES local dwDisposition:DWORD local hKey:HANDLE local as:ANSI_STRING local us:UNICODE_STRING invoke RtlInitAnsiStringaddr ,addr as ,addr as.Buffer invoke RtlAnsiStringToUnicodeString,addr us,addr as,TRUE lea ecx, oa InitializeObjectAttributes ecx, us.Buffer, OBJ_CASE_INSENSITIVE, NULL, NULL invoke ZwCreateKey, addr hKey,KEY_ALL_ACCESS, addr oa, 0,0,REG_OPTION_NON_VOLATILE, addr dwDisposition invoke ZwClose, hKey WndProc endp Убрал цепочку mov-ов ,заменил RtlInitUnicodeString на RtlInitAnsiString Ключ не создаётся и всё В чём проблема не пойму
>> invoke RtlInitAnsiStringaddr ,addr as ,addr as.Buffer странный ты человек, туда надо передавать адрес реальной строки, как система узнает, что ты имеешь в виду именно szKeyName? invoke RtlInitAnsiStringaddr ,addr as ,addr szKeyName Очень рекомендую сначала читать MSDN, а потом код писать. Большинство почему-то делает наоборот.
Код (Text): .386 .model flat,stdcall option casemap:none include \masm32\include\w2k\ntdll.inc include \masm32\include\w2k\ntstatus.inc include \masm32\include\w2k\ntddk.inc include \masm32\Macros\Strings.mac includelib \masm32\lib\ntdll.lib .const .data? .data szKeyName db "\\Registry\\Machine\\Software\\мой раздел\\мой раздел1\\моя папка ",0 WndProc pro local oa:OBJECT_ATTRIBUTES local dwDisposition:DWORD local hKey:HANDLE local as:ANSI_STRING local us:UNICODE_STRING invoke RtlInitAnsiStringaddr ,addr as ,addr szKeyName invoke RtlAnsiStringToUnicodeString,addr us,addr as,TRUE lea ecx, oa InitializeObjectAttributes ecx, us.Buffer, OBJ_CASE_INSENSITIVE, NULL, NULL invoke ZwCreateKey, addr hKey,KEY_ALL_ACCESS, addr oa, 0,0,REG_OPTION_NON_VOLATILE, addr dwDisposition invoke ZwClose, hKey WndProc endp НУ не СОЗДАЁТСЯ и ВСЁ
>> InitializeObjectAttributes ecx, us.Buffer, OBJ_CASE_INSENSITIVE, NULL, NULL почему ты передаешь us.Buffer? Читай MSDN. второй раз говорю. Там написано, что надо передвать UNICODE_STRING* Меняй на addr us
СПАСИБО Great за помощь всё получилось (ключ создается),но с нюансом если наблюдать RegMon то ключ создаётся с именем \\Registry\\Machine\\Software\\мой раздел\\мой раздел1\\моя папка а должен HKLM\Software\мой раздел\мой раздел1\моя папка если же применять Код (Text): const. CCOUNTED_UNICODE_STRING "\\Registry\\Machine\\Software\\мой раздел", g_usMachineKeyName, 4 (вместо szKeyName db "\\Registry\\Machine\\Software\\мой раздел\\мой раздел1\\моя папка ",0) code. lea ecx, oa InitializeObjectAttributes ecx, addrg_usMachineKeyName , OBJ_CASE_INSENSITIVE,0, NULL invoke ZwCreateKey, addr hKey,KEY_ALL_ACCESS, addr oa, 0,0,REG_OPTION_NON_VOLATILE, addr dwDisposition invoke ZwClose, hKey то получается правильный ключ Мож что-то не правильно происходит при конвертации из из ansi в unicode-строку