Всем добрый день. Непонятка возникла с функцией 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 для себя так преобразует символ "*" ?
seeQ А ты смотрел, что происходит с lpFileName в цепочке вызовов от FindFirstFile до ZwQueryDirectoryFile?
IceStudent спасибо, разобрался. Да бы полностью раскрыть тему. Кусок кода из FindFirstFileExW который и делает преобразования перед вызовом NtQueryDirectoryFile: Код (Text): #define DOS_STAR (L'<') #define DOS_QM (L'>') #define DOS_DOT (L'"') ULONG Index; WCHAR *NameChar; for ( Index = 0, NameChar = FileName.Buffer; Index < FileName.Length/sizeof(WCHAR); Index += 1, NameChar += 1) { if (Index && (*NameChar == L'.') && (*(NameChar - 1) == L'*')) { *(NameChar - 1) = DOS_STAR; } if ((*NameChar == L'?') || (*NameChar == L'*')) { if (*NameChar == L'?') { *NameChar = DOS_QM; } if (Index && *(NameChar-1) == L'.') { *(NameChar-1) = DOS_DOT; } } } if (EndsInDot && *(NameChar - 1) == L'*') { *(NameChar-1) = DOS_STAR; } }