Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Узнать какие папки/файлы использует процесс 
:(
    Опции темы
AHTOLLlKA
  Дата 22.5.2009, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 18.10.2007

Репутация: нет
Всего: нет



есть некий процес test.exe

и он работает тоже с некими файлами и папками..


вот суть вопроса: как получить этот список открытых / заблокированных им файлов и папок


PM MAIL ICQ   Вверх
Riply
Дата 23.5.2009, 06:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Комодератор
Сообщений: 572
Регистрация: 27.3.2007
Где: St. Petersburg

Репутация: 21
Всего: 32



Цитата(AHTOLLlKA @  22.5.2009,  13:49 Найти цитируемый пост)
вот суть вопроса: как получить этот список открытых / заблокированных им файлов и папок


Корректно, из user-mode - никак.
На всякий случай перефразируем: корректного решения в user-mode я не встречала smile

Если устроит решение типа "терминируем нить в цикле", то ищи на сайте Rouse_`а.
Есть и другой вариант, но там не будет гарантии, что перечислены абсолютно все объекты.
PM MAIL   Вверх
AHTOLLlKA
Дата 23.5.2009, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 18.10.2007

Репутация: нет
Всего: нет



есть пример перечисляющий хендлы используемых или заблокированых файлов.. но та мдля всех процесов.. тоесть да, можно фильтровать но все равно все это длится секунд 5.. а это не айс...

слышал что можно как то через дубликейтхендл сделать
PM MAIL ICQ   Вверх
Riply
Дата 23.5.2009, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Комодератор
Сообщений: 572
Регистрация: 27.3.2007
Где: St. Petersburg

Репутация: 21
Всего: 32



Цитата(AHTOLLlKA @  23.5.2009,  16:55 Найти цитируемый пост)
есть пример перечисляющий хендлы используемых или заблокированых файлов.. но та мдля всех процесов.. тоесть да, можно фильтровать но все равно все это длится секунд 5.. а это не айс...


Не знаю что за пример ты видел, но ZwQuerySystemInformation(SystemHandleInformation, ...)
отрабатывает за микро, а не милисекунды. А ведь именно она возвращает открытые Handle`ы, в том числе и файлов.


Цитата(AHTOLLlKA @  23.5.2009,  16:55 Найти цитируемый пост)
слышал что можно как то через дубликейтхендл сделать 


Сделать что ?

PM MAIL   Вверх
AHTOLLlKA
Дата 24.5.2009, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 18.10.2007

Репутация: нет
Всего: нет



есть какойто такой вот код...
перебирает хендлы и выводит

Код

unit Unit1;

interface

uses     tlhelp32,
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, Menus, ExtCtrls;

type NT_STATUS = Cardinal;

 PSYSTEM_THREADS = ^SYSTEM_THREADS;
 SYSTEM_THREADS  = packed record
   KernelTime: LARGE_INTEGER;
   UserTime: LARGE_INTEGER;
   CreateTime: LARGE_INTEGER;
   WaitTime: ULONG;
   StartAddress: Pointer;
   UniqueProcess: DWORD;
   UniqueThread: DWORD;
   Priority: Integer;
   BasePriority: Integer;
   ContextSwitchCount: ULONG;
   State: Longint;
   WaitReason: Longint;
 end;

  PSYSTEM_PROCESS_INFORMATION = ^SYSTEM_PROCESS_INFORMATION;
  SYSTEM_PROCESS_INFORMATION = packed record
    NextOffset: ULONG;
    ThreadCount: ULONG;
    Reserved1: array [0..5] of ULONG;
    CreateTime: FILETIME;
    UserTime: FILETIME;
     KernelTime: FILETIME;
    ModuleNameLength: WORD;
    ModuleNameMaxLength: WORD;
    ModuleName: PWideChar;
    BasePriority: ULONG;
    ProcessID: ULONG;
    InheritedFromUniqueProcessID: ULONG;
    HandleCount: ULONG;
    Reserved2 : array[0..1] of ULONG;
    PeakVirtualSize : ULONG;
    VirtualSize : ULONG;
    PageFaultCount : ULONG;
    PeakWorkingSetSize : ULONG;
    WorkingSetSize : ULONG;
    QuotaPeakPagedPoolUsage : ULONG;
    QuotaPagedPoolUsage : ULONG;
    QuotaPeakNonPagedPoolUsage : ULONG;
    QuotaNonPagedPoolUsage : ULONG;
    PageFileUsage : ULONG;
    PeakPageFileUsage : ULONG;
    PrivatePageCount : ULONG;
    ReadOperationCount : LARGE_INTEGER;
    WriteOperationCount : LARGE_INTEGER;
    OtherOperationCount : LARGE_INTEGER;
    ReadTransferCount : LARGE_INTEGER;
    WriteTransferCount : LARGE_INTEGER;
    OtherTransferCount : LARGE_INTEGER;
   ThreadInfo: array [0..0] of SYSTEM_THREADS;
 end;

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

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

 PFILE_NAME_INFORMATION = ^FILE_NAME_INFORMATION;
 FILE_NAME_INFORMATION = packed record
   FileNameLength: ULONG;
   FileName: array [0..MAX_PATH - 1] of WideChar;
 end;
 TForm1 = class(TForm)
   ListBox1: TListBox;
    Button1: TButton;
    Edit1: TEdit;
    procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;
SYSTEM_HANDLE_INFORMATION = packed record
     ProcessId: DWORD;
     ObjectTypeNumber: Byte;
     Flags: Byte;
     Handle: Word;
     pObject: Pointer;
     GrantedAccess: DWORD;
end;
PSYSTEM_HANDLE_INFORMATION = ^SYSTEM_HANDLE_INFORMATION;

PSYSTEM_HANDLE_INFORMATION_EX = ^SYSTEM_HANDLE_INFORMATION_EX;
   SYSTEM_HANDLE_INFORMATION_EX = packed record
     NumberOfHandles: dword;
     Information: array [0..0] of SYSTEM_HANDLE_INFORMATION;
   end;
 PGetFileNameThreadParam = ^TGetFileNameThreadParam;
 TGetFileNameThreadParam = packed record
   hFile: THandle;
   Data: array [0..MAX_PATH - 1] of Char;
   Status: NT_STATUS;
 end;

//**************************************************************************
var   SystemHandleInformation:SYSTEM_HANDLE_INFORMATION;
 Form1: TForm1;
 
 function GetLongPathNameA(lpszShortPath, lpszLongPath: PChar;
       cchBuffer: DWORD): DWORD; stdcall; external kernel32;

 function NtQueryObject(ObjectHandle: THandle;
   ObjectInformationClass: DWORD; ObjectInformation: Pointer;
   ObjectInformationLength: ULONG;
   ReturnLength: PDWORD): NT_STATUS; stdcall; external 'ntdll.dll';

 function NtQueryInformationFile(FileHandle: THandle;
   IoStatusBlock: PIO_STATUS_BLOCK; FileInformation: Pointer;
   Length: DWORD; FileInformationClass: DWORD): NT_STATUS;
   stdcall; external 'ntdll.dll';

 function ZwQuerySystemInformation(ASystemInformationClass: DWORD;
      ASystemInformation: Pointer; ASystemInformationLength: DWORD;
     AReturnLength: PDWORD): NT_STATUS; stdcall; external 'ntdll.dll';
implementation

{$R *.dfm}
//**************************************************************************
 function GetInfoTable(ATableType: DWORD): Pointer;
  const STATUS_INFO_LENGTH_MISMATCH = NT_STATUS($C0000004);
  var
    dwSize: DWORD;
    pPtr: Pointer;
    ntStatus: NT_STATUS;
  begin
    Result := nil;
    dwSize := WORD(-1);
    GetMem(pPtr, dwSize);
    ntStatus := ZwQuerySystemInformation(ATableType, pPtr, dwSize, nil);
    while ntStatus = STATUS_INFO_LENGTH_MISMATCH do
    begin
      dwSize := dwSize * 2;
      ReallocMem(pPtr, dwSize);
      ntStatus := ZwQuerySystemInformation(ATableType, pPtr, dwSize, nil);
    end;
    if ntStatus = NT_STATUS($00000000){STATUS_SUCCESS} then
      Result := pPtr
    else
      FreeMem(pPtr);
  end;
//**************************************************************************
function GetFileHandleType:byte;
var
hFile,r:THANDLE;
Info: PSYSTEM_HANDLE_INFORMATION_EX;
begin
result:=0;
hFile := CreateFile('NUL', GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0);
if (hFile <> INVALID_HANDLE_VALUE) then begin
Info := GetInfoTable(16{SystemHandleInformation});
if (Info<>nil) then
for r:=0 to Info.NumberOfHandles do begin
 if ((Info.Information[r].Handle = hFile) and
    (Info.Information[r].ProcessId = GetCurrentProcessId)) then begin
   result:=info.Information[r].ObjectTypeNumber;
//   Result := ;
  break;
 end;
end;
end;

FreeMem(Info);
CloseHandle(hFile);
end;


//**************************************************************************
function GetFileNameThread(lpParameters: Pointer): DWORD; stdcall;
const FileNameInformation = 9; ObjectNameInformation = 1;
  var
    FileNameInfo: FILE_NAME_INFORMATION;
    ObjectNameInfo: TOBJECT_NAME_INFORMATION;
    IoStatusBlock: IO_STATUS_BLOCK;
    pThreadParam: TGetFileNameThreadParam;
    dwReturn: DWORD;
  begin
    ZeroMemory(@FileNameInfo, SizeOf(FILE_NAME_INFORMATION));
    pThreadParam := PGetFileNameThreadParam(lpParameters)^;
    Result := NtQueryInformationFile(pThreadParam.hFile, @IoStatusBlock,
      @FileNameInfo, MAX_PATH * 2, FileNameInformation);
    if Result = NT_STATUS($00000000){STATUS_SUCCESS} then
    begin
      Result := NtQueryObject(pThreadParam.hFile, ObjectNameInformation,
        @ObjectNameInfo, MAX_PATH * 2, @dwReturn);
      if Result = NT_STATUS($00000000){STATUS_SUCCESS} then
      begin
        pThreadParam.Status := Result;
        WideCharToMultiByte(CP_ACP, 0,
          @ObjectNameInfo.Name.Buffer[ObjectNameInfo.Name.MaximumLength -
          ObjectNameInfo.Name.Length],
          ObjectNameInfo.Name.Length, @pThreadParam.Data[0],
          MAX_PATH, nil, nil);
      end
      else
      begin
        pThreadParam.Status := NT_STATUS($00000000){STATUS_SUCCESS};
        Result := NT_STATUS($00000000){STATUS_SUCCESS};
        WideCharToMultiByte(CP_ACP, 0,
          @FileNameInfo.FileName[0], IoStatusBlock.Information,
          @pThreadParam.Data[0],
          MAX_PATH, nil, nil);
      end;
    end;
    PGetFileNameThreadParam(lpParameters)^ := pThreadParam;
    ExitThread(Result);
  end;


function GetFileNameFromHandle(hFile: THandle): String;
 var
   lpExitCode: DWORD;
   pThreadParam: TGetFileNameThreadParam;
   hThread: THandle;
 begin
   Result := '';
   ZeroMemory(@pThreadParam, SizeOf(TGetFileNameThreadParam));
   pThreadParam.hFile := hFile;
   hThread := CreateThread(nil, 0, @GetFileNameThread, @pThreadParam, 0, PDWORD(nil)^);
   if hThread <> 0 then
   try
     case WaitForSingleObject(hThread, 100) of
       WAIT_OBJECT_0:
       begin
         GetExitCodeThread(hThread, lpExitCode);
         if lpExitCode = NT_STATUS($00000000){STATUS_SUCCESS} then
           Result := pThreadParam.Data;
       end;
       WAIT_TIMEOUT:
         TerminateThread(hThread, 0);
     end;
   finally
     CloseHandle(hThread);
   end;
 end;



function GetHandlesFileFromPID(PID:cardinal):string;
var SystemInformation: PSYSTEM_PROCESS_INFORMATION;
 pHandleInfo: PSYSTEM_HANDLE_INFORMATION_EX;
b:byte;  i:integer;    s:String;
cp,hp:Cardinal;hFile: THandle;
begin
b:=GetFileHandleType;
SystemInformation:= GetInfoTable(5);
 if SystemInformation <> nil then
   pHandleInfo := GetInfoTable(16);
for I := 0 to pHandleInfo^.NumberOfHandles - 1 do
     begin
       if pHandleInfo^.Information[I].ObjectTypeNumber = b then
       begin
         hP := OpenProcess(PROCESS_DUP_HANDLE, True,
           pHandleInfo^.Information[I].ProcessId);
         if hP > 0 then
         try
           if DuplicateHandle(hP, pHandleInfo^.Information[I].Handle,
             GetCurrentProcess, @hFile, 0, False, DUPLICATE_SAME_ACCESS) then
           try
             if Application.Terminated then Exit;
             s := GetFileNameFromHandle(hFile);

            if (trim(s)<>'')and(pHandleInfo^.Information[I].ProcessId=PID) then
              result:=result+(inttostr(pHandleInfo^.Information[I].ProcessId)+' '+s)
              +#10#13;
           finally
             CloseHandle(hFile);
           end;
         finally
           CloseHandle(hP);
         end;
       end;
       Application.ProcessMessages;
     end;
end;





PM MAIL ICQ   Вверх
Riply
Дата 25.5.2009, 16:24 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Комодератор
Сообщений: 572
Регистрация: 27.3.2007
Где: St. Petersburg

Репутация: 21
Всего: 32



Цитата(AHTOLLlKA @  24.5.2009,  11:10 Найти цитируемый пост)
есть какойто такой вот код...


Есть и уж очень знакомый smile

Цитата(AHTOLLlKA @  24.5.2009,  11:10 Найти цитируемый пост)
перебирает хендлы и выводит


И что ? 
Я за него рада smile
В чем вопрос то ?
PM MAIL   Вверх
AHTOLLlKA
Дата 26.5.2009, 20:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 18.10.2007

Репутация: нет
Всего: нет



Цитата(Riply @  25.5.2009,  16:24 Найти цитируемый пост)
И что ? Я за него рада В чем вопрос то ?

если делать на каждый хендл
GetFileNameFromHandle(hFile);

то он перебирает гдето секунд шесть.. а это крайне долго... вот и как то можно ускоритть??
PM MAIL ICQ   Вверх
Riply
Дата 27.5.2009, 00:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Комодератор
Сообщений: 572
Регистрация: 27.3.2007
Где: St. Petersburg

Репутация: 21
Всего: 32



Цитата(AHTOLLlKA @  26.5.2009,  20:38 Найти цитируемый пост)
то он перебирает гдето секунд шесть.. а это крайне долго... вот и как то можно ускоритть?? 


Ну..., если латать данный код, то можно поступить так:
Так как львиную долю времени съедает многократное создание нити (это очень тяжелая операция), 
то один из вариантов решения - не выходить из нити при удачном запросе, а использовать ее же для следующего запроса.
Разумеется, если ее пришлось терминировать, то создаем заново.
Практика показывает, что таким образом можно уложиться в 20-25 раз нитей_создавания smile
и снизить затрачиваемое время на порядок.

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.1216 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.