(转)NtQueryInformationProcess用法

http://blog.csdn.net/yiyefangzhou24/article/details/6242459

  从所周知,在Windows NT/2000系统的API黑洞之一便是NTDLL.DLL,此DLL包含了许多未公开的API函数。本文将列举一、二,并以如何获取任何指定进程的父进程ID为例作为示范。
    NTDLL.DLL中有一个函数叫NtQueryInformationProcess,用它可以将指定类型的进程信息拷贝到某个缓冲。其原型如下:

NTSYSAPI NTSTATUS NTAPI NtQueryInformationProcess (
  IN HANDLE         ProcessHandle,       // 进程句柄
  IN PROCESSINFOCLASS   InformationClass,      // 信息类型
  OUT PVOID         ProcessInformation,     // 缓冲指针
  IN ULONG          ProcessInformationLength, // 以字节为单位的缓冲大小
  OUT PULONG         ReturnLength OPTIONAL     // 写入缓冲的字节数
);

  第一个参数是希望操作的进程句柄,这个句柄必须以PROCESS_QUERY_INFORMATION模式存取。为了取得一个句柄,我们必须用OpenProcess函数

  第二个参数是请求信息的类型,这个参数可以有许多个值,本文例子中将用ProcessBasicInformation (值为0)。
  因此,如果第二个参数是ProcessBasicInformation的话,则第三个参数必须为一个指针指向结构PROCESS_BASIC_INFORMATION:

typedef struct
{
  DWORD ExitStatus;      // 接收进程终止状态
  DWORD PebBaseAddress;    // 接收进程环境块地址
  DWORD AffinityMask;     // 接收进程关联掩码
  DWORD BasePriority;     // 接收进程的优先级类
  ULONG UniqueProcessId;   // 接收进程ID
  ULONG InheritedFromUniqueProcessId; // 接收父进程ID
} PROCESS_BASIC_INFORMATION;

  这个结构的最后一个参数是InheritedFromUniqueProcessId,它就是我们所要的东西。

DWORD dwParentPID;
LONG status;
PROCESS_BASIC_INFORMATION pbi;

status = NtQueryInformationProcess(hProcess, ProcessBasicInformation,
          (PVOID)&pbi,
          sizeof(PROCESS_BASIC_INFORMATION),
          NULL);
if (!status)
  dwParentPID = pbi.InheritedFromUniqueProcessId;
posted @ 2013-01-08 10:33  himessage  阅读(7313)  评论(0编辑  收藏  举报