سؤال

هل هناك أي طريقة لتعداد العملية مع PID المعطاة في Windows، والحصول على قائمة بجميع مقابضه المفتوحة (الملفات المقفلة، إلخ)؟

تحرير: لا يهمني اللغة. إذا كان ذلك في .NET، سأكون سعيدا، إذا كان في Winapi (ج)، فلن يضر. إذا كنت في شيء آخر، أعتقد أنني أستطيع إعادة كتابة ذلك :-)

هل كانت مفيدة؟

المحلول

لقد فعلت googling عميق ووجدت هذا شرطوبعد أعطى هذا المقال رابطا تحميل التعليمات البرمجية المصدر:

حاولت الطريقة في ntsysteminfotest.cpp (التعليمات البرمجية المصدر التي تم تنزيلها) وقد عملت بشكل رائع.

void ListHandles( DWORD processID, LPCTSTR lpFilter )

الرمز يحتوي على reclaimer:

// 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
//
//////////////////////////////////////////////////////////////////////////////////////
//

آمل أن يكون هذا يساعدك.

نصائح أخرى

سطر الأوامر "مقبض"أداة من sysinternals هل هذا، إذا كنت تريد فقط أداة. هذا لن يساعدك إذا كنت تبحث عن حل رمز، على الرغم من ذلك.

هنا مثال استخدام ZwQueryProcessInformation من DDK. يعرف الآن DDK باسم "WDK" ومتوفر مع MSDN. إذا لم يكن لديك MSDN، فجأة، فيمكنك أيضا الحصول عليها هنا.

لم أحاول ذلك، أنا فقط سؤالك.

#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;
}

وهنا هو ما يشبه إجابة جيدة من منتدى SYSINTERNALS:HOWTO: تعداد مقابض

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top