您的位置:首页 > 产品设计 > UI/UE

NtQueryInformationProcess用法

2013-03-15 07:56 381 查看
从所周知,在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函数:

HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION,FALSE,dwProcessID);

第二个参数是请求信息的类型,这个参数可以有许多个值,本文例子中将用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,它就是我们所要的东西。

实例如下:

// NtQueryInformationProcess is declared in winternl.h
typedef NTSTATUS (CALLBACK *PFN_NTQUERYINFORMATIONPROCESS)(
HANDLE ProcessHandle,
PROCESSINFOCLASS ProcessInformationClass,
PVOID ProcessInformation,
ULONG ProcessInformationLength,
PULONG ReturnLength OPTIONAL
);

NTSTATUS _NtQueryInformationProcess(
HANDLE hProcess,
PROCESSINFOCLASS pic,
PVOID pPI,
ULONG cbSize,
PULONG pLength
) {

HMODULE hNtDll = LoadLibrary(TEXT("ntdll.dll"));
if (hNtDll == NULL) {
return(-1);
}

NTSTATUS lStatus = -1;  // error by default.

// Note that function name is not UNICODE
PFN_NTQUERYINFORMATIONPROCESS pfnNtQIP =
(PFN_NTQUERYINFORMATIONPROCESS)GetProcAddress(
hNtDll, "NtQueryInformationProcess");
if (pfnNtQIP != NULL) {
lStatus = pfnNtQIP(hProcess, pic, pPI, cbSize, pLength);
}

FreeLibrary(hNtDll);
return(lStatus);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: