EternalWindows
GINA / 関数の構図

これまで、スタブを通してGINAを作成してきましたが、 完全にオリジナルのGINAを作ろうとなると、もうスタブに頼るわけにはいきません。 GINAフックでログオンダイアログボックスをカスタマイズするにしても、 それはユーザー名とパスワードの入力という一般的なログオンに過ぎず、 指紋や音声を基にしたような完全にオリジナルなログオンを 行うにはGINAのコードを全て自分で書くより方法はないのです。 これを成すには、とにかくGINAがエクスポートする関数の役割と引数を 理解しなければなりませんが、復習の意味を込めて、今一度個々の関数が呼ばれる タイミングについて確認したいと思います。

そもそも、GINAがエクスポートする関数は、基本的にユーザーのセキュリティ操作と 1対1の関係を持っていますが、その操作が発生する状態というのは2つに限られています。 1つは、ユーザーがログオンする前の状態で、このときにユーザーが行うセキュリティ操作は、 msgina.dllの例で述べると、ログオンダイアログボックスによる認証です。 もう1つの状態は、ユーザーがログオンした後のことを指し、このときに行う セキュリティ操作は、ワークステーションのロックやログオフなどがあります。 この2つの状態におけるセキュリティ操作は互いに異なりますから、 呼ばれる関数もログオンしているかどうかで異なることになります。 よって、GINAがエクスポートする個々の関数の呼ばれるタイミングを理解するには、 ユーザーがログオンしているかどうかを基準にして調べるのが効率的であるといえます。

この図は、ユーザーがログオンする前に呼ばれることになる関数とその流れを示しています。 四角で囲われているのがGINAの関数で、その戻り値によって次の操作が決まります。 たとえば、WlxNegotiateでTRUEを返すとWlxInitializeが呼ばれ、 FALSEを返すとシステムは再起動することになります。 正確には、WlxActivateUserShellが呼ばれている時点でユーザーはログオンしていますが、 この段階ではまだデスクトップがアプリケーションデスクトップに切り替わってないため、 この図ではWlxActivateUserShellもログオン前に呼ばれる関数としています。 また、WlxLogoffとWlxShutdownは基本的にログオン後に呼ばれる関数ですが、 関数の戻り値によってはログオン前に呼ばれることもあります。 続いて、ログオン後に呼ばれる関数の関係を見てみましょう。

WlxLoggedOnSASは、ユーザーがログオンしているときにSASが入力されると呼ばれ、 この関数から一連のセキュリティ操作が開始されます。 たとえば、msgina.dllは提供しているダイアログの「コンピュターのロック」という ボタンが押されると、WlxLoggedOnSASの戻り値をWLX_SAS_ACTION_LOCK_WKSTAとします。 これまでは、「コンピュターのロック」を押したらWlxDisplayLockedNoticeが呼ばれるという 解釈で済みましたが、これからはWLX_SAS_ACTION_LOCK_WKSTAを 返したらWlxDisplayLockedNoticeが呼ばれるという考え方をしなくてはなりません。

多くのセキュリティ操作はwinlogonデスクトップで明示的に行われることから、 そこでの操作はユーザーの意思が正しく反映されることになります。 しかし、中にはユーザーが予期しない形で発生するセキュリティ操作もあります。 たとえば、通常のアプリケーションはExitWindowsExというWindowsAPIを呼び出すことにより、 いつでも現在ログオンしているユーザーをログオフさせることができるようになっています。 このような問題を回避するため、GINAでは関数経由で発生するセキュリティ操作を エクスポート関数を通じて制御できるようになっています。

LockWorkStationは、ワークステーションのディスプレイをロックしますが、 それが成功するかはWlxIsLockOkがTRUEを返したときに限られています。 ExitWindowsExは、引数の指定によってはシャットダウンも行うことができる関数ですが、 シャットダウンにはログオフも伴いますから、どちらにせよそれが成功するかどうかは、 WlxIsLogoffOkがTRUEを返すかで決定されることになります (シャットダウンを指定した場合は、WlxLogoffに続いてWlxShutdowも呼ばれます)。 上図では、WlxIsLockOkやWlxIsLogoffOkがFALSEを返すと対応する関数もFALSEを返すように 思えますが、実際にはそれらの関数はTRUEを返すことになっています。 そのため、LockWorkStationやExitWindowsExの呼び出し側は、 戻り値によってその操作が成功したかどうかを確実には判断できません。


戻る