举个例子
#include <iostream>
#include <windows.h>
#include <tchar.h>
#include <winternl.h>
using namespace std;
int main(int argc, char* argv[])
{
PROCESS_BASIC_INFORMATION pi;
memset(&pi, 0, sizeof(pi));
NTSTATUS re = NtQueryInformationProcess(OpenProcess(PROCESS_ALL_ACCESS, FALSE, 17720),
ProcessBasicInformation,/*还必须用这个,不能用0*/
&pi,
sizeof (pi),
NULL);
if(NT_SUCCESS(re))
{
wcout << "OK" << endl;
}
getchar();
return 0;
}
这个程序没有静态编译错误,但有动态运行错误
原因在于 NtQueryInformationProcess 函数,这个函数包含在 winternl.h 头文件里
但是在运行时会报错:
undefined reference to Ntqueryinformati onprocess 未定义错误
原因是程序在链接的时候没有装入 NtQueryInformationProcess 函数的dll,解决方法:
查询官方资料,找到它在那个dll库里面,手动链接
涉及到函数指针
例子:
NtQueryInformationProcess 在 Ntdll.dll 里
#include <iostream>
#include <windows.h>
#include <tchar.h>
#include <winternl.h>
//定义一个函数指针
typedef NTSTATUS (WINAPI *QT)(HANDLE, PROCESSINFOCLASS, PVOID, ULONG, PULONG);
using namespace std;
int main(int argc, char* argv[])
{
HMODULE hModule = 0;
hModule = LoadLibrary(L"Ntdll.dll");
QT NtQuery;
if(hModule)
{
NtQuery = (QT)GetProcAddress(hModule, "NtQueryInformationProcess");
}
PROCESS_BASIC_INFORMATION pi;
memset(&pi, 0, sizeof(pi));
NTSTATUS re = NtQuery(OpenProcess(PROCESS_ALL_ACCESS, FALSE, 17720),
ProcessBasicInformation,/*还必须用这个,不能用0*/
&pi,
sizeof (pi),
NULL);
if(NT_SUCCESS(re))
{
wcout << "OK" << endl;
}
getchar();
return 0;
}
可以正确运行。