Advertisement
Guest User

Getting Process ID

a guest
Jan 1st, 2014
1,145
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.31 KB | None | 0 0
  1. #include <Windows.h>
  2. #include <ntstatus.h>
  3.  
  4. #define NT_SUCCESS(Status) ((NTSTATUS)(Status) >= 0)
  5.  
  6. enum SYSTEM_INFORMATION_CLASS { SystemProcessInformation = 5 };
  7.  
  8. struct SYSTEM_PROCESS_INFORMATION
  9. {
  10.     ULONG NextEntryOffset;
  11.     DWORD unused0[14];
  12.     WCHAR* ImageName;
  13.     DWORD unused1;
  14.     HANDLE UniqueProcessId;
  15. };
  16.  
  17. extern "C" NTSTATUS __stdcall NtQuerySystemInformation(SYSTEM_INFORMATION_CLASS systemInformationClass, void* pSystemInformation, ULONG systemInformationLength, ULONG* pReturnLength);
  18.  
  19. DWORD GetProcessID(wstring const& ImageName)
  20. {
  21.     size_t size = 0x10000;
  22.     string Data;
  23.     Data.resize(size);
  24.  
  25.     NTSTATUS status;
  26.     while ((status = NtQuerySystemInformation(SystemProcessInformation, (char*)Data.data(), (ULONG)Data.size(), nullptr)) == STATUS_INFO_LENGTH_MISMATCH)
  27.         Data.resize(size *= 2);
  28.  
  29.     if (!NT_SUCCESS(status))
  30.         throw runtime_error("NtQuerySystemInformation failed");
  31.  
  32.     auto pProcessInfo = (SYSTEM_PROCESS_INFORMATION*)Data.data();
  33.     while (true)
  34.     {
  35.         if (pProcessInfo->ImageName && !_wcsicmp(pProcessInfo->ImageName, ImageName.c_str()))
  36.             return (DWORD)pProcessInfo->UniqueProcessId;
  37.  
  38.         if (!pProcessInfo->NextEntryOffset)
  39.             break;
  40.  
  41.         pProcessInfo = (SYSTEM_PROCESS_INFORMATION*)((byte*)pProcessInfo + pProcessInfo->NextEntryOffset);
  42.     }
  43.  
  44.     throw runtime_error("process not found");
  45. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement