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 }
浙公网安备 33010602011771号