The DuplicateHandlefunction creates a duplicate handle. The returned duplicate is in the caller's process space.(从当前进程复制句柄到其他进程空间)

//ALL of the following code is executed by Process S.
//Create a mutex object accessible by Process S.
HANDLE hObjProcessS = CreateMutex(NULL, FALSE, NULL);

//Open a handle to Process T's kernel object.
HANDLE hProcessT = OpenProcess(PROCESS_ALL_ACCESS,
   FALSE, dwProcessIdT);

//An uninitilized handle relative to Process T.
HANDLE hObjProcessT;

//Give Process T accesss to our mutex object
DuplicateHandle(GetCurrentProcess(),
   hObjProcessS,
   hProcessT,
   &hObjProcessT, 0, FALSE,
   DUPLICATE_SAME_ACCESS);

//Use some IPC mechanism to get the handle
//valuein hOnjProcess S into Process T
//We nolonger need to communicate with Process T.
//[Mailslot, pipe, share memory, socket. etc.]
//传递句柄的值到其他进程
CloseHandle(hProcessT);

//WhenProcess S no longer needs to Use the mutex,
//itshould close it.
CloseHandle(hObjProcessS);

内核对象的句柄会在新进程中,产生一条记录,并且该内核对象计数增加。
根据引用计数,这里会引出该函数的一种巧妙用法,文件锁定或者叫文件占坑,原理如下:

向系统进程中,复制打开的文件句柄,内核对象在所有引用未删除时不会销毁。

示例代码:

#include <windows.h>

BOOL OccupyFile( LPCTSTR lpFileName );

int main()
{
    OccupyFile("c:\\duplicateHandle_Test.txt");

return 0;
}

void RaiseToDebugP()
{
    HANDLE hToken;
    HANDLE hProcess = GetCurrentProcess();
    if ( OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken) )
    {
        TOKEN_PRIVILEGES tkp;
        if ( LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tkp.Privileges[0].Luid) )
        {
            tkp.PrivilegeCount = 1;
            tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
            
            BOOL bREt = AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, NULL, 0) ;
        }
        CloseHandle(hToken);
    }    
}

BOOL OccupyFile( LPCTSTR lpFileName )
{
    BOOL    bRet;
    
    RaiseToDebugP();

HANDLE hProcess = OpenProcess( PROCESS_DUP_HANDLE, FALSE, 4);    // 4为system pid

if ( hProcess == NULL )
    {
        hProcess = OpenProcess( PROCESS_DUP_HANDLE, FALSE, 8);        // OS-2K is 8
        
        if ( hProcess == NULL )
            return FALSE;
    }

HANDLE hFile;
    HANDLE hTargetHandle;

hFile = CreateFile( lpFileName, GENERIC_READ, 0, NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL, NULL);

if ( hFile == INVALID_HANDLE_VALUE )
    {
        CloseHandle( hProcess );
        return FALSE;
    }

bRet = DuplicateHandle( GetCurrentProcess(), hFile, hProcess, &hTargetHandle, 
        0, FALSE, DUPLICATE_SAME_ACCESS|DUPLICATE_CLOSE_SOURCE);

CloseHandle( hProcess );

return bRet;
}

DuplicateHandle用法相关推荐

  1. 线程中CreateEvent和SetEvent和ReSetEvent及WaitForSingleObject的用法

    概述 首先介绍CreateEvent是创建windows事件的意思,作用主要用在判断线程退出,程锁定方面. CreateEvent:创建或打开一个命名的或无名的事件对象. EVENT有两种状态:发信号 ...

  2. 利用DuplicateHandle()无驱动的另类读写内存方法,理论上可以过游戏保护读写

    突发奇想出的原创思路,在理论上经过完善应该可以做到过游戏保护无驱动读写内存 首先看一下MSDN对这个函数的定义 BOOL DuplicateHandle(HANDLE hSourceProcessHa ...

  3. ring3层一种占用文件的方法(DuplicateHandle以后,把占用文件的句柄丢给系统进程,导致被占用)

    前段时间,一个测试工程师问我关于怎样长时间的占用一个文件,而使别的程序无法再访问这个文件,想起以前很多病毒木马经常劫持hosts文件不放,除非你找到占用文件的程序,并强行结束掉,否则怎么也访问不了ho ...

  4. 转:线程中CreateEvent和SetEvent及WaitForSingleObject的用法

    转自线程中CreateEvent和SetEvent及WaitForSingleObject的用法 首先介绍CreateEvent是创建windows事件的意思,作用主要用在判断线程退出,程锁定方面. ...

  5. 线程中CreateEvent、SetEvent、WaitForSingleObject的用法

    原文地址:https://www.cnblogs.com/MrYuan/p/5238749.html 首先介绍CreateEvent是创建windows事件的意思,作用主要用在判断线程退出,线程锁定方 ...

  6. c语言中external,static关键字用法

    static用法: 在C中,static主要定义全局静态变量.定义局部静态变量.定义静态函数. 1.定义全局静态变量:在全局变量前面加上关键字static,该全局变量变成了全局静态变量.全局静态变量有 ...

  7. Pandas_transform的用法

    先来看一个实例问题. 如下销售数据中展现了三笔订单,每笔订单买了多种商品,求每种商品销售额占该笔订单总金额的比例.例如第一条数据的最终结果为:235.83 / (235.83+232.32+107.9 ...

  8. Python中yield和yield from的用法

    yield 后面接的是 future 对象 调用方 委托生成器 yield from 直接给出循环后的结果 yield from 委托者和子生成器直接通信 yield from 直接处理stopIte ...

  9. pytorch学习 中 torch.squeeze() 和torch.unsqueeze()的用法

    squeeze的用法主要就是对数据的维度进行压缩或者解压. 先看torch.squeeze() 这个函数主要对数据的维度进行压缩,去掉维数为1的的维度,比如是一行或者一列这种,一个一行三列(1,3)的 ...

最新文章

  1. 负数运算_小学生必备科学常识100问-34数学史(7):负数的产生
  2. matlab如何点对点画曲线,MIMOBeamformingExample
  3. 【学习笔记】opencv的python接口 轮廓特征值 滚动条控制阈值参数
  4. java zip文件操作,java 关于 zip 文件 的 基本操作
  5. 工具丨超好用的免费AWR分析工具
  6. 如何处理word中字体和公式不在同一水平线上
  7. 服务器上安装声卡稳定吗,服务器加装声卡的故障
  8. 关于源泉插件没有办法正常载入cad里的问题
  9. 微信小程序websocket实现即时聊天功能
  10. 海康服务器找不到网卡驱动,驱动技巧:解决设备管理器中找不到网卡的问题
  11. Spring Boot项目@RunWith注解报错
  12. JavaSE学习笔记-08
  13. 阿木社区的SLAM无人机硬件配置
  14. 请问汽车CD接线各个的字母代表什么,ACC,ILL,RR,FR,FL,RLANT,B/U,NC,CND,真诚的谢谢了
  15. 图灵奖得主今日开讲 | Machine Intelligence – Myths and Reality
  16. 584分学计算机报什么大学,高考成绩584分可以上哪些大学,2021年584分怎么填报志愿上什么大学...
  17. stm32f4discovery开发板无法连接ST-Link
  18. 2017秋招-技术岗-恒生电子
  19. 06_02_任务三:Spring JDBCTemplate 声明式事务
  20. Google Noto Sans CJK 字体

热门文章

  1. Linux设备文件简介
  2. htc g12 电话自动开扬声器的解决办法
  3. 基于VMware创建虚拟机以及安装虚拟机系统
  4. 期末冲刺作文素材合集 | 文化
  5. javac不是内部命令或外部命令
  6. 对比度保留之彩色图像去色算法---基础算法上档次。
  7. 借助区块链技术,打通各部门_借助新兴的机器人技术在家里进行创新
  8. css动画效果之transition
  9. 蓝牙文件传输失败不支持的解决方法!
  10. NSIS MUI教程