Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.05.31;
Скачать: CL | DM;

Вниз

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

 
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 вся ветка

Текущий архив: 2009.05.31;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.015 c
15-1238486183
desc
2009-03-31 11:56
2009.05.31
Что может быть ? Не могу откомпелировать компонент...


3-1215112673
Real
2008-07-03 23:17
2009.05.31
Open Office - Base


9-1180095242
@!!ex
2007-05-25 16:14
2009.05.31
Вопрос по нескольким RC.


15-1237877089
{RASkov}
2009-03-24 09:44
2009.05.31
Настройка сетевого принтера


6-1203404629
stupido
2008-02-19 10:03
2009.05.31
Apache shared module