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 есть какие-то такие функции, но ту ветку непомню.


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


> 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 сделать можно.


Riply   (2007-09-07 13:13:00) [22]

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

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


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

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

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

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


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

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


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

RtlNtPathNameToDosPathName [WXP, 2K3]


Slym   (2007-09-07 07:27:00) [25]

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

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


Riply   (2007-09-07 07:04:00) [26]

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


Slym   (2007-09-07 07:01:00) [27]

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


Slym   (2007-09-07 06:38:00) [28]

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.


Riply   (2007-09-07 06:32:00) [29]

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


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


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

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


Riply   (2007-09-07 04:36:00) [31]

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


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

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


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

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


clickmaker   (2007-09-05 16:08:00) [34]

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


Dib@zol   (2007-09-05 16:07:00) [35]

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


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

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


Dib@zol   (2007-09-05 15:51:00) [37]

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


Cj   (2007-09-05 15:50:00) [38]

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


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

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


clickmaker   (2007-09-05 15:45:00) [40]

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


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

Наверх

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