Windows内核对象管理
? ? Windows內核情景分析;所有的分析都有ReactOS的源代碼(以及部分由微軟公開的源代碼)作為依據;不清楚版本;
對象管理 ? ?
?
? ? Windows把一些核心功能作為內核對象來管理,這些對象是一些結構體,沒有封裝、繼承、多態等高級功能。
? ? 內核對象有很多,還可以通過.sys模塊添加新類型。
? ? 通過OpenFile()通用方式打開對象獲得句柄,但底下具體的實現因對象類型不同而異。
? ? OS有個對象類型目錄,表結構,存放指向OS里注冊的對象類型的指針。對象類型也是struct。
? ? 對象數據結構:[object_body|object_head|object_info]。
? ? head里沒有掛入隊列的鏈指針。即對象自身并沒要求要加入對象目錄,它可以是獨立的,提供句柄供用戶進程控制。
? ? 但被多個進程共享,或是被一個進程重復“創建”的對象,在OS中可以通過且只能命名找到它,OS將命名對象加入了對象目錄來便于查找。對象目錄是樹結構,根節點是目錄對象(系統內部用struct),普通對象都是葉節點。節點之間通過連接對象連接(普通對象沒有鏈指針),目錄節點通過Hash表、對象名來組織葉節點。
? ? 打開模式:創建對象,初始化,或已有對象引用計數加1,建立這一次打開的上下文(運行信息:訪問權限,占據內存頁,換入換出設置等,因具體類型而不同);加入對象目錄和進程句柄表,返回句柄表的索引,即Handle,從而建立進程與對象的連接。
? ? 每個進程有一個句柄表,表項指向對象的head。有時進程通過一些函數會直接操作內核對象,這時候要掛靠內核句柄表(內核運行也在使用一些對象),copy修改一些句柄值。多個進程的句柄表可以指向同一個對象。
? ? 進程與線程也是對象,一個進程創建一個子進程,也就有了這個進程的句柄。
? ? Win內核中是使用對象概念來描述管理內核中使用到的數據結構。
? ? 一個對象實際上是分為三部分。?
? ? OBJECT_HEADER對象頭.
? ? 數據本體(比如文件對象File Object、Event等)
? ? 附加信息(比如Object Header Name Info等)
結構如下:
//摘錄自 Reactos代碼
// Object Header
//
typedef struct _OBJECT_HEADER
{
LONG PointerCount;
union
{
LONG HandleCount;
volatile PVOID NextToFree;
};
POBJECT_TYPE Type;
UCHAR NameInfoOffset;
UCHAR HandleInfoOffset;
UCHAR QuotaInfoOffset;
UCHAR Flags;
union
{
POBJECT_CREATE_INFORMATION ObjectCreateInfo;
PVOID QuotaBlockCharged;
};
PSECURITY_DESCRIPTOR SecurityDescriptor;
QUAD Body;
} OBJECT_HEADER, *POBJECT_HEADER;
使用windbg調試windows XP時候 得到結構如下。
lkd> dt _OBJECT_HEADER
nt!_OBJECT_HEADER
+0×000 PointerCount : Int4B
+0×004 HandleCount : Int4B
+0×004 NextToFree : Ptr32 Void
+0×008 Type : Ptr32 _OBJECT_TYPE
+0x00c NameInfoOffset : UChar
+0x00d HandleInfoOffset : UChar
+0x00e QuotaInfoOffset : UChar
+0x00f Flags : UChar
+0×010 ObjectCreateInfo : Ptr32 _OBJECT_CREATE_INFORMATION
+0×010 QuotaBlockCharged : Ptr32 Void
+0×014 SecurityDescriptor : Ptr32 Void
+0×018 Body : _QUAD
看上去應該差不多,REACTOS對于對象頭的描述基本與windows一致.其中Body便是對象本體,由于本體結構的多樣性,長度是未確定的。所以《windows內核情景分析》中提到,”OBJECT_HEADER_NAME_INFO等放在OBJECT_HEADER下面,用8位字節表示位移量。”?
https://www.cnblogs.com/cvbnm/articles/2035473.html
https://www.cnblogs.com/itdef/p/3759951.html?utm_source=tuicool&utm_medium=referral
?
總結
以上是生活随笔為你收集整理的Windows内核对象管理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VC++ 开发pop3收邮件程序的相关问
- 下一篇: Windows内核系统调用分析