按照网上的CreateToolhelp32Snapshot、Process32First和Process32Next方法获取PID,为什么每次都失败。如这个,任务管理器已经打开,但是显示没有找到。前面代码:
int main()
{
int Ans; //用来输入控制程序执行
HANDLE hDevice = NULL;
BOOLEAN bRes = FALSE; //输出缓冲区,用来判断是否Hook成功
DWORD dwRetLength = 0; //接受缓冲区长度
if (InstallService())
{
// 获取设备句柄
hDevice = CreateFile(LINK_NAME, GENERIC_READ | GENERIC_WRITE,
0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if (hDevice == INVALID_HANDLE_VALUE)
{
printf("CreateFile Error %d.\n", GetLastError());
goto exit;
}
char d;
bRes = TRUE;
cout << "请输入要保护的进程名:";
cin >> d;
***.sync();
cout << "选择操作,(输入1 2 3):\n";
cout << "1.开启保护,2.关闭保护,3.退出程序";
cin >> Ans;
while (TRUE)
{
if (Ans == 3) break;
else if (Ans == 1)
{
DWORD dwPid = GetPID(d);
if (dwPid == 0)
{
printf("没有找到进程\n");
break;
}
//开启HOOK
if (!DeviceIoControl(hDevice, CTL_HOOK, &dwPid, INPUT_BUFFER_LENGTH,
&bRes, OUT_BUFFER_LENGTH, &dwRetLength, NULL))
{
printf("DeviceIoControl CTL_HOOK Error\n");
break;
}
if (bRes) {
printf("Hook 成功\n");break;
}
else printf("Hook 失败\n");
break;
}
else if (Ans == 2)
{
//关闭HOOK
if (!DeviceIoControl(hDevice, CTL_UNHOOK, NULL, 0,
&bRes, OUT_BUFFER_LENGTH, &dwRetLength, NULL))
{
printf("DeviceIoControl CTL_UNHOOK Error\n");
break;
}
if (bRes) printf("UnHook 成功\n");
else printf("UnHook 失败\n");
break;
}
}
exit:
if (hDevice) CloseHandle(hDevice);
if (!UnInstallService())
{
printf("卸载驱动失败\n");
}
}
else
{
printf("驱动加载失败\n");
}
system("pause");
return 0;
}

本程序是通过SSDT Hook保护进程,程序总有Bug
环境:Visual Studio 2010+WDK 7.1.0