Непонятки с Unicode

Тема в разделе "WASM.WIN32", создана пользователем seeQ, 19 дек 2006.

  1. seeQ

    seeQ New Member

    Публикаций:
    0
    Регистрация:
    3 сен 2003
    Сообщения:
    71
    Всем добрый день. Непонятка возникла с функцией ZwQueryDirectoryFile. Одним из параметров этой функции является FileName.
    Из MSDN:

    . . .
    IN PUNICODE_STRING FileName OPTIONAL,

    FileName
    Pointer to a caller-allocated Unicode string containing the name of a file (or multiple files, if wildcards are used) within the directory specified by FileHandle. This parameter is optional and can be NULL.
    If FileName is not NULL, only files whose names match the FileName string are included in the directory scan.


    Все вроде понятно. набрасываем простенький пример и проверяем.

    hFind := FindFirstFile('*.exe', FindData);
    Смотрим в UNICODE_STRING.BUFFER а там:

    3C 00 2E 00 65 00 78 00 65 00 00 00 <...e.x.e...

    Почему собственно 3C, ведь код "*" - 2A. Скачал официальную спецификацию с unicode.org ("*" - 002A). Или это Windows для себя так преобразует символ "*" ?
     
  2. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    seeQ
    А ты смотрел, что происходит с lpFileName в цепочке вызовов от FindFirstFile до ZwQueryDirectoryFile?
     
  3. seeQ

    seeQ New Member

    Публикаций:
    0
    Регистрация:
    3 сен 2003
    Сообщения:
    71
    IceStudent
    спасибо, разобрался. Да бы полностью раскрыть тему. Кусок кода из FindFirstFileExW который и делает преобразования перед вызовом NtQueryDirectoryFile:

    Код (Text):
    1. #define DOS_STAR                       (L'<')
    2. #define DOS_QM                          (L'>')
    3. #define DOS_DOT                         (L'"')
    4.  
    5. ULONG Index;
    6.         WCHAR *NameChar;
    7.  
    8.         for ( Index = 0, NameChar = FileName.Buffer;
    9.               Index < FileName.Length/sizeof(WCHAR);
    10.               Index += 1, NameChar += 1) {
    11.  
    12.             if (Index && (*NameChar == L'.') && (*(NameChar - 1) == L'*')) {
    13.  
    14.                 *(NameChar - 1) = DOS_STAR;
    15.             }
    16.  
    17.             if ((*NameChar == L'?') || (*NameChar == L'*')) {
    18.  
    19.                 if (*NameChar == L'?') { *NameChar = DOS_QM; }
    20.  
    21.                 if (Index && *(NameChar-1) == L'.') { *(NameChar-1) = DOS_DOT; }
    22.             }
    23.         }
    24.  
    25.         if (EndsInDot && *(NameChar - 1) == L'*') { *(NameChar-1) = DOS_STAR; }
    26.     }