【摘自网上】Delphi Gina编程----Wlx.h

 

unit GinaFunctionDeclare; 

 

interface 

uses Windows, Messages, SysUtils,Classes,Dialogs, 

CommonFunction; 

 

{$INCLUDE NTVersion.inc} 

 

 

const 

MSGINADLL=’msgina.dll’; 

 

{$IFNDEF _WINWLX_} 

{$define _WINWLX_} 

{$ENDIF } 

 

{******************************************************} 

{有2个版本的Gina: Major revision 和 minor revision. } 

{ Major revision使用在高于16位的系统. } 

{ minor revision使用在低于16位的系统. } 

{******************************************************} 

WLX_VERSION_1_0 =$00010000; 

WLX_VERSION_1_1 =$00010001; 

WLX_VERSION_1_2 =$00010002; 

WLX_VERSION_1_3 =$00010003; 

//WLX_VERSION_1_4 =$00010004; //不被支持 

WLX_CURRENT_VERSION =WLX_VERSION_1_3; 

 

{*******************************************************} 

{ 安全口令系列类型定义 } 

{这些值被具有dwSasType参数的函数使用. } 

{从0..127的值已被系统使用,用户自定义的类型必须大于127. } 

{*******************************************************} 

WLX_SAS_TYPE_TIMEOUT =0; 

WLX_SAS_TYPE_CTRL_ALT_DEL =1; // CTRL+ALT+DEL三键被按下 

WLX_SAS_TYPE_SCRNSVR_TIMEOUT =2; //键盘和鼠标没有使用导致屏保出现{It is up to the GINA DLL whether this constitutes a workstation locking event.} 

WLX_SAS_TYPE_SCRNSVR_ACTIVITY =3; //处于屏保状态时键盘或鼠标被使用.(退出屏保) 

WLX_SAS_TYPE_USER_LOGOFF =4; 

WLX_SAS_TYPE_SC_INSERT =5; 

WLX_SAS_TYPE_SC_REMOVE =6; 

WLX_SAS_TYPE_AUTHENTICATED =7; 

WLX_SAS_TYPE_SC_FIRST_READER_ARRIVED=8; 

WLX_SAS_TYPE_SC_LAST_READER_REMOVED =9; 

WLX_SAS_TYPE_SWITCHUSER =10; 

WLX_SAS_TYPE_MAX_MSFT_VALUE =127; 

 

{*******************************************************} 

{成功登录之后,Gina.dll会提供一些选项给WinLogon. } 

{这些选项通过WlxLoggedOutSas函数的dwOptions参数被传递 } 

{*******************************************************} 

WLX_LOGON_OPT_NO_PROFILE =$00000001; // 

WLX_LOGON_OPT_USE_GROUPPOLICY =$00000002; //提交组策略给用户 

 

{*******************************************************} 

{成功登录之后,Gina.dll期望返回一个信息给WinLogon. } 

{这个信息允许WinLogon做2件事情: } 

{ 1> 支持Profile载入. } 

{ 2> 追加网络提供者. } 

{为了不同的信息可以传递给Winlogon,每一个profile结构体的 } 

{第一个DWord成员必须是一个类型标志.下面的常量定义了可以 } 

{使用的类型标志. } 

{标准的profile 类型标志是 V2_0 } 

{*******************************************************} 

WLX_PROFILE_TYPE_V1_0 =1; 

WLX_PROFILE_TYPE_V2_0 =2; 

 

{*******************************************************} 

{WlxLoggedOnSas() 和 WlxWkstaLockedSas()函数返回一个值, } 

{这个值指示WinLogon执行一些动作(或者什么也不执行). } 

{下面定义了这2个函数的一些(并非全部)返回值. } 

{*******************************************************} 

WLX_SAS_ACTION_LOGON =1; //用户已登录 

WLX_SAS_ACTION_NONE =2; //不改变Windows工作站的状态 

WLX_SAS_ACTION_LOCK_WKSTA =3; //锁定工作站,等待下一个SAS事件. 

WLX_SAS_ACTION_LOGOFF =4; //用户退出工作站 

WLX_SAS_ACTION_SHUTDOWN =5; //用户退出工作站,并关闭系统 

WLX_SAS_ACTION_PWD_CHANGED =6; //用户改变密码.通知网络提供者. 

WLX_SAS_ACTION_TASKLIST =7; //调用Task List. 

WLX_SAS_ACTION_UNLOCK_WKSTA =8; //解锁工作站. 

WLX_SAS_ACTION_FORCE_LOGOFF =9; //强制用户退出 

WLX_SAS_ACTION_SHUTDOWN_POWER_OFF =10; //关闭计算机 

WLX_SAS_ACTION_SHUTDOWN_REBOOT =11; //Reboot machine after shutting down. 

WLX_SAS_ACTION_SHUTDOWN_SLEEP =12; //Put the machine to sleep 

WLX_SAS_ACTION_SHUTDOWN_SLEEP2 =13; //Put the machine to sleep and disable wakeup events 

WLX_SAS_ACTION_SHUTDOWN_HIBERNATE =14; //Hibernate the machine 

WLX_SAS_ACTION_RECONNECTED =15; 

WLX_SAS_ACTION_DELAYED_FORCE_LOGOFF =16; 

WLX_SAS_ACTION_SWITCH_CONSOLE =17; 

 

 

{********************************************} 

{ 消息. } 

{ wParam传递SAS事件类型. } 

{********************************************} 

WLX_WM_SAS =WM_USER + 601; 

 

{********************************************} 

{ 对话框的返回值 } 

{********************************************} 

WLX_DLG_SAS =101; 

WLX_DLG_INPUT_TIMEOUT =102; // Insert (keys, etc) timed out 

WLX_DLG_SCREEN_SAVER_TIMEOUT =103; // Screen Saver activated 

WLX_DLG_USER_LOGOFF =104; // User logged off 

 

WLX_CONSOLESWITCHCREDENTIAL_TYPE_V1_0=1; 

 

STATUSMSG_OPTION_NOANIMATION =1; 

STATUSMSG_OPTION_SETFOREGROUND =2; 

 

type 

{*********************************************************} 

{ 登录之后,WLX_PROFILE_*结构体将由Gina.dll返回. } 

{这些结构体将被WinLogon用来支持追加网络提供者 和 载入 } 

{新用户的Profile. (原文:This information is used by } 

{ Winlogon to support supplemental Network Providers and } 

{ to load the newly logged-on user’s profile.) } 

{ } 

{ Winlogon有责任释放这2个结构提及其成员. } 

{*********************************************************} 

PVOID=Pointer; 

PPVOID=^PVOID; 

_LUID=packed record 

LowPart :DWORD; 

HighPart :int64; 

end; 

LUID=_LUID; 

PLUID=^_LUID; 

 

_WLX_PROFILE_V1_0=packed record 

{************************************************} 

{这个成员字段识别由Gina.dll返回的Profile的类型. } 

{它允许Winlogon进行类型转换. } 

{ Profile类型被定义成 WLX_PROFILE_TYPE_xxx 前缀. } 

{************************************************} 

dwType :DWORD; 

 

{************************************************} 

{将被载入的Profile的路径. } 

{这个字段指向的缓冲区必须被分配.不再使用时,须由 } 

{Winlogon释放. } 

{************************************************} 

pszProfile :PWideChar; 

end; 

WLX_PROFILE_V1_0 =_WLX_PROFILE_V1_0; 

PWLX_PROFILE_V1_0 =^_WLX_PROFILE_V1_0; 

 

_WLX_PROFILE_V2_0 =packed record 

dwType :DWORD; //同 _WLX_PROFILE_V1_0.dwType 

pszProfile :PWideChar; //同 _WLX_PROFILE_V1_0.pszProfile,但可以为NULL(表示本地的Profile). 

 

{************************************************} 

{ 策略的路径名. } 

{可以设为Null,以阻止网络认证. } 

{这个字段指向的缓冲区必须被分配.不再使用时,须由 } 

{Winlogon释放. } 

{************************************************} 

pszPolicy :PWideChar; 

 

{******************************************************************} 

{ pathname of network default user profile } 

{它可以为Null. 这将使得默认的用户Profile在本机. } 

{ } 

{这个字段指向的缓冲区必须被分配.不再使用时,须由Winlogon释放. } 

{******************************************************************} 

pszNetworkDefaultUserProfile :PWideChar; 

 

 

{*******************************************************************} 

{ 使用户帐号生效的服务的名字. } 

{它用来枚举用户所在的 全局的组.它可以为Null. } 

{(原文: This is used to enumerate globals groups the user belongs } 

{ to for policy support. This parameter can be NULL.) } 

{ } 

{这个字段指向的缓冲区必须被分配.不再使用时,须由Winlogon释放. } 

{*******************************************************************} 

pszServerName :PWideChar; 

 

{*******************************************************************} 

{指向一系列由NULL结尾的环境变量 } 

{格式: 环境变量名 = 值 或者 环境变量名 = %OtherVar%/more text } 

{每一个环境变量都以NULL结尾,最后一个环境变量必须以2个Null结尾. } 

{环境变量可以包含其它环境变量.这就要用到"%"标记. } 

{该参数可以为Null. } 

{该参数指向的缓冲区必须被分配.不再使用时,须由Winlogon释放. } 

{*******************************************************************} 

pszEnvironment :PWideChar; 

end; 

WLX_PROFILE_V2_0 =_WLX_PROFILE_V2_0; 

PWLX_PROFILE_V2_0 =^_WLX_PROFILE_V2_0; 

 

 

{*************************************************************************} 

{认证之后,WLX_MPR_NOTIFICATION_INFO结构体将由Gina.dll返回. } 

{这些结构体将被WinLogon用来提供 收集来的认证和鉴别信息 给网络提供者. } 

{(原文: This information is used by Winlogon to provide identification } 

{ and authentication information already collected to network providers.)} 

{ } 

{ Winlogon有责任释放这2个结构提及其成员. } 

{*************************************************************************} 

_WLX_MPR_NOTIFY_INFO =packed record 

{*************************************************************************} 

{ 登录帐号 } 

{ 它指向的缓冲区必须被分配.不再使用时,须由Winlogon释放. } 

{*************************************************************************} 

pszUserName :PWideChar; 

pszDomain :PWideChar; 

pszPassword :PWideChar; //密码.它指向的缓冲区必须被分配.不再使用时,须由Winlogon释放. 

 

{*************************************************************************} 

{ 旧密码 } 

{ 当用户更改了密码,pszOldPassword指向以前的密码.新密码由pszPassword保存. } 

{ } 

{ 它指向的缓冲区必须被分配.不再使用时,须由Winlogon释放. } 

{*************************************************************************} 

pszOldPassword :PWideChar; 

END; 

WLX_MPR_NOTIFY_INFO=_WLX_MPR_NOTIFY_INFO; 

PWLX_MPR_NOTIFY_INFO=^_WLX_MPR_NOTIFY_INFO; 

 

 

 

 

// // 

// Winlogon 提供的服务 // 

// // 

 

const 

WLX_DESKTOP_NAME =$00000001; // Name present 

WLX_DESKTOP_HANDLE =$00000002; // Handle present 

type 

_WLX_DESKTOP=packed record 

Size :DWORD; 

Flags :DWORD; 

hDesktop :HDESK; 

pszDesktopName :PWideChar; 

end; 

 

{回调函数,处理对话框的消息循环.} 

DLGPROC=function(hHwnd:HWND;Msg:Longword;wP:wParam;lP:lParam):Bool;stdcall; 

 

DLGTEMPLATE=packed record 

_Style :DWORD; 

_dwExtendedStyle :DWORD; 

_cdit :WORD; 

_x :Short; 

_y :Short; 

_cx :Short; 

_cy :Short; 

end; 

LPCDLGTEMPLATE=^DLGTEMPLATE; 

 

WLX_DESKTOP=_WLX_DESKTOP; 

PWLX_DESKTOP=^_WLX_DESKTOP; 

PPWLX_DESKTOP=^PWLX_DESKTOP; 

 

PWLX_USE_CTRL_ALT_DEL= procedure(hWlx:THandle);stdcall; 

PWLX_SET_CONTEXT_POINTER= procedure(hWlx:THandle;pWlxContext:Pointer);stdcall; 

PWLX_SAS_NOTIFY= procedure(hWlx:THandle;dwSasType:DWORD);stdcall; 

PWLX_SET_TIMEOUT= function(hWlx:THandle;Timeout:DWORD):Bool;stdcall; 

PWLX_ASSIGN_SHELL_PROTECTION= function(hWlx,hToken,hProcess,hThread:THandle):Integer;stdcall; 

PWLX_MESSAGE_BOX= function(hWlx:THandle;hwndOwner:HWND; 

lpszText,lpszTitle:PWideChar;fuStyle:LongWord):Integer;Stdcall; 

PWLX_DIALOG_BOX= function(hWlx,hInst:THandle;lpszTemplate:PWideChar; 

hwndOwner:THandle;dlgprc:DLGPROC):Integer;stdcall; 

PWLX_DIALOG_BOX_INDIRECT= function(hWlx,hInst:THandle;hDialogTemplate:LPCDLGTEMPLATE; 

hwndOwner:HWND;dlgprc:DLGPROC):Integer;stdcall; 

PWLX_DIALOG_BOX_PARAM= function(hWlx,hInst:THandle;lpszTemplate:PWideChar; 

hwndOwner:HWND;dlgprc:DLGPROC;dwInitParam:LPARAM):Integer;stdcall; 

PWLX_DIALOG_BOX_INDIRECT_PARAM= function(hWlx,hInst:THandle; 

hDialogTemplate:LPCDLGTEMPLATE;hwndOwner:HWND;dlgprc:DLGPROC; 

dwInitParam:LPARAM):Integer;stdcall; 

PWLX_SWITCH_DESKTOP_TO_USER= function(hWlx:THandle):Integer;stdcall; 

PWLX_SWITCH_DESKTOP_TO_WINLOGON= function(hWlx:THandle):Integer;stdcall; 

 

PWLX_CHANGE_PASSWORD_NOTIFY= function(hWlx:THandle;pMprInfo:PWLX_MPR_NOTIFY_INFO; 

dwChangeInfo:DWORD):Integer;stdcall; 

 

PWLX_GET_SOURCE_DESKTOP= function(hWlx:THandle;ppDesktop:PPWLX_DESKTOP):bool;stdcall; 

 

PWLX_SET_RETURN_DESKTOP= function(hWlx:THandle;pDesktop:PWLX_DESKTOP):Bool;stdcall; 

PWLX_CREATE_USER_DESKTOP= function(hWlx,hToken:THandle;Flags:DWORD; 

pszDesktopName:PWideChar;ppDesktop:PPWLX_DESKTOP):bool;stdcall; 

PWLX_CLOSE_USER_DESKTOP= function(hwxl:THandle;PWLX_DESKTOP:PWLX_DESKTOP;hToken:THandle):LongBool;stdcall; 

PWLX_SET_OPTION= function(hwxl:THandle;Option:DWORD;Value:PWORD;var OldValue:PWORD):BOOL;stdcall; ///???? 

PWLX_GET_OPTION =function(hwxl:THandle;Option:DWORD;var OldValue:PWORD):BOOL;stdcall; 

PWLX_WIN31_MIGRATE =procedure(hwxl:THandle);stdcall; 

 

_WLX_CLIENT_CREDENTIALS_INFO=packed record 

dwType: DWORD; 

pszUserName, 

pszDomain, 

pszPassword :PWideChar; 

fPromptForPassword:BOOL; 

end; 

WLX_CLIENT_CREDENTIALS_INFO_V1_0 = _WLX_CLIENT_CREDENTIALS_INFO; 

PWLX_CLIENT_CREDENTIALS_INFO_V1_0 =^_WLX_CLIENT_CREDENTIALS_INFO; 

 

_WLX_CLIENT_CREDENTIALS_INFO_2_0=packed record 

dwType:DWORD; 

pszUserName, 

pszDomain, 

pszPassword :PWideChar; 

fPromptForPassword, 

fDisconnectOnLogonFailure:BOOL; 

 

end; 

WLX_CLIENT_CREDENTIALS_INFO_V2_0 = _WLX_CLIENT_CREDENTIALS_INFO_2_0; 

P_WLX_CLIENT_CREDENTIALS_INFO_2_0 = ^_WLX_CLIENT_CREDENTIALS_INFO_2_0; 

 

{_WLX_CONSOLESWITCH_CREDENTIALS_INFO= packed record 

dwType: DWORD; 

UserToken: THandle; 

LogonId: LUID; 

Quotas: QUOTA_LIMITS; 

UserName, 

Domain: PWideChar; 

LogonTime: LARGE_INTEGER; 

SmartCardLogon:BOOL; 

ProfileLength: ULONG; 

MessageType: DWORD; 

LogonCount, //UShort??????? 

BadPasswordCount: Word; 

ProfileLogonTime, 

LogoffTime, 

KickOffTime, 

PasswordLastSet, 

PasswordCanChange, 

PasswordMustChange:LARGE_INTEGER 

LogonScript, 

HomeDirectory, 

FullName, 

ProfilePath, 

HomeDirectoryDrive, 

LogonServer:PWideChar; 

UserFlags, 

PrivateDataLen:ULONG; 

PrivateData :PByte; 

end; 

WLX_CONSOLESWITCH_CREDENTIALS_INFO_V1_0= _WLX_CONSOLESWITCH_CREDENTIALS_INFO; 

PWLX_CONSOLESWITCH_CREDENTIALS_INFO_V1_0=^_WLX_CONSOLESWITCH_CREDENTIALS_INFO; } 

 

{ _WLX_MPR_NOTIFY_INFO=packed record 

pszUserName,pszDomain,pszPassword,pszOldPassword:PWideChar; 

end; 

WLX_MPR_NOTIFY_INFO=_WLX_MPR_NOTIFY_INFO; 

PWLX_MPR_NOTIFY_INFO=^_WLX_MPR_NOTIFY_INFO; } 

 

PWLX_QUERY_CLIENT_CREDENTIALS=function(pCred:PWLX_CLIENT_CREDENTIALS_INFO_V1_0):BOOL;stdcall; 

PWLX_QUERY_IC_CREDENTIALS =function(pCred:PWLX_CLIENT_CREDENTIALS_INFO_V1_0):BOOL;stdcall; 

PWLX_DISCONNECT =function:BOOL; 

 

 

const 

WLX_CREATE_INSTANCE_ONLY =$00000001; 

WLX_CREATE_USER =$00000002; 

type 

PWLX_CHANGE_PASSWORD_NOTIFY_EX=function( 

hWlx:THandle; 

pMprInfo:PWLX_MPR_NOTIFY_INFO; 

dwChangeInfo:DWORD; 

ProviderName:PWideChar; 

Reserved:PVOID 

):Integer;stdcall; 

 

 

// // 

// Function dispatch tables. // 

// 初始化期间,当WlxInitialize()被调用时,下面3个函数分发表之一将被传递// 

// 给GINA.DLL. // 

// // 

// NOTE: FOR THIS REVISION THERE IS ONLY ONE TABLE. DEVELOPERS // 

// SHOULD EXPECT MORE IN FUTURE RELEASE. // 

// // 

 

 

 

{*********************************************************************} 

{ 版本WLX_VERSION_1_0的函数分发表 } 

{ NT3.51支持的函数集 } 

{*********************************************************************} 

_WLX_DISPATCH_VERSION_1_0=packed record 

WlxUseCtrlAltDel :PWLX_USE_CTRL_ALT_DEL; 

WlxSetContextPointer :PWLX_SET_CONTEXT_POINTER; 

WlxSasNotify :PWLX_SAS_NOTIFY; 

WlxSetTimeout :PWLX_SET_TIMEOUT; 

WlxAssignShellProtection :PWLX_ASSIGN_SHELL_PROTECTION; 

WlxMessageBox :PWLX_MESSAGE_BOX; 

WlxDialogBox :PWLX_DIALOG_BOX; 

WlxDialogBoxParam :PWLX_DIALOG_BOX_PARAM; 

WlxDialogBoxIndirect :PWLX_DIALOG_BOX_INDIRECT; 

WlxDialogBoxIndirectParam :PWLX_DIALOG_BOX_INDIRECT_PARAM; 

WlxSwitchDesktopToUser :PWLX_SWITCH_DESKTOP_TO_USER; 

WlxSwitchDesktopToWinlogon :PWLX_SWITCH_DESKTOP_TO_WINLOGON; 

WlxChangePasswordNotify :PWLX_CHANGE_PASSWORD_NOTIFY; 

end; 

WLX_DISPATCH_VERSION_1_0=_WLX_DISPATCH_VERSION_1_0; 

PWLX_DISPATCH_VERSION_1_0=^_WLX_DISPATCH_VERSION_1_0; 

 

{*********************************************************************} 

{ 版本WLX_VERSION_1_1的分发表 } 

{ WinNT4.0使用该分发表 } 

{*********************************************************************} 

_WLX_DISPATCH_VERSION_1_1=packed record 

WlxUseCtrlAltDel :PWLX_USE_CTRL_ALT_DEL; 

WlxSetContextPointer :PWLX_SET_CONTEXT_POINTER; 

WlxSasNotify :PWLX_SAS_NOTIFY; 

WlxSetTimeout :PWLX_SET_TIMEOUT; 

WlxAssignShellProtection :PWLX_ASSIGN_SHELL_PROTECTION; 

WlxMessageBox :PWLX_MESSAGE_BOX; 

WlxDialogBox :PWLX_DIALOG_BOX; 

WlxDialogBoxParam :PWLX_DIALOG_BOX_PARAM; 

WlxDialogBoxIndirect :PWLX_DIALOG_BOX_INDIRECT; 

WlxDialogBoxIndirectParam :PWLX_DIALOG_BOX_INDIRECT_PARAM; 

WlxSwitchDesktopToUser :PWLX_SWITCH_DESKTOP_TO_USER; 

WlxSwitchDesktopToWinlogon :PWLX_SWITCH_DESKTOP_TO_WINLOGON; 

WlxChangePasswordNotify :PWLX_CHANGE_PASSWORD_NOTIFY; 

WlxGetSourceDesktop :PWLX_GET_SOURCE_DESKTOP; 

WlxSetReturnDesktop :PWLX_SET_RETURN_DESKTOP; 

WlxCreateUserDesktop :PWLX_CREATE_USER_DESKTOP; 

WlxChangePasswordNotifyEx :PWLX_CHANGE_PASSWORD_NOTIFY_EX; 

end; 

WLX_DISPATCH_VERSION_1_1=_WLX_DISPATCH_VERSION_1_1; 

PWLX_DISPATCH_VERSION_1_1=^_WLX_DISPATCH_VERSION_1_1; 

 

{*********************************************************************} 

{ 版本WLX_VERSION_1_2的分发表 } 

{ WLX_DISPATCH_VERSION_1_2使用在NT SP4机器及其后续版本. ?? NT200} 

{*********************************************************************} 

_WLX_DISPATCH_VERSION_1_2=packed record 

WlxUseCtrlAltDel :PWLX_USE_CTRL_ALT_DEL; 

WlxSetContextPointer :PWLX_SET_CONTEXT_POINTER; 

WlxSasNotify :PWLX_SAS_NOTIFY; 

WlxSetTimeout :PWLX_SET_TIMEOUT; 

WlxAssignShellProtection :PWLX_ASSIGN_SHELL_PROTECTION; 

WlxMessageBox :PWLX_MESSAGE_BOX; 

WlxDialogBox :PWLX_DIALOG_BOX; 

WlxDialogBoxParam :PWLX_DIALOG_BOX_PARAM; 

WlxDialogBoxIndirect :PWLX_DIALOG_BOX_INDIRECT; 

WlxDialogBoxIndirectParam :PWLX_DIALOG_BOX_INDIRECT_PARAM; 

WlxSwitchDesktopToUser :PWLX_SWITCH_DESKTOP_TO_USER; 

WlxSwitchDesktopToWinlogon :PWLX_SWITCH_DESKTOP_TO_WINLOGON; 

WlxChangePasswordNotify :PWLX_CHANGE_PASSWORD_NOTIFY; 

WlxGetSourceDesktop :PWLX_GET_SOURCE_DESKTOP; 

WlxSetReturnDesktop :PWLX_SET_RETURN_DESKTOP; 

WlxCreateUserDesktop :PWLX_CREATE_USER_DESKTOP; 

WlxChangePasswordNotifyEx :PWLX_CHANGE_PASSWORD_NOTIFY_EX; 

WlxCloseUserDesktop :PWLX_CLOSE_USER_DESKTOP; 

end; 

WLX_DISPATCH_VERSION_1_2=_WLX_DISPATCH_VERSION_1_2; 

PWLX_DISPATCH_VERSION_1_2=^_WLX_DISPATCH_VERSION_1_2; 

 

{*********************************************************************} 

{ 版本WLX_VERSION_1_3的分发表 } 

{ WLX_DISPATCH_VERSION_1_3使用在XP ??? } 

{*********************************************************************} 

_WLX_DISPATCH_VERSION_1_3=packed record 

WlxUseCtrlAltDel :PWLX_USE_CTRL_ALT_DEL; 

WlxSetContextPointer :PWLX_SET_CONTEXT_POINTER; 

WlxSasNotify :PWLX_SAS_NOTIFY; 

WlxSetTimeout :PWLX_SET_TIMEOUT; 

WlxAssignShellProtection :PWLX_ASSIGN_SHELL_PROTECTION; 

WlxMessageBox :PWLX_MESSAGE_BOX; 

WlxDialogBox :PWLX_DIALOG_BOX; 

WlxDialogBoxParam :PWLX_DIALOG_BOX_PARAM; 

WlxDialogBoxIndirect :PWLX_DIALOG_BOX_INDIRECT; 

WlxDialogBoxIndirectParam :PWLX_DIALOG_BOX_INDIRECT_PARAM; 

WlxSwitchDesktopToUser :PWLX_SWITCH_DESKTOP_TO_USER; 

WlxSwitchDesktopToWinlogon :PWLX_SWITCH_DESKTOP_TO_WINLOGON; 

WlxChangePasswordNotify :PWLX_CHANGE_PASSWORD_NOTIFY; 

WlxGetSourceDesktop :PWLX_GET_SOURCE_DESKTOP; 

WlxSetReturnDesktop :PWLX_SET_RETURN_DESKTOP; 

WlxCreateUserDesktop :PWLX_CREATE_USER_DESKTOP; 

WlxChangePasswordNotifyEx :PWLX_CHANGE_PASSWORD_NOTIFY_EX; 

WlxCloseUserDesktop :PWLX_CLOSE_USER_DESKTOP; 

WlxSetOption :PWLX_SET_OPTION; 

WlxGetOption :PWLX_GET_OPTION; 

WlxWin31Migrate :PWLX_WIN31_MIGRATE; 

WlxQueryClientCredentials :PWLX_QUERY_CLIENT_CREDENTIALS; 

WlxQueryInetConnectorCredentials :PWLX_QUERY_IC_CREDENTIALS; 

WlxDisconnect :PWLX_DISCONNECT; 

end; 

WLX_DISPATCH_VERSION_1_3=_WLX_DISPATCH_VERSION_1_3; 

PWLX_DISPATCH_VERSION_1_3=^_WLX_DISPATCH_VERSION_1_3; 

 

 

{******************************************************************} 

{GINA通常会分配一些自己需要的内存.在MS自己的样板例程里,GINA需要分配} 

{一段内存,记录的是一些全局变量.这些变量的定义如下: } 

{******************************************************************} 

_MiniAccount=record 

pszUsername, 

pszDomain, 

pszPassword, 

pszComment :PWideChar; 

IconId, 

Flags :DWORD; 

end; 

MiniAccount=_MiniAccount; 

PMiniAccount=^_MiniAccount; 

 

_Globals=record 

fAllowNewUser, 

fAutoLogonAtBoot, 

fAutoLogonAlways :BOOL; 

hUserToken :THandle; 

pAccount :PMiniAccount; 

end; 

Globals=_Globals; 

PGlobals=^_Globals; 

 

const 

{******************************************************} 

{ShellShutdownDialog将返回一个值,告诉Logon执行什么操作.} 

{返回值在下面被定义: } 

{******************************************************} 

SHUT_DOWN_NONE = 0; //无操作 

SHUT_DOWN_LOGOUT = 1; //注销 

SHUT_DOWN_POWEROFF = 2; //关机 

SHUT_DOWN_REBOOT = 4; //重启 

SHUT_DOWN_WAIT = 16; //待机 

SHUT_DOWN_DORMANCY = 64; //休眠 

 

type 

{下面定义了3个结构体,关于这3个结构体的说明,请参见本目录下的"Client/MyGina/Doc/xxxx.txt"} 

 

{ Gina Context } 

_GINA_CONTEXT = record 

bAllowNewUser : boolean; 

bAutoLogonAtBoot : boolean; 

bAutoLogonAlways : boolean; //自动登录 

LoginName : PWideChar; 

Password : PWideChar; 

Domain : PWideChar; 

LoginOnTime : PWideChar; 

hWlx : THANDLE; 

station : PWideChar; 

{$IF VERSION>=1.3} 

pWlxFuncs : PWLX_DISPATCH_VERSION_1_3; 

{$ELSEIF VERSION>=1.2} 

pWlxFuncs : PWLX_DISPATCH_VERSION_1_2; 

{$ELSEIF VERSION>=1.1} 

pWlxFuncs : PWLX_DISPATCH_VERSION_1_1; 

{$ELSEIF VERSION>=1.0} 

pWlxFuncs : PWLX_DISPATCH_VERSION_1_0; 

{$IFEND} 

hDllInstance : THANDLE; 

UserToken : THANDLE; 

end; 

GINA_CONTEXT = _GINA_CONTEXT; 

PGINA_CONTEXT = ^_GINA_CONTEXT; 

 

{ http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ security/Security/token_type.asp} 

tagTOKEN_TYPE = (TokenPrimary = 1, //显示主令牌 

TokenImpersonation //扮演者的令牌 

); 

TOKEN_TYPE = tagTOKEN_TYPE; 

 

{ http://msdn.microsoft.com/library/default.asp?url=/library/en-us/security/security/security_impersonation_level.asp} 

_SECURITY_IMPERSONATION_LEVEL = (SecurityAnonymous = 0, //不能获得客户端信任信息 

SecurityIdentification, //可以获得客户端信任信息 

SecurityImpersonation, // 可以获得安全上下文,但不能获得本地或远程系统. 

SecurityDelegation //NT不支持该选项 

); 

SECURITY_IMPERSONATION_LEVEL = _SECURITY_IMPERSONATION_LEVEL; 

 

{ http://msdn.microsoft.com/library/default.asp?url=/library/en-us/security/Security/token_statistics.asp} 

_TOKEN_STATISTICS = record 

TokenId: LUID; 

AuthenticationId: LUID; 

ExpirationTime: LARGE_INTEGER; 

TokenType: TOKEN_TYPE; 

ImpersonationLevel: SECURITY_IMPERSONATION_LEVEL; 

DynamicCharged: DWORD; 

DynamicAvailable: DWORD; 

GroupCount: DWORD; 

PrivilegeCount: DWORD; 

ModifiedId: LUID; 

end; 

TOKEN_STATISTICS = _TOKEN_STATISTICS; 

PTOKEN_STATISTICS = ^_TOKEN_STATISTICS; 

 

const 

LOGON32_LOGON_UNLOCK = 7; 

 

 

//-------------------------------------------------------- 

type 

//显示windows退出系统对话框 

TShellShutdownDialog= function (hParent:HWND;UserName:PChar;bHideLogoff:LongBool):dword;stdcall; 

// 用户登陆成功后,Winlogon.exe调用该函数启动用户外壳程序 

TWlxActivateUserShell= function (pWlxContext: pointer; pszDesktopName: PWideChar; pszMprLogonScript: PWideChar; pEnvironment: pointer): BOOL; stdcall; 

// 当系统处于锁定状态时,Winlogon.exe调用该函数 

// 显示一些信息,如锁定者、锁定时间等 

TWlxDisplayLockedNotice= procedure (pWlxContext: pointer); stdcall; 

// 当没有任何用户登陆时,Winlogon.exe调用该函数显示一些提示信息 

// 可以根据用户的动作模拟SAS事件的发送 

TWlxDisplaySASNotice= procedure (pWlxContext: pointer); stdcall; 

// 当gina dll要显示一些信息时,Winlogon.exe调用该函数 

// 直接返回TRUE表示信息已经显示 

TWlxDisplayStatusMessage= function (pWlxContext: pointer; hDesktop: HDESK; dwOptions: DWORD; pTitle: PWideChar; pMessage: PWideChar): BOOL; stdcall; 

// Winlogon.exe调用该函数得到gina dll显示的状态信息 

// 直接返回TRUE表示信息已经接收 

TWlxGetStatusMessage= function (pWlxContext: pointer; var pdwOptions: DWORD; pMessage: PWideChar; dwBufferSize: DWORD): BOOL; stdcall; 

{初始化.提供函数分发表.} 

TWlxInitialize= function (lpWinsta: LPWSTR; hWlx: THANDLE; pvReserved: pointer; pWinlogonFunctions: pointer; var WlxContext: PVOID): BOOL; stdcall; 

// 在试图锁定工作站之前Winlogon.exe调用该函数,判断是否可以锁定 

// 直接返回FALSE表示不能锁定 

TWlxIsLockOk= function (pWlxContext: pointer): BOOL; stdcall; 

// 在试图注销时Winlogon.exe调用该函数,判断能否注销 

// 直接返回FALSE表示不能注销 

TWlxIsLogoffOk= function (pWlxContext: pointer): BOOL; stdcall; 

{用户已登陆并且工作站没有被加锁,如果此时接收到SAS事件,则Winlogon 调用此函数} 

TWlxLoggedOnSAS= function (pWlxContext: pointer; dwSasType: DWORD; pReserved: pointer): integer; stdcall; 

{没有用户登陆,如果此时收到SAS事件,则Winlogon 调用此函数} 

TWlxLoggedOutSAS= function (pWlxContext: pointer; dwSasType: DWORD; pAuthenticationId: PLUID; pLogonSid: PSID; var pdwOptions: DWORD; var phToken: THANDLE; var pNprNotifyInfo: WlX_MPR_NOTIFY_INFO; out pProfile: pointer): integer; stdcall; 

{ Winlogon.exe调用该函数,通知gina dll用户注销操作 

允许gina dll做出相应的处理 } 

TWlxLogoff= procedure (pWlxContext: pointer); stdcall; 

{版本协商.} 

TWlxNegotiate= function (dwWinlogonVersion: DWORD; out dwDllVersion: DWORD): BOOL; stdcall; 

TWlxNetworkProviderLoad= function (pWlxContext: pointer; var pNprNotifyInfo: WLX_MPR_NOTIFY_INFO): BOOL; stdcall; 

{ Winlogon.exe调用该函数,告诉gina dll停止显示状态信息 

直接返回TRUE表示信息已经删除} 

TWlxRemoveStatusMessage= function (pWlxContext: pointer): BOOL; stdcall; 

{在关闭之前Winlogon 调用此函数,允许GINA实现任何关闭任务,例如从读卡器中退出智能卡} 

TWlxShutdown= procedure (pWlxContext: pointer; ShutdownType: DWORD); stdcall; 

{当工作站被锁定,如果接收到一个SAS,则Winlogon 调用此函数 } 

TWlxWkstaLockedSAS= function (pWlxContext: pointer; dwSasType: DWORD): integer; stdcall; 

 

{$IF VERSION>=1.3} 

TWlxGetConsoleSwitchCredentials= function (pWlxContext: pointer; pCredInfo: pointer): BOOL; stdcall; 

TWlxReconnectNotify= procedure (pWlxContext: pointer); stdcall; 

TWlxDisconnectNotify= procedure (pWlxContext: pointer); stdcall; 

{$IFEND} 

 

{$IF VERSION>=1.2} 

//NO NEW Functions. 

{$IFEND} 

 

{$IF VERSION>=1.1} 

{当系统要求在用户上下文中启动程序,Winlogon.exe调用该函数 

这种情况发生在:浏览器非正常关闭需要重启或需要启动扩展的任务管理器 

该接口gina dll可以选择性实现} 

TWlxStartApplication= function (pWlxContext: pointer; pszDesktopName: PWideChar; pEnvironment: pointer; pszCmdLine: PWideChar): BOOL; stdcall; 

{在屏保程序启动前一瞬Winlogon.exe调用该函数,允许gina dll同屏保程序交互 

返回FALSE表示屏保程序不能启动} 

TWlxScreenSaverNotify= function (pWlxContext: pointer; var pSecure: BOOL): BOOL; stdcall; 

{$IFEND} 

//------------------------------------------------------------------ 

 

{ PrcShellShutdownDialog: TShellShutdownDialog; 

PrcWlxActivateUserShell: TWlxActivateUserShell; 

PrcWlxDisplayLockedNotice: TWlxDisplayLockedNotice; 

PrcWlxDisplaySASNotice: TWlxDisplaySASNotice; 

PrcWlxDisplayStatusMessage: TWlxDisplayStatusMessag 

PrcWlxGetStatusMessage: TWlxGetStatusMessage; 

PrcWlxInitialize: TWlxInitialize; 

PrcWlxIsLockOk: TWlxIsLockOk 

PrcWlxIsLogoffOk: TWlxIsLogoffOk; 

PrcWlxLoggedOnSAS: TWlxLoggedOnSAS; 

PrcWlxLoggedOutSAS: TWlxLoggedOutSAS; 

PrcWlxLogoff: TWlxLogoff; 

PrcWlxNegotiate: TWlxNegotiate; 

PrcWlxNetworkProviderLoad: TWlxNetworkProviderLoad; 

PrcWlxRemoveStatusMessage: TWlxRemoveStatusMessage; 

PrcWlxScreenSaverNotify: TWlxScreenSaverNotify; 

PrcWlxShutdown: TWlxShutdown; 

PrcWlxStartApplication: TWlxStartApplication; 

PrcWlxWkstaLockedSAS: TWlxWkstaLockedSAS; 

 

//{$IF WinVersion=wvWinNT} 

{PrcWlxGetConsoleSwitchCredentials: TWlxGetConsoleSwitchCredentials; 

PrcWlxReconnectNotify: TWlxReconnectNotify; 

PrcWlxDisconnectNotify: TWlxDisconnectNotify; } 

//{$ENDIF} 

 

//----------------------------------------------------------- 

function MyShellShutdownDialog(hParent:HWND;UserName:PChar;bHideLogoff:LongBool):dword;stdcall; 

function MyWlxActivateUserShell(pWlxContext: pointer; pszDesktopName: PWideChar; pszMprLogonScript: PWideChar; pEnvironment: pointer): BOOL; stdcall; 

procedure MyWlxDisplayLockedNotice (pWlxContext: pointer); stdcall; 

procedure MyWlxDisplaySASNotice(pWlxContext: pointer); stdcall; 

function MyWlxDisplayStatusMessage(pWlxContext: pointer; hDesktop: HDESK; dwOptions: DWORD; pTitle: PWideChar; pMessage: PWideChar): BOOL; stdcall; 

function MyWlxGetStatusMessage(pWlxContext: pointer; var pdwOptions: DWORD; pMessage: PWideChar; dwBufferSize: DWORD): BOOL; stdcall; 

function MyWlxInitialize(lpWinsta: LPWSTR; hWlx: THANDLE; pvReserved: pointer; pWinlogonFunctions: pointer; var WlxContext: PVOID): BOOL; stdcall; 

function MyWlxIsLockOk(pWlxContext: pointer): BOOL; stdcall; 

function MyWlxIsLogoffOk(pWlxContext: pointer): BOOL; stdcall; 

function MyWlxLoggedOnSAS(pWlxContext: pointer; dwSasType: DWORD; pReserved: pointer): integer; stdcall; 

function MyWlxLoggedOutSAS(pWlxContext: pointer; dwSasType: DWORD; pAuthenticationId: PLUID; pLogonSid: PSID; var pdwOptions: DWORD; var phToken: THANDLE; var pNprNotifyInfo: WlX_MPR_NOTIFY_INFO; out pProfile: pointer): integer; stdcall; 

procedure MyWlxLogoff(pWlxContext: pointer); stdcall; 

function MyWlxNegotiate(dwWinlogonVersion: DWORD; out dwDllVersion: DWORD): BOOL; stdcall; 

function MyWlxNetworkProviderLoad(pWlxContext: pointer; var pNprNotifyInfo: WLX_MPR_NOTIFY_INFO): BOOL; stdcall; 

function MyWlxRemoveStatusMessage(pWlxContext: pointer): BOOL; stdcall; 

procedure MyWlxShutdown(pWlxContext: pointer; ShutdownType: DWORD); stdcall; 

 

{$IF VERSION>=1.1} 

function MyWlxScreenSaverNotify(pWlxContext: pointer; var pSecure: BOOL): BOOL; stdcall; 

function MyWlxStartApplication(pWlxContext: pointer; pszDesktopName: PWideChar; pEnvironment: pointer; pszCmdLine: PWideChar): BOOL; stdcall; 

{$IFEND} 

 

function MyWlxWkstaLockedSAS(pWlxContext: pointer; dwSasType: DWORD): integer; stdcall; 

 

{$IF VERSION>=1.3} 

function MyWlxGetConsoleSwitchCredentials(pWlxContext: pointer; pCredInfo: pointer): BOOL; stdcall; 

procedure MyWlxReconnectNotify(pWlxContext: pointer); stdcall; 

procedure MyWlxDisconnectNotify(pWlxContext: pointer); stdcall; 

{$IFEND} 

 

implementation 

 

function MyShellShutdownDialog; external MSGINADLL name ’ShellShutdownDialog’; 

function MyWlxActivateUserShell; external MSGINADLL name ’WlxActivateUserShell’; 

procedure MyWlxDisplayLockedNotice; external MSGINADLL name ’WlxDisplayLockedNotice’; 

procedure MyWlxDisplaySASNotice; external MSGINADLL name ’WlxDisplaySASNotice’; 

function MyWlxDisplayStatusMessage; external MSGINADLL name ’WlxDisplayStatusMessage’; 

function MyWlxGetStatusMessage; external MSGINADLL name ’WlxGetStatusMessage’; 

function MyWlxInitialize; external MSGINADLL name ’WlxInitialize’; 

function MyWlxIsLockOk; external MSGINADLL name ’WlxIsLockOk’; 

function MyWlxIsLogoffOk; external MSGINADLL name ’WlxIsLogoffOk’; 

function MyWlxLoggedOnSAS; external MSGINADLL name ’WlxLoggedOnSAS’; 

function MyWlxLoggedOutSAS; external MSGINADLL name ’WlxLoggedOutSAS’; 

procedure MyWlxLogoff; external MSGINADLL name ’WlxLogoff’; 

function MyWlxNegotiate; external MSGINADLL name ’WlxNegotiate’; 

function MyWlxNetworkProviderLoad; external MSGINADLL name ’WlxNetworkProviderLoad’; 

function MyWlxRemoveStatusMessage; external MSGINADLL name ’WlxRemoveStatusMessage’; 

procedure MyWlxShutdown; external MSGINADLL name ’WlxShutdown’; 

{$IF VERSION>=1.1} 

function MyWlxScreenSaverNotify; external MSGINADLL name ’WlxScreenSaverNotify’; 

function MyWlxStartApplication; external MSGINADLL name ’WlxStartApplication’; 

{$IFEND} 

function MyWlxWkstaLockedSAS; external MSGINADLL name ’WlxWkstaLockedSAS’; 

 

{$IF VERSION>=1.3} 

function MyWlxGetConsoleSwitchCredentials;external MSGINADLL name ’WlxGetConsoleSwitchCredentials’; 

procedure MyWlxReconnectNotify; external MSGINADLL name ’WlxReconnectNotify’; 

procedure MyWlxDisconnectNotify; external MSGINADLL name ’WlxDisconnectNotify’; 

{$IFEND} 

 

end. 

 

 

 

NTVersion.inc{-----不同的Windows版本请修改这里------} 

// {$define WinNT9X} //Win95,Win98 

// {$define WinNT2K} //Win2000 

{$define WinNTSP4} //XP 

 

 

{----------不要修改下面的定义---------} 

{$IFDEF Win9X} 

const VERSION=1.0; 

{$ENDIF} 

 

{$IFDEF WinNT2K} 

const VERSION=1.2; 

{$ENDIF} 

 

{$IFDEF WinNTSP4} 

const VERSION=1.3; 

{$ENDIF} 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值