zoukankan      html  css  js  c++  java
  • 进程/线程的身份识别(《WINDOWS核心编程》笔记一)

    一般来说,我们都会使用GetCurrentProcess()或GetCurrentThread()函数来获取一个进程句柄或是线程句柄。但是值得注意的是函数返回的只是其内核对象的一个伪句柄。而在使用这个伪句柄的时候,有些情况会无法得到我们想要的效果。例如:
    Code
    父线程传递自己的句柄给子线程,子线程在线程处理函数中获取父线程的CPU使用时间。但是这个意图不能实现,原因就在于,传递的是一个父线程的伪句柄,导致获得是子线程自己的CPU使用时间。
    伪句柄的定义:一个指向当前线程/进程的句柄。
    上面的例子中,当前的线程是子线程,所以传递的伪句柄便是子线程的句柄。解决的方法,需要灵活使用DuplicateHandle函数,将一个伪句柄转换为真正的句柄。
    1BOOL DuplicateHandle(
    2   HANDLE hSourceProcess,
    3   HANDLE hSource,
    4   HANDLE hTargetProcess,
    5   PHANDLE phTarget,
    6   DWORD dwDesiredAccess,
    7   BOOL bInheritHandle,
    8   DWORD dwOptions);
    DuplicateHandle函数本意是跨进程边界共享内核对象,复制对象的句柄。它的第一个与第三个参数必须是进程内核对象句柄;第二个参数可以是任意类型的内核对象句柄,但是不能与此函数的主调进程句柄相关;第四个参数就是复制得到的句柄地址,从类型上可以看出他是指向内核对象句柄的句柄;最后三个参数这里不赘述,对这个问题影响不大。
    Code
    因为DuplicateHandle递增了内核对象的使用计数,所以在复制的对象句柄用完后必须调用CloseHandle()函数,递减内核对象的使用技术。这里补充的是,CloseHandle()接受的句柄参数也必须是真正的句柄,如果传递的是伪句柄,则返回FALSE同时GetLastError()将返回ERROR_INVALID_HANDLE。
  • 相关阅读:
    DataGrip for Mac破解步骤详解 亲测好用
    git 之路
    linux用户管理
    virtualenvwrappers pipreqs 踩坑
    pycharm 快捷键
    kubernetes(k8s)之K8s部署多种服务yaml文件
    centos下彻底删除mysql的方法
    vi 和vim 的区别
    Django中related_name作用
    Windows CMD命令大全
  • 原文地址:https://www.cnblogs.com/wxfasdic/p/1559589.html
Copyright © 2011-2022 走看看