函数介绍自建的替换GINA必须实现WlxNegotiate函数,它是Winlogon调用的第一个GINA函数。WlxNegotiate允许GINA确认是否支持目前安装的Winlogon版本。
注: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版本:[1]
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;
}