`
andyjackson
  • 浏览: 57607 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

WINDOWS核心编程——内核对象

阅读更多

今天想把看的第三章的心得写下来。

这章主要介绍了内核对象。在WINDOWS中,内核对象是由操作系统来管理,尽管用户能够创建它,但是在创建之后,用户对该内核对象的操作都是委托给操作系统。

通常用户创建和使用的对象分为:用户对象(如 HICON CreateIcon(prama))、GDI对象函数以及内核对象。像访问令牌、事件对象、文件对象、文件映像对象、进程对象、信号量等都属于内核对象。在内核对象第一次被创建的是,系统会根据给定的参数初始化,其中有一个参数:PSECURITY_ATTRIBUTES,是SECURITY_ATTRIBUTES的指针,SECURITY_ATTRIBUTES的结构如下:

typedef struct _SECUTIRTY_ATTRIBUTES
{
    DWORD nLength;//length of itself
    LPVOID lpSecurityDescirptor;//安全描述符
    BOOL bInheritHandle;//表明该内核对象是否可以被继承
} SECURITY_ATTRIBUTES;

并返回一个该内核对象的句柄给创建函数所在的进程(首先要在该进程的句柄表中,找到一块空白的位置,存放该内核对象所在的地址)。

以后如果自己进程的其他线程的函数创建该内核对象时,操作系统会将该内核对象的计数器加一,然后返回该内核对象的一个句柄(对于中间可能出项的异常,就不在讨论)。关闭内核对象,类似地,操作系统会先通过传入的对象的句柄在进程的句柄表中验证该对象确实有权限访问它。然后进行相反的操作,当该内核对象的计数器为0时,操作系统会自动销毁它。

 

然而,在WINDOWS内部,内核对象的句柄是与进程相关的。但是,进程间有时候必须要共享内核对象,解决这个问题,有几种方法:

首先是使用对象句柄继承。 也就是说,对于父子进程间,可以在父进程中创建该内核对象的时候,设置它的bInheritHandle值为TRUE。然后使用 CreateProcess创建子进程的时候,同样需要设这个值为TRUE。当然也可以在父进程中设置一个变量的方法来实现。

 

如果想让某个进程的子进程部分由继承该内核对象,可以通过SetHandleInformationg来设置,该内核对象是否能够被继承。

BOOL SetHandleInformation(
   HANDLE hObject, 
   DWORD dwMask,
   DWORD dwFlags
)
/*
*@hObject:标志一个有效地句柄
*@dwMask:告诉函数我想修改那个或者哪些标志,目前每个句柄都关联了两个标志
*/
#define HANDLE_FLAG_INHERIT   0x00000001
//告诉句柄是否需要继承
#define HANDLE_FLAG_FROM_CLOSE   0X00000002
//告诉句柄是否允许关闭句柄

通过上面的方式,就可以让内核对象可选择性的被继承。

 

 

第二种方式是为对象命名。 事实上,大多数的内核对象都可以命名。例如:

HANDLE hMutex= CreateMutex(NULL, FALSE, TEXT("test"));
//创建一个叫做“test”的互斥量内核对象,并获得它的句柄
HANDLE hMutex1 = OpenMutex(NULL,FALSE,Text("test"));
//获得一个叫做“test”的互斥量对象
if(GetLastError()==ERROR_FILE_NOT_FOUND){
   //说明没有找到“test”
}else if(GetLastError()==ERROR_INVALID_HANDLE){
   //找到,但是类型不同
}
//上面两种情况下,hMutex1=NULL
//如果找到,且匹配,则会查看OpenMutex的第一个参数:dwDesirdAccess,看他想要的权限是否是允许的 

 

最后一种方式是复制对象的句柄。 使用DuplicateHandle函数:

BOOL DuplicateHandle
(
HANDLE hSourceProcessHandle,
HANDLE hSourceHandle,
HANDLE hTargetProcessHandle,
PHANDLE hTargetHandle,
DWORD dwDesiredAccess,
BOOL bInheritHandle,
DWORD dwOptions
);
//这个函数是获得一个进程的句柄表的一条记录,然后copy到目标进程的进程句柄表中
 

考虑这样一个场景,假设进程S能够访问一个对象,并希望进程T也能够访问,那么就可以在S中调用DuplicatieHandle函数:

//create a mutex object accessible by Process S
HANDLE hObjInProcessS = CreateMutex(NULL, FALSE,NULL);

//get a handle to Process T's kernel object
//dwProcessIdT 就是T的进程标识符,假设已经获得
HANDLE hProcessT = OpenProcess(PROCESS_ALL_ACCESS,FLASE, dwProcessIdT);

HANDLE hObjInProcessT;
//give T access to our hObjInProcessS
DuplicateHandle(GetCurrentProcess(),hObjInProcessS, hProcessT, &hObjInProcessT, 0, FALSE, 
DUPLICATE_SAME_ACCESS);
//通过进程间通信的方式,是T获得这个句柄。
CloseHandle(hProcessT);
CloseHandle(hProcessS);

  注意:进程S中永远不要调用CloseHandle(hObjInProcessT);另外,这种方式存在潜在的失败风险,如果进程S中的hObjInProcessT的句柄值已经被另外的内核对象占据,那么会强行将先前的内核对象关闭。

 

未完待续……

 

 

 

 

分享到:
评论

相关推荐

    Windows编程入门——字节跳动.pptx

    Windows 编程入门涵盖了 Windows 操作系统、Windows 基本编程理论、API 文档、字符集与字符编码、内核对象、线程 API、WinDbg、SDK、PE 文件格式、文件系统等多个方面的知识点,是 Windows 编程的必备知识。

    操作系统实验——Windows 控制台命令.docx

    5. **Windows核心系统服务**: - **Windows执行体**:包含了系统服务、设备驱动程序、文件系统、网络堆栈等。 - **Windows内核**:处理调度、内存管理、中断处理等核心功能。 - **设备驱动程序**:为硬件设备提供...

    windows驱动开发技术详解-part2

    本书是作者结合教学和科研实践经验编写而成的,不仅详细介绍了Windows内核原理,而且介绍了编程技 巧和应用实例,兼顾了在校研究生和工程技术人员的实际需求,对教学、生产和科研有现实的指导意义 ,是一本值得...

    孙鑫C++教程(全20讲)PPT讲义 + code

     从Win32SDK编程开始讲解,帮助大家理解掌握Windows编程的核心 —— 消息循环机制。 2、通俗易懂  编程语言枯燥难懂,然而通过孙鑫老师形象化的讲解,Windows和MFC编程中的难点、重点,让你轻松掌握。 3、实战性强...

    Windows驱动开发技术详解的光盘-part1

    本书是作者结合教学和科研实践经验编写而成的,不仅详细介绍了Windows内核原理,而且介绍了编程技巧和应用实例,兼顾了在校研究生和工程技术人员的实际需求,对教学、生产和科研有现实的指导意义,是一本值得推荐的...

    大学计算机专业书籍推荐.pdf

    * 汇编语言程序设计:斯皮格尔、斯里尼瓦桑底层相关IBM PC 汇编语言程序设计、阿贝尔汇编语言编程艺术、海德Intel 汇编语言程序设计、欧文琢石成器——Windows 环境下 32 位汇编语言程序设计 * 微处理器:罗云彬...

    《程序员》杂志2012年第7期

    本文从移动设备、Metro UI、编程的变化、Windows Store四个方面分析了Windows 8在移动互联网时代带来的影响与面对的挑战。 (3)游戏画面的印象价值和审美属性分析 (4)Cocos2D-X for XNA游戏开发指南(下)—...

    CLR.via.C#.(中文第3版)(自制详细书签)Part1

    本书作者作者Jeffrey Richter,.NET和Windows编程领域当之无愧的大师和权威,以著述清楚明了,行文流水,言简意赅著称,在国内具有相当高的知名度,他的著作之一《Windows核心编程(第5版)》屡获殊荣,在国内外都...

    CLR.via.C#.(中文第3版)(自制详细书签)

    本书作者作者Jeffrey Richter,.NET和Windows编程领域当之无愧的大师和权威,以著述清楚明了,行文流水,言简意赅著称,在国内具有相当高的知名度,他的著作之一《Windows核心编程(第5版)》屡获殊荣,在国内外都...

    CLR.via.C#.(中文第3版)(自制详细书签)Part3

    本书作者作者Jeffrey Richter,.NET和Windows编程领域当之无愧的大师和权威,以著述清楚明了,行文流水,言简意赅著称,在国内具有相当高的知名度,他的著作之一《Windows核心编程(第5版)》屡获殊荣,在国内外都...

    CLR.via.C#.(中文第3版)(自制详细书签)Part2

    本书作者作者Jeffrey Richter,.NET和Windows编程领域当之无愧的大师和权威,以著述清楚明了,行文流水,言简意赅著称,在国内具有相当高的知名度,他的著作之一《Windows核心编程(第5版)》屡获殊荣,在国内外都...

    C程序设计语言(第2版·新版中文)

    作者其他资源编程大讲坛:C语言核心开发技术从入门到精通(光盘代码) C语言库函数功能查询器(绿色版) 共有评论81条 hua5040发表的评论 学习,收藏。。。 时间:2010-10-22 18:09:48 来自:58.60.231.* ...

    Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐)--随书源代码

    2.13 SQL执行——总览 52 2.14 小结 53 第3章 访问和联结方法 55 3.1 全扫描访问方法 55 3.1.1 如何选择全扫描操作 56 3.1.2 全扫描与舍弃 59 3.1.3 全扫描与多块读取 60 3.1.4 全扫描与高水位线 60 3.2 ...

    新版Android开发教程.rar

    ----------------------------------- Android 编程基础 1 封面----------------------------------- Android 编程基础 2 开放手机联盟 --Open --Open --Open --Open Handset Handset Handset Handset Alliance ...

    自己动手写操作系统(含源代码).part2

     本书以“动手写”为指导思想,只要是跟“动手写”操作系统有关的知识,都作为介绍对象加以讨论,所以,从开发环境的搭建,到保护模式,再到IBMPC中有关芯片的知识,最后到操作系统本身的设计实现,都能在本文中...

    自己动手写操作系统(含源代码).part1

     本书以“动手写”为指导思想,只要是跟“动手写”操作系统有关的知识,都作为介绍对象加以讨论,所以,从开发环境的搭建,到保护模式,再到IBMPC中有关芯片的知识,最后到操作系统本身的设计实现,都能在本文中...

    《计算机操作系统》期末复习指导

    实时是指计算机对于外来信息能够以足够快的速度进行处理,并在被控对象允许的时间范围内做出快速反应。交互作用能力较差。 3、操作系统的五大功能 •作业管理:包括任务管理、界面管理、人机交互、图形...

Global site tag (gtag.js) - Google Analytics