Каталог поиска ntQueryDirectoryFile

Тема в разделе "WASM.WIN32", создана пользователем Progr, 14 ноя 2006.

  1. Progr

    Progr New Member

    Публикаций:
    0
    Регистрация:
    8 ноя 2006
    Сообщения:
    48
    Таак, вот что удалось навоять, но в результате БСОД
    Вот мой глючный код:

    Код (Text):
    1.   char ParentDirectory[1024];
    2.   PUNICODE_STRING Parent=NULL;
    3.   PVOID Object;
    4.   ULONG BytesReturned;
    5.  
    6.   PFILE_OBJECT pParPortXFileObj = NULL;
    7.   PDEVICE_OBJECT pParPortXDevObj = NULL;
    8.   UNICODE_STRING uHardDiskInf;
    9.   UNICODE_STRING uDOSPath;
    10.  
    11.   ParentDirectory[0]='\0';
    12.  
    13.   Parent=(PUNICODE_STRING)ParentDirectory;
    14.   ns=ObReferenceObjectByHandle(hFile,STANDARD_RIGHTS_REQUIRED,*IoFileObjectType,
    15.        KernelMode,&Object,NULL);
    16.   if (!NT_SUCCESS(ns))
    17.       DbgPrint ("Unable to finish first stage");
    18.  
    19.   ns=ObQueryNameString(Object, (POBJECT_NAME_INFORMATION)ParentDirectory,
    20.        sizeof(ParentDirectory), &BytesReturned);
    21.   if (!NT_SUCCESS(ns))
    22.       DbgPrint ("Unable to finish second stage");
    23.   ObDereferenceObject(Object);
    24.  
    25.   //Выделяем место под строку
    26.   RtlInitUnicodeString (&uHardDiskInf, L"                                         ");
    27.   //...и копируем в нее первые 23 символа оригинальной строки (внутреннего системного вида)
    28.   wcsncpy(uHardDiskInf.Buffer, Parent->Buffer, 23);
    29.   //завершающий ноль
    30.   uHardDiskInf.Buffer[23] = 0;
    31.  
    32.   //получаем объект по системному пути (\Device\HarddiskVolumeX)
    33.   ns = IoGetDeviceObjectPointer(&uHardDiskInf,0,&pParPortXFileObj,&pParPortXDevObj);
    34.   if (!NT_SUCCESS(ns))
    35.       DbgPrint ("Unable to finish third stage; Name: %ws", uHardDiskInf.Buffer);
    36.   else {
    37.         //...пытаемся по нему получить ДОСовский путь, но где-то тут возникает БСОД
    38.     ns = IoVolumeDeviceToDosName(&pParPortXDevObj, &uDOSPath);
    39.     if (!NT_SUCCESS(ns))
    40.       DbgPrint ("Unable to finish LAST stage");
    41.     ExFreePool (&uDOSPath);
    42.   }
    БСОД возникает на последнем этапе (где именно не уверен).
    И еще несколько вопросов:
    - ф-ция IoGetDeviceObjectPointer стабильно сначала возвращает ошибку (при первом вызове), не могу понять почему...
    - В ДДК написано что IoVolumeDeviceToDosName работает во всех виндах не ниже ХР, но на одном из форумов попалось сообщение что она не работает под 2003, так ли это?
    - Если не трудно, то скажите что лишнее и т.п...
     
  2. Progr

    Progr New Member

    Публикаций:
    0
    Регистрация:
    8 ноя 2006
    Сообщения:
    48
    Вот еще один вариант (взят с CodeProject), но результат тот же. Система падает при вызове IoVolumeDeviceToDosName:

    Код (Text):
    1.   UNICODE_STRING uDOSPath;
    2.   PFILE_OBJECT file=0;
    3.  
    4.   ns=ObReferenceObjectByHandle(hFile,0,0,KernelMode,&file,NULL);
    5.   if (!NT_SUCCESS(ns))
    6.       DbgPrint ("Unable to finish first stage");
    7.   else {
    8.     ns = IoVolumeDeviceToDosName(file->DeviceObject, &uDOSPath);
    9.     if (!NT_SUCCESS(ns))
    10.       DbgPrint ("Unable to finish last stage");
    11.         //DbgPrint ("Name: %ws", uDOSPath.Buffer);
    12.     ExFreePool (&uDOSPath);
    13.   }
    14.   ObDereferenceObject(&file);
    Так что же все-таки не так?
     
  3. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    ExFreePool (&uDOSPath); !!!
    Должно быть ExFreePool(uDosPath.Buffer);

    А какой статус?
     
  4. Progr

    Progr New Member

    Публикаций:
    0
    Регистрация:
    8 ноя 2006
    Сообщения:
    48
    Так точно, не углядел...

    Посмотрю...
     
  5. Progr

    Progr New Member

    Публикаций:
    0
    Регистрация:
    8 ноя 2006
    Сообщения:
    48
    Эта проблема отпала сама собой, т.к. получаю все что мне нужно без этой функции

    Скажите, если кто знает, я "вырезаю" нормальный путь из системного путем копирования всех символов после 22-го (см. код), в расчете на то, что все пути будут начинаться с \Device\HarddiskVolume. Но здравое мышление подсказывает что так будет не всегда и не везде. Подскажите как лучше отделить системную строку \Device\HarddiskVolume от всего пути...

    Сейчас все это дело выглядет так:

    Код (Text):
    1.   ParentDirectory[0]='\0';
    2.   char ParentDirectory[1024];
    3.   PUNICODE_STRING Parent=NULL;
    4.   ULONG BytesReturned;
    5.   UNICODE_STRING uDOSPath, uPath;
    6.   PFILE_OBJECT file=0;
    7.  
    8.   Parent=(PUNICODE_STRING)ParentDirectory;
    9.   ns=ObReferenceObjectByHandle(hFile,0,0,KernelMode,&file,NULL);
    10.   if (!NT_SUCCESS(ns)) {
    11.       DbgPrint ("Unable to finish first stage");
    12.       return RESULT;
    13.   } else {
    14.     ns = IoVolumeDeviceToDosName(file->DeviceObject, &uDOSPath);
    15.     if (!NT_SUCCESS(ns)) {
    16.       DbgPrint ("Unable to finish last stage");
    17.       return RESULT;
    18.     } else {
    19.         ns=ObQueryNameString(file, (POBJECT_NAME_INFORMATION)ParentDirectory, sizeof(ParentDirectory), &BytesReturned);
    20.         if (!NT_SUCCESS(ns)) {
    21.             DbgPrint ("Unable to finish second stage");
    22.             return RESULT;
    23.         } else {
    24.               neededSize = (Parent->Length-23 + uDOSPath.Length + 2) * 2;
    25.               Name = (wchar_t *)ExAllocatePool(PagedPool, neededSize);
    26.               RtlZeroMemory(Name, neededSize);
    27.               wcsncpy(Name, uDOSPath.Buffer, uDOSPath.Length);
    28.               wcsncat(Name, Parent->Buffer+23, Parent->Length-23);
    29.               RtlInitUnicodeString(&uPath, Name);
    30.         }
    31.         ExFreePool (uDOSPath.Buffer);
    32.     }
    33.     ObDereferenceObject(&file);
    34.   }
    Очевидно, что любой путь короче 23 символов приведет к краху => нужно знать с чего начинается строка с \Device\HarddiskVolume или нет?