Windows開発ツールとしての「Sysinternals」

Windows Sysinternals徹底解説を読んだのでそのまとめ

#入手方法
##ダウンロード先
TOPページ
https://technet.microsoft.com/ja-jp/sysinternals
以下のURLからSysinternals Suiteをダウンロードできる。
https://download.sysinternals.com/files/SysinternalsSuite.zip
ファイル数が146(2017/9/15時点)で、すべてのtoolが含まれていると思われる。

##ZIPファイルを解凍する前にすること
ダウンロードしたファイルが信頼されないファイルとして、実行する際に、以下の警告が表示されることがある？
「このアプリがデバイスに変更することを許可しますか」
この警告を出さないようにするためには、ZIPファイルを展開する前にブロックの解除を行う必要がある？
![image.png](https://qiita-image-store.s3.amazonaws.com/0/187121/2c05825f-5ff6-e3e4-9302-bfe92a92b97d.png)

##特徴
開発者が本当に必要としている機能
直観的で使いやすい
単一の実行可能イメージでインストール不要
実行し終わると重要なデータを残さない

#基本知識
##プロセス
###構成要素
・プロセスID(PID)と呼ばれる一意の識別子
・1つ以上の実行スレッド
・プライベートな仮想アドレス空間
・実行可能プログラム
・システムリソース(セマフォ、通信ポート、ファイルなど）に対して開かれたハンドル
・アクセストークンと呼ばれるセキュリティコンテキスト
###メモ
親プロセスのPIDの情報を保持するが、親プロセスが終了しても更新されないため、参考程度の情報。
プロセスは単なるコンテナーで、実行されない。実行されるのはスレッド。

##ジョブ
複数のプロセスをグループ化して、1つにまとめて管理、操作できるようにすること。

##スレッド
###構成要素
・プロセッサの状態を示すCPUレジスタのセット
・2つのスタック。1つはカーネルモードで実行する際に使用され、もう1つはユーザーモードで実行する際に使用される。
・スレッドローカルストレージ(Thread Local Storage:TLS)と呼ばれるプライベートの記憶域。
・スレッドID(TID)と呼ばれる一意の識別子。プロセスIDとスレッドIDは、同じ名前空間から生成されるため重複することはない。

###メモ
同じプロセスの各スレッドは、プロセスの仮想アドレス空間を共有する。
プロセス内の１つのスレッドによって使用されるデータ構造は、同じプロセスの他スレッドによる参照や変更からは保護されない。
別プロセスのアドレス空間を参照できない。（例外としてファイルマッピングオブジェクトがある）

##コールスタック
どの部分のコードを実行中なのかを示しているのではなく、どのようにしてそこに戻るのかを示すもの。
<モジュール>!<関数>+<オフセット>

#Tools
##Process Explorer(Procexp.exe)
###概要
高機能なタスクマネージャ。システムのスナップショットを確認する。

###列の説明
|列名|説明|
|:--|:--|
|Private Bytes|プロセス専用に割り当てられ、コミットされた、他のプロセスとは共有しないメモリバイト数。ヒープ及びスタックメモリを含む。メモリリークがある場合は、この値が継続的に上昇する。|
|Working Set|メモリマネージャによって、プロセスに割り当てられた物理メモリのサイズ。|
###プロセスの操作(CPUの使用コアを制限)
制限したいプロセスを選択し、右クリックで「Set Affinity」
###DLLとハンドルの検索
・Ctrl+Lで下部ペインの表示切替ができる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/187121/de5215d9-d7e6-128a-d43d-7eea8326b221.png)
・その右横のボタンで、DLLとハンドルを切り替えることができる。
・すべてのプロセスの中から使用しているDLLを検索するには、Ctrl+Fキーで「Process Explorer Search」ダイアログを表示して、検索する。
###TIPS1(コメント)
プロセスの詳細画面(Properties)のImageタブに「Comment」欄があるので、コメントを入力し、列の選択画面(Select Columns)のProcess Imageタブにある「Comment」にチェックをつける。
入力したコメントはレジストリ(HKEY_CURRENT_USER\Software\Sysinternals\Process Explorer\ProcessComments)に格納され、プロセスを再起動していも保持される。

###TIPS2(タスクマネージャの代わりに使用する)
[Options]メニューの[Replace Task Manager]を選択する。
procexp.exeを誤って削除した場合は、「taskmgr.exeが見つからない」とエラーになるので、以下のキーを削除することで元に戻る。
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\taskmgr.exe

##Process Monitor(Procmon.exe)
###概要
詳細なログ記録ツールとして、レジストリやファイル、プロセス／スレッド、ネットワークのアクティビティをキャプチャする。
プロセスがそのファイルに対して実行しているローレベル操作(ハードウェア寄りの操作)や、それがいつ発生しているのか、どのくらい時間がかかったのか、成功あるいはなぜ失敗したのか、コールスタックの完全なリスト(操作のためにコードのたどった道)を教えてくれる。
強力で柔軟なフィルター機能、強調表示機能、ブックマーク機能がある。
###使い方
[Capture](Ctrl+X)でキャプチャのON・OFFを切り替え
[Clear](Ctrl+A)ですべての表示をクリア

###
##Autoruns(Autoruns.exe)
###概要
自動起動プログラムの確認と制御用ツール。（タスクマネージャのスタートアップタブの高機能版）
###画面の説明
タブが多いが、「Everything」タブはシステム上のすべてのASEP(Autostart Extensibility Points)のエントリを一覧表示しており、その他(19個のタブ)は特定の自動開始エントリの分類ごとに表示している。
###自動開始エントリの無効化と削除
削除は一覧からエントリを選択してDelキーで可能だが、復元は不可。まずはチェックボックスをOFFにして、無効化するのが無難。

##メモリ関連(RAMMap、VMMap)
###概要
|名称|説明|
|:--|:--|
|RAMMap(RAMMap.exe)|物理メモリの使用状況に関する詳細なビューを表示する|
|VMMap(VMMap.exe)|プロセスの仮想メモリと物理メモリの使用状況の詳細を表示する|

###RAMMap

###VMMap
プロセスのメモリ割り当て状況のスナップショットを複数取得して、時系列に割り当て状況の変化をグラフ表示する。
F5キーを押して更新し、「TimeLine」ボタンを押すとグラフが表示される。
詳しく解析したい場合は、「Select or Launch Process」画面で、「View a running process」タブで起動中のプロセスを選択するのではなく、「Launch and trace a new process」タブでプロセスを起動する。

###メモリの種類
|名称|説明|
|:--|:--|
|Image|EXEやDLLなど実行可能ファイルを示す|
|Mapped File|ディスク上のファイルに対応し、共有可能なメモリマップ度ファイルであることを示す|
|Shareable|他のプロセスと共有可能なメモリを示す|
|Heap|ヒープ。アプリケーションのプライベートメモリ|
|Managed Heap|マネージドヒープ。.NETランタイムによって管理されるプライベートメモリ|
|Stack|スタック。関数のパラメータやローカル変数、呼び出し履歴を格納するのに使用される|
|Private Data|Heap、Managed Heap、Stack以外|
|Page Table|カーネルモードのプライベートメモリ|