使用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*型也可以。问我周围的人时说HANDLE *hToken;定义了,但没分配空间,但我后来我用了下面:HANDLE *hToken = new HANDLE;
OpenProcessToken(hProc, TOKEN_ADJUST_PRIVILEGES, hToken); 执行OpenProcessToken()执行后hToken没有什么变化啊,还是new时候的值,这有问题吗?
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*型也可以。问我周围的人时说HANDLE *hToken;定义了,但没分配空间,但我后来我用了下面:HANDLE *hToken = new HANDLE;
OpenProcessToken(hProc, TOKEN_ADJUST_PRIVILEGES, hToken); 执行OpenProcessToken()执行后hToken没有什么变化啊,还是new时候的值,这有问题吗?
bool sum(int a, int b, int * result)
{
if ( NULL == result)
return false; *result = a + b;
return true;
}正确的调用显然应该是
int result;
sum(1,2, &result); //对应你上面的方法2你的方法1就好比是这样调用:
int * r1;
sum(1,2, r1); // r1是个野指针,你想一下,sum中对其赋值会发生什么情况?你的最后一种方法(HANDLE *hToken = new HANDLE;)是正确的,虽然hToken没有什么变化,但hToken指向的内容是变了的
就好比这样调用
int * r2 = new int;
sum(1,2,r2); // 调用之后r2的地址不会变,但是 *r2的值已经变成3了