Перевод из ansi в unicode-строку

Тема в разделе "WASM.BEGINNERS", создана пользователем yuri, 10 июн 2008.

  1. yuri

    yuri New Member

    Публикаций:
    0
    Регистрация:
    29 янв 2008
    Сообщения:
    47
    Код (Text):
    1. .386
    2.     .model flat,stdcall
    3.     option casemap:none
    4.    
    5.  
    6.         include \masm32\include\w2k\ntdll.inc
    7.         include \masm32\include\w2k\ntstatus.inc
    8.         include \masm32\include\w2k\ntddk.inc
    9.  
    10.      include \masm32\Macros\Strings.mac
    11.  
    12.      includelib \masm32\lib\ntdll.lib
    13.  
    14.     .const
    15.  
    16.          .data?
    17.  
    18.          .data
    19.  
    20.          szKeyName db "\\Registry\\Machine\\Software\\мой раздел\\мой раздел1\\моя папка ",0
    21.  
    22.  
    23.  
    24.    WndProc pro
    25.  
    26.                   local oa:OBJECT_ATTRIBUTES
    27.                   local dwDisposition:DWORD
    28.                   local hKey:HANDLE
    29.                    local as:ANSI_STRING
    30.                     local us:UNICODE_STRING
    31.  
    32.  
    33.             mov eax,sizeof szKeyName
    34.             mov as._Length,ax
    35.              mov as.MaximumLength,ax
    36.             mov eax,offset szKeyName
    37.              mov as.Buffer,eax
    38.  
    39.  
    40.              invoke RtlInitUnicodeString ,addr as ,addr as.Buffer
    41.                  invoke RtlAnsiStringToUnicodeString,addr us,addr as,TRUE
    42.  
    43.  
    44.           lea ecx, oa
    45.    InitializeObjectAttributes ecx, us.Buffer, OBJ_CASE_INSENSITIVE, NULL, NULL
    46.  
    47.  invoke ZwCreateKey, addr hKey,KEY_ALL_ACCESS, addr oa, 0,0,REG_OPTION_NON_VOLATILE, addr dwDisposition
    48.  
    49.  
    50.  
    51.   invoke ZwClose, hKey
    52.  
    53.  
    54.   WndProc endp
    НЕ получается перевести из ansi в unicode-строку (ключ не создаётся)

    Подскажите пожалуйста в чем может быть здесь проблема???
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    В упор не понимаю - ты сначала инициализируешь (причем, неверно) структуру ANSI_STRING, потом передаешь ее в RtlInitUnicodeString (Как не бсодит - не знаю), а потом ее преобразовать еще и в другую UNICODE_STRING.

    Вообщем, чтобы работало.. убери цепочку mov-ов для "инициализации" твоей (ошибочной) и замени RtlInitUnicodeString на RtlInitAnsiString
     
  3. yuri

    yuri New Member

    Публикаций:
    0
    Регистрация:
    29 янв 2008
    Сообщения:
    47
    Код (Text):
    1. .386
    2.     .model flat,stdcall
    3.     option casemap:none
    4.    
    5.  
    6.         include \masm32\include\w2k\ntdll.inc
    7.         include \masm32\include\w2k\ntstatus.inc
    8.         include \masm32\include\w2k\ntddk.inc
    9.  
    10.      include \masm32\Macros\Strings.mac
    11.  
    12.      includelib \masm32\lib\ntdll.lib
    13.  
    14.     .const
    15.  
    16.          .data?
    17.  
    18.          .data
    19.  
    20.          szKeyName db "\\Registry\\Machine\\Software\\мой раздел\\мой раздел1\\моя папка ",0
    21.  
    22.  
    23.  
    24.    WndProc pro
    25.  
    26.                   local oa:OBJECT_ATTRIBUTES
    27.                   local dwDisposition:DWORD
    28.                   local hKey:HANDLE
    29.                    local as:ANSI_STRING
    30.                     local us:UNICODE_STRING
    31.  
    32.  
    33.          
    34.                       invoke RtlInitAnsiStringaddr ,addr as ,addr as.Buffer
    35.  
    36.                  invoke RtlAnsiStringToUnicodeString,addr us,addr as,TRUE
    37.  
    38.  
    39.           lea ecx, oa
    40.    InitializeObjectAttributes ecx, us.Buffer, OBJ_CASE_INSENSITIVE, NULL, NULL
    41.  
    42.  invoke ZwCreateKey, addr hKey,KEY_ALL_ACCESS, addr oa, 0,0,REG_OPTION_NON_VOLATILE, addr dwDisposition
    43.  
    44.  
    45.  
    46.   invoke ZwClose, hKey
    47.  
    48.  
    49.   WndProc endp
    Убрал цепочку mov-ов ,заменил RtlInitUnicodeString на RtlInitAnsiString

    Ключ не создаётся и всё

    В чём проблема не пойму
     
  4. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    >> invoke RtlInitAnsiStringaddr ,addr as ,addr as.Buffer

    странный ты человек, туда надо передавать адрес реальной строки, как система узнает, что ты имеешь в виду именно szKeyName?

    invoke RtlInitAnsiStringaddr ,addr as ,addr szKeyName

    Очень рекомендую сначала читать MSDN, а потом код писать. Большинство почему-то делает наоборот.
     
  5. yuri

    yuri New Member

    Публикаций:
    0
    Регистрация:
    29 янв 2008
    Сообщения:
    47
    Код (Text):
    1. .386
    2.     .model flat,stdcall
    3.     option casemap:none
    4.    
    5.  
    6.         include \masm32\include\w2k\ntdll.inc
    7.         include \masm32\include\w2k\ntstatus.inc
    8.         include \masm32\include\w2k\ntddk.inc
    9.  
    10.      include \masm32\Macros\Strings.mac
    11.  
    12.      includelib \masm32\lib\ntdll.lib
    13.  
    14.     .const
    15.  
    16.          .data?
    17.  
    18.          .data
    19.  
    20.          szKeyName db "\\Registry\\Machine\\Software\\мой раздел\\мой раздел1\\моя папка ",0
    21.  
    22.  
    23.  
    24.    WndProc pro
    25.  
    26.                   local oa:OBJECT_ATTRIBUTES
    27.                   local dwDisposition:DWORD
    28.                   local hKey:HANDLE
    29.                    local as:ANSI_STRING
    30.                     local us:UNICODE_STRING
    31.  
    32.             invoke RtlInitAnsiStringaddr ,addr as ,addr szKeyName
    33.                      
    34.                  invoke RtlAnsiStringToUnicodeString,addr us,addr as,TRUE
    35.  
    36.  
    37.           lea ecx, oa
    38.    InitializeObjectAttributes ecx, us.Buffer, OBJ_CASE_INSENSITIVE, NULL, NULL
    39.  
    40.  invoke ZwCreateKey, addr hKey,KEY_ALL_ACCESS, addr oa, 0,0,REG_OPTION_NON_VOLATILE, addr dwDisposition
    41.  
    42.  
    43.  
    44.   invoke ZwClose, hKey
    45.  
    46.  
    47.   WndProc endp
    НУ не СОЗДАЁТСЯ и ВСЁ
     
  6. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    >> InitializeObjectAttributes ecx, us.Buffer, OBJ_CASE_INSENSITIVE, NULL, NULL

    почему ты передаешь us.Buffer?
    Читай MSDN. второй раз говорю. Там написано, что надо передвать UNICODE_STRING*

    Меняй на addr us
     
  7. yuri

    yuri New Member

    Публикаций:
    0
    Регистрация:
    29 янв 2008
    Сообщения:
    47
    СПАСИБО Great за помощь всё получилось (ключ создается),но с нюансом

    если наблюдать RegMon то ключ создаётся с именем \\Registry\\Machine\\Software\\мой раздел\\мой раздел1\\моя папка

    а должен HKLM\Software\мой раздел\мой раздел1\моя папка

    если же применять
    Код (Text):
    1.  const.
    2.  
    3. CCOUNTED_UNICODE_STRING "\\Registry\\Machine\\Software\\мой раздел", g_usMachineKeyName, 4
    4.  
    5. (вместо szKeyName db "\\Registry\\Machine\\Software\\мой раздел\\мой раздел1\\моя папка ",0)
    6.  
    7.  
    8.  
    9.  code.
    10.  
    11.   lea ecx, oa
    12.           InitializeObjectAttributes ecx, addrg_usMachineKeyName , OBJ_CASE_INSENSITIVE,0, NULL
    13.           invoke ZwCreateKey, addr hKey,KEY_ALL_ACCESS, addr oa, 0,0,REG_OPTION_NON_VOLATILE, addr dwDisposition
    14.  
    15.  invoke ZwClose, hKey
    то получается правильный ключ

    Мож что-то не правильно происходит при конвертации из
    из ansi в unicode-строку