Для ZwCreateFile нужна спец. unicode строка?

Тема в разделе "WASM.BEGINNERS", создана пользователем Flasher, 28 окт 2005.

  1. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    Нашёл всё-таки волшебную функцию RtlAnsiStringToUnicodeString для перевода в unicode.

    Но теперь возникла другая проблема...



    ZwCreateFile не воспринимает полученную unicode строку.
    Код (Text):
    1. .data
    2. szFileName db "\\??\\c:\\test.txt",0
    3.  
    4. .code
    5. start proc
    6. local hFile:HANDLE
    7. local as:ANSI_STRING
    8. local us:UNICODE_STRING
    9. local oa:OBJECT_ATTRIBUTES
    10. local iosb:IO_STATUS_BLOCK
    11.  
    12.        mov eax,sizeof szFileName
    13.        mov as._Length,ax
    14.        mov as.MaximumLength,ax
    15.        mov eax,offset szFileName
    16.        mov as.Buffer,eax
    17.        invoke RtlAnsiStringToUnicodeString,addr us,addr as,TRUE
    18.        
    19.        invoke MessageBoxW,0,us.Buffer,us.Buffer,0
    20.        
    21.  ;     InitializeObjectAttributes addr oa,us.Buffer,OBJ_CASE_INSENSITIVE+OBJ_KERNEL_HANDLE,0,0
    22.  
    23.        lea ecx,oa
    24.        mov dword ptr [ecx],000000018h
    25.        and dword ptr [ecx+000000004h],0
    26.        mov dword ptr [ecx+00000000Ch],00000240h
    27.        and dword ptr [ecx+000000010h],0
    28.        push us.Buffer
    29.        pop dword ptr [ecx+000000008h]
    30.        and dword ptr [ecx+000000014h],0
    31.    
    32.     invoke ZwCreateFile,addr hFile,SYNCHRONIZE,addr oa,addr iosb,0,FILE_ATTRIBUTE_NORMAL,\
    33.                         0,FILE_CREATE,FILE_SYNCHRONOUS_IO_NONALERT,0,0
    34.       invoke ZwClose,hFile
    35.       invoke ExitProcess,0
    36. start endp
    37. end start


    Не подскажите в чём может быть проблема?

    Спасибо.
     
  2. Zufyxe

    Zufyxe New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2004
    Сообщения:
    137
    Адрес:
    Russia
    Дело в том, что практически во всех NT-шных API используется не UNICODE строка, а т.н. INITIALIZED UNICODE. Внимательнее читай MSDN:



    typedef struct _UNICODE_STRING {

    USHORT Length;

    USHORT MaximumLength;

    PWSTR Buffer;

    } UNICODE_STRING;



    как раз для преобразования существует функция:



    VOID RtlInitUnicodeString(

    PUNICODE_STRING DestinationString,

    PCWSTR SourceString

    );
     
  3. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    Zufyxe

    Благодарю, всё получилось!



    Но теперь проблема, как обратно возвратить? :)



    Вот на примере этого кода:
    Код (Text):
    1.  
    2.        invoke RtlGetCurrentDirectory_U,520,addr us.Buffer
    3.        
    4.        invoke MessageBoxW,0,addr us.Buffer,addr us.Buffer,0
    5.        
    6.        invoke RtlInitUnicodeString,addr us2,addr us.Buffer
    7.      
    8.        invoke RtlUnicodeStringToAnsiString,addr as,addr us2,1
    9.          
    10.        invoke MessageBox,0,as.Buffer,as.Buffer,0


    Разве не правильно делаю?
     
  4. Udzhen

    Udzhen New Member

    Публикаций:
    0
    Регистрация:
    18 окт 2005
    Сообщения:
    25
    Адрес:
    Russia
    Структура UNICODE_STRING отличается от ANSI_STRING только указателем на строку т.е.:

    typedef struct _ANSI_STRING {

    USHORT Length;

    USHORT MaximumLength;

    PCHAR Buffer;

    } ANSI_STRING;

    Дерзай...



    ----------------------

    С уважением Евгений.
     
  5. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    Не совсем понятно как это поможет для решения проблемы...
     
  6. Zufyxe

    Zufyxe New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2004
    Сообщения:
    137
    Адрес:
    Russia
    - это поможет, если ты внимательнее посмотришь на типы:

    RtlUnicodeStringToAnsiString возвращает pANSI_STRING, а MessageBox принимает LPCTSTR, разница существенна. :)
     
  7. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Flasher



    Попробуй invoke MessageBoxW,0,us.Buffer,us.Buffer,0
     
  8. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    IceStudent

    У мя в MessageBoxW всё отлично, с MessageBoxА - борода ;)



    Zufyxe

    Хоть убей, не доходит...



    Уже как хошь пробовал, там полный линк не отабражается, либо "C:", либо какие-то каракулы ](4@"



    Даж пытался юзать аналогичному RtlInitUnicodeString -> RtlInitAnsiString после RtlUnicodeStringToAnsiString, серавно нормальной строки не могу получить.
     
  9. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Flasher



    Хех. Ну да, затираешь стек и утверждаешь, что отлично? Бог в помощь ;)


    Код (Text):
    1.  
    2.     local buffer[520]:BYTE
    3.     local us:UNICODE_STRING
    4.     local as:ANSI_STRING
    5.     ; тут не знаю, может 520/2 надо..
    6.     invoke RtlGetCurrentDirectory_U,520,addr buffer
    7.     invoke MessageBoxW,0,addr buffer,addr buffer,0
    8.     invoke RtlInitUnicodeString,addr us,addr buffer
    9.     invoke RtlUnicodeStringToAnsiString,addr as,addr us,1
    10.     invoke MessageBox,0,as.Buffer,as.Buffer,0
    11.  
     
  10. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    IceStudent

    Спасибо, оказывается вон как всё просто.

    Рас моно в RtlGetCurrentDirectory_U и в RtlInitUnicodeString обыкновенный buffer юзать, почему в справочниках этот параметр имеет вид STRUCT'ур'ы ?



    Чтоб меня путать? :)
     
  11. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Flasher

    Какой параметр? О назначение структур (XXX_STRING), кажется, писал Four-F. В двух словах, это для оптимизации работы с выделяемой памятью: если выделяешь память под строку, то выделяй не Length, а где-то 1.5*Length и записывай размер буфера в MaximumLength, а собственно длину строки - в Length.
     
  12. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    Ясно, спасибо ещё раз! ;)
     
  13. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    Может кому понадобится...


    Код (Text):
    1.  
    2.        mov edi,offset ansistring
    3.        mov esi,offset unicodestr
    4.        push offset unicodestr
    5.        call _strlenw
    6.        mov edx,eax
    7.        shl edx,2
    8.        xor eax,eax
    9.          .while SDWORD ptr edx >= 0
    10.             lodsw
    11.             stosb
    12.             sub edx,4
    13.          .endw
    14.  
    15. _strlenw:
    16.        pop eax
    17.        pop edx
    18.        push eax
    19.        xor ecx,ecx
    20.     @@:mov eax,[edx+ecx*2]
    21.        add ecx,1
    22.        test eax,00000ffffh
    23.        jz @F
    24.        add ecx,1
    25.        test eax,0ffff0000h
    26.        jnz @B
    27.     @@:xchg eax,ecx
    28.        retn