没有问题的Gina程序只实现了2个Wlx函数, 其他调用msGina.dll
带有(DWORD dwSasType)的WlxXX函数有3个, WlxLoggedOnSAS, WlxLoggedOutSAS, WlxWkstaLockedSAS. 主要就是修改这3个函数.
DWORD dwSasType 有以下定义
/**
#define WLX_SAS_TYPE_TIMEOUT (0)
#define WLX_SAS_TYPE_CTRL_ALT_DEL (1)
#define WLX_SAS_TYPE_SCRNSVR_TIMEOUT (2)
#define WLX_SAS_TYPE_SCRNSVR_ACTIVITY (3)
#define WLX_SAS_TYPE_USER_LOGOFF (4)
#define WLX_SAS_TYPE_SC_INSERT (5)
#define WLX_SAS_TYPE_SC_REMOVE (6)
#define WLX_SAS_TYPE_AUTHENTICATED (7)
#define WLX_SAS_TYPE_SC_FIRST_READER_ARRIVED (8)
#define WLX_SAS_TYPE_SC_LAST_READER_REMOVED (9)
#define WLX_SAS_TYPE_SWITCHUSER (10)
#define WLX_SAS_TYPE_MAX_MSFT_VALUE (127)
*/
WlxXX返回的Action(DWORD dwSasAction) 有以下定义
/**
#define WLX_SAS_ACTION_LOGON (1)
#define WLX_SAS_ACTION_NONE (2)
#define WLX_SAS_ACTION_LOCK_WKSTA (3)
#define WLX_SAS_ACTION_LOGOFF (4)
#define WLX_SAS_ACTION_SHUTDOWN (5)
#define WLX_SAS_ACTION_PWD_CHANGED (6)
#define WLX_SAS_ACTION_TASKLIST (7)
#define WLX_SAS_ACTION_UNLOCK_WKSTA (8)
#define WLX_SAS_ACTION_FORCE_LOGOFF (9)
#define WLX_SAS_ACTION_SHUTDOWN_POWER_OFF (10)
#define WLX_SAS_ACTION_SHUTDOWN_REBOOT (11)
#define WLX_SAS_ACTION_SHUTDOWN_SLEEP (12)
#define WLX_SAS_ACTION_SHUTDOWN_SLEEP2 (13)
#define WLX_SAS_ACTION_SHUTDOWN_HIBERNATE (14)
#define WLX_SAS_ACTION_RECONNECTED (15)
#define WLX_SAS_ACTION_DELAYED_FORCE_LOGOFF (16)
#define WLX_SAS_ACTION_SWITCH_CONSOLE (17)
*/
通过观察这3个函数的入参dwSasType, 和调用msGina.dll的默认的返回的Action. 来决定我们修改过的MyGina.Dll的返回的Action与msGina.dll返回的一致,以免出现异常场景.
在没有任何一个用户登陆的情况下,Winlogon.exe接收到SAS事件调用该函数
WlxLoggedOutSAS
在锁定状态下,Winlogon.exe接收到SAS事件调用该函数
WlxWkstaLockedSAS
如果没有通过检验, 应该返回 WLX_SAS_ACTION_NONE, 而不是别的
如果通过校验, 应该尽可能的返回由系统gina函数执行的的结果, 而不是自己去写
在校验函数中,加入自己的验证代码
验证代码要做的事,例如:
1. 要用户输入口令, 正确, 才会去调用msGina.dll的系统实现
2. 要用户插入验证用的设备, 和设备交互, 设备中的信息合格, 才会去调用msGina.dll的系统实现
在msdn中搜索, 有gina函数实现的例子.
在msdn中搜索 'WLX_SAS_ACTION_NONE'
可以搜索到下列例子
'Implementing WlxLoggedOutSAS'
'Implementing WlxLoggedOnSAS'
'Implementing WlxWkstaLockedSAS'
这些例子最后都没有调用msGina.dll的行为, 而是单独实现了一段代码.
如果自己替换了系统登陆的对话框, 那就不能直接返回msGina的结果。
因为msGina执行时会再弹出一个系统的登陆对话框. 这时,就要参照msdn中给的例子, 返回 ‘WLX_SAS_XX’的系统宏定义.
要添加以下的额外定义, 现在不知道是哪个标准头中有这两个定义.
typedef struct _USER_ACCOUNT {
struct _MiniAccount * pNext;
LPSTR lpUsername;
LPSTR lpDomain;
LPSTR lpPassword;
LPSTR lpComment;
DWORD IconId;
DWORD Flags;
} USER_ACCOUNT, * PUSER_ACCOUNT;
typedef struct _GINA_CONTEXT {
HANDLE hDllInstance;
PWLX_DISPATCH_VERSION_1_1 pWlxFuncs;
HANDLE hWlx;
LPWSTR station;
BOOL bAllowNewUser;
BOOL bAutoLogonAtBoot;
BOOL bAutoLogonAlways;
HANDLE hUserToken;
PUSER_ACCOUNT pUserAccount;
} GINA_CONTEXT, * PGINA_CONTEXT;