内核对象(1)

内核对象的含义:
内核对象就是类似符号对象、事件对象、文件对象、文件映射对象、
I / O完成端口对象、作业对象、信箱对象、互斥对象、管道对象、进程对象,信标对象、线程
对象和等待计时器对象等
关于内核对象的注意点:
1.内核对象是内核而不是进程所拥有的
2.由于第1点的原因,内核对象的生存周期可能比创建他的进程周期还要长(只要内核的引用计数还没变为0),举个例子,我在某个进程A里创建了一个名字为”aa”的互斥量,进程B里创建了一个名为”aa”的互斥量,请记住,当第二次调用CreateMutex函数时,只是在该对象的引用计数上加1,当进程A退出,aa的计数从2变为1,当然不会退出,自然生存周期要比进程A要长
3.除了内核对象之外还有其他的对象比如GDI对象,用户对象(菜单,窗口,鼠标光标,字体,刷子等等),如何区分创建的对象是内核对象呢,看其创建函数中有没有安全属性
4.由于内核对象的数据结构只能被内核访问,因此应用程序无法在内存中找到这些数据结构并直接改变它们的内容,Microsoft规定了这个限制条件,目的是为了确保内核对象状态结构的一致

5.由于第4点引发第5点,怎样操作内核对象呢,那好我给你一根绳子去牵着这个对象,从计算机的角度来说,这根绳子就是句柄,将句柄传递给windows函数就可以,那么这里举个例子
通过CreateFile产生一个文件句柄hFile,那怎样再文件里写入内容呢,当然是使用WriteFile

句柄的含义:
内核对象是内核所拥有的,但是句柄确实与进程密切相关的,如果将进程A里的某个句柄值传递给另外一个进程中的线程,则这个线程所做的所有调用都可能失败
这么说大家可能不是很清楚
每个进程都有一个内核对象的句柄表,该句柄表只用于内核对象而不用于用户对象或者GDI对象,句柄的含义没有明确的解释,可能解释为在表中的索引或者是其他值,但是可以确定的是通过这个值可以检索到句柄的位置进而检索到内核对象的位置,
当把这个句柄值传递给线程2的时候,由于这个句柄并不在内核对象中,所以当线程2对句柄进行操作时,由于在句柄表找不到该句柄,就有可能造成调用失败
这里写图片描述
在这里我们讲下为什么CreateThread之后要立马调用CLoseHandle关闭线程句柄,因为CreateThread之后,线程内核对象的引用计数是2,一个是线程本身在引用内核对象,一个是创建该线程的线程在引用内核对象,如果不关掉一个计数,则线程结束后线程对象的引用计数为1,内核对象依然不会被销毁
CloseHandle并不会结束线程或者进程,只是让引用计数减1,另外还会清除句柄表里的相关句柄
通过GetCurrentThread也会得到当前的线程句柄,但是这个句柄是伪句柄,在句柄表中无法找到这个句柄,所以此时调用CloseHandle来关闭这个句柄,就会失败
创建内核对象的函数有个例外,CreateFile失败之后返回的不是NULL,而是INVALID_HANDLE_VALUE(-1)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值