![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как получить путь к файлу... [D7, WinXP]
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]