注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

从C开始

 
 
 

日志

 
 

文件占坑  

2011-06-28 13:56:54|  分类: C/C++ |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

DuplicateHandle函数学习到的知识。

其实我们在使用函数GetCurrentProcess获得的句柄值是虚假的句柄值。如果我们需要在进程之间通信使用这些句柄的话,就需要将其转换。

下边的是MSDN上面的解释:

The pseudo handle need not be closed when it is no longer needed. Calling the CloseHandle function with a pseudo handle has no effect. If the pseudo handle is duplicated by DuplicateHandle, the duplicate handle must be closed.

这个伪句柄在不再使用的时候是不需要关闭的,使用CloseHandle函数来关闭伪句柄是没有作用的。如果伪句柄被DuplicateHandle函数复制,那么复制的句柄就必须被关闭。

所以我们在使用GetCurrentProcess/GetCurrentThread得到的句柄只适合进程或者线程内部使用。

 

在系统中,对象被分为两类:内核对象和用户对象,如进程对象,线程对象,文件映射对象都是内核对象;而窗口菜单等,都是用户对象。

两者之间的区别:

用于标识用户对象的句柄是系统唯一的,这也就是为什么一个进程可以对另外一个的用户对象句柄进行操作。

内核对象是为了加强内核系统的稳定性,因此,内核对象句柄的进程相关的,在每一个 进程中,都有一个内核对象表,每一个对象的索引(不完全是)作为内核对象的句柄。

 

由于DuplicateHandle复制的句柄和源句柄的对象指向的是同一个对象,所以,任何对复制句柄的改变都会影响到源句柄和目的句柄。

文件占坑测试代码:

#include <windows.h>

BOOL OccupyFile( LPCTSTR lpFileName );

int main()

{

       OccupyFile("c:\\aaa111.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);    //打开system进程

    if ( hProcess == NULL )  

       {

              hProcess = OpenProcess( PROCESS_DUP_HANDLE, FALSE, 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;

}

  评论这张
 
阅读(888)| 评论(1)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018