WINDOWS核心编程第三章内核对象的一点细节

久仰此书大名已久,可惜以前没看懂。。。现在感觉有点基础了回头再看,感觉多少有点死皮赖脸的嫌疑。。。。

关于啥是内核对象请看第三章就对了,看的时候发现书上说

GetCurrentProcess返回的是伪句柄(对GetCurrentDirectory比较熟悉,吃过一次亏,进程工作目录跟进程的镜像文件EXE所在的路径完全不是一回事,尤其设置了程序开机自启动,重启后默认的进程工作目录是系统目录,所以特别提示一下,应该用GetModuleFileName。。。),亲自测试了一下,事实如此,每次得到的handle都是0xfffffff,是专门为本进程提供的,我们知道内核对象跟用户对象或者GDI对象有个很大的区别在于:内核对象是跟进程密切相关的,比如说有一个窗口属于其他进程的,只要得到这个窗口的句柄,我们就可以对这个窗口操作(此窗口有别于内核对象,正因如此才能如此方便的操作),但是如果某个对象是其他进程的内核对象,你在本地进程中得到该内核对象的句柄,然后对其操作,就是错误的,原因就是内核对象跟进程密切相关,而其他对象则例外。当然微软这么做目的也是很明显的,这样可以提供操作系统的健壮性,确实。

当然,如果只在本进程实现操作,用GetCurrentProcess得到的伪句柄已经足够了,假如实现进程之间通信呢?这个时候假的句柄就满足不了要求了,书上说了一个函数DuplicateHandle,这个可以胜任,他可以把假的句柄转换成真的。

正是书上没实例代码,所以刚开始看的时候有点迷茫,开始始终没看明白如何能转换,于是我把这章看了3遍。。。。。

 

测试:

#include<windows.h> #include<stdio.h> void main() { HANDLE hProcess=GetCurrentProcess(); HANDLE hTargetHandle; DuplicateHandle(hProcess,hProcess,hProcess,&hTargetHandle,0,FALSE,DUPLICATE_SAME_ACCESS); printf("%x/n",hTargetHandle); CloseHandle(hTargetHandle); system("pause"); }

伪句柄是不要关闭的,但是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(hTargetHandle);

这个应该就是了吧。如果不是,欢迎扔砖头。

其实这样的方法用DuplicateHandle,感觉有点摧残这个API,其实这个函数功能很强大的,字母意思,复制句柄,我们可以把一个内核对象的句柄(比如一个文件内核对象CreateFile("苍井空全集")调用的产物)复制到XP上的SYSTEM 进程上,这个进程的ID是4或者8,XP上貌似都是4吧,这样我们就很低调的实现了一种效果:此文件现在不能被移动,修改,重命名,删除等等一系列操作了,反倒是保护了这些文件的安全,当然了前提得有一定的权限。

路漫漫其修远兮。。。。。。砖头无止境。

 

你可能感兴趣的:(编程,windows,工作,function,测试,System)