○GINA.DLLの作成(Ver1.0)
なにもしないGINA.DLLを作成します
注)32bit版 Windows2000,XPでしか試していません
うまくいかないと再起動しなくなります。
再インストールの準備をして試してください。
いかなる障害が出たとしても自己責任でやってください。
Ver1.0のためログインダイアログが昔からある古いものになります。
@カスタマイズされたGINA.DLLの作成
▽Win32 Dynamic-Link Library
空のdllプロジェクトを選択
▽2つの空のファイルを作成します。
○○○.cpp
○○○.def
▽○○○.defファイルにプログラムを書きます。
---------------------------------------------------------
EXPORTS
WlxNegotiate
WlxInitialize
WlxDisplaySASNotice
WlxLoggedOutSAS
WlxActivateUserShell
WlxLoggedOnSAS
WlxDisplayLockedNotice
WlxWkstaLockedSAS
WlxIsLockOk
WlxIsLogoffOk
WlxLogoff
WlxShutdown
---------------------------------------------------------
▽○○○.cppファイルにプログラムを書きます。
---------------------------------------------------------
//MSGINA.DLL Ver1.0 API
//なにもしないGINA.DLLのサンプル
#include <windows.h>
#include <stdio.h>
#include <winwlx.h>
//MSGINA.dllのファンクションを呼び出すための関数ポインタ構造体
typedef BOOL (CALLBACK * PGWLX_Negotiate)(DWORD, DWORD *);
typedef BOOL (CALLBACK * PGWLX_Initialize)(LPWSTR, HANDLE, PVOID, PVOID, PVOID);
typedef VOID (CALLBACK * PGWLX_DisplaySASNotice)(PVOID);
typedef int (CALLBACK * PGWLX_LoggedOutSAS)(PVOID, DWORD, PLUID, PSID, PDWORD, PHANDLE,PWLX_MPR_NOTIFY_INFO, PVOID *);
typedef BOOL (CALLBACK * PGWLX_ActivateUserShell)(PVOID, PWSTR, PWSTR, PVOID);
typedef int (CALLBACK * PGWLX_LoggedOnSAS)(PVOID, DWORD, PVOID);
typedef VOID (CALLBACK * PGWLX_DisplayLockedNotice)(PVOID);
typedef int (CALLBACK * PGWLX_WkstaLockedSAS)(PVOID, DWORD);
typedef BOOL (CALLBACK * PGWLX_IsLockOk)(PVOID);
typedef BOOL (CALLBACK * PGWLX_IsLogoffOk)(PVOID);
typedef VOID (CALLBACK * PGWLX_Logoff)(PVOID);
typedef VOID (CALLBACK * PGWLX_Shutdown)(PVOID, DWORD);
//上の関数ポインタ構造体の変数
PGWLX_Negotiate GWlxNegotiate;
PGWLX_Initialize GWlxInitialize;
PGWLX_DisplaySASNotice GWlxDisplaySASNotice;
PGWLX_LoggedOutSAS GWlxLoggedOutSAS;
PGWLX_ActivateUserShell GWlxActivateUserShell;
PGWLX_LoggedOnSAS GWlxLoggedOnSAS;
PGWLX_DisplayLockedNotice GWlxDisplayLockedNotice;
PGWLX_WkstaLockedSAS GWlxWkstaLockedSAS;
PGWLX_IsLockOk GWlxIsLockOk;
PGWLX_IsLogoffOk GWlxIsLogoffOk;
PGWLX_Logoff GWlxLogoff;
PGWLX_Shutdown GWlxShutdown;
//初期化
static BOOL MyInitialize(void){
HINSTANCE hDll;
//MSGINA.DLLをロードします
if (! (hDll = LoadLibrary(TEXT("MSGINA.DLL")))) return FALSE;
//DLLの関数と関数ポインタ変数を接続します。
GWlxNegotiate = (PGWLX_Negotiate)GetProcAddress(hDll, "WlxNegotiate");
if (! GWlxNegotiate) return FALSE;
GWlxInitialize = (PGWLX_Initialize)GetProcAddress(hDll, "WlxInitialize");
if (! GWlxInitialize) return FALSE;
GWlxDisplaySASNotice = (PGWLX_DisplaySASNotice)GetProcAddress(hDll, "WlxDisplaySASNotice");
if (! GWlxDisplaySASNotice) return FALSE;
GWlxLoggedOutSAS = (PGWLX_LoggedOutSAS)GetProcAddress(hDll, "WlxLoggedOutSAS");
if (! GWlxLoggedOutSAS) return FALSE;
GWlxActivateUserShell = (PGWLX_ActivateUserShell)GetProcAddress(hDll, "WlxActivateUserShell");
if (! GWlxActivateUserShell) return FALSE;
GWlxLoggedOnSAS = (PGWLX_LoggedOnSAS)GetProcAddress(hDll, "WlxLoggedOnSAS");
if (! GWlxLoggedOnSAS) return FALSE;
GWlxDisplayLockedNotice = (PGWLX_DisplayLockedNotice)GetProcAddress(hDll, "WlxDisplayLockedNotice");
if (! GWlxDisplayLockedNotice) return FALSE;
GWlxIsLockOk = (PGWLX_IsLockOk)GetProcAddress(hDll, "WlxIsLockOk");
if (! GWlxIsLockOk) return FALSE;
GWlxWkstaLockedSAS = (PGWLX_WkstaLockedSAS)GetProcAddress(hDll, "WlxWkstaLockedSAS");
if (! GWlxWkstaLockedSAS) return FALSE;
GWlxIsLogoffOk = (PGWLX_IsLogoffOk)GetProcAddress(hDll, "WlxIsLogoffOk");
if (! GWlxIsLogoffOk) return FALSE;
GWlxLogoff = (PGWLX_Logoff)GetProcAddress(hDll, "WlxLogoff");
if (! GWlxLogoff) return FALSE;
GWlxShutdown = (PGWLX_Shutdown)GetProcAddress(hDll, "WlxShutdown");
if (! GWlxShutdown) return FALSE;
return TRUE;
}
//利用可能なバージョンであるかを返す
BOOL WINAPI WlxNegotiate(DWORD dwWinlogonVersion,DWORD *pdwDllVersion){
if (! MyInitialize()) return FALSE;
return (* GWlxNegotiate)(dwWinlogonVersion, pdwDllVersion);
}
//MSGINA.DLLの初期化処理
BOOL WINAPI WlxInitialize(
LPWSTR lpWinsta,
HANDLE hWlx,
PVOID pvReserved,
PVOID pWinlogonFunctions,
PVOID *pWlxContext)
{
return (* GWlxInitialize)(
lpWinsta,
hWlx,
pvReserved,
pWinlogonFunctions,
pWlxContext
);
}
//ディスプレイがロックされたときに呼び出される
VOID WINAPI WlxDisplaySASNotice(PVOID pWlxContext)
{
(* GWlxDisplaySASNotice)(pWlxContext);
}
int WINAPI WlxLoggedOutSAS(
PVOID pWlxContext,
DWORD dwSasType,
PLUID pAuthenticationId,
PSID pLogonSid,
PDWORD pdwOptions,
PHANDLE phToken,
PWLX_MPR_NOTIFY_INFO pMprNotifyInfo,
PVOID *pProfile)
{
int iRet;
iRet = (* GWlxLoggedOutSAS)(
pWlxContext,
dwSasType,
pAuthenticationId,
pLogonSid,
pdwOptions,
phToken,
pMprNotifyInfo,
pProfile
);
return iRet;
}
//ログオンが認証されたときに呼び出される
BOOL WINAPI WlxActivateUserShell(
PVOID pWlxContext,
PWSTR pszDesktopName,
PWSTR pszMprLogonScript,
PVOID pEnvironment)
{
return (* GWlxActivateUserShell)(
pWlxContext,
pszDesktopName,
pszMprLogonScript,
pEnvironment
);
}
//ログオン中にSASイベントが発生すると呼び出される
int WINAPI WlxLoggedOnSAS(PVOID pWlxContext,DWORD dwSasType,PVOID pReserved){
return (* GWlxLoggedOnSAS)(pWlxContext, dwSasType, pReserved);
}
//ディスプレイがロックされたときに呼び出される
VOID WINAPI WlxDisplayLockedNotice(PVOID pWlxContext){
(* GWlxDisplayLockedNotice)(pWlxContext);
}
//ワークステーションをロックする前に呼び出される
BOOL WINAPI WlxIsLockOk(PVOID pWlxContext){
return (* GWlxIsLockOk)(pWlxContext);
}
//ワークステーションがロックされたときに呼び出される
int WINAPI WlxWkstaLockedSAS(PVOID pWlxContext,DWORD dwSasType){
return (* GWlxWkstaLockedSAS)(pWlxContext, dwSasType);
}
//ExitWindowsExでログオフを始めたとき呼び出される
BOOL WINAPI WlxIsLogoffOk(PVOID pWlxContext){
BOOL bSuccess;
bSuccess = (* GWlxIsLogoffOk)(pWlxContext);
return bSuccess;
}
//ログオフの直前に呼び出される
VOID WINAPI WlxLogoff(PVOID pWlxContext){
(* GWlxLogoff)(pWlxContext);
}
//システムがシャットダウンされる直前に呼び出される
VOID WINAPI WlxShutdown(PVOID pWlxContext,DWORD ShutdownType){
(* GWlxShutdown)(pWlxContext, ShutdownType);
}
---------------------------------------------------------
▽Win32 Releaseにてビルドします
▲トップページ
>
Windows と C++