2009-04-09 20 views
21

Czy istnieje sposób, aby zliczyć proces z danym PID w oknach i uzyskać listę wszystkich jego otwartych uchwytów (zablokowane pliki itp.)?Jak wyliczyć uchwyt procesu?

EDYCJA: Nie obchodzi mnie język. Jeśli jest w .NET, byłbym zadowolony, jeśli w WinApi (C), nie zaszkodzi. Jeśli w czymś innym, myślę, że mogę go przepisać :-)

Odpowiedz

23

Zrobiłem głębokie google i znalazłem to article. Ten artykuł podał link do download source code:

Próbowałem metody w NtSystemInfoTest.cpp (pobrany kod źródłowy) i działało znakomicie.

void ListHandles(DWORD processID, LPCTSTR lpFilter) 

Kod jest następujący deklamator:

// Written by Zoltan Csizmadia, [email protected] 
// For companies(Austin,TX): If you would like to get my resume, send an email. 
// 
// The source is free, but if you want to use it, mention my name and e-mail address 
// 
////////////////////////////////////////////////////////////////////////////////////// 
// 

Mam nadzieję, że to pomaga.

+0

Znakomity! Dokładnie to, czego potrzebowałem (i nie byłem w stanie google). Dzięki. :-) – nothrow

4

Here is an example przy użyciu ZwQueryProcessInformation z DDK. DDK jest teraz znany jako "WDK" i jest dostępny z MSDN. Jeśli nie masz MSDN, apparantly, możesz również uzyskać go od here.

Nie próbowałem, po prostu wpisałem w Google pytanie.

#include "ntdll.h" 
#include <stdlib.h> 
#include <stdio.h> 
#include "ntddk.h" 

#define DUPLICATE_SAME_ATTRIBUTES 0x00000004 

#pragma comment(lib,"ntdll.lib") 

BOOL EnablePrivilege(PCSTR name) 
{ 
TOKEN_PRIVILEGES priv = {1, {0, 0, SE_PRIVILEGE_ENABLED}}; 
LookupPrivilegeValue(0, name, &priv.Privileges[0].Luid); 

HANDLE hToken; 
OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken); 

AdjustTokenPrivileges(hToken, FALSE, &priv, sizeof priv, 0, 0); 
BOOL rv = GetLastError() == ERROR_SUCCESS; 

CloseHandle(hToken); 
return rv; 
} 

int main(int argc, char *argv[]) 
{ 
if (argc == 1) return 0; 

ULONG pid = strtoul(argv[1], 0, 0); 

EnablePrivilege(SE_DEBUG_NAME); 

HANDLE hProcess = OpenProcess(PROCESS_DUP_HANDLE, FALSE, pid); 

ULONG n = 0x1000; 
PULONG p = new ULONG[n]; 

while (NT::ZwQuerySystemInformation(NT::SystemHandleInformation, p, n * sizeof *p, 0) 
== STATUS_INFO_LENGTH_MISMATCH) 

delete [] p, p = new ULONG[n *= 2]; 

NT::PSYSTEM_HANDLE_INFORMATION h = NT::PSYSTEM_HANDLE_INFORMATION(p + 1); 

for (ULONG i = 0; i < *p; i++) { 

if (h[i].ProcessId == pid) { 
HANDLE hObject; 

if (NT::ZwDuplicateObject(hProcess, HANDLE(h[i].Handle), NtCurrentProcess(), &hObject, 
0, 0, DUPLICATE_SAME_ATTRIBUTES) 
!= STATUS_SUCCESS) continue; 

NT::OBJECT_BASIC_INFORMATION obi; 

NT::ZwQueryObject(hObject, NT::ObjectBasicInformation, &obi, sizeof obi, &n); 

printf("%p %04hx %6lx %2x %3lx %3ld %4ld ", 
h[i].Object, h[i].Handle, h[i].GrantedAccess, 
int(h[i].Flags), obi.Attributes, 
obi.HandleCount - 1, obi.PointerCount - 2); 

n = obi.TypeInformationLength + 2; 

NT::POBJECT_TYPE_INFORMATION oti = NT::POBJECT_TYPE_INFORMATION(new CHAR[n]); 

NT::ZwQueryObject(hObject, NT::ObjectTypeInformation, oti, n, &n); 

printf("%-14.*ws ", oti[0].Name.Length/2, oti[0].Name.Buffer); 

n = obi.NameInformationLength == 0 
? MAX_PATH * sizeof (WCHAR) : obi.NameInformationLength; 

NT::POBJECT_NAME_INFORMATION oni = NT::POBJECT_NAME_INFORMATION(new CHAR[n]); 

NTSTATUS rv = NT::ZwQueryObject(hObject, NT::ObjectNameInformation, oni, n, &n); 
if (NT_SUCCESS(rv)) 
printf("%.*ws", oni[0].Name.Length/2, oni[0].Name.Buffer); 

printf("\n"); 

CloseHandle(hObject); 
} 
} 
delete [] p; 

CloseHandle(hProcess); 

return 0; 
} 
+0

dobrze, ja też to google, ale nie udało mi się ściągnąć DDK dla Vista :-(Więc pomyślałem, że istnieją pewne w przeciwnym razie (ProcessExplorer od sysinternals nie robi w ogóle linku ntdll) – nothrow

+0

ProcessExplorer nie łączy statycznie z ntdll, ale załaduje go do środowiska wykonawczego.Możesz go znaleźć w zależności od: –

+0

Jak pracujesz nad tym zawieszaniem się rozwiązania, jeśli jesteś robi ZwQueryObject (.. ObjectNameInformation ..) na rurze z otwartym z SYNC_READ? – mrduclaw

5

linii poleceń „Handle” narzędzie z Sysinternals robi to, jeśli chcesz po prostu narzędzie. To nie pomoże, jeśli szukasz rozwiązania kodu.