Winlogon のカスタマイズ
資格情報プロバイダーを実装して Winlogon の動作をカスタマイズします。 資格情報プロバイダーの詳細については、「 ICredentialProvider インターフェイス」を参照してください。
Windows Server 2003 および Windows XP: 資格情報プロバイダーはサポートされていません。
以降のセクションでは、Windows Vista より前のバージョンの Windows で Winlogon をカスタマイズする方法について説明します。
Note
Windows Vista では、GINA DLL と Winlogon 通知パッケージは無視されます。
Winlogon 通知パッケージ
Winlogon 通知パッケージは、Winlogon イベントを処理する関数をエクスポートする DLL です。 たとえば、ユーザーがシステムにログオンすると、Winlogon は各通知パッケージを呼び出してイベントに関する情報を提供します。 詳細については、「 Winlogon 通知パッケージ」を参照してください。
GINA スタブ
GINA スタブは、以前にインストールされた GINA DLL (通常はMsGina.dll) のエクスポート関数の実装を使用するカスタム GINA DLL です。 GINA スタブは、以前にインストールされた GINA DLL によってエクスポートされた各関数へのポインターを取得します。 次に、各 GINA スタブ関数は、適切な関数ポインターを使用して、以前にインストールされた GINA DLL 内の対応する関数を呼び出します。
重要
各 GINA スタブ関数は、以前にインストールした GINA で対応する関数を呼び出す必要があります。
GINA スタブ関数は、1 つ以上のエクスポート関数に追加の機能を実装できます。 たとえば、GINA スタブの WlxLoggedOutSAS 関数は、MsGina.dllの WlxLoggedOutSAS 関数を呼び出す前に現在の時刻をチェック可能性があります。 現在の時刻が特定の範囲内にある場合、スタブ関数は、その期間中にログオンが許可されていないことを示すメッセージを表示し、 Winlogon にWLX_SAS_ACTION_NONE を返す可能性があります。 その後、MsGina.dllの WlxLoggedOutSAS 関数は、許可された期間中にのみ呼び出されます。
GINA スタブ アプリケーションは、WlxInitialize 関数の pWinlogonFunctions パラメーターを使用して、Winlogon サポート関数へのディスパッチ テーブルを取得します。 GINA スタブ アプリケーションでは、このディスパッチ テーブルを使用して Winlogon サポート関数を呼び出すことができます。 たとえば、GINA スタブ アプリケーションは WlxSasNotify 関数を呼び出して、スマート カードがリーダーに挿入されたときにセキュア アテンション シーケンス (SAS) イベントを発生させることができます。
GINA スタブの作成の詳細については、プラットフォーム ソフトウェア開発キット (SDK) インストールの \Samples\Security\Gina\GinaStub ディレクトリにある Gina Stubs サンプルを参照してください。
Note
GINA と Winlogon の間のすべての呼び出しは、1 つのスレッド内にある必要があります。
GINAフック
GINA フックは、 WlxInitialize 関数の実装において、ディスパッチ テーブルの WlxDialogBoxParam サポート関数へのポインターを、WlxDialogBoxParam 関数の独自の実装へのポインターに置き換える GINA スタブです。 その結果、以前にインストールした GINA (通常はMsGina.dll) が WlxDialogBoxParam 関数を呼び出すたびに、GINA フックによって実装された関数が呼び出されます。
GINA フックによって実装される WlxDialogBoxParam 関数は、特定のダイアログ ボックス イベントに応答する DialogProc コールバック プロシージャを置き換えることができます。
これにより、GINA フックは、MsGina.dll作成されるすべてのダイアログ ボックスの外観と動作を完全に制御できます。
GINA フックの作成の詳細については、プラットフォーム SDK インストールの \Samples\Security\Gina\GinaHook ディレクトリにある Gina Hooks サンプルを参照してください。
Note
GINA と Winlogon の間のすべての呼び出しは、1 つのスレッド内にある必要があります。