Ребят, подскажите, пожалуйста, в каком формате передавать имя файла функции ZwCreateFile? Стандартных семплов, её юзающих, не нашел. Документация по WDK тоде молчит по этому поводу. По коду CreateProcessW нашел, что она каким-то образом вызывает что-то вида RtlDosFileNameTont_U (пишу по памяти), но понять. куда оно пишет результирующую строку я пока не смог. При передаче имени файла вида Код (Text): L"C:\\1.txt" /* C:\1.txt */ возвращается статус "синтаксическая ошибка в имени файла или папки" Код (Text): HANDLE hLocked; OBJECT_ATTRIBUTES attLocked; IO_STATUS_BLOCK iobLocked; RtlZeroMemory(&attLocked,sizeof(attLocked)); RtlZeroMemory(&iobLocked,sizeof(iobLocked)); InitializeObjectAttributes(&attLocked,(PUNICODE_STRING)inBuffer/*name*/,OBJ_KERNEL_HANDLE,NULL,NULL); status = ZwCreateFile(&hLocked,GENERIC_READ,&attLocked,&iobLocked,NULL/*allocation size*/,FILE_ATTRIBUTE_NORMAL,0/*share*/,FILE_OPEN/*no create*/,FILE_NON_DIRECTORY_FILE,NULL,0);
в формате относительно корня менеджера объектов. что есть в менеджере объектов - качай WinObj/WinObjEx. Для доступа к файловой системе можно, например, использовать ссылку \??\X:\Path\File.ext, где X: - буква диска, Path - путь, File.ext - файл и расширение. Можно открыть девайс - \Device\XXX, где XXX имя девайса. и так далее. >>RtlDosFileNameTont да, я тоже не помню как она называется, но есть такая функция, которая конвертирует DOS-путь (X:\Path\File.ext) в NT-путь (\??\X:\Path\File.ext) PS. Везде выше вместо ?? справедливо так же Globals?? или DosDevices.
Примерно разобрался: "\??\C:\1txt". Гугл рулит. И ве же, остался вопрос, почему так, и если не тяжело, подскажите, пожалуйста, почему так, и где почитать об именах файлов в kernel-mode?
Если я вас правиьно понял: \ DosDevices - старые устройства и пути \ (Globals)?? - все, что есть на этом компе \ Device - девайсы Спасибо.
Поменял. Исправил ошибку с уровнем IRQ - теперь приведенный ZwCreateFile возвращает "указан недопусимый путь" для "\\??\\C:\1.txt" или бсодит на "\\DosDevices\\C:\\1.txt" Файл по заданному пути существует. IoCreateFile(..) возвращает "Неверная попытка доступа к адресу памяти". Код (Text): HANDLE hLocked; OBJECT_ATTRIBUTES attLocked; IO_STATUS_BLOCK iobLocked; RtlZeroMemory(&attLocked,sizeof(attLocked)); RtlZeroMemory(&iobLocked,sizeof(iobLocked)); InitializeObjectAttributes(&attLocked,(PUNICODE_STRING)inBuffer/*name*/,OBJ_KERNEL_HANDLE|OBJ_CASE_INSENSITIVE,NULL,NULL); currentIrql = KeGetCurrentIrql(); if(currentIrql==PASSIVE_LEVEL) // status = ZwCreateFile(&hLocked,FILE_READ_ATTRIBUTES,&attLocked,&iobLocked,NULL/*allocation size*/,FILE_ATTRIBUTE_NORMAL,0/*share*/,FILE_OPEN_IF,FILE_SYNCHRONOUS_IO_NONALERT,NULL,0); status = IoCreateFile(&hLocked, FILE_READ_ATTRIBUTES, &attLocked, &iobLocked, NULL, FILE_ATTRIBUTE_NORMAL, 0 /* no share */, FILE_OPEN_IF, FILE_NON_DIRECTORY_FILE, NULL, 0, CreateFileTypeNone, NULL, IO_FORCE_ACCESS_CHECK);
SpiritFire KmdTut -> Базовая техника -> Каталоги и файлы там рабочий пример с подробными комментариями.
Нет. И \?? и \Globals?? и \DosDevices это одно и то же. Я даже написал что можно поменять на любое из этих. Это все каталог - символьных ссылок (кроме DosDevices, который сам - символьная ссылка на этот кталог), экспортируемых в юзермод. Хочешь чтобы девайс был доступен в юзермоде например? Создавай ссылку \??\XXX на \Device\XXX. Насчет \Device ты прав - там действительно девайсы. Читай Марка Руссиновича и Д.Соломона - там все прекрасно расписано и про пути, и про ссылки, и про девайсы и про все на свете.