Есть указатель на FILE_OBJECT, как получить букву тома, на котором находится файл? А то имени относительно тома не достаточно для работы.
У тебя какое имя получается: Код (Text): \Device\HarddiskVolume1\myfile.txt или Код (Text): myfile.txt
Можно попробовать через IoGetRelatedDeviceObject получить устройство и получить имя устройства при помощи ObQueryNameString. Затем останется только транслировать '\Device\HarddiskVolume1' в 'C:'.
Что-то вообще странное. Делаю: Код (Text): pDev = IoGetRelatedDeviceObject(pFileObject); ObQueryNameString(pDev, pObjInfo, 1024, &Length); DbgPrint("%wZ\", pObjInfo->Name); И в выводе получаю <null>. Хотя память под OBJECT_NAME_INFORMATION выделяется и ObQueryNameString возвращает STATUS_SUCCESS.
В догонку такой вопрос: как проверить ReadAccess, WriteAccess и DeleteAccess в структуре FILE_OBJECT? Для Share-версий есть IoCheckShareAccess(). А для обычных?
x64, спасибо, только при использовании IoVolumeDeviceToDosName() у меня система виснет. Не в БСоД падает, а именно виснет.
Во-первых, смотрим сюда: Во-вторых, они тут забыли написать, что на системах вроде Windows XP это также имеет значение. Другими словами, эту функцию следует вызывать всегда строго на irql=0. В-третьих, если правильно помню, эту функцию (как и некоторые другие) не следует вызывать на именованных каналах (named pipes) и почтовых ящиках (mailslots). В-четвёртых, на всякий случай предупреждаю, что в ряде случаев эта функция не будет работать. Например, оно точно не будет работать для сетевых дисков, а также для некоторых дисков, у которых не предусмотрена поддержка Mount Manager-а. Покажи код целиком, где ты вызываешь эту функцию.
x64 Вот, убрал только лишние проверки, чтобы не загромождали основную часть: Код (Text): PFILE_OBJECT pFileObject = IoGetCurrentIrpStackLocation(Irp)->FileObject; PDEVICE_OBJECT pDev; PUNICODE_STRING temp = NULL; LPWSTR Image[256]; HANDLE procID = PsGetCurrentProcessId(); GetProcessNameByPID(procID, Image); pDev = IoGetRelatedDeviceObject(pFileObject); IoVolumeDeviceToDosName(pDev, temp); DbgPrint("Create: %wZ %ws\n", temp, Image); ExFreePool(temp); return FsFilterDispatchPassThrough(DeviceObject, Irp); Сейчас специально поставил проверки IRQL на PASSIVE_LEVEL + сделал вызов KeAreApcsDisabled(). Все в норме.
Ололо: Врача! Врача срочно! У нас приступ острого незнанияязыкаси! Как правильно: Ты уверен, что система таки виснет, а не падает? Код в отношении IoVolumeDeviceToDosName() не корректен, по идее, должно падать. Виснуть может, например, в случаях, когда pIoStack -> FileObject -> Flags содержит флаги FO_NAMED_PIPE или FO_MAILSLOT, и то вряд ли из-за этой функции. Т.е. как минимум следует добавить проверку на эти флаги, если они есть - пропускать запрос ниже без вопросов. Да, и если какой-либо поток всё же виснет, покажи стек этого повисшего потока, если падает, покажи анализ дампа, команда !analyze -v. Символы не забудь подгрузить нормальные.