「「プロセスはオブジェクトである」の意味は」を追いかけてみる
WinDbgを覚えたいです。インサイドWindowsの影響です。
トラブルシュートよりか、Windowsをもっと知りたいという、例のやつです。
「プロセスはオブジェクトである」の意味は (1/3):EnterpriseZine(エンタープライズジン)
この連載が素敵なので読んでいますが、この回は結果だけ書いてあるのでピンときません。
そこで、おなじような出力をするようにコマンドを書いてみました。
1. ターゲットのプロセスを探します。今回はペイントです。
lkd> !process 0 0
- -
- -
2. 1で探したプロセスのアドレス(0x89635020)を指定して、オブジェクトの情報を見ます。
lkd> !object 89635020 Object: 89635020 Type: (89bfae70) Process ObjectHeader: 89635008 (old version) HandleCount: 5 PointerCount: 87
3. オブジェクトのヘッダー(_object_header)を指定して値を見ます。ヘッダーはボディの0x18バイト前です。
ヘッダーのアドレスは、!object の出力にありました。ObjectHeader: 89635008 (old version)
(0x89635008 = 0x0x89635020 - 0x18)
lkd> dt _object_header 89635008 nt!_OBJECT_HEADER +0x000 PointerCount : 87 +0x004 HandleCount : 5 +0x004 NextToFree : 0x00000005 +0x008 Type : 0x89bfae70 _OBJECT_TYPE +0x00c NameInfoOffset : 0 '' +0x00d HandleInfoOffset : 0 '' +0x00e QuotaInfoOffset : 0 '' +0x00f Flags : 0x20 ' ' +0x010 ObjectCreateInfo : 0x8996e768 _OBJECT_CREATE_INFORMATION +0x010 QuotaBlockCharged : 0x8996e768 +0x014 SecurityDescriptor : 0xe28764c3 +0x018 Body : _QUAD
4. 同じく、ヘッダーの中にTypeのアドレスがありました。型(_object_type)を指定して値を見ます。
lkd> dt _object_type 89bfae70 nt!_OBJECT_TYPE +0x000 Mutex : _ERESOURCE +0x038 TypeList : _LIST_ENTRY [ 0x89bfaea8 - 0x89bfaea8 ] +0x040 Name : _UNICODE_STRING "Process" +0x048 DefaultObject : (null) +0x04c Index : 5 +0x050 TotalNumberOfObjects : 0x2a +0x054 TotalNumberOfHandles : 0xca +0x058 HighWaterNumberOfObjects : 0x2e +0x05c HighWaterNumberOfHandles : 0xd9 +0x060 TypeInfo : _OBJECT_TYPE_INITIALIZER +0x0ac Key : 0x636f7250 +0x0b0 ObjectLocks : [4] _ERESOURCE
5. このオブジェクトの型は、"Process"ですよということで、Typeの中にある、TypeInfoの情報を見ます。
(0x89bfaed0 = 0x89bfae70 + 0x060)
lkd> dt _object_type_initializer 89bfaed0 nt!_OBJECT_TYPE_INITIALIZER +0x000 Length : 0x4c +0x002 UseDefaultObject : 0 '' +0x003 CaseInsensitive : 0 '' +0x004 InvalidAttributes : 0xb0 +0x008 GenericMapping : _GENERIC_MAPPING +0x018 ValidAccessMask : 0x1f0fff +0x01c SecurityRequired : 0x1 '' +0x01d MaintainHandleCount : 0 '' +0x01e MaintainTypeList : 0 '' +0x020 PoolType : 0 ( NonPagedPool ) +0x024 DefaultPagedPoolCharge : 0x1000 +0x028 DefaultNonPagedPoolCharge : 0x290 +0x02c DumpProcedure : (null) +0x030 OpenProcedure : (null) +0x034 CloseProcedure : (null) +0x038 DeleteProcedure : 0x8058510f void nt!PspProcessDelete+0 +0x03c ParseProcedure : (null) +0x040 SecurityProcedure : 0x8056d9df long nt!SeDefaultObjectMethod+0 +0x044 QueryNameProcedure : (null) +0x048 OkayToCloseProcedure : (null)
なんかわかりません。と、ここまでです。
「dt(display type) 型 アドレス」 で型を指定してメモリ中の値を見るという操作がしっくりきました。