
| Key Name: \HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\ Winlogon Value Name: GinaDLL Value Type: [REG_SZ] Value: MyGina.dll |
| // //////////////////////////////////////////MyGina.h : main header file for the MYGINA DLL #if !defined(AFX_MYGINA_H__5959C4FD_1D31_4E51_B3CD_B5649C8473B7__INCLUDED_) #define AFX_MYGINA_H__5959C4FD_1D31_4E51_B3CD_B5649C8473B7__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #ifndef __AFXWIN_H__ #error include ‘stdafx.h‘ before including this file for PCH #endif #include "resource.h" // main symbols //定義的函數類(lèi)型; typedef (WINAPI * NEGOTIATE) (DWORD,PDWORD); typedef (WINAPI * INITIALIZE) (LPWSTR,HANDLE,PVOID,PVOID,PVOID *); typedef (WINAPI * ACTIVATE_USHELL) (PVOID,PWSTR,PWSTR,PVOID); typedef (WINAPI * PARAM_PVOID) (PVOID); typedef (WINAPI * DISP_STATUS) (PVOID,HDESK,DWORD,PWSTR,PWSTR); typedef (WINAPI * GET_STATUS) (PVOID,DWORD *,PWSTR,DWORD); typedef (WINAPI * LOGON_SAS) (PVOID,DWORD,PVOID); typedef (WINAPI * LOGOUT_SAS) (PVOID,DWORD,PLUID,PSID,PDWORD, PHANDLE,PWLX_MPR_NOTIFY_INFO,PVOID *); typedef (WINAPI * NETWORK_LOAD) (PVOID,PWLX_MPR_NOTIFY_INFO); typedef (WINAPI * SCR_SAVER) (PVOID,BOOL *); typedef (WINAPI * SHUT_DOWN) (PVOID,DWORD); typedef (WINAPI * START_APP) (PVOID,PWSTR,PVOID,PWSTR); typedef (WINAPI * LOCKED_SAS) (PVOID,DWORD); class CMyGinaApp : public CWinApp { private: HMODULE hMsDll; public: NEGOTIATE MyWlxNegotiate; INITIALIZE MyWlxInitialize; ACTIVATE_USHELL MyWlxActivateUserShell; PARAM_PVOID MyWlxDisplayLockedNotice; PARAM_PVOID MyWlxDisplaySASNotice; DISP_STATUS MyWlxDisplayStatusMessage; GET_STATUS MyWlxGetStatusMessage; PARAM_PVOID MyWlxIsLockOk; PARAM_PVOID MyWlxIsLogoffOk; LOGON_SAS MyWlxLoggedOnSAS; LOGOUT_SAS MyWlxLoggedOutSAS; PARAM_PVOID MyWlxLogoff; NETWORK_LOAD MyWlxNetworkProviderLoad; PARAM_PVOID MyWlxRemoveStatusMessage; SCR_SAVER MyWlxScreenSaverNotify; SHUT_DOWN MyWlxShutdown; START_APP MyWlxStartApplication; LOCKED_SAS MyWlxWkstaLockedSAS; public: CMyGinaApp(); // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CMyGinaApp) public: virtual BOOL InitInstance(); virtual int ExitInstance(); //}}AFX_VIRTUAL //{{AFX_MSG(CMyGinaApp) // NOTE - the ClassWizard will add and remove member functions here. // DO NOT EDIT what you see in these blocks of generated code ! //}}AFX_MSG DECLARE_MESSAGE_MAP() }; extern CMyGinaApp theApp; #endif ////////////////// #include "stdafx.h" #include "MyGina.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif /////////////////////////////////////////////////////////////////////////////// CMyGinaApp BEGIN_MESSAGE_MAP(CMyGinaApp, CWinApp) //{{AFX_MSG_MAP(CMyGinaApp) // NOTE - the ClassWizard will add and remove mapping macros here. // DO NOT EDIT what you see in these blocks of generated code! //}}AFX_MSG_MAP END_MESSAGE_MAP() ////////////////////////////////////////////// CMyGinaApp construction CMyGinaApp::CMyGinaApp() { // 初始化各變量 hMsDll = NULL; MyWlxNegotiate = NULL; MyWlxInitialize = NULL; MyWlxActivateUserShell = NULL; MyWlxDisplayLockedNotice = NULL; MyWlxDisplaySASNotice = NULL; MyWlxDisplayStatusMessage = NULL; MyWlxGetStatusMessage = NULL; MyWlxIsLockOk = NULL; MyWlxIsLogoffOk = NULL; MyWlxLoggedOnSAS = NULL; MyWlxLoggedOutSAS = NULL; MyWlxLogoff = NULL; MyWlxNetworkProviderLoad = NULL; MyWlxRemoveStatusMessage = NULL; MyWlxScreenSaverNotify = NULL; MyWlxShutdown = NULL; MyWlxStartApplication = NULL; MyWlxWkstaLockedSAS = NULL; } CMyGinaApp theApp; BOOL CMyGinaApp::InitInstance() { // 得到默認的gina dll if (hMsDll == NULL) { hMsDll = ::LoadLibrary("msgina.dll"); } // 導入各個(gè)接口函數 if (hMsDll != NULL) { MyWlxNegotiate= (NEGOTIATE) GetProcAddress(hMsDll,"WlxNegotiate"); MyWlxInitialize= (INITIALIZE) GetProcAddress(hMsDll,"WlxInitialize"); MyWlxActivateUserShell= (ACTIVATE_USHELL)GetProcAddress(hMsDll,"WlxActivateUserShell"); MyWlxDisplayLockedNotice= (PARAM_PVOID)GetProcAddress(hMsDll,"WlxDisplayLockedNotice"); MyWlxDisplaySASNotice= (PARAM_PVOID)GetProcAddress(hMsDll,"WlxDisplaySASNotice"); MyWlxDisplayStatusMessage= (DISP_STATUS)GetProcAddress(hMsDll,"WlxDisplayStatusMessage"); MyWlxGetStatusMessage= (GET_STATUS)GetProcAddress(hMsDll,"WlxGetStatusMessage"); MyWlxIsLockOk= (PARAM_PVOID)GetProcAddress(hMsDll,"WlxIsLockOk"); MyWlxIsLogoffOk= (PARAM_PVOID)GetProcAddress(hMsDll,"WlxIsLogoffOk"); MyWlxLoggedOnSAS= (LOGON_SAS)GetProcAddress(hMsDll,"WlxLoggedOnSAS"); MyWlxLoggedOutSAS= (LOGOUT_SAS)GetProcAddress(hMsDll,"WlxLoggedOutSAS"); MyWlxLogoff= (PARAM_PVOID) GetProcAddress(hMsDll,"WlxLogoff"); MyWlxNetworkProviderLoad= (NETWORK_LOAD)GetProcAddress(hMsDll,"WlxNetworkProviderLoad"); MyWlxRemoveStatusMessage= (PARAM_PVOID)GetProcAddress(hMsDll,"WlxRemoveStatusMessage"); MyWlxScreenSaverNotify= (SCR_SAVER)GetProcAddress(hMsDll,"WlxScreenSaverNotify"); MyWlxShutdown= (SHUT_DOWN)GetProcAddress(hMsDll,"WlxShutdown"); MyWlxStartApplication= (START_APP)GetProcAddress(hMsDll,"WlxStartApplication"); MyWlxWkstaLockedSAS= (LOCKED_SAS)GetProcAddress(hMsDll,"WlxWkstaLockedSAS"); } return CWinApp::InitInstance(); } int CMyGinaApp::ExitInstance() { if (hMsDll != NULL) { ::FreeLibrary(hMsDll);//卸載動(dòng)態(tài)鏈接庫; hMsDll = NULL; } return CWinApp::ExitInstance(); } ////////////////////////////////////////////消息處理函數的實(shí)現; #include "StdAfx.h" #include "MyGina.h" // Winlogon.exe調用的gina dll中的第一個(gè)函數 // 使gina dll確認是否支持當前版本的Winlogon.exe // 傳遞給winlogon.exe需要那個(gè)版本的接口函數 BOOL WINAPI WlxNegotiate(DWORD dwWinLogonVersion, PDWORD pdwDllVersion) { return theApp.MyWlxNegotiate(dwWinLogonVersion,pdwDllVersion); } // 初始化,winlogon.exe向gina dll傳遞需要版本的接口函數分配表 BOOL WINAPI WlxInitialize(LPWSTR lpWinsta,HANDLE hWlx,PVOID pvReserved,PVOID pWinlogonFunctions,PVOID * pWlxContext) { return theApp.MyWlxInitialize(lpWinsta,hWlx,pvReserved,pWinlogonFunctions,pWlxContext); } // 用戶(hù)登陸成功后,Winlogon.exe調用該函數啟動(dòng)用戶(hù)外殼程序 BOOL WINAPI WlxActivateUserShell(PVOID pWlxContext,PWSTR pszDesktopName,PWSTR pszMprLogonScript,PVOID pEnvironment) { return theApp.MyWlxActivateUserShell(pWlxContext,pszDesktopName,pszMprLogonScript,pEnvironment); } // 當系統處于鎖定狀態(tài)時(shí),Winlogon.exe調用該函數 // 顯示一些信息,如鎖定者、鎖定時(shí)間等 VOID WINAPI WlxDisplayLockedNotice(PVOID pWlxContext) { theApp.MyWlxDisplayLockedNotice(pWlxContext); } // 當沒(méi)有任何用戶(hù)登陸時(shí),Winlogon.exe調用該函數顯示一些提示信息 // 可以根據用戶(hù)的動(dòng)作模擬SAS事件的發(fā)送 VOID WINAPI WlxDisplaySASNotice(PVOID pWlxContext) { theApp.MyWlxDisplaySASNotice(pWlxContext); } // 當gina dll要顯示一些信息時(shí),Winlogon.exe調用該函數 // 直接返回TRUE表示信息已經(jīng)顯示 BOOL WINAPI WlxDisplayStatusMessage(PVOID pWlxContext, HDESK hDesktop, DWORD dwOptions, PWSTR pTitle, PWSTR pMessage) { return theApp.MyWlxDisplayStatusMessage(pWlxContext,hDesktop,dwOptions,pTitle,pMessage); // return TRUE; } // Winlogon.exe調用該函數得到gina dll顯示的狀態(tài)信息 // 直接返回TRUE表示信息已經(jīng)接收 BOOL WINAPI WlxGetStatusMessage(PVOID pWlxContext, DWORD *pdwOptions, PWSTR pMessage, DWORD dwBufferSize) { return theApp.MyWlxGetStatusMessage(pWlxContext,pdwOptions,pMessage,dwBufferSize); // return TRUE; } // 在試圖鎖定工作站之前Winlogon.exe調用該函數,判斷是否可以鎖定 // 直接返回FALSE表示不能鎖定 BOOL WINAPI WlxIsLockOk(PVOID pWlxContext) { return theApp.MyWlxIsLockOk(pWlxContext); // return FALSE; } // 在試圖注銷(xiāo)時(shí)Winlogon.exe調用該函數,判斷能否注銷(xiāo) // 直接返回FALSE表示不能注銷(xiāo) BOOL WINAPI WlxIsLogoffOk(PVOID pWlxContext) { return theApp.MyWlxIsLogoffOk(pWlxContext); // return FALSE; } // 當系統處于登陸成功,沒(méi)有鎖定的狀態(tài)下 // Winlogon接收到SAS事件,于是調用該函數 // 現屏蔽所有事件,直接返回 int WINAPI WlxLoggedOnSAS(PVOID pWlxContext, DWORD dwSasType, PVOID pReserved) { return WLX_SAS_ACTION_NONE; } // 在沒(méi)有任何一個(gè)用戶(hù)登陸的情況下,Winlogon.exe接收到SAS事件調用該函數 int WINAPI WlxLoggedOutSAS(PVOID pWlxContext, DWORD dwSasType, PLUID pAuthenticationId, PSID pLogonSid, PDWORD pdwOptions, PHANDLE phToken, PWLX_MPR_NOTIFY_INFO pMprNotifyInfo, PVOID * pProfile) { return theApp.MyWlxLoggedOutSAS(pWlxContext,dwSasType,pAuthenticationId, pLogonSid,pdwOptions,phToken,pMprNotifyInfo,pProfile); } // Winlogon.exe調用該函數,通知gina dll用戶(hù)注銷(xiāo)操作 // 允許gina dll做出相應的處理 VOID WINAPI WlxLogoff(PVOID pWlxContext) { theApp.MyWlxLogoff(pWlxContext); } // Winlogon.exe調用該函數收集有效的認證信息 // 返回TRUE表示用戶(hù)被識別 BOOL WINAPI WlxNetworkProviderLoad(PVOID pWlxContext, PWLX_MPR_NOTIFY_INFO pNprNotifyInfo) { return theApp.MyWlxNetworkProviderLoad(pWlxContext,pNprNotifyInfo); // return TRUE; } // Winlogon.exe調用該函數,告訴gina dll停止顯示狀態(tài)信息 // 直接返回TRUE表示信息已經(jīng)刪除 BOOL WINAPI WlxRemoveStatusMessage(PVOID pWlxContext) { return theApp.MyWlxRemoveStatusMessage(pWlxContext); // return TRUE; } // 在屏保程序啟動(dòng)前一瞬Winlogon.exe調用該函數,允許gina dll同屏保程序交互 // 返回FALSE表示屏保程序不能啟動(dòng) BOOL WINAPI WlxScreenSaverNotify(PVOID pWlxContext, BOOL *pSecure) { return theApp.MyWlxScreenSaverNotify(pWlxContext,pSecure); } // 在系統關(guān)閉之前,Winlogon.exe調用該函數 // 允許gina dll處理一些系統關(guān)閉前的處理 VOID WINAPI WlxShutdown(PVOID pWlxContext, DWORD ShutdownType) { theApp.MyWlxShutdown(pWlxContext,ShutdownType); } // 當系統要求在用戶(hù)上下文中啟動(dòng)程序,Winlogon.exe調用該函數 // 這種情況發(fā)生在:瀏覽器非正常關(guān)閉需要重啟或需要啟動(dòng)擴展的任務(wù)管理器 // 該接口gina dll可以選擇性實(shí)現 BOOL WINAPI WlxStartApplication(PVOID pWlxContext,PWSTR pszDesktopName,PVOID pEnvironment,PWSTR pszCmdLine) { return theApp.MyWlxStartApplication(pWlxContext,pszDesktopName,pEnvironment,pszCmdLine); } // 在鎖定狀態(tài)下,Winlogon.exe接收到SAS事件調用該函數 int WINAPI WlxWkstaLockedSAS(PVOID pWlxContext, DWORD dwSasType) { return theApp.MyWlxWkstaLockedSAS(pWlxContext,dwSasType); } |
聯(lián)系客服