Chinaunix首页 | 论坛 | 博客
  • 博客访问: 147069
  • 博文数量: 43
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 401
  • 用 户 组: 普通用户
  • 注册时间: 2013-07-31 22:55
文章分类

全部博文(43)

文章存档

2015年(1)

2014年(25)

2013年(17)

我的朋友

分类: Windows平台

2014-01-03 20:52:49

文件映像

CreateFileMapping


功能:创建文件映射内核对象


OpenFileMapping

HANDLE OpenFileMapping(  

DWORD dwDesiredAccess,  // access mode  

BOOL bInheritHandle,    // inherit flag  

LPCTSTR lpName           // pointer to name of file-mapping object

);

功能:打开一个文件映射内核对象

备注:如果访问被拒绝,OpenFileMapping就会返回NULL;如果调用GetLastError,将返回 5 (ERROR_ACCESS_DENIED)。



怎样区分用户对象或GDI对象与内核对象

要想判断一个对象是不是内核对象,最简单的方式是查看创建这个对象的函数。几乎所有创建内核对象的函数都有一个允许我们指定安全属性信息的参数,面创建用户对象或GDI对象的函数都没有PSECURITY_ATTRIBUTES参数。


调用函数创建一个内核对象时,如果调用失败,那么返回的句柄值通常为0(NULL),而当CreateFile无法打开指定文件时,它会返回INVALID_HANDLE_VALUE,而不是NULL,所以凡是用于创建内核对象的函数,在检查它们的返回值时,务必相当仔细。


错误代码示例:

HANDLE hMutex = CreateMutex();

if(hMutex==INVALID_HANDLE_VALUE){

}


HANDLE hFile =CreateFile();

if(hFile==NULL){

}




通常我们在创建一个内核对象时,我们会将相应的句柄保存到一个变量中。将此变量作为参数调用CloseHandle函数后,还应同时将这个变量设为NULL。


跨进程边界共享内核对象

一、使用对象句柄继承

父进程为需要继承的内核对象分配并初始化一个SECURITY_ATTRIBUTES结构,其中成员bInheritHandle赋值为TRUE并将这个结构传给具体的Create函数。

父进程调用CreateProcess并向bInheritHandles参数传递TRUE,这时系统会遍历父进程的句柄表,对它的每一个记录项进行检查。凡是包含一个有效的“可继承的句柄”的项,都会被完整地复制到子进程的句柄表中。在子进程句柄表中,复制项的位置和它在父进程的句柄表中的位置是完全一样的。

为了使传递过去的句柄能被子进程使用,常用的几种方式

l 将句柄值作为命令行参数传递给子进程,子进程通常调用_stscanf_s提取句柄值。

l 父进程使用WaitForInputIdle函数等待子进程完成初始化工作后,将一条消息发送或发布到由子进程中的一个线程创建的一个窗口。

l 父进程向环境块中添加一个环境变量,保存句柄值,子进程要知道变量名,由于子进程会继承父进程的环境变量,所以可以轻松调用GetEnvironmentVariable来获得这个继承到内核对象的句柄值。


二、改变句柄标志

BOOL SetHandleInfomation(

HANDLE hObject,

DWORD dwMask, //想更改哪个或哪些标志

DWORD dwFlags //希望把标志改为什么

);


BOOL GetHandleInfomation(

HANDLE hObject,

PDWORD pdwFlags

);


HANDLE_FLAG_INHERIT        标志句柄是否能继承

HANDLE_FLAG_PROTECT_FROM_CLOSE  标志告诉系统不允许关闭句柄


三、为对象命名

A进程创建一个具名内核对象Zane,B进程用同样的名字创建一个同类型的具名内核对象,如果B拥有该对象的完全访问权限,系统将把Zane内核对象返回给B,否则将返回失败,其中B进程不一定要是A进程的子进程,

另外,B进程可以不使用Create*函数,而调用Open*函数来实现内核对象共享,区别就在于如果对象不存在,Create*函数会创建它;而Open*函数只是简单的返回失败。





四、复制对象句柄

BOOL DuplicateHandle(

  HANDLE hSourceProcessHandle, // handle to the source process

  HANDLE hSourceHandle,        // handle to duplicate

  HANDLE hTargetProcessHandle, // handle to process to duplicate to

  LPHANDLE lpTargetHandle, // pointer to duplicate handle

  DWORD dwDesiredAccess,   // access for duplicate handle

  BOOL bInheritHandle,     // handle inheritance flag

  DWORD dwOptions           // optional actions

);


阅读(1420) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~