EternalWindows
GINA / ログオフ

基本的にGINAの開発で重要となるのは、これまで実装してきた関数に尽きるでしょう。 残るは、ログオフとシャットダウンに関する関数のみですが、 これまで実装してきた関数と比べると非常に簡単であるはずです。 次に示すWlxLogoffは、ユーザーがログオフしたときに呼ばれます。

VOID WlxLogoff(
  PVOID pWlxContext
);

pWlxContextは、コンテキストのアドレスです。 この関数に戻り値はありません。

WlxLogoffが呼ばれている時点で、既にユーザーはログオフしています。 そのため、この関数でトークンを必要とする関数は呼び出すことはできず、 CloseHandleでハンドルを閉じる必要もないと思われます。 なお、ExitWindows(Ex)によるログオフは、WlxIsLogoffOkで制御することができます。

BOOL WlxIsLogoffOk(
  PVOID pWlxContext
);

pWlxContextは、コンテキストのアドレスです。 戻り値はTRUEを返したときログオフは許可され、FALSEのときは拒否されます。 WlxLoggedOnSASでWLX_SAS_ACTION_LOGOFFを返すことによるログオフでは、 WlxIsLogoffOkは呼ばれないので注意してください。

WlxLoggedOnSASでWLX_SAS_ACTION_SHUTDOWNを返したときや、 ExitWindowsExでシャットダウンを指定したときには、WlxShutdownが呼ばれます。

VOID WlxShutdown(
  PVOID pWlxContext,  
  DWORD ShutdownType  
);

pWlxContextは、コンテキストのアドレスです。 ShutdownType は、シャットダウンのタイプです。 以下の定数のいずれかが格納されています。

定数 意味
WLX_SAS_ACTION_SHUTDOWN システムをシャットダウンする。
WLX_SAS_ACTION_SHUTDOWN_REBOOT システムをシャットダウンした後、システムを再起動する。
WLX_SAS_ACTION_SHUTDOWN_POWER_OFF システムをシャットダウンした後、電源を切る。

次に、今回紹介した3つの関数の実装例を示します。

BOOL WINAPI WlxIsLogoffOk(PVOID pWlxContext)
{
	return TRUE;
}

VOID WINAPI WlxLogoff(PVOID pWlxContext)
{

}

VOID WINAPI WlxShutdown(PVOID pWlxContext, DWORD dwShutdownType)
{

}

WlxIsLogoffOkでは、常にTRUEを返すようにしています。 ここでFALSEを返すと、たとえばエクスプローラのスターメニューから、 ログオフやシャットダウンを選択しても成功しませんから、 基本的にはTRUEを返す設計にしておくべきでしょう。 WlxLogoffとWlxShutdownでは特に何も処理をしていませんが、 実用的なGINAの設計ではユーザー固有のメモリを開放したり、 データをファイルに保存したりすることがあるかもしれません。

winlogonデスクトップへの切り替え

ExitWindowsなどによる意図しないログオフを確認したい場合、 WlxIsLogoffOkで何らかのユーザーインターフェースを表示するのはよい方法です。 問題は、このユーザーインターフェースがwinlogonデスクトップに表示されるという関係上、 defaultデスクトップで作業を行うユーザーでは見ることができないという点なのですが、 以下のようなコードを記述すれば解決することができます。

BOOL WINAPI WlxIsLogoffOk(PVOID pWlxContext)
{
	int           nId;
	LPGINACONTEXT lpgc = (LPGINACONTEXT)pWlxContext;
	
	lpgc->pDispatchTable->WlxSwitchDesktopToWinlogon(lpgc->hWlx);

	nId = lpgc->pDispatchTable->WlxMessageBox(lpgc->hWlx, NULL, L"ログオフを許可してよろしいですか。", L"ログオフの発生", MB_YESNO);
	
	lpgc->pDispatchTable->WlxSwitchDesktopToUser(lpgc->hWlx);

	return nId == IDYES ? TRUE : FALSE;
}

ディスパッチテーブルに存在するWlxSwitchDesktopToWinlogonは、 アクティブなデスクトップをwinlogonデスクトップに切り替えることができます。 このようにすれば、ユーザーが見えるのはwinlogonデスクトップになりますから、 WlxMessageBoxで表示されたログオフを知らせるメッセージボックスを確認することができます。 確認が終了すれば、WlxSwitchDesktopToUserでdefultデスクトップに戻し、 「はい」を選択していた場合はログオフの処理が行われ、 「いいえ」を選択していた場合は、 これまで通りユーザーはdefultデスクトップで作業を継続することになります。



戻る