はじめに
ご承知のように、ほとんどのWindowsには「MSPAINT.EXE」というプログラム(Windowsアプリケーション)が付属してきます。このプログラムは動作を開始すると、プロセスと呼ばれたり、システム内部的には、オブジェクトと呼ばれたりします。今回は、これらの2つの概念を実装するWindows内部情報を紹介します。紹介される実装情報は技術的にかなり詳しいものですから、必要な箇所にのみ目を通すようにしてください。なお、今回予定していた「!object」と「!handle」コマンドは次回以降の連載回に譲ります。
今回の目標
MSPAINT.EXEは、Windowsシステム内で生成・管理されるプロセスです。同時に、ある「型」から生成されるオブジェクトです。プロセスは1つ以上のスレッドを持っていることになっています。今回は、MSPAINT.EXEに関するプロセス情報とオブジェクトに関する性質のうち、次の2つの性質を確認してみます。
- MSPAINT.EXEプロセスが持つスレッド個数
- MSPAINT.EXEオブジェクトの「型」
MSPAINT.EXEプロセス情報を調査する
MSPAINT.EXEプロセスに関する内部実装情報を見てみましょう。ここでは、赤字で表示されている情報にのみ注目してください。なお、この内部情報の取得方法は以前の連載回ですでに説明してあるように、「dt」と「!process」という2つのWinDbgコマンドを使用します。
+0x000 Pcb : _KPROCESS +0x06c ProcessLock : _EX_PUSH_LOCK +0x070 CreateTime : _LARGE_INTEGER 0x1c94f89`4bb819b0 +0x078 ExitTime : _LARGE_INTEGER 0x0 +0x080 RundownProtect : _EX_RUNDOWN_REF +0x084 UniqueProcessId : 0x00000af8 +0x088 ActiveProcessLinks : _LIST_ENTRY [ 0xffbc59b8 - 0x812c1620 ] +0x090 QuotaUsage : [3] 0x16a8 +0x09c QuotaPeak : [3] 0x4590 +0x0a8 CommitCharge : 0x28c +0x0ac PeakVirtualSize : 0x5486000 +0x0b0 VirtualSize : 0x5476000 +0x0b4 SessionProcessLinks : _LIST_ENTRY [ 0xffbc59e4 - 0x812c164c ] +0x0bc DebugPort : 0x8120f3c8 +0x0c0 ExceptionPort : 0xe16f0598 +0x0c4 ObjectTable : 0xe282bdb0 _HANDLE_TABLE +0x0c8 Token : _EX_FAST_REF +0x0cc WorkingSetLock : _FAST_MUTEX +0x0ec WorkingSetPage : 0xd1cf +0x0f0 AddressCreationLock : _FAST_MUTEX +0x110 HyperSpaceLock : 0 +0x114 ForkInProgress : (null) +0x118 HardwareTrigger : 0 +0x11c VadRoot : 0x8126ae60 +0x120 VadHint : 0xff8e1ec8 +0x124 CloneRoot : (null) +0x128 NumberOfPrivatePages : 0x169 +0x12c NumberOfLockedPages : 0 +0x130 Win32Process : 0xe114f490 +0x134 Job : (null) +0x138 SectionObject : 0xe27fb4e8 +0x13c SectionBaseAddress : 0x01000000 +0x140 QuotaBlock : 0x81287518 _EPROCESS_QUOTA_BLOCK +0x144 WorkingSetWatch : (null) +0x148 Win32WindowStation : 0x00000030 +0x14c InheritedFromUniqueProcessId : 0x00000798 +0x150 LdtInformation : (null) +0x154 VadFreeHint : (null) +0x158 VdmObjects : (null) +0x15c DeviceMap : 0xe23740b8 +0x160 PhysicalVadList : _LIST_ENTRY [ 0x812ae768 - 0x812ae768 ] +0x168 PageDirectoryPte : _HARDWARE_PTE +0x168 Filler : 0 +0x170 Session : 0xf97f5000 +0x174 ImageFileName : [16] "mspaint.exe" +0x184 JobLinks : _LIST_ENTRY [ 0x0 - 0x0 ] +0x18c LockedPagesList : (null) +0x190 ThreadListHead : _LIST_ENTRY [ 0xff8ede04 - 0xff8c924c ] +0x198 SecurityPort : (null) +0x19c PaeTop : (null) +0x1a0 ActiveThreads : 6 +0x1a4 GrantedAccess : 0x1f0fff +0x1a8 DefaultHardErrorProcessing : 0 +0x1ac LastThreadExitStatus : 0 +0x1b0 Peb : 0x7ffdc000 _PEB +0x1b4 PrefetchTrace : _EX_FAST_REF +0x1b8 ReadOperationCount : _LARGE_INTEGER 0x6 +0x1c0 WriteOperationCount : _LARGE_INTEGER 0x3 +0x1c8 OtherOperationCount : _LARGE_INTEGER 0x238 +0x1d0 ReadTransferCount : _LARGE_INTEGER 0xd53a +0x1d8 WriteTransferCount : _LARGE_INTEGER 0xd8 +0x1e0 OtherTransferCount : _LARGE_INTEGER 0x26716 +0x1e8 CommitChargeLimit : 0 +0x1ec CommitChargePeak : 0x290 +0x1f0 AweInfo : (null) +0x1f4 SeAuditProcessCreationInfo : _SE_AUDIT_PROCESS_CREATION_INFO +0x1f8 Vm : _MMSUPPORT +0x238 LastFaultCount : 0 +0x23c ModifiedPageCount : 0x188 +0x240 NumberOfVads : 0x7b +0x244 JobStatus : 0 +0x248 Flags : 0xd0803 +0x248 CreateReported : 0y1 +0x248 NoDebugInherit : 0y1 +0x248 ProcessExiting : 0y0 +0x248 ProcessDelete : 0y0 +0x248 Wow64SplitPages : 0y0 +0x248 VmDeleted : 0y0 +0x248 OutswapEnabled : 0y0 +0x248 Outswapped : 0y0 +0x248 ForkFailed : 0y0 +0x248 HasPhysicalVad : 0y0 +0x248 AddressSpaceInitialized : 0y10 +0x248 SetTimerResolution : 0y0 +0x248 BreakOnTermination : 0y0 +0x248 SessionCreationUnderway : 0y0 +0x248 WriteWatch : 0y0 +0x248 ProcessInSession : 0y1 +0x248 OverrideAddressSpace : 0y0 +0x248 HasAddressSpace : 0y1 +0x248 LaunchPrefetched : 0y1 +0x248 InjectInpageErrors : 0y0 +0x248 VmTopDown : 0y0 +0x248 Unused3 : 0y0 +0x248 Unused4 : 0y0 +0x248 VdmAllowed : 0y0 +0x248 Unused : 0y00000 (0) +0x248 Unused1 : 0y0 +0x248 Unused2 : 0y0 +0x24c ExitStatus : 259 +0x250 NextPageColor : 0xc0be +0x252 SubSystemMinorVersion : 0 '' +0x253 SubSystemMajorVersion : 0x4 '' +0x252 SubSystemVersion : 0x400 +0x254 PriorityClass : 0x2 '' +0x255 WorkingSetAcquiredUnsafe : 0 '' +0x258 Cookie : 0x4f89c249
情報内の「+0x174 ImageFileName : [16] "mspaint.exe"」を見ると、このプロセス情報がMSPAINT.EXEプロセスのものであることが分かります。さらに、「+0x1a0 ActiveThreads : 6」情報からは、MSPAINT.EXEプロセスが6個のアクティブなスレッドを持っていることが分かります。このスレッド個数は、タスクマネージャーなどのビジュアルツールでも表示されます。
今回は触れませんが、「+0x190 ThreadListHead : _LIST_ENTRY [ 0xff8ede04 - 0xff8c924c ]」という情報は生成されたスレッドのリストを管理していることが想像できると思います。管理されているスレッドの中にはすでに動作を終了しているスレッドも含まれます。
このリストを辿れば、スレッドの詳細な情報を取得できます。プロセスによっては、100個近いスレッドを内部で生成しているものもあります。以前言及したGoogleのChromeブラウザプロセスの1つは20個を超える数のスレッドを生成していました。
このような内部情報を初めて目にしたときには、だれでも驚いてしまいます。しかし、内部情報はそれ単独で存在することはなく、他の内部情報と深い関係を持っています。内部情報間の関係はちょっとした計算式で解明できてしまうこともあります。このため、内部情報に慣れてくると、"どのような関係があるのだろう"、"どのような演算を行えばよいのだろう"などと興味が湧いてきます。
皆さんも上の情報を時間を掛けて眺め、慣れるようにしてください。たとえば、「+0x248 OutswapEnabled : 0y0」という情報がありますが、これは"ページアウトといわれるディスクへの移動が可能かどうか"を示しています。この場合、0という値が設定されていますから、ページアウトはされません。この値は時間と共に変化します。また、「+0x248 VmDeleted : 0y0」という情報は、VM、つまり、割り当てられたVirtual Memory(仮想メモリ)が削除されたかどうかを示しています。この場合、0ですから、削除されていません。MSPAINT.EXEプロセスは現在まさに動作中ですから、VMが削除されたら動作できないことになりますから大変な事態を迎えることになります。