Jak mogę uzyskać listę otwartych plików przez aplikację, używając Delphi? Na przykład, jakie pliki są otwierane przez winword.exeDelphi - zobacz, jakie pliki otwiera aplikacja
7
A
Odpowiedz
12
Za pomocą funkcji Native API NtQuerySystemInformation można wyświetlić listę wszystkich otwartych uchwytów ze wszystkich procesów.
spróbować tego przykładu
program ListAllHandles;
{$APPTYPE CONSOLE}
uses
PSApi,
Windows,
SysUtils;
const
SystemHandleInformation = $10;
STATUS_SUCCESS = $00000000;
STATUS_BUFFER_OVERFLOW = $80000005;
STATUS_INFO_LENGTH_MISMATCH = $C0000004;
DefaulBUFFERSIZE = $100000;
type
OBJECT_INFORMATION_CLASS = (ObjectBasicInformation,ObjectNameInformation,ObjectTypeInformation,ObjectAllTypesInformation,ObjectHandleInformation);
SYSTEM_HANDLE=packed record
uIdProcess:ULONG;
ObjectType:UCHAR;
Flags :UCHAR;
Handle :Word;
pObject :Pointer;
GrantedAccess:ACCESS_MASK;
end;
PSYSTEM_HANDLE = ^SYSTEM_HANDLE;
SYSTEM_HANDLE_ARRAY = Array[0..0] of SYSTEM_HANDLE;
PSYSTEM_HANDLE_ARRAY= ^SYSTEM_HANDLE_ARRAY;
SYSTEM_HANDLE_INFORMATION=packed record
uCount:ULONG;
Handles:SYSTEM_HANDLE_ARRAY;
end;
PSYSTEM_HANDLE_INFORMATION=^SYSTEM_HANDLE_INFORMATION;
TNtQuerySystemInformation=function (SystemInformationClass:DWORD; SystemInformation:pointer; SystemInformationLength:DWORD; ReturnLength:PDWORD):THandle; stdcall;
TNtQueryObject =function (ObjectHandle:cardinal; ObjectInformationClass:OBJECT_INFORMATION_CLASS; ObjectInformation:pointer; Length:ULONG;ResultLength:PDWORD):THandle;stdcall;
UNICODE_STRING=packed record
Length :Word;
MaximumLength:Word;
Buffer :PWideChar;
end;
OBJECT_NAME_INFORMATION=UNICODE_STRING;
POBJECT_NAME_INFORMATION=^OBJECT_NAME_INFORMATION;
Var
NTQueryObject :TNtQueryObject;
NTQuerySystemInformation:TNTQuerySystemInformation;
function GetObjectInfo(hObject:cardinal; objInfoClass:OBJECT_INFORMATION_CLASS):LPWSTR;
var
pObjectInfo:POBJECT_NAME_INFORMATION;
HDummy :THandle;
dwSize :DWORD;
begin
Result:=nil;
dwSize := sizeof(OBJECT_NAME_INFORMATION);
pObjectInfo := AllocMem(dwSize);
HDummy := NTQueryObject(hObject, objInfoClass, pObjectInfo,dwSize, @dwSize);
if((HDummy = STATUS_BUFFER_OVERFLOW) or (HDummy = STATUS_INFO_LENGTH_MISMATCH)) then
begin
FreeMem(pObjectInfo);
pObjectInfo := AllocMem(dwSize);
HDummy := NTQueryObject(hObject, objInfoClass, pObjectInfo,dwSize, @dwSize);
end;
if((HDummy >= STATUS_SUCCESS) and (pObjectInfo.Buffer <> nil)) then
begin
Result := AllocMem(pObjectInfo.Length + sizeof(WCHAR));
CopyMemory(result, pObjectInfo.Buffer, pObjectInfo.Length);
end;
FreeMem(pObjectInfo);
end;
Procedure EnumerateOpenFiles();
var
sDummy : string;
hProcess : THandle;
hObject : THandle;
ResultLength: DWORD;
aBufferSize : DWORD;
aIndex : Integer;
pHandleInfo : PSYSTEM_HANDLE_INFORMATION;
HDummy : THandle;
lpwsName : PWideChar;
lpwsType : PWideChar;
lpszProcess : PAnsiChar;
begin
AbufferSize := DefaulBUFFERSIZE;
pHandleInfo := AllocMem(AbufferSize);
HDummy := NTQuerySystemInformation(DWORD(SystemHandleInformation), pHandleInfo,AbufferSize, @ResultLength); //Get the list of handles
if(HDummy = STATUS_SUCCESS) then //If no error continue
begin
for aIndex:=0 to pHandleInfo^.uCount-1 do //iterate the list
begin
hProcess := OpenProcess(PROCESS_DUP_HANDLE or PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, FALSE, pHandleInfo.Handles[aIndex].uIdProcess); //open the process to get aditional info
if(hProcess <> INVALID_HANDLE_VALUE) then //Check valid handle
begin
hObject := 0;
if DuplicateHandle(hProcess, pHandleInfo.Handles[aIndex].Handle,GetCurrentProcess(), @hObject, STANDARD_RIGHTS_REQUIRED,FALSE, 0) then //Get a copy of the original handle
begin
lpwsName := GetObjectInfo(hObject, ObjectNameInformation); //Get the filename linked to the handle
if (lpwsName <> nil) then
begin
lpwsType := GetObjectInfo(hObject, ObjectTypeInformation);
lpszProcess := AllocMem(MAX_PATH);
if GetModuleFileNameEx(hProcess, 0,lpszProcess, MAX_PATH)<>0 then //get the name of the process
sDummy:=ExtractFileName(lpszProcess)
else
sDummy:= 'System Process';
Writeln('PID ',pHandleInfo.Handles[aIndex].uIdProcess);
Writeln('Handle ',pHandleInfo.Handles[aIndex].Handle);
Writeln('Process ',sDummy);
Writeln('FileName ',string(lpwsName));
Writeln;
FreeMem(lpwsName);
FreeMem(lpwsType);
FreeMem(lpszProcess);
end;
CloseHandle(hObject);
end;
CloseHandle(hProcess);
end;
end;
end;
FreeMem(pHandleInfo);
end;
begin
try
NTQueryObject := GetProcAddress(GetModuleHandle('NTDLL.DLL'), 'NtQueryObject');
NTQuerySystemInformation := GetProcAddress(GetModuleHandle('NTDLL.DLL'), 'NtQuerySystemInformation');
if (@NTQuerySystemInformation<>nil) and (@NTQuerySystemInformation<>nil) then
EnumerateOpenFiles();
Readln;
except
on E:Exception do
Writeln(E.Classname, ': ', E.Message);
end;
end.
2
Można przesłać walkobjects.cpp lub uruchomić command line process that does it for you i przeanalizować jego wynik.
1
Szukałem na stronie MSDN ... Mówi NtQuerySystemInformation() jest wewnętrzną proc OS, i że my nie zaleca się go używać:
funkcja NtQuerySystemInformation i struktury, które zwraca są wewnętrzny do systemu operacyjnego i ulec zmianie z jednego wydaniu Windows na inny. Aby zachować zgodność aplikacji z numerem , lepiej jest użyć alternatywnych funkcji wspomnianych wcześniej .
Powiązane problemy
- 1. Jakie polecenie otwiera REPL?
- 2. Tworzenie aplikacja, która otwiera plik niestandardowe rozszerzenie
- 3. Emacs powoli otwiera ostatnie pliki!
- 4. Aplikacja internetowa w Delphi
- 5. Delphi XE4: docelowy pulpit linux? (aplikacja GUI)
- 6. Jakie pliki COFF (pliki .OBj) są dostępne?
- 7. Delphi XE2 aplikacja nie odpowiada na IPAD
- 8. Aplikacja na ekranie głównym (android) facebook login otwiera przeglądarkę
- 9. Aplikacja Swift otwiera się na symulatorze, ale nie na urządzeniu
- 10. Google Map aplikacja nie otwiera łącza internetowego na urządzeniach mobilnych
- 11. Przykładowa aplikacja - Amazon S3/Indy/Delphi
- 12. Delphi XE2: pusta aplikacja waży 7 Mb
- 13. Jakie rodzaje przeciążeń operatora obsługuje Delphi?
- 14. Jakie intencje obsługuje aplikacja Facebook na Androida?
- 15. Zobacz żądanie cfhttp
- 16. Jakie pliki ReSharper powinienem przechowywać i jakie pliki należy ignorować w opcji Kontrola źródła?
- 17. Jakie są twoje ulubione pliki szkieletów dla różnych języków?
- 18. Jakie pliki są rzeczywiście uwzględniane podczas kompilowania
- 19. jQuery UI: jakie pliki są potrzebne?
- 20. Jakie pliki projektu autoconf umieścić w .gitignore?
- 21. CakePHP Zobacz przedłużenie zmiana
- 22. Aplikacja kliencka Delphi przy użyciu błędu połączenia wbudowanego Firebird 2.5
- 23. Delphi 2009 Aplikacja używająca dużych ikon dla Vista
- 24. Wykryj, czy moja aplikacja działa pod IDE "Delphi 2007 .Net"
- 25. Jakie dokumenty dotyczące standardów kodowania Delphi są przestrzegane?
- 26. Jakie elementy Delphi dostarczane są z testami jednostkowymi?
- 27. Jakie edytory mają emulację vi ORAZ obsługę delphi hightlighting?
- 28. Jakie aktualizacje zainstalować, aby uzyskać najnowszą wersję Delphi 2007?
- 29. Git: Zobacz mój ostatni commit
- 30. Jak zintegrować pliki pomocy komponentu z systemem Delphi?
Pliki nagłówkowe dla Native API są obecne w Jedi ApiLib (JwaNative) (Jwa), a także w pozostałej części zestawu SDK systemu Windows, co oszczędza ci deklarowania ich jak wyżej. Jeśli Ty ApiLib jest dla ciebie nowy, nasz blog to prawdopodobnie dobry punkt wyjścia (http://blog.delphi-jedi.net/) – Remko
Witam @Remko, znam Jedi APILib, to tylko prosty przykład NtQuerySystemInformation API, bez zależności. ;) – RRUZ
Witaj RRUZ. Gdy uruchamiam twój kod, otrzymuję wiersz nazwy pliku: "Nazwa pliku \ BaseNamedObjects \ CTF.Compart.MutexDefaultS-1-5-21-2000478354-606747145-1801674531-500". Czy czegoś brakuje? Robię coś nie tak? –