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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 用户态和内核态切换开销_进程切换在用户态还是内核态

    用户态和内核态切换开销_进程切换在用户态还是内核态1.切换方式从用户态到内核态切换可以通过三种方式,或者说会导致从用户态切换到内核态的操作:系统调用,这个上面已经讲解过了,在我公众号之前的文章也有讲解过。其实系统调用本身就是中断,但是软件中断,跟硬中断不同。系统调用机制是使用了操作系统为用户特别开放的一个中断来实现,如Linux的int80h中断。 异常:如果当前进程运行在用户态,如果这个时候发生了异常事件,会触发由当前运行进程切换到处理此异常的内核相关进程中 外围设备中断:外围设备完成用户请求的操作之后,会向CPU发出中断信号,这

    2022年9月18日
    3
  • gdb调试命令的使用及总结_大锅安装调试指南

    gdb调试命令的使用及总结_大锅安装调试指南写这篇文档的目的是对前面GDB的知识做一次总览,本文为GDB调试指南,参考GDB调试手册,目前已有的篇目:启动调试断点设置查看源码单步调试查看变量前言GDB是Linux下非常好用且强大的调试工具。GDB可以调试C、C++、Go、java、objective-c、PHP等语言。对于一名Linux下工作的c/c++程序员,GDB是必不可少的工具,本篇以C语言来调试。GDB简介U…

    2025年8月7日
    3
  • 廖雪峰Python练习题

    廖雪峰Python练习题今天主要学习了python中filter的用法。Python内建的filter()函数主要用于过滤序列,和map()类似,filter()也接收一个函数和一个序列。和map()不同的是,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。做了两道练习题,第一道是用filter求素数。第二道是用filter()筛选出回数。@Pyt…

    2025年7月20日
    4
  • 香港坚固金业的黑幕,属于非法投资平台。

    2015年4.29晚上凌晨两点半我结束了建仓操作,当时没又发现账户资金问题,后来第二天早晨发现账户被非法操作做单,所有资金信息都被在美国时间22:08开始到22:56仅仅不到一个小时时间,所有资金都频繁建仓平仓操作,导致我账户资金全部亏损。 第二天咨询客服客服回答说是我自己认为操作要么,账户信息被泄露,被他人非法操作了。他们查询说是操作IP地址是外地操作,我感觉到很可悲,

    2022年4月4日
    62
  • Flowable 流程跟踪图片

    Flowable 流程跟踪图片文章目录1.DefaultProcessDiagramGenerator2.DefaultProcessDiagramCanvas3.使用Flowable默认的流程图生成器4.自定义流程图生成器4.1扩展DefaultProcessDiagramCanvas4.2扩展DefaultProcessDiagramGenerator4.3或者自定义类实现ProcessDiagramGenerator4.4使用自定义的流程图生成器生成流程图1.DefaultProcessDiagramGener

    2022年5月13日
    35
  • java二维数组三种初始化方法(实例)[通俗易懂]

    java二维数组三种初始化方法(实例)[通俗易懂]初始化方法:1、使用大括号直接赋值,适合已经确定知道数组元素的情况2、给定二维数组的大小3、数组第二维的长度可变化,未改变代码举例如下:publicclassNewArray{publicstaticvoidmain(String[]args){//第一种://int[][]arr1=newint[][]…

    2022年5月24日
    42

发表回复

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

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