「「プロセスはオブジェクトである」の意味は」を追いかけてみる

WinDbgを覚えたいです。インサイドWindowsの影響です。
トラブルシュートよりか、Windowsをもっと知りたいという、例のやつです。


「プロセスはオブジェクトである」の意味は (1/3):EnterpriseZine(エンタープライズジン)
この連載が素敵なので読んでいますが、この回は結果だけ書いてあるのでピンときません。
そこで、おなじような出力をするようにコマンドを書いてみました。


1. ターゲットのプロセスを探します。今回はペイントです。

lkd> !process 0 0
  • -
PROCESS 89635020 SessionId: 0 Cid: 0be8 Peb: 7ffde000 ParentCid: 0778 DirBase: 5e79a000 ObjectTable: e34790c8 HandleCount: 114. Image: mspaint.exe
  • -

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) 型 アドレス」 で型を指定してメモリ中の値を見るという操作がしっくりきました。

言語バーの設定をレジストリで操作する

必要にかられて調べたのでメモ。WindowsXPでしか試していません。

HKEY_CURRENT_USER\Software\Microsoft\CTF\LangBar

  • ExtraIconsOnMinimized : 言語バー アイコンをタスクバーで表示 する(1) / しない(0)
  • Label : 言語バーのテキストラベルを表示 する(1) / しない(0)
  • ShowStatus : 言語バーをデスクトップ上に表示 する(0) / しない(3)
  • Transparency : 言語バーがアクティブでないときは透明で表示 する(128) / しない(255)

プログラミング Clojure

買いました。枕元のノートPCでペソペソ試しつつ読んでいます。

プログラミングClojure

プログラミングClojure

REPLのキーバインド(確認したもの)

  • C-a 行頭へ移動する
  • C-e 行末へ移動する
  • C-f 一文字進む
  • C-b 一文字戻る
  • C-h 一文字消す
  • C-k 一行消す(Windowsだと効かない)
  • C-n 次の履歴
  • C-p 一つ前の履歴

コマンドプロンプトだとカーソルがもっさり動くのでなんとかしたい。

インサイドWindows 第4版

読み始めました。流し読みしないならカーネルデバッガが必要です。

インサイド MS WINDOWS 第4版 上 (マイクロソフト公式解説書)

インサイド MS WINDOWS 第4版 上 (マイクロソフト公式解説書)

副読リンク

上はリモートカーネルデバッグ、下はローカルカーネルデバッグの環境を作成する手順です。
http://www-06.ibm.com/jp/domino04/pc/support/Sylphd07.nsf/jtechinfo/SYJ0-00D719A
WinDbgのインストールと3つのコマンド (1/4):EnterpriseZine(エンタープライズジン)
そういえば、ローカルカーネルデバックの記事は、インサイドWindowsの監訳をされている方が書いていますね。


シリアルケーブルと古いThinkPadがあるので、リモートカーネルデバッグがしたいです。
でも、ThinkPadのシリアルポートがどうしても有効になりません。ヤク毛刈りになってきたよ。