自建的替換GINA必須實現WlxNegotiate函式,它是Winlogon調用的第一個GINA函式。WlxNegotiate允許GINA確認是否支持目前安裝的Winlogon版本。
基本介紹
- 外文名:WlxNegotiate
- 類型:函式
- 作用:自建的替換GINA
- 參數:dwWinLogonVersion [in]
函式介紹,代碼示例,
函式介紹
註:Windows Vista忽略GINA動態程式庫(Vista及以後版本參考ICredentialProvider)
語法
BOOL WlxNegotiate(
__in DWORD dwWinLogonVersion,
__out PDWORD pdwDllVersion
);
參數
dwWinLogonVersion [in]
指定了將與GINA互動的Winlogon版本
pdwDllVersion [out]
指明GINA支持的Winlogon版本。這個值也被Winlogon用來決定傳遞哪個分發表(dispatch table)給接下來的WlxInitialize函式。這個值不能比dwWinLogonVersion的值大。
返回值
如果dwWinLogonVersion表示的Winlogon版本大於或等於返回的pdwDllVersion值,函式返回TRUE,Winlogon將繼續初始化。
如果dwWinLogonVersion 小於pdwDllVersion,函式返回FALSE,Winlogon終止,系統不會啟動。
附註
調用WlxNegotiate之前,Winlogon設定桌面狀態,於是當前桌面為Winlogon桌面;Winlogon設定工作站狀態,於是桌面是鎖定的。
參數中的版本數宏定義所代表的Windows版本:
GINA版本 | 對應的Windows版本 |
WLX_VERSION_1_0 | Windows NT 3.5.0 |
WLX_VERSION_1_1 | Windows NT 3.5.1 |
WLX_VERSION_1_2 | Windows NT 4.0 |
WLX_VERSION_1_3 | Windows 2000 |
WLX_VERSION_1_4 | Windows 2003/XP |
需求
支持的最低客戶機 | Windows 2000 Professional |
支持的最低伺服器 | Windows 2000 Server |
最終支持客戶機 | Windows XP |
最終支持伺服器 | Windows Server 2003 |
頭檔案 | Winwlx.h |
代碼示例
代碼來自於API sample -GINASTUB
BOOL
WINAPI
WlxNegotiate (DWORD dwWinlogonVersion,
DWORD * pdwDllVersion)
{
HINSTANCE hDll;
DWORD dwWlxVersion = GINASTUB_VERSION;
// Load MSGINA.DLL.
if (!(hDll = LoadLibrary(REALGINA_PATH)))
{
return FALSE;
}
// Get pointers to WlxNegotiate function in the real MSGINA.
pfWlxNegotiate = (PFWLXNEGOTIATE) GetProcAddress(hDll, "WlxNegotiate");
if (!pfWlxNegotiate)
{
return FALSE;
}
// Handle older version of Winlogon.
if (dwWinlogonVersion < dwWlxVersion)
{
dwWlxVersion = dwWinlogonVersion;
}
// Negotiate with MSGINA for version that we can support.
if (!pfWlxNegotiate(dwWlxVersion, &dwWlxVersion))
{
return FALSE;
}
// Load the rest of the WLX functions from the real MSGINA.
if (!MyInitialize(hDll, dwWlxVersion))
{
return FALSE;
}
// Inform Winlogon which version to use.
*pdwDllVersion = g_dwVersion = dwWlxVersion;
return TRUE;
}