Таак, вот что удалось навоять, но в результате БСОД Вот мой глючный код: Код (Text): char ParentDirectory[1024]; PUNICODE_STRING Parent=NULL; PVOID Object; ULONG BytesReturned; PFILE_OBJECT pParPortXFileObj = NULL; PDEVICE_OBJECT pParPortXDevObj = NULL; UNICODE_STRING uHardDiskInf; UNICODE_STRING uDOSPath; ParentDirectory[0]='\0'; Parent=(PUNICODE_STRING)ParentDirectory; ns=ObReferenceObjectByHandle(hFile,STANDARD_RIGHTS_REQUIRED,*IoFileObjectType, KernelMode,&Object,NULL); if (!NT_SUCCESS(ns)) DbgPrint ("Unable to finish first stage"); ns=ObQueryNameString(Object, (POBJECT_NAME_INFORMATION)ParentDirectory, sizeof(ParentDirectory), &BytesReturned); if (!NT_SUCCESS(ns)) DbgPrint ("Unable to finish second stage"); ObDereferenceObject(Object); //Выделяем место под строку RtlInitUnicodeString (&uHardDiskInf, L" "); //...и копируем в нее первые 23 символа оригинальной строки (внутреннего системного вида) wcsncpy(uHardDiskInf.Buffer, Parent->Buffer, 23); //завершающий ноль uHardDiskInf.Buffer[23] = 0; //получаем объект по системному пути (\Device\HarddiskVolumeX) ns = IoGetDeviceObjectPointer(&uHardDiskInf,0,&pParPortXFileObj,&pParPortXDevObj); if (!NT_SUCCESS(ns)) DbgPrint ("Unable to finish third stage; Name: %ws", uHardDiskInf.Buffer); else { //...пытаемся по нему получить ДОСовский путь, но где-то тут возникает БСОД ns = IoVolumeDeviceToDosName(&pParPortXDevObj, &uDOSPath); if (!NT_SUCCESS(ns)) DbgPrint ("Unable to finish LAST stage"); ExFreePool (&uDOSPath); } БСОД возникает на последнем этапе (где именно не уверен). И еще несколько вопросов: - ф-ция IoGetDeviceObjectPointer стабильно сначала возвращает ошибку (при первом вызове), не могу понять почему... - В ДДК написано что IoVolumeDeviceToDosName работает во всех виндах не ниже ХР, но на одном из форумов попалось сообщение что она не работает под 2003, так ли это? - Если не трудно, то скажите что лишнее и т.п...
Вот еще один вариант (взят с CodeProject), но результат тот же. Система падает при вызове IoVolumeDeviceToDosName: Код (Text): UNICODE_STRING uDOSPath; PFILE_OBJECT file=0; ns=ObReferenceObjectByHandle(hFile,0,0,KernelMode,&file,NULL); if (!NT_SUCCESS(ns)) DbgPrint ("Unable to finish first stage"); else { ns = IoVolumeDeviceToDosName(file->DeviceObject, &uDOSPath); if (!NT_SUCCESS(ns)) DbgPrint ("Unable to finish last stage"); //DbgPrint ("Name: %ws", uDOSPath.Buffer); ExFreePool (&uDOSPath); } ObDereferenceObject(&file); Так что же все-таки не так?
Эта проблема отпала сама собой, т.к. получаю все что мне нужно без этой функции Скажите, если кто знает, я "вырезаю" нормальный путь из системного путем копирования всех символов после 22-го (см. код), в расчете на то, что все пути будут начинаться с \Device\HarddiskVolume. Но здравое мышление подсказывает что так будет не всегда и не везде. Подскажите как лучше отделить системную строку \Device\HarddiskVolume от всего пути... Сейчас все это дело выглядет так: Код (Text): ParentDirectory[0]='\0'; char ParentDirectory[1024]; PUNICODE_STRING Parent=NULL; ULONG BytesReturned; UNICODE_STRING uDOSPath, uPath; PFILE_OBJECT file=0; Parent=(PUNICODE_STRING)ParentDirectory; ns=ObReferenceObjectByHandle(hFile,0,0,KernelMode,&file,NULL); if (!NT_SUCCESS(ns)) { DbgPrint ("Unable to finish first stage"); return RESULT; } else { ns = IoVolumeDeviceToDosName(file->DeviceObject, &uDOSPath); if (!NT_SUCCESS(ns)) { DbgPrint ("Unable to finish last stage"); return RESULT; } else { ns=ObQueryNameString(file, (POBJECT_NAME_INFORMATION)ParentDirectory, sizeof(ParentDirectory), &BytesReturned); if (!NT_SUCCESS(ns)) { DbgPrint ("Unable to finish second stage"); return RESULT; } else { neededSize = (Parent->Length-23 + uDOSPath.Length + 2) * 2; Name = (wchar_t *)ExAllocatePool(PagedPool, neededSize); RtlZeroMemory(Name, neededSize); wcsncpy(Name, uDOSPath.Buffer, uDOSPath.Length); wcsncat(Name, Parent->Buffer+23, Parent->Length-23); RtlInitUnicodeString(&uPath, Name); } ExFreePool (uDOSPath.Buffer); } ObDereferenceObject(&file); } Очевидно, что любой путь короче 23 символов приведет к краху => нужно знать с чего начинается строка с \Device\HarddiskVolume или нет?