Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как получить путь к файлу... [D7, WinXP]


Страницы:   1 2 3

Cj ©   (2007-09-05 14:57:00) 

...если есть его handle полученый с помощью CreateFile. Подскажите в какую сторону копать.

ps Слышал вроде-бы  ntdll есть какие-то такие функции, но ту ветку непомню.


Cj   (2008-05-09 14:51:00) [1]

вообщето ответ уже давно сказали.и про перевод в нормальный путь. но лишняя инфа не помешает. спасибо


Devil_guy   (2008-05-08 20:44:00) [2]

#define RTL_NT_PATH_NAME_TO_DOS_PATH_NAME_AMBIGUOUS   (0x00000001)
#define RTL_NT_PATH_NAME_TO_DOS_PATH_NAME_UNC         (0x00000002)
#define RTL_NT_PATH_NAME_TO_DOS_PATH_NAME_DRIVE       (0x00000003)
#define RTL_NT_PATH_NAME_TO_DOS_PATH_NAME_ALREADY_DOS (0x00000004)

NTSYSAPI
NTSTATUS
NTAPI
RtlNtPathNameToDosPathName(
   __in ULONG Flags,
   __inout PRTL_UNICODE_STRING_BUFFER Path,
   __out_opt PULONG Disposition,
   __inout_opt PWSTR* FilePart
   );

typedef struct _RTL_UNICODE_STRING_BUFFER {
   UNICODE_STRING String;
   RTL_BUFFER     ByteBuffer;
   UCHAR          MinimumStaticBufferForTerminalNul[sizeof(WCHAR)];
} RTL_UNICODE_STRING_BUFFER, *PRTL_UNICODE_STRING_BUFFER;

typedef struct _RTL_BUFFER {
   PUCHAR    Buffer;
   PUCHAR    StaticBuffer;
   SIZE_T    Size;
   SIZE_T    StaticSize;
   SIZE_T    ReservedForAllocatedSize; // for future doubling
   PVOID     ReservedForIMalloc; // for future pluggable growth
} RTL_BUFFER, *PRTL_BUFFER;


Прохожий   (2007-10-26 12:56:00) [3]

Удалено модератором
Примечание: Забаню за неуважение к правилам


  (2007-10-26 05:28:00) [4]

Удалено модератором


LENIN_INC   (2007-10-10 13:25:00) [5]

Удалено модератором


Игорь Шевченко   (2007-09-12 09:34:00) [6]

Undri   (12.09.07 01:28) [41]

Конечно

function RtlDosPathNameToNtPathName_U (const DosFileName: PWideChar;
 NtFileName: PUNICODE_STRING; FilePart: PPWideChar;
 RelativeName: PRTL_RELATIVE_NAME): Boolean; stdcall;

Slym ©   (12.09.07 08:02) [42]


> ухты,а хде валяются? (ссылку)


В кладовке у керка ( http://kladovka.net.ru) по ISchevchenko поищи


Slym   (2007-09-12 08:02:00) [7]

Игорь Шевченко ©   (11.09.07 17:23) [40]
ухты,а хде валяются? (ссылку)


Undri   (2007-09-12 01:28:00) [8]

> Игорь Шевченко ©   (11.09.07 11:42) [38]
Спасибо.

А есть обратная (RtlDosPathNameToNtPathName_U ??) ?


Игорь Шевченко   (2007-09-11 17:23:00) [9]

SLoW.AlfaMoon.Com   (11.09.07 16:18) [39]

Нету пока. Не успеваю :)


SLoW.AlfaMoon.Com   (2007-09-11 16:18:00) [10]


> Игорь Шевченко ©   (11.09.07 11:42) [38]

Спасибо, ценно. Это в ваших модулях по Native API есть?


Игорь Шевченко   (2007-09-11 11:42:00) [11]

NTSTATUS RtlNtPathNameToDosPathName (UNICODE_STRING* NtPathName, UNICODE_STRING* DosPathName, ULONG* ReturnedLength, LPWSTR* FilePath)


SLoW.AlfaMoon.Com   (2007-09-11 10:00:00) [12]

NTSTATUS NTAPI RtlNtPathNameToDosPathName   (    
               ULONG     Unknown1,
 ULONG   Unknown2,
 ULONG   Unknown3,
 ULONG   Unknown4
)


Undri   (2007-09-11 08:08:00) [13]

Забыл добавить: тут не учитываются Network drive'ы (всякие там LanmanRedirector/etc.). Но при желании и их можно довольно просто обработать.


Undri   (2007-09-11 07:40:00) [14]

SLoW.AlfaMoon.Com, спасибо. Я просто нигде не нашел сигнатуры RtlNtPathNameToDosPathName. Думал, может у тебя имеется..

А сам я пользую  вот такое:


// device file name -> DOS file name
function GetDOSFileName(lpDeviceFileName:pchar):string;
var
lpDeviceName:array[0..$1000-1] of char;
lpDrive:array[0..2] of char;
actDrive:char;
begin
 Result:=lpDeviceFileName;
lpDrive := 'A:';
for actDrive :='A' to 'Z' do
begin
 lpDrive[0] := actDrive;
 if (QueryDosDevice(lpDrive, lpDeviceName, $1000) <> 0) then
 begin
     if (CompareString(LOCALE_SYSTEM_DEFAULT,NORM_IGNORECASE,lpDeviceName,lstrlen(lpDevi ceName),
                      lpDeviceFileName,lstrlen(lpDeviceName))=CSTR_EQUAL) then
  begin
   Result:=string(lpDrive)+PChar(cardinal(lpDeviceFileName) + lstrlen(lpDeviceName));
   break
  end
 end
end
end;

// DOS file name -> device file name
function GetDeviceFileName(lpDOSFileName:pchar):string;
var
lpDrive:array[0..2] of char;
lpDeviceName:array[0..$1000-1] of char;
begin
 Result:=lpDOSFileName;
lstrcpyn(lpDrive,lpDOSFileName,3);
if (QueryDosDevice(lpDrive, lpDeviceName, $1000 )<>0) then
begin
   if (CompareString(LOCALE_SYSTEM_DEFAULT,NORM_IGNORECASE,'\??\',4,
                      lpDeviceName,4)=CSTR_EQUAL) then
 begin
  Result:=PChar(lpDeviceName + 4)+ string(PChar(lpDOSFileName + 2));
  exit
 end;
 lstrcat(lpDeviceName, lpDOSFileName + 2 );
 Result := lpDeviceName
end
end;


SLoW.AlfaMoon.Com   (2007-09-10 10:17:00) [15]


> Undri


функцию "копать" надо. сэмпла у себя не нашел чего-то :( Странно.
Впрочем вот тебе решение

http://www.wasm.ru/forum/viewtopic.php?pid=183057#p183057


Cj   (2007-09-09 12:19:00) [16]

А, все, разобрался, еще раз спасибо всем!


Riply   (2007-09-09 12:19:00) [17]

> [31] Cj ©   (09.09.07 12:10)
>а перевести вроде-бы можно QueryDosDevice - не подскажете?
У [22] Slym © один из вариантов.
Можно еще посмотреть исходники от Игоря Шевченко.
Если память мне не изменяет, то в DeviceIoControl60 есть функция перевода.


Cj   (2007-09-09 12:10:00) [18]

Всем спасибо, заработало, только путь выводит в виде
\Device\HarddiskVolume1\
я то знаю, что это c:\ раздел первый.
а перевести вроде-бы можно QueryDosDevice - не подскажете?


Undri   (2007-09-08 02:01:00) [19]


> SLoW.AlfaMoon.Com   (07.09.07 10:23) [25]
>
> RtlNtPathNameToDosPathName [WXP, 2K3]

А сигнатуру можешь дать (хотя бы типы параметров)?  Полазил по Сети - ничего конкретного по этой ф-ции не обнаружил :(

ЗЫ  ты сам-то пользовался этой функцией?


SLoW.AlfaMoon.Com   (2007-09-07 15:55:00) [20]

пост [25]
это в ответ на Slym ©   (07.09.07 07:01) [22]


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо