буква тома из FILE_OBJECT

Тема в разделе "WASM.NT.KERNEL", создана пользователем Zitzy, 7 апр 2010.

  1. Zitzy

    Zitzy New Member

    Публикаций:
    0
    Регистрация:
    4 янв 2009
    Сообщения:
    28
    Есть указатель на FILE_OBJECT, как получить букву тома, на котором находится файл? А то имени относительно тома не достаточно для работы.
     
  2. vasalvit

    vasalvit New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2008
    Сообщения:
    53
    Может IoQueryFileDosDeviceName?
     
  3. Zitzy

    Zitzy New Member

    Публикаций:
    0
    Регистрация:
    4 янв 2009
    Сообщения:
    28
    Получается тоже, что и при выводе PFILE_OBJECT->FileName
     
  4. vasalvit

    vasalvit New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2008
    Сообщения:
    53
    У тебя какое имя получается:
    Код (Text):
    1. \Device\HarddiskVolume1\myfile.txt
    или
    Код (Text):
    1. myfile.txt
     
  5. Zitzy

    Zitzy New Member

    Публикаций:
    0
    Регистрация:
    4 янв 2009
    Сообщения:
    28
    vasalvit
    относительно тома:
    Код (Text):
    1. \Directory\File
     
  6. vasalvit

    vasalvit New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2008
    Сообщения:
    53
    Можно попробовать через IoGetRelatedDeviceObject получить устройство и получить имя устройства при помощи ObQueryNameString. Затем останется только транслировать '\Device\HarddiskVolume1' в 'C:'.
     
  7. Zitzy

    Zitzy New Member

    Публикаций:
    0
    Регистрация:
    4 янв 2009
    Сообщения:
    28
    Что-то вообще странное. Делаю:
    Код (Text):
    1. pDev = IoGetRelatedDeviceObject(pFileObject);
    2. ObQueryNameString(pDev, pObjInfo, 1024, &Length);
    3.  
    4. DbgPrint("%wZ\", pObjInfo->Name);
    И в выводе получаю <null>.
    Хотя память под OBJECT_NAME_INFORMATION выделяется и ObQueryNameString возвращает STATUS_SUCCESS.
     
  8. Zitzy

    Zitzy New Member

    Публикаций:
    0
    Регистрация:
    4 янв 2009
    Сообщения:
    28
    В догонку такой вопрос: как проверить ReadAccess, WriteAccess и DeleteAccess в структуре FILE_OBJECT? Для Share-версий есть IoCheckShareAccess(). А для обычных?
     
  9. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
  10. Zitzy

    Zitzy New Member

    Публикаций:
    0
    Регистрация:
    4 янв 2009
    Сообщения:
    28
    x64, спасибо, только при использовании IoVolumeDeviceToDosName() у меня система виснет. Не в БСоД падает, а именно виснет.
     
  11. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Во-первых, смотрим сюда:

    Во-вторых, они тут забыли написать, что на системах вроде Windows XP это также имеет значение. Другими словами, эту функцию следует вызывать всегда строго на irql=0. В-третьих, если правильно помню, эту функцию (как и некоторые другие) не следует вызывать на именованных каналах (named pipes) и почтовых ящиках (mailslots). В-четвёртых, на всякий случай предупреждаю, что в ряде случаев эта функция не будет работать. Например, оно точно не будет работать для сетевых дисков, а также для некоторых дисков, у которых не предусмотрена поддержка Mount Manager-а. Покажи код целиком, где ты вызываешь эту функцию.
     
  12. Zitzy

    Zitzy New Member

    Публикаций:
    0
    Регистрация:
    4 янв 2009
    Сообщения:
    28
    x64
    Вот, убрал только лишние проверки, чтобы не загромождали основную часть:
    Код (Text):
    1. PFILE_OBJECT pFileObject = IoGetCurrentIrpStackLocation(Irp)->FileObject;
    2. PDEVICE_OBJECT pDev;
    3. PUNICODE_STRING temp = NULL;
    4. LPWSTR Image[256];
    5. HANDLE procID = PsGetCurrentProcessId();
    6. GetProcessNameByPID(procID, Image);
    7.  
    8. pDev = IoGetRelatedDeviceObject(pFileObject);
    9. IoVolumeDeviceToDosName(pDev, temp);
    10.  
    11. DbgPrint("Create: %wZ %ws\n", temp, Image);
    12. ExFreePool(temp);
    13.  
    14. return FsFilterDispatchPassThrough(DeviceObject, Irp);
    Сейчас специально поставил проверки IRQL на PASSIVE_LEVEL + сделал вызов KeAreApcsDisabled(). Все в норме.
     
  13. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Ололо:

    Врача! Врача срочно! У нас приступ острого незнанияязыкаси! Как правильно:

    Ты уверен, что система таки виснет, а не падает? Код в отношении IoVolumeDeviceToDosName() не корректен, по идее, должно падать. Виснуть может, например, в случаях, когда pIoStack -> FileObject -> Flags содержит флаги FO_NAMED_PIPE или FO_MAILSLOT, и то вряд ли из-за этой функции. Т.е. как минимум следует добавить проверку на эти флаги, если они есть - пропускать запрос ниже без вопросов. Да, и если какой-либо поток всё же виснет, покажи стек этого повисшего потока, если падает, покажи анализ дампа, команда !analyze -v. Символы не забудь подгрузить нормальные.