Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2009.05.31;
Скачать: [xml.tar.bz2];

Вниз

Как получить путь к файлу...   Найти похожие ветки 

 
Cj ©   (2007-09-05 14:57) [0]

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

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


 
Сергей М. ©   (2007-09-05 15:00) [1]

Зачем это может понадобиться ?


 
Cj ©   (2007-09-05 15:13) [2]

Ну ты понимаеш. У меня иногда бывают такие резкие как пoНoc идеи и я их тут-же осуществляю. Просто перебирал от 1 до 2000 с попыткой
if getfiletype=file_type_disk then...
вот и приспичило узнать пути открытых процессом файлов


> Зачем это может понадобиться ?

уж заверю тебя, я не руткит пишу!
Если не хочеш оглашать функцию скинь мне пожалуйста на мое мыло
мыло=strtoint@mail.ru


 
Сергей М. ©   (2007-09-05 15:24) [3]


> приспичило узнать пути открытых процессом файлов


Твоим процессом ?

А что, ты разве не контролируешь, какие конкретно файлы ты открываешь в своей программе ?


 
Cj ©   (2007-09-05 15:30) [4]

ну просто панаоткрывал файлов в папке, вот, дол...я идея такая


 
Сергей М. ©   (2007-09-05 15:33) [5]


> ну просто панаоткрывал файлов в папке


.. и при этом ума хранить имена открытых файлов (и соотв. им хэндлы) в каком-либо массиве, конечно же не хватило ?

К поносу надо относиться гораздо ответственней)


 
clickmaker ©   (2007-09-05 15:36) [6]


> ну просто панаоткрывал файлов в папке

и чё? имена при этом не запомнить?


 
Сергей М. ©   (2007-09-05 15:37) [7]

Ну раз уж понос случился, лечи его с пом. NtQueryInformationFile()


 
Dib@zol ©   (2007-09-05 15:43) [8]

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


 
clickmaker ©   (2007-09-05 15:45) [9]

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


 
Сергей М. ©   (2007-09-05 15:49) [10]

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


 
Cj ©   (2007-09-05 15:50) [11]

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


 
Dib@zol ©   (2007-09-05 15:51) [12]

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


 
clickmaker ©   (2007-09-05 16:00) [13]

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


 
Dib@zol ©   (2007-09-05 16:07) [14]

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


 
clickmaker ©   (2007-09-05 16:08) [15]

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


 
Dib@zol ©   (2007-09-05 16:09) [16]

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


 
Undri   (2007-09-07 04:28) [17]

Ну если коротенько,то примерно так
NtQuerySystemInformation(SystemHandleInformation,...) +
NtQueryObject(Handle,ObjectNameInformation,...) и т.д.
Правда не для всех файлов срабатывает.


 
Riply ©   (2007-09-07 04:36) [18]

>[17] Undri   (07.09.07 04:28)
>Правда не для всех файлов срабатывает.
А для каких "не срабатывает" ? (Pipe"ы отбросим)


 
Undri   (2007-09-07 06:21) [19]


> Pipe"ы отбросим

Почему отбросим, если на них-то как раз и "не срабатывает" ? :)


 
Riply ©   (2007-09-07 06:32) [20]

> [19] Undri   (07.09.07 06:21)
> Почему отбросим,
Потому, что это старая проблемма.
>если на них-то как раз и "не срабатывает" ? :)
На них срабатывает, но иногда для срабатывания требуется неопределенное количество времени :)


 
Slym ©   (2007-09-07 06:38) [21]

unit NTApi;

interface
uses windows,sysutils;

type
 NT_STATUS = Cardinal;

function NtQuerySystemInformation(SystemInformationClass: DWORD; SystemInformation: Pointer;
SystemInformationLength:DWORD; ReturnLength:PDWORD):NT_STATUS; stdcall;

type
 PIO_STATUS_BLOCK = ^IO_STATUS_BLOCK;
 IO_STATUS_BLOCK = packed record
   Status: NT_STATUS;
   Information: DWORD;
 end;
 TIOStatusBlock=IO_STATUS_BLOCK;

 PFILE_NAME_INFORMATION = ^FILE_NAME_INFORMATION;
 FILE_NAME_INFORMATION = packed record
   FileNameLength: ULONG;
   FileName: array [0..MAX_PATH - 1] of WideChar;
 end;
 TFileNameInformation=FILE_NAME_INFORMATION;

 PUNICODE_STRING = ^TUNICODE_STRING;
 TUNICODE_STRING = packed record
   Length : WORD;
   MaximumLength : WORD;
   Buffer : array [0..MAX_PATH - 1] of WideChar;
 end;

 POBJECT_NAME_INFORMATION = ^OBJECT_NAME_INFORMATION;
 OBJECT_NAME_INFORMATION = packed record
   Name : TUNICODE_STRING;
 end;
 TObjectNameInformation=OBJECT_NAME_INFORMATION;

const
 STATUS_SUCCESS = NT_STATUS($00000000);
 STATUS_INVALID_INFO_CLASS = NT_STATUS($C0000003);
 STATUS_INFO_LENGTH_MISMATCH = NT_STATUS($C0000004);
 STATUS_INVALID_DEVICE_REQUEST = NT_STATUS($C0000010);
 ObjectNameInformation = 1;
 FileDirectoryInformation = 1;
 FileNameInformation = 9;
 SystemProcessesAndThreadsInformation = 5;
 SystemHandleInformation = 16;

function NtQueryInformationFile(FileHandle: THandle; IoStatusBlock: PIO_STATUS_BLOCK; FileInformation: Pointer;
Length: DWORD; FileInformationClass: DWORD): NT_STATUS; stdcall;

function NtQueryObject(ObjectHandle: THandle; ObjectInformationClass: DWORD; ObjectInformation: Pointer;
   ObjectInformationLength: ULONG; ReturnLength: PDWORD): NT_STATUS; stdcall;

function GetLongPathNameA(lpszShortPath, lpszLongPath: PChar;
   cchBuffer: DWORD): DWORD; stdcall; external kernel32 name "GetLongPathNameA";

const
 ntdll  = "ntdll.dll";

function GetFileNameByHandle(FileHandle: THandle):string;

implementation

function NtQuerySystemInformation; external ntdll name "NtQuerySystemInformation";
function NtQueryInformationFile; external ntdll name "NtQueryInformationFile";
function NtQueryObject; external ntdll name "NtQueryObject";

function GetFileNameByHandle(FileHandle: THandle):string;
var
 FileNameInfo: TFileNameInformation;
 ObjectNameInfo: TObjectNameInformation;
 IoStatusBlock: TIOStatusBlock;
 res,dwReturn: DWORD;
begin
 result:="";
 res := NtQueryInformationFile(FileHandle,@IoStatusBlock,@FileNameInfo,
   SizeOf(FileNameInfo.FileName),FileNameInformation);
 if res = STATUS_SUCCESS then
 begin
   res := NtQueryObject(FileHandle,ObjectNameInformation,
     @ObjectNameInfo, SizeOf(ObjectNameInfo.Name.Buffer), @dwReturn);
   if res = STATUS_SUCCESS then
   begin
     SetLength(result,MAX_PATH);
     SetLength(result,WideCharToMultiByte(CP_ACP, 0,
       @ObjectNameInfo.Name.Buffer[ObjectNameInfo.Name.MaximumLength -
       ObjectNameInfo.Name.Length],
       ObjectNameInfo.Name.Length div SizeOf(WideChar),
       @result[1],MAX_PATH, nil, nil));
   end else
   begin
     SetLength(result,MAX_PATH);
     SetLength(result,WideCharToMultiByte(CP_ACP, 0,
       @FileNameInfo.FileName[0], FileNameInfo.FileNameLength div SizeOf(WideChar),
       @result[1],MAX_PATH, nil, nil));
   end;
 end;
end;

end.


 
Slym ©   (2007-09-07 07:01) [22]

только как получить нормальный c:\ низнаю :)
хотя... можно для всех DosDevice получить \Device\HarddiskVolumeX\ и тупо заменять


 
Riply ©   (2007-09-07 07:04) [23]

>[21] Slym ©   (07.09.07 06:38)
А для чего вызывается NtQueryInformationFile ?
Почему не обойтись только NtQueryObject ?


 
Slym ©   (2007-09-07 07:27) [24]

Riply ©   (07.09.07 7:04) [23]
NtQueryObject

хз с инета сдернул :)
а так NtQueryObject - на пайпах виснет и NtQueryInformationFile используется (я так понял) аля GetFileType(FileHandle: THandle)=FILE_TYPE_CHAR


 
SLoW.AlfaMoon.Com   (2007-09-07 10:23) [25]

RtlNtPathNameToDosPathName [WXP, 2K3]


 
Undri   (2007-09-07 12:59) [26]

У меня код [21] вообще ничего не показывает. Единственное, что на пайпах не виснет :)

> Riply ©   (07.09.07 06:32) [20]
>
> > [19] Undri   (07.09.07 06:21)
> > Почему отбросим,
> Потому, что это старая проблемма.

Это не проблема. Решается простым драйвером.


> Riply ©   (07.09.07 06:32) [20]
>
> >если на них-то как раз и "не срабатывает" ? :)
> На них срабатывает, но иногда для срабатывания требуется
> неопределенное количество времени :)

Иногда до конца сеанса :)


 
Riply ©   (2007-09-07 13:13) [27]

> [26] Undri   (07.09.07 12:59)
> У меня код [21] вообще ничего не показывает. Единственное, что на пайпах не виснет :)
Не на тех пайпах пробовал :)
P.S. Код не тестировала.

> Это не проблема. Решается простым драйвером.
Мне до написания драйвера как до луны :(
Поэтому для меня это остается проблеммой.


 
Undri   (2007-09-07 14:10) [28]


> Riply ©   (07.09.07 13:13) [27]
>
> Не на тех пайпах пробовал :)

На тех - на тех :) Cинхронные пайпы, занятые в данный момент.


> Riply ©   (07.09.07 13:13) [27]
>
> P.S. Код не тестировала.
>

Там просто память надо выделить для FileNameInfo и ObjectNameInfo.


> Riply ©   (07.09.07 13:13) [27]
>
> > Это не проблема. Решается простым драйвером.
> Мне до написания драйвера как до луны :(
> Поэтому для меня это остается проблеммой.
>

Ещё вариант - создать поток, в ф-ции которого запрашивать имя. А если поток скажем через 100 мс. сам не завершится (типа WaitForSingleObject( hThread, 100 ) == WAIT_TIMEOUT ) - значит завис на пайпе. После чего прибить его TerminateThread"ом.
Правда, имени его ты так и не узнаешь :) Это только из R0 сделать можно.


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

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


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


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

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

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


 
Cj ©   (2007-09-09 12:10) [31]

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


 
Riply ©   (2007-09-09 12:19) [32]

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


 
Cj ©   (2007-09-09 12:19) [33]

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


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


> Undri


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

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


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

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;


 
Undri   (2007-09-11 08:08) [36]

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


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

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


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

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


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


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

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


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

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

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



Страницы: 1 2 вся ветка

Форум: "WinAPI";
Текущий архив: 2009.05.31;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.005 c
15-1238018281
Юрий
2009-03-26 00:58
2009.05.31
С днем рождения ! 26 марта 2009 четверг


2-1240150745
programmer90
2009-04-19 18:19
2009.05.31
Delphi и командная строка


2-1240130471
Inko
2009-04-19 12:41
2009.05.31
Вопрос по StringGrid


2-1240272203
truefalse
2009-04-21 04:03
2009.05.31
Прога пропала из Taskbar, но в дисп. заданий есть->куда смотреть?


2-1239684656
Alex_C
2009-04-14 08:50
2009.05.31
Изменение размеров динамических массивов





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский