Не могли бы вы мне подсказать размерность элементов этой структуры, а то я не врублюсь... Code (Text): type FILE_BOTH_DIRECTORY_INFORMATION = packed record NextEntryOffset: ULONG; Unknown: ULONG; CreationTime, LastAccessTime, LastWriteTime, ChangeTime, EndOfFile, AllocationSize: int64; FileAttributes: ULONG; FileNameLength: ULONG; EaInformationLength: ULONG; AlternateNameLength: ULONG; AlternateName[0..11]: array of WideChar; FileName: PWideChar; end; Особенно интересует последний элемент. Это указатель на строку или что это? Пытаюсь Ms-Rem'a учить, пока, затык в этом. При вызове ZwQueryDirectoryFile в параметре FileInformationLength находиться 0х268. В общем, пока сплошные непонятки. Помогите разобраться, плиз.
MagnumGT Странно. Почему тогда ZwQueryDirectoryFile в параметр FileInformationLength возвращает 0х268? Вот, что я вижу в олли. Тут первые 75 байт. Code (Text): 0006CF7C 00 00 00 00 01 00 00 00 A0 77 EF 16 D1 97 C7 01 ....... wпС—З 0006CF8C 00 88 6B 2D 5C 13 C8 01 00 03 68 17 D1 97 C7 01 .?k-\И.hС—З 0006CF9C 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0006CFAC 00 00 00 00 00 00 00 00 10 00 00 00 2C 00 00 00 ...........,... 0006CFBC 00 00 00 00 10 00 44 00 4F 00 43 .....D.O.C 00 55 00 4D 00 .U.M. 0006CFCC 45 00 7E 00 31 00 00 00 00 00 00 00 00 00 44 00 E.~.1.........D. 0006CFDC 6F 00 63 00 75 00 6D 00 65 00 6E 00 74 00 73 00 o.c.u.m.e.n.t.s. 0006CFEC 20 00 61 00 6E 00 64 00 20 00 53 00 65 00 74 00 .a.n.d. .S.e.t. 0006CFFC 74 00 69 00 6E 00 67 00 73 00 00 00 00 00 00 00 t.i.n.g.s....... 0006D00C 00 00 00 00 20 D0 06 00 00 00 00 00 3D FB 90 7C .... Р.....=ыђ| 0006D01C D4 D0 06 00 00 00 00 00 54 D0 06 00 6C FB 90 7C ФР.....TР.lыђ| Совсем не похоже на то, что нужно =\
Aspire Почему тогда ... возвращает 0х268 Если за основу взять структуру Gary Nebbett'а Code (Text): typedef struct _FILE_BOTH_DIRECTORY_INFORMATION { ULONG NextEntryOffset; // 4 ULONG Unknown; // 4 LARGE_INTEGER CreationTime; // 8 LARGE_INTEGER LastAccessTime; // 8 LARGE_INTEGER LastWriteTime; // 8 LARGE_INTEGER ChangeTime; // 8 LARGE_INTEGER EndOfFile; // 8 LARGE_INTEGER AllocationSize; // 8 ULONG FileAttributes; // 4 ULONG FileNameLength; // 4 ULONG EaInformationLength; // 4 UCHAR AlternateNameLength; // 1 // + 1 для выравнивания // следующего WCHAR AlternateName[12]; // 24 WCHAR FileName[1]; // 2 // == 96 (0x60) } FILE_BOTH_DIRECTORY_INFORMATION, *PFILE_BOTH_DIRECTORY_INFORMATION; С параметра FileName полное начинается имя файла, если предположить, что оно 256 символов, т.е. 512 байт, то 96 + 510 = 606 (0x25E) останется найти еще 10 байтов.
Данные наверху, если я все правильно посчитал, то там 0х2С, т.е. 44 байта ("Documents and Senning" в юникоде) Тогда что означает последний элемент FileName ? Если он два байта? Кстати, после юникодовой строки, где кончаются нули, мы там видим дворд 0х0060D020. ??? Хорошо. Я вот тут подумал, может, я вообще не туда смотрю, в смысле неправильно получаю эту структуру. Поэтому приведу код, посмотрите, плиз. Code (Text): ;Перехватываю вызов ZwQueryDirectoryFile в том месте, где в стеке лежат параметры и сверху адрес возврата LOCAL RAZMER ;создаю локальную переменную ------------;Здесь вызываю оригинальную функцию .if (FileInformationClass==1|| FileInformationClass==2 || FileInformationClass==3 || FileInformationClass==12) mov edi,FileInformation .if FileInformationClass==3 assume edi: ptr FILE_BOTH_DIRECTORY_INFORMATION mov RAZMER, sizeof FILE_BOTH_DIRECTORY_INFORMATION Ну и дальше предполагается изменение этой структуры для скрытия файла... В edi - указатель на структуру. Сами данные я приводил выше. Вроде все правильно...Остается со структурой разобраться.
Aspire что означает последний элемент FileName ? Если он два байта? С этого места начинается _длинное_имя_. Это поле используется совместно с FileNameLength. Т.е. прежде чем делать что-либо с FileName настоятельно рекомендую прочитать из FileNameLength со сколькими байтами можно работать. При вызове ZwQueryDirectoryFile в параметре FileInformationLength находиться 0х268. Кажется, я понял вопрос. Фактически FILE_BOTH_DIRECTORY_INFORMATION имеет переменную длину. 94 байта постоянных, плюс к ним добавляются байты, в которых хранится _длинное_имя_. Вызывающая ZwQueryDirectoryFile программа _обязана_ позаботиться, чтобы буфер (шестой параметр) был достаточного размера, т.е. не меньше чем sizeof(FILE_BOTH_DIRECTORY_INFORMATION) + ожидаемый размер имени файла. MagnumGT твое #8 противоречит твоему #2, ты тему читаешь или только пишешь?
Следующий трабл. Ставлю бряк после вызова ф-ции, смотрю на структуру, в поле NextEntryOffset имеем ноль, что говорит, что это последняя структура в массиве. Жму F9, останавливаюсь еще раз, структура уже другая, имя файла другое, а в поле NextEntryOffset все равно ноль. Так она у меня и фигачит по кругу, пока в параметре FileInformation не появиться -1. И каждый раз NextEntryOffset==0. Почему такая фигня? Может для разных файловых систем поразному (у меня фат32) ? Как в моем случае мне скрыть свой файл при совпадении имен?
Aspire Прежде чем смотреть на NextEntryOffset необходимо убедиться, что оригинальная ZwQueryDirectoryFile завершилась успешно. Ноль в NextEntryOffset означает, что в буфере содержится информация об одном (очередном) файле, информация о следующем, например, не помещается. фигачит по кругу, пока в параметре FileInformation не появиться -1 Как в FileInformation может быть -1? Это же адрес. Как в моем случае мне скрыть свой файл при совпадении имен? Т.е. когда информация поступает по одному файлу? Например, определив, что пришла информация по твоему файлу еще раз вызвать оригинальную ZwQueryDirectoryFile, чтобы она заполнила буфер информацией о следующем(щих) файле(ах).
q_q Мое 2 - я просто посчитал число байтов из топика Аспайра А мое 8 - это я выдернул из своей программы. Мое 2 можно удалять, ибо неактуально
[off] MagnumGT Мое 2 - я просто посчитал число байтов из топика Аспайра Я не зря спросил "читаешь ли ты", например, в #1 поля CreationTime, LastAccessTime, LastWriteTime, ChangeTime, EndOfFile определены как int64, а ты указал их размер 4. Мое 2 можно удалять, ибо неактуально Тогда вопрос: "Можно ли считать хоть одно твое сообщение в этой теме актуальным (т.е. не содержащим очевидные ошибки, не дублирующим другие сообщения и относящимся к теме)?" [/off]
q_q Ага, оригинальная ф-ция возвращает ноль. Все просто оказывается. Спасибо. Просто меня ввело в ступор, то, что ZwQueryDirectoryFile "возвращает информацию об одном (очередном) файле"... Еще раз, сенкс!