全3082文字

 Windowsの内部構造を詳細に解き明かす定番書籍「インサイドWindows」。1992年の初版発行以来(初版の訳書は1993年発行)、Windowsに接するすべてのITエンジニアのバイブルとして永く読み継がれてきました。最新刊の第7版「上」の原書は2017年5月に発行され、2018年5月には山内和朗訳の日本語版を発行しています。「下」の原書は約4年の歳月を経た2021年10月に登場、2022年9月には山内訳の日本語版を発行しました。

 第7版完結を機に、「インサイドWindows」の読みどころを、上(第1章~第7章)と下(第8章~第12章)から抜粋してお届けします。今回は第3章(上)からの抜粋で、Windowsのプロセス作成関数についての解説の一部を紹介します。(日経BOOKSユニット第2編集部)

第3章 プロセスとジョブ

 この章では、Windows内でプロセスとジョブを扱う、データ構造体とアルゴリズムについて説明します。最初に、プロセスの作成を概観します。次に、1つのプロセスを構成する内部構造を調べます。次に、保護されたプロセスと、保護されていないプロセスの違いを見ていきます。その後、プロセス(およびそのプロセスの初期スレッド)の作成で発生する手順のアウトラインを示します。最後に、この章ではジョブについて説明します。

 プロセスはWindows内の非常に多くのコンポーネントと関わるため、この章では多くの用語とデータ構造体(例えば、ワーキングセット、スレッド、オブジェクト、ハンドル、システムメモリヒープなど)が登場しますが、それらの詳細については本書『インサイドWindows 第7版 上』の他の章で説明しています。この章を完全に理解するためには、「第1章 概念とツール」と「第2章 システムアーキテクチャ」で説明した用語と概念に精通している必要があります。例えば、プロセスとスレッドの違いや、Windowsの仮想アドレス領域レイアウト、ユーザーモードとカーネルモードの違いなどです。

3.1 プロセスの作成

 Windows APIは、プロセスを作成するためのいくつかの関数を提供しています。最もシンプルなCreateProcess関数は、プロセスを作成したのと同じアクセストークンを使用して新しいプロセスを作成します。異なるトークンを必要とする場合は、CreateProcessAsUser関数が使用され、追加の引数を受け取ります。その1番目の引数は、既に何かしらの方法で取得(例えば、LogonUser関数の呼び出しによって取得)したトークンオブジェクトのハンドルになります。

 その他のプロセス作成関数としては、CreateProcessWithTokenWとCreateProcessWithLogonWがあります(いずれもAdvapi32.dllが提供します)。CreateProcessWithTokenWはCreateProcessAsUserに似ていますが、この2つは呼び出し元に必要な特権が異なります(詳細は、Windowsソフトウェア開発キット=SDKドキュメントで確認してください)。

 CreateProcessWithLogonWは、1回の操作の中で、指定したユーザーの資格情報を使用してログオンし、取得したトークンを使用してプロセスを作成することができる、便利なショートカットです。どちらも、リモートプロシージャコール(RPC)を使ってSecondary Logonサービス(Svchost.exeによってホストされるSeclogon.dll)を呼び出し、実際のプロセス作成を行います。

 Secondary Logonサービスは、自身の内部のSlrCreateProcessWithLogon関数の呼び出しを実行し、すべてがうまくいけば、最終的にCreateProcessAsUserを呼び出します。Secondary Logonサービスのスタートアップの種類は既定で「手動」に構成されており、CreateProcessWithTokenWまたはCreateProcessWithLogonWが呼び出されたときに、初めてサービスが開始します。サービスの開始に失敗した場合(例えば、管理者によってこのサービスのスタートアップの種類が「無効」に構成されている場合)、これらの関数は失敗します。あなたが慣れ親しんでいるRunasコマンドラインユーティリティは、これらの関数を使用しています。