大家好,又见面了,我是你们的朋友全栈君。
使用OpenProcessToken()用于得到指定进程的访问令牌,而第三个参数定义设置不正确可能导致该函数调用失败,以下举例说明:
HANDLE hProc;
hProc = GetCurrentProcess();
// Method1 – Error(998)
HANDLE *hToken;
OpenProcessToken(hProc, TOKEN_ADJUST_PRIVILEGES, hToken);
// Method2 – Success
HANDLE hToken;
OpenProcessToken(hProc, TOKEN_ADJUST_PRIVILEGES, &hToken);
以上是获取访问令牌的调用,OpenProcessToken()函数原型如下:
BOOL WINAPI OpenProcessToken(
__in HANDLE ProcessHandle,
__in DWORD DesiredAccess,
__out PHANDLE TokenHandle
);
方法1和方法2都使用HANDLE类型定义,方法1定义指针,方法2定义变量,但方法1调用函数返回失败(通过GetLastError()可知错误代码为998——拒绝访问);方法2调用函数则能成功获取访问令牌。为什么出现这种情况呢?WinNT.h中相关的定义引起,如下:
#ifdef STRICT
typedef void *HANDLE;
#define DECLARE_HANDLE(name) struct name##__ { int unused; }; typedef struct name##__ *name
#else
typedef PVOID HANDLE;
#define DECLARE_HANDLE(name) typedef HANDLE name
#endif
typedef HANDLE *PHANDLE;
由此可见可以把任意一种类型的指针赋值给PVOID型,因此PVOID*赋给PVOID型是可以的,而把PVOID型赋值给PVOID*型也可以。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/152932.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...