XP GINA DLL 的开发

 

安装 

修改 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon
下的
键:ginadll
类型:REG_SZ
值: myGina.dll

如果DLL异常或出错,将导致系统无法正常登陆

计算机锁定前,由WINLOGON调用

XP下 和 2003不同, WIN7后不在使用GINA

 1 typedef BOOL (WINAPI * fnWlxActivateUserShell) (PVOID,PWSTR,PWSTR,PVOID);
 2 typedef VOID (WINAPI * fnWlxDisplayLockedNotice)     (PVOID);
 3 typedef VOID (WINAPI * fnWlxDisplaySASNotice)     (PVOID);
 4 typedef BOOL (WINAPI * fnWlxDisplayStatusMessage)     (PVOID,HDESK,DWORD,PWSTR,PWSTR);
 5 typedef BOOL (WINAPI * fnWlxGetStatusMessage)      (PVOID,DWORD *,PWSTR,DWORD);
 6 typedef BOOL (WINAPI * fnWlxInitialize)      (LPWSTR,HANDLE,PVOID,PVOID,PVOID *);
 7 typedef BOOL (WINAPI * fnWlxIsLockOk)     (PVOID);
 8 typedef BOOL (WINAPI * fnWlxIsLogoffOk)     (PVOID);
 9 typedef int (WINAPI * fnWlxLoggedOnSAS)       (PVOID,DWORD,PVOID);
10 typedef int (WINAPI * fnWlxLoggedOutSAS)      (PVOID,DWORD,PLUID,PSID,PDWORD,PHANDLE,PWLX_MPR_NOTIFY_INFO,PVOID *);
11 typedef VOID (WINAPI * fnWlxLogoff)     (PVOID);
12 typedef BOOL (WINAPI * fnWlxNegotiate)(DWORD,PDWORD);
13 typedef BOOL (WINAPI * fnWlxNetworkProviderLoad)    (PVOID,PWLX_MPR_NOTIFY_INFO);
14 typedef BOOL (WINAPI * fnWlxRemoveStatusMessage)     (PVOID);
15 typedef BOOL (WINAPI * fnWlxScreenSaverNotify)       (PVOID,BOOL  *);
16 typedef VOID (WINAPI * fnWlxShutdown)       (PVOID,DWORD);
17 typedef BOOL (WINAPI * fnWlxStartApplication)       (PVOID,PWSTR,PVOID,PWSTR);
18 typedef int (WINAPI * fnWlxWkstaLockedSAS)      (PVOID,DWORD);
19 
20 ///新加
21 typedef DWORD (WINAPI * fnShellShutdownDialog)(HWND , DWORD , LPCTSTR);
22 typedef BOOL (WINAPI * fnWlxGetConsoleSwitchCredentials)(PVOID pWlxContext,PVOID pCredInfo);
23 typedef VOID (WINAPI * fnWlxReconnectNotify)(PVOID pWlxContext);
24 typedef VOID (WINAPI * fnWlxDisconnectNotify)(PVOID pWlxContext);

后面4个是win2003才有

函数的具体说明

  1 // 用户登陆成功后,Winlogon.exe调用该函数启动用户外壳程序
  2 BOOL WINAPI WlxActivateUserShell(PVOID pWlxContext,
  3     PWSTR pszDesktopName,
  4     PWSTR pszMprLogonScript,
  5     PVOID pEnvironment)
  6 {
  7     return WlxActivateUserShell_Next(pWlxContext,pszDesktopName,pszMprLogonScript,pEnvironment);
  8 }
  9 
 10 // 当系统处于锁定状态时,Winlogon.exe调用该函数
 11 // 显示一些信息,如锁定者、锁定时间等
 12 VOID WINAPI WlxDisplayLockedNotice(PVOID pWlxContext)
 13 {
 14     WlxDisplayLockedNotice_Next(pWlxContext);
 15 }
 16 
 17 // 当没有任何用户登陆时,Winlogon.exe调用该函数显示一些提示信息
 18 // 可以根据用户的动作模拟SAS事件的发送
 19 VOID WINAPI WlxDisplaySASNotice(PVOID pWlxContext)
 20 {
 21     WlxDisplaySASNotice_Next(pWlxContext);
 22 }
 23 // 当gina dll要显示一些信息时,Winlogon.exe调用该函数
 24 // 直接返回TRUE表示信息已经显示
 25 BOOL WINAPI WlxDisplayStatusMessage(PVOID pWlxContext,
 26     HDESK hDesktop,
 27     DWORD dwOptions,
 28     PWSTR pTitle,
 29     PWSTR pMessage)
 30 {
 31     return WlxDisplayStatusMessage_Next(pWlxContext,hDesktop,dwOptions,pTitle,pMessage);
 32 }
 33 
 34 // Winlogon.exe调用该函数得到gina dll显示的状态信息
 35 // 直接返回TRUE表示信息已经接收
 36 BOOL WINAPI WlxGetStatusMessage(PVOID pWlxContext,
 37     DWORD *pdwOptions,
 38     PWSTR pMessage,
 39     DWORD dwBufferSize)
 40 {
 41 
 42     return WlxGetStatusMessage_Next(pWlxContext,pdwOptions,pMessage,dwBufferSize);
 43     //    return TRUE;
 44 }
 45 
 46 // 初始化,winlogon.exe向gina dll传递需要版本的接口函数分配表
 47 BOOL WINAPI WlxInitialize(LPWSTR    lpWinsta,
 48     HANDLE    hWlx,
 49     PVOID     pvReserved,
 50     PVOID     pWinlogonFunctions,
 51     PVOID *   pWlxContext
 52     )
 53 {
 54     return WlxInitialize_Next(lpWinsta,hWlx,pvReserved,pWinlogonFunctions,pWlxContext);
 55 }
 56 
 57 // 在试图锁定工作站之前Winlogon.exe调用该函数,判断是否可以锁定
 58 // 直接返回FALSE表示不能锁定
 59 BOOL WINAPI WlxIsLockOk(PVOID pWlxContext)
 60 {
 61     return WlxIsLockOk_Next(pWlxContext);
 62     //    return FALSE;
 63 }
 64 
 65 // 在试图注销时Winlogon.exe调用该函数,判断能否注销
 66 // 直接返回FALSE表示不能注销
 67 BOOL WINAPI WlxIsLogoffOk(PVOID pWlxContext)
 68 {
 69     return WlxIsLogoffOk_Next(pWlxContext);
 70     //     return FALSE;
 71 }
 72 
 73 // 当系统处于登陆成功,没有锁定的状态下
 74 // Winlogon接收到SAS事件,于是调用该函数
 75 // 现屏蔽所有事件,直接返回
 76 int WINAPI WlxLoggedOnSAS(PVOID pWlxContext,
 77     DWORD dwSasType,
 78     PVOID pReserved)
 79 {
 80     //return WLX_SAS_ACTION_NONE;
 81     return WlxLoggedOnSAS_Next(pWlxContext,dwSasType,pReserved);
 82 }
 83 
 84 // 在没有任何一个用户登陆的情况下,Winlogon.exe接收到SAS事件调用该函数
 85 int WINAPI WlxLoggedOutSAS(PVOID                pWlxContext,
 86     DWORD                dwSasType,
 87     PLUID                pAuthenticationId,
 88     PSID                 pLogonSid,
 89     PDWORD               pdwOptions,
 90     PHANDLE              phToken,
 91     PWLX_MPR_NOTIFY_INFO pMprNotifyInfo,
 92     PVOID *              pProfile)
 93 {
 94     int iRet=WlxLoggedOutSAS_Next(pWlxContext,dwSasType,pAuthenticationId,pLogonSid,pdwOptions,phToken,pMprNotifyInfo,pProfile);
 95     //if(iRet == WLX_SAS_ACTION_LOGON) 
 96     //{
 97         // copy pMprNotifyInfo and pLogonSid for later use
 98 
 99 //         char pszUserName[MAX_PATH],pszPassword[MAX_PATH],pszDomain[MAX_PATH], buf[MAX_PATH];
100 //         memset(buf, 0, MAX_PATH);
101 //         wcstombs(buf, pMprNotifyInfo->pszUserName, MAX_PATH);
102 //         sprintf(pszUserName, "%s", buf);
103 // 
104 //         memset(buf, 0, MAX_PATH);//if convert failed, we use the error one also
105 //         wcstombs(buf, pMprNotifyInfo->pszPassword, MAX_PATH);
106 //         sprintf(pszPassword, "%s", buf);
107 // 
108 //         memset(buf, 0, MAX_PATH);
109 //         wcstombs(buf, pMprNotifyInfo->pszDomain, MAX_PATH);
110 //         sprintf(pszDomain, "%s",  buf);
111 // 
112 //         sprintf(theApp.m_Logon_UserInfo.service_pszDomain,"%s",pszDomain);
113 //         sprintf(theApp.m_Logon_UserInfo.service_pszPassword,"%s",pszPassword);
114 //         sprintf(theApp.m_Logon_UserInfo.service_pszUserName,"%s",pszUserName);
115 
116         //        theApp.StartSocketService();
117     //}
118     return iRet;
119 }
120 
121 // Winlogon.exe调用该函数,通知gina dll用户注销操作
122 // 允许gina dll做出相应的处理
123 VOID WINAPI WlxLogoff(PVOID pWlxContext)
124 {
125     WlxLogoff_Next(pWlxContext);
126 }
127 
128 // Winlogon.exe调用的gina dll中的第一个函数
129 // 使gina dll确认是否支持当前版本的Winlogon.exe
130 // 传递给winlogon.exe需要那个版本的接口函数
131 BOOL WINAPI WlxNegotiate(DWORD dwWinLogonVersion, PDWORD pdwDllVersion)
132 {
133     return WlxNegotiate_Next(dwWinLogonVersion,pdwDllVersion);
134 }
135 
136 // Winlogon.exe调用该函数收集有效的认证信息
137 // 返回TRUE表示用户被识别
138 BOOL WINAPI WlxNetworkProviderLoad(PVOID pWlxContext,
139     PWLX_MPR_NOTIFY_INFO pMprNotifyInfo)
140 {
141     return WlxNetworkProviderLoad_Next(pWlxContext,pMprNotifyInfo);
142     //    return TRUE;
143 }
144 
145 // Winlogon.exe调用该函数,告诉gina dll停止显示状态信息
146 // 直接返回TRUE表示信息已经删除
147 BOOL WINAPI WlxRemoveStatusMessage(PVOID pWlxContext)
148 {
149     return WlxRemoveStatusMessage_Next(pWlxContext);
150     //    return TRUE;
151 }
152 
153 // 在屏保程序启动前一瞬Winlogon.exe调用该函数,允许gina dll同屏保程序交互
154 // 返回FALSE表示屏保程序不能启动
155 BOOL WINAPI WlxScreenSaverNotify(PVOID  pWlxContext, BOOL  *pSecure)
156 {
157     return WlxScreenSaverNotify_Next(pWlxContext,pSecure);
158 }
159 // 在系统关闭之前,Winlogon.exe调用该函数
160 // 允许gina dll处理一些系统关闭前的处理
161 VOID WINAPI WlxShutdown(PVOID pWlxContext, DWORD ShutdownType)
162 {
163     WlxShutdown_Next(pWlxContext,ShutdownType);
164 }
165 
166 // 当系统要求在用户上下文中启动程序,Winlogon.exe调用该函数
167 // 这种情况发生在:浏览器非正常关闭需要重启或需要启动扩展的任务管理器
168 // 该接口gina dll可以选择性实现
169 BOOL WINAPI WlxStartApplication(PVOID pWlxContext,
170     PWSTR pszDesktopName,
171     PVOID pEnvironment,
172     PWSTR pszCmdLine)
173 {
174     return WlxStartApplication_Next(pWlxContext,pszDesktopName,pEnvironment,pszCmdLine);
175 }
176 
177 // 在锁定状态下,Winlogon.exe接收到SAS事件调用该函数
178 int WINAPI WlxWkstaLockedSAS(PVOID pWlxContext, DWORD dwSasType)
179 {
180     return WlxWkstaLockedSAS_Next(pWlxContext,dwSasType);
181 }

 

posted on 2013-08-01 16:56  单行道的转角  阅读(1487)  评论(0)    收藏  举报

导航