windows - hvordan man opregner proceshåndtag?

Indlæg af Hanne Mølgaard Plasc

Problem



Er der nogen måde, hvordan man tæller proces med givet PID i Windows, og få en liste over alle hans åbne håndtag (låste filer osv.)?


EDIT: Jeg bryr mig ikke om sprog. Hvis det er i .NET, vil jeg være glad, hvis den i WinApi (C) ikke vandt. Hvis jeg i noget andet tror jeg kan omskrive det :-)

Bedste reference


Jeg gjorde en dyb googling og fandt denne artikel.
Denne artikel gav et link til download kildekode: [5] [6]


Jeg forsøgte metode i NtSystemInfoTest.cpp (downloadet kildekode) og det fungerede fremragende.


void ListHandles( DWORD processID, LPCTSTR lpFilter )


Koden har følgende fraskrivelse:


// Written by Zoltan Csizmadia, zoltan\_csizmadia@yahoo.com
// 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
//
//////////////////////////////////////////////////////////////////////////////////////
//


Jeg håber det hjælper dig.

Andre referencer 1


Kommandolinjen 'Håndter' værktøj fra Sysinternals gør dette, hvis du bare vil have et værktøj. Dette vil ikke hjælpe dig, hvis du leder efter en kodeopløsning. [7]

Andre referencer 2


Her er et eksempel ved hjælp af ZwQueryProcessInformation fra DDK. DDK'en er nu kendt som 'WDK' og er tilgængelig med MSDN. Hvis du ikke har MSDN, kan du også få det herfra. [8] [9]


Jeg har ikke prøvet det, jeg har bare googled dit spørgsmål.


#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("
");

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

CloseHandle(hProcess);

return 0;
}

Andre referencer 3


Og her ser det ud som et godt svar fra Sysinternals forum:
HOWTO: Opregner håndtag [10]