猿问

为什么这个函数是否会调用内核的NtOpenProcess函数?

在ssdt hook中 经常会有下面的代码 
//定义一个原函数指针
typedef NTSTATUS (__stdcall *REALZWOPENPROCESS)(OUT PHANDLE ProcessHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes,
IN PCLIENT_ID ClientId
);
REALZWOPENPROCESS RealZwOpenProcess;

......

//为什么可以直接调用呢? 这个函数是否会调用内核的NtOpenProcess函数?为什么
status = RealZwOpenProcess(ProcessHandle, 
DesiredAccess, 
ObjectAttributes, 
ClientId
);

新手求指点

偶然的你
浏览 122回答 1
1回答

慕莱坞森

typedef定义了一个函数指针类型REALZWOPENPROCESS,REALZWOPENPROCESS RealZwOpenProcess声明了一个函数指针RealZwOpenProcess。你省略掉的部分应该有对RealZwOpenProcess的赋值,RealZwOpenProcess = &FunctionName或者RealZwOpenProcess = FunctionName,否则都没指向某个函数,是没法调用的。我想,你想所问“直接调用”是只直接写的RealZwOpenProcess(...)而不是(* RealZwOpenProcess)(...),对么?原因是二者等效。因为在C里面,当你用一个函数指针调用函数时,C会自动反引用,也就是说前这会被自动翻译为后者。至于这个函数会否调用内核的NtOpenProcess函数,就得看你赋值给指针RealZwOpenProcess的那个函数了。
随时随地看视频慕课网APP
我要回答