要写一个Gina dll,感觉困难,有了ginastub的源码,也查阅了msdn文档,但是还是有点无从下手,有谁有写过gina,输出函数都是用自己的代码,不是象ginastub那样将msgina.dll简单的打包一下,全给

解决方案 »

  1.   

    首先介绍一下Winlogon。Windows 2000/NT有三种系统状态:没有用户登录状态、用户成功登录状态以及工作站锁定状态。Winlogon是Windows 2000/NT操作系统提供交互式登录支持的组件。Winlogon有三个组成部分:可执行文件winlogon.exe,提供图形界面认证功能的动态库Gina Dll,以及一些网络服务提供动态库Network Provider Dll。参考模型如下:(图略)
    winlogon.exe处理一些下层导出的接口函数,而认证策略是在Gina Dll中是独立设计的。在系统启动时,Gina Dll被winlogon.exe装载。Microsoft提供了一个默认的Gina Dll——Winnt\system32\msgina.dll,提供了标准的用户名、密码认证模式。Gina Dll是可替换的,用户可以设计自己的Gina Dll,以提供其他如智能卡、视网膜、指纹或其他一些认证机制。
    开发自定义的Gina Dll。必须实现并导出与winlogon.exe交互的18个标准函数接口:
    l BOOL WINAPI WlxNegotiate(DWORD dwWinLogonVersion, PDWORD pdwDllVersion)
    // Winlogon.exe调用的gina dll中的第一个函数
    // 使gina dll确认是否支持当前版本的Winlogon.exe
    // 传递给winlogon.exe需要那个版本的接口函数
    l BOOL WINAPI WlxInitialize(LPWSTR    lpWinsta,
      HANDLE    hWlx,
      PVOID     pvReserved,
      PVOID     pWinlogonFunctions,
      PVOID *   pWlxContext
      )
    // 初始化,winlogon.exe向gina dll传递需要版本的接口函数分配表
    l BOOL WINAPI WlxActivateUserShell(PVOID pWlxContext,
     PWSTR pszDesktopName,
     PWSTR pszMprLogonScript,
     PVOID pEnvironment)
    // 用户登陆成功后,Winlogon.exe调用该函数启动用户外壳程序
    l VOID WINAPI WlxDisplayLockedNotice(PVOID pWlxContext)
        // 当系统处于锁定状态时,Winlogon.exe调用该函数
    // 显示一些信息,如锁定者、锁定时间等
    l VOID WINAPI WlxDisplaySASNotice(PVOID pWlxContext)
    // 当没有任何用户登陆时,Winlogon.exe调用该函数显示一些提示信息
    // 可以根据用户的动作模拟SAS事件的发送
    l BOOL WINAPI WlxDisplayStatusMessage(PVOID pWlxContext,
    HDESK hDesktop,
    DWORD dwOptions,
    PWSTR pTitle,
    PWSTR pMessage)
          // 当gina dll要显示一些信息时,Winlogon.exe调用该函数
    // 直接返回TRUE表示信息已经显示
    l BOOL WINAPI WlxGetStatusMessage(PVOID pWlxContext,
    DWORD *pdwOptions,
    PWSTR pMessage,
    DWORD dwBufferSize)
    // Winlogon.exe调用该函数得到gina dll显示的状态信息
    // 直接返回TRUE表示信息已经接收
    l BOOL WINAPI WlxIsLockOk(PVOID pWlxContext)
    // 在试图锁定工作站之前Winlogon.exe调用该函数,判断是否可以锁定
    // 直接返回FALSE表示不能锁定
    l BOOL WINAPI WlxIsLogoffOk(PVOID pWlxContext)
    // 在试图注销时Winlogon.exe调用该函数,判断能否注销
    // 直接返回FALSE表示不能注销
    l int WINAPI WlxLoggedOnSAS(PVOID pWlxContext,
      DWORD dwSasType,
      PVOID pReserved)
    // 当系统处于登陆成功,没有锁定的状态下
    // Winlogon接收到SAS事件,于是调用该函数
    // 现屏蔽所有事件,直接返回
    l int WINAPI WlxLoggedOutSAS(PVOID                pWlxContext,
    DWORD                dwSasType,
    PLUID                pAuthenticationId,
    PSID                 pLogonSid,
    PDWORD               pdwOptions,
    PHANDLE              phToken,
    PWLX_MPR_NOTIFY_INFO   pMprNotifyInfo,
    PVOID *              pProfile)
    // 在没有任何一个用户登陆的情况下,Winlogon.exe接收到SAS事件调//用该函数
    l VOID WINAPI WlxLogoff(PVOID pWlxContext)
    // Winlogon.exe调用该函数,通知gina dll用户注销操作
    // 允许gina dll做出相应的处理
    l BOOL WINAPI WlxNetworkProviderLoad(PVOID pWlxContext,
    PWLX_MPR_NOTIFY_INFO pNprNotifyInfo)
    // Winlogon.exe调用该函数收集有效的认证信息
    // 返回TRUE表示用户被识别
    l BOOL WINAPI WlxRemoveStatusMessage(PVOID pWlxContext)
    // Winlogon.exe调用该函数,告诉gina dll停止显示状态信息
    // 直接返回TRUE表示信息已经删除
    l BOOL WINAPI WlxScreenSaverNotify(PVOID  pWlxContext, BOOL  *pSecure)
    // 在屏保程序启动前一瞬Winlogon.exe调用该函数,允许gina dll同屏
    //保程序交互
    // 返回FALSE表示屏保程序不能启动
    l VOID WINAPI WlxShutdown(PVOID pWlxContext, DWORD ShutdownType)
    // 在系统关闭之前,Winlogon.exe调用该函数
    // 允许gina dll处理一些系统关闭前的处理
    l BOOL WINAPI WlxStartApplication(PVOID pWlxContext,
    PWSTR pszDesktopName,
    PVOID pEnvironment,
    PWSTR pszCmdLine)
    // 当系统要求在用户上下文中启动程序,Winlogon.exe调用该函数
    // 这种情况发生在:浏览器非正常关闭需要重启或需要启动扩展的任务// 管理器
    // 该接口gina dll可以选择性实现
    l int WINAPI WlxWkstaLockedSAS(PVOID pWlxContext, DWORD dwSasType)
    // 在锁定状态下,Winlogon.exe接收到SAS事件调用该函数其中WlxNegotiate是winlogon.exe调用的第一个接口函数,进行必要的版本判断,随后调用的是WlxInitialize,主要完成winlogon.exe特定版本的函数分派表向Gina Dll的传递。最主要的是WlxLoggedOnSAS函数,这个函数主要的功能是,当winlogon在登录成功状态下,接收到SAS事件,于是调用这个函数进行SAS事件的识别以及进行各事件的相应处理。
    由于现在只需屏蔽按下Ctrl+Alt+Del时系统不再弹出“Widows安全”对话框。并不需要改变用户名、密码这种标准的认证模式,所以可以仍然使用msgina.dll中导出的函数接口,而对WlxLoggedOnSAS函数的实现进行必要的改变。
        int WINAPI WlxLoggedOnSAS(PVOID pWlxContext,
      DWORD dwSasType,
      PVOID pReserved)
    {
    if(bLock) //如果处于锁定状态,现屏蔽所有事件,直接返回
        return WLX_SAS_ACTION_NONE;  
    else
    return theApp.MyWlxLoggedOnSAS(pWlxContext, dwSasType, pReserved);
    //MyWlxLoggedOnSAS为默认gina dll(msgina dll)中的WlxLoggedOnSAS
    }
    自定义Gina Dll的使用。比如开发的Gina Dll文件名为MyGina.dll。将该文件放到以下路径:Winnt\system32。并修改注册表,如下:
    Key Name: \HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\ Winlogon 
    Value Name: GinaDLL
    Value Type: [REG_SZ]
    Value: MyGina.dll
    重新启动计算机MyGina.dll即投入使用。
      

  2.   

    打个比方,如果我要在Logged-on状态下按Ctrl+Alt+Del不显示gina本身的对话框而显示自己的对话框资源,并且为该对话框上的按钮加上消息处理函数,怎么改写WlxLoggedOnSAS亚