OpenProcessToken()运用心得

OpenProcessToken()运用心得   使用OpenProcessToken()用于得到指定进程的访问令牌,而第三个参数定义设置不正确可能导致该函数调用失败,以下举例说明: HANDLEhProc;hProc=GetCurrentProcess(); //Method1-Error(998)HANDLE*hToken;OpenProcessToken(hProc,TOKEN_ADJUST_PRIV

大家好,又见面了,我是你们的朋友全栈君。

    使用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*型也可以。 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/152932.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • plc编程入门梯形图符号_梯形图编程语言有

    plc编程入门梯形图符号_梯形图编程语言有2019独角兽企业重金招聘Python工程师标准>>>…

    2025年10月6日
    3
  • 实战Vue:基于Vue的移动端购物商城

    实战Vue:基于Vue的移动端购物商城基于Vue的移动端购物商城

    2022年6月5日
    32
  • 数据挖掘之时间序列分析[通俗易懂]

    数据挖掘之时间序列分析[通俗易懂]按时间顺序排列的一组随机变量X1,X2,…,Xt表示一个随机事件的时间序列。时间序列分析的目的是给定一个已被观测了的时间序列,预测该序列的未来值。表1常用的时间序列模型 模型名称 描述 平滑法 常用于趋势分析和预测,利用修匀技术,削弱短期随机波动对序列的影响,使序列平滑化。 根据所用平滑技术的不同,可分为移动平均法和指数平滑法。 趋势拟合法…

    2022年6月22日
    30
  • 指令的四个周期_cpu指令周期流程图

    指令的四个周期_cpu指令周期流程图指令流程图的概念菱形:译码,测试,表示判断,如零指令字是0或者1.与前面的CPU周期紧密相连,不单独占用CPU周期。每个方框箭头下面的是公共操作符符号,表示一条指令结束。mov指令将R1寄存器的数据存储到R2寄存器中,lad指令时间主存中的数据存储到寄存器中。sto是将R2中的数据根据R3中的主存地址存储到主存中。lad和sto是寄存器-主存指令需要三个CPU周期,其他都是寄存器-…

    2022年10月13日
    3
  • Java事务管理[通俗易懂]

    Java事务管理[通俗易懂]事务的ACID属性:原子性(Atomicity)、一致性(Consistency)、隔离性或独立性(Isolation)和持久性(Durabilily)一、Java事务管理Java事务管理有三种类型:JDBC事务、JTA(JavaTransactionAPI)事务、容器事务1.1JDBC事务JDBC的一切行为包括事务是基于一个Connection的,JDBC通过Connec…

    2022年10月9日
    3
  • jdbc和数据库连接池_数据库连接池满了

    jdbc和数据库连接池_数据库连接池满了数据库连接池JDBC数据库连接池的必要性在使用开发基于数据库的web程序时,传统的模式基本是按照以下步骤:在主程序(如servlet beans)中建立数据库连接进行sql操作断开数据库连接这种模式开发,存在的问题:普通的JDBC数据库连接使用DriverManager来获取,每次向数据库建立连接的时候都要将Connection加载到内存中,再验证用户名和密码(大概花费0.05s-1s),需要数据库连接的时候,就向数据库要求一个,执行完成后再断开。这样的方式将会消耗大量的时间。数据库的

    2022年8月8日
    23

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号