我一直在阅读Hoglund的一个标题,但我读得很好,但是我可以让它工作吗?为什么他们在书中提供非工作的例子?
#include "stdafx.h"
#include <cstdio>
#include <windows.h>
#include <winbase.h>
#include <tlhelp32.h>
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE hProcess;
DEBUG_EVENT dbg_evt;
int aPID;
if(argc != 2)
{
printf("wrong number of params\nusage %s<pid>\n", argv[0]);
return 0;
}
//load the ptr to fDebugSetProcessKillOnExit
fDebugSetProcessKillOnExit = (DEBUGSETPROCESSKILLONEXIT)
GetProcAddress(GetModuleHandle("kernel32.dll"),
"DebugSetProcessKillOnExit");
if(!fDebugSetProcessKillOnExit)
{
printf("[!] failed to get fDebugSetProcessKillOnExit function!\n");
}
aPID = atoi(argv[1]);
}
我收到两条错误消息:
fDebugSetProcessKillOnExit is an undeclared identifier
"Error 4 error C2664: 'GetModuleHandleW' : cannot convert parameter 1 from 'const char [13]' to 'LPCWSTR'
fDebug...
应该是什么类型的?为什么aPid = atoi...
行不起作用?项目是否应该用C而不是C ++编译,因为这与书中完全一样?
谢谢,R。
答案 0 :(得分:2)
从MSDN获取此信息:
BOOL WINAPI DebugSetProcessKillOnExit(__in BOOL KillOnExit);
您可以将函数指针声明为:
BOOL (*fDebugSetProcessKillOnExit)(BOOL) = /* ... */;
使用typedef
:
typedef BOOL (*DebugKillPtr)(BOOL);
DebugKillPtr fDebugSetProcessKillOnExit = /* ... */;
函数指针可能有些混乱,InformITs guide on them应该有所帮助。
此外,您正在使用Unicode版本。您可以使用GetModuleHandle(L"Kernel32.dll")
或_T()
等,也可以将项目设置为使用多字节字符集(项目属性 - &gt;配置 - &gt; general - &gt;字符集)
unicode-character-set也是atoi()
语句不起作用的原因:
argv
是一个_TCHAR*
的数组,_TCHAR
是wchar_t
,用于unicode-builds。 atoi()
但是需要一个const char*
参数,而你正在给它wchar_t*
因此,您可以再次使用多字节字符集,转换字符串或使用Microsofts _wtoi()
/_ttoi()
。
为了便于在字符集之间切换并坚持使用书籍的风格,请选择_T*
和_t*
版本。
答案 1 :(得分:1)
DEBUGSETPROCESSKILLONEXIT fDebugSetProcessKillOnExit;
其中DEBUGSETPROCESSKILLONEXIT应该是该函数原型的typedef。
因此,要总结一切,您只需更改一行并添加typedef:
typedef BOOL (*DEBUGSETPROCESSKILLONEXIT)(BOOL);
//load the ptr to fDebugSetProcessKillOnExit
DEBUGSETPROCESSKILLONEXIT fDebugSetProcessKillOnExit = (DEBUGSETPROCESSKILLONEXIT) GetProcAddress(GetModuleHandle(_T("kernel32.dll")), _T("DebugSetProcessKillOnExit"));