本帖最后由 stlnkm 于 2010-08-22 00:29:15 编辑

解决方案 »

  1.   

    代码如下://msgina.cpp
    #include <windows.h>
    #include <winwlx.h>
    #include <tchar.h>#define _LNKMDEBUG#ifdef _LNKMDEBUG
    #define MSGBOXEX(Msg,Title) MessageBox(NULL,_T(#Msg),_T(#Title),MB_OK);
    #else
    #define MSGBOXEX(Msg,Title) 
    #endif#define MSGBOX(Msg) MSGBOXEX(Msg,Function)
    #define MSG(Msg) _T(#Msg)##_T("\r\n")typedef BOOL (WINAPI * PFWLXNEGOTIATE)(DWORD,PDWORD);
    typedef BOOL (WINAPI * PFWLXINITIALIZE)(LPWSTR,HANDLE,PVOID,PVOID,PVOID *);
    typedef void (WINAPI * PFWLXDISPLAYSASNOTICE)(PVOID);
    typedef int  (WINAPI * PFWLXLOGGEDOUTSAS)(PVOID,DWORD,PLUID,PSID,PDWORD,PHANDLE,PWLX_MPR_NOTIFY_INFO,PVOID *);
    typedef BOOL (WINAPI * PFWLXACTIVATEUSERSHELL)(PVOID,PWSTR,PWSTR,PVOID);
    typedef int  (WINAPI * PFWLXLOGGEDONSAS)(PVOID,DWORD,PVOID);
    typedef VOID (WINAPI * PFWLXDISPLAYLOCKEDNOTICE)(PVOID);
    typedef int  (WINAPI * PFWLXWKSTALOCKEDSAS)(PVOID,DWORD);
    typedef BOOL (WINAPI * PFWLXISLOCKOK)(PVOID);
    typedef BOOL (WINAPI * PFWLXISLOGOFFOK)(PVOID);
    typedef void (WINAPI * PFWLXLOGOFF)(PVOID);
    typedef void (WINAPI * PFWLXSHUTDOWN)(PVOID,DWORD);
    typedef BOOL (WINAPI * PFWLXSTARTAPPLICATION)(PVOID,PWSTR,PVOID,PWSTR);
    typedef BOOL (WINAPI * PFWLXSCREENSAVERNOTIFY)(PVOID,BOOL *);
    typedef BOOL (WINAPI * PFWLXNETWORKPROVIDERLOAD)(PVOID,PWLX_MPR_NOTIFY_INFO);
    typedef BOOL (WINAPI * PFWLXDISPLAYSTATUSMESSAGE)(PVOID,HDESK,DWORD,PWSTR,PWSTR);
    typedef BOOL (WINAPI * PFWLXGETSTATUSMESSAGE)(PVOID,DWORD *,PWSTR,DWORD);
    typedef BOOL (WINAPI * PFWLXREMOVESTATUSMESSAGE)(PVOID);
    typedef BOOL (WINAPI * PFWLXGETCONSOLESWITCHCREDENTIALS) (PVOID,PVOID);PFWLXNEGOTIATE pfnWlxNegotiate=NULL;
    PFWLXINITIALIZE pfnWlxInitialize=NULL;
    PFWLXACTIVATEUSERSHELL pfnWlxActivateUserShell=NULL;
    PFWLXDISPLAYLOCKEDNOTICE pfnWlxDisplayLockedNotice=NULL;
    PFWLXDISPLAYSASNOTICE pfnWlxDisplaySASNotice=NULL;
    PFWLXDISPLAYSTATUSMESSAGE pfnWlxDisplayStatusMessage=NULL;
    PFWLXGETCONSOLESWITCHCREDENTIALS pfnWlxGetConsoleSwitchCredentials=NULL;
    PFWLXGETSTATUSMESSAGE pfnWlxGetStatusMessage=NULL;
    PFWLXISLOCKOK pfnWlxIsLockOk=NULL;
    PFWLXISLOGOFFOK pfnWlxIsLogoffOk=NULL;
    PFWLXLOGGEDONSAS pfnWlxLoggedOnSAS=NULL;
    PFWLXLOGGEDOUTSAS pfnWlxLoggedOutSAS=NULL;
    PFWLXLOGOFF pfnWlxLogoff=NULL;
    PFWLXNETWORKPROVIDERLOAD pfnWlxNetworkProviderLoad=NULL;
    PFWLXREMOVESTATUSMESSAGE pfnWlxRemoveStatusMessage=NULL;
    PFWLXSCREENSAVERNOTIFY pfnWlxScreenSaverNotify=NULL;
    PFWLXSHUTDOWN pfnWlxShutdown=NULL;
    PFWLXSTARTAPPLICATION pfnWlxStartApplication=NULL;
    PFWLXWKSTALOCKEDSAS pfnWlxWkstaLockedSAS=NULL;//日志文件句柄
    HANDLE g_hLogFile=NULL;//写日志
    inline int WriteLog(TCHAR *pszMsg)
    {
    DWORD dwFileSizeHigh=0;
    DWORD dwFileSizeLow=0;
    dwFileSizeLow=::GetFileSize(g_hLogFile,&dwFileSizeHigh);
    ::SetFilePointer(g_hLogFile,dwFileSizeLow,PLONG(&dwFileSizeHigh),FILE_BEGIN);
    DWORD dwWriteBytes=0;
    ::WriteFile(g_hLogFile,pszMsg,_tcslen(pszMsg)*sizeof(TCHAR),&dwWriteBytes,NULL);
    return dwWriteBytes;
    }
    BOOL LoadOldGina()
    {
    HMODULE hOldGina=::LoadLibrary(_T("oldmsgina.dll"));
    if(!hOldGina)
    {
    WriteLog(MSG(LoadLibrary() Failed!));
    return FALSE;
    }

    pfnWlxNegotiate=(PFWLXNEGOTIATE)::GetProcAddress(hOldGina,"WlxNegotiate");
    pfnWlxInitialize=(PFWLXINITIALIZE)::GetProcAddress(hOldGina,"WlxInitialize");
    pfnWlxActivateUserShell=(PFWLXACTIVATEUSERSHELL)::GetProcAddress(hOldGina,"WlxActivateUserShell");
    pfnWlxDisplayLockedNotice=(PFWLXDISPLAYLOCKEDNOTICE)::GetProcAddress(hOldGina,"WlxDisplayLockedNotice");
    pfnWlxDisplaySASNotice=(PFWLXDISPLAYSASNOTICE)::GetProcAddress(hOldGina,"WlxDisplaySASNotice");
    pfnWlxDisplayStatusMessage=(PFWLXDISPLAYSTATUSMESSAGE)::GetProcAddress(hOldGina,"WlxDisplayStatusMessage");
    pfnWlxGetConsoleSwitchCredentials=(PFWLXGETCONSOLESWITCHCREDENTIALS)::GetProcAddress(hOldGina,"WlxGetConsoleSwitchCredentials");
    pfnWlxGetStatusMessage=(PFWLXGETSTATUSMESSAGE)::GetProcAddress(hOldGina,"WlxGetStatusMessage");
    pfnWlxIsLockOk=(PFWLXISLOCKOK)::GetProcAddress(hOldGina,"WlxIsLockOk");
    pfnWlxIsLogoffOk=(PFWLXISLOGOFFOK)::GetProcAddress(hOldGina,"WlxIsLogoffOk");
    pfnWlxLoggedOnSAS=(PFWLXLOGGEDONSAS)::GetProcAddress(hOldGina,"WlxLoggedOnSAS");
    pfnWlxLoggedOutSAS=(PFWLXLOGGEDOUTSAS)::GetProcAddress(hOldGina,"WlxLoggedOutSAS");
    pfnWlxLogoff=(PFWLXLOGOFF)::GetProcAddress(hOldGina,"WlxLogoff");
    pfnWlxNetworkProviderLoad=(PFWLXNETWORKPROVIDERLOAD)::GetProcAddress(hOldGina,"WlxNetworkProviderLoad");
    pfnWlxRemoveStatusMessage=(PFWLXREMOVESTATUSMESSAGE)::GetProcAddress(hOldGina,"WlxRemoveStatusMessage");
    pfnWlxScreenSaverNotify=(PFWLXSCREENSAVERNOTIFY)::GetProcAddress(hOldGina,"WlxScreenSaverNotify");
    pfnWlxShutdown=(PFWLXSHUTDOWN)::GetProcAddress(hOldGina,"WlxShutdown");
    pfnWlxStartApplication=(PFWLXSTARTAPPLICATION)::GetProcAddress(hOldGina,"WlxStartApplication");
    pfnWlxWkstaLockedSAS=(PFWLXWKSTALOCKEDSAS)::GetProcAddress(hOldGina,"WlxWkstaLockedSAS"); BOOL bRet=pfnWlxNegotiate && pfnWlxInitialize && pfnWlxActivateUserShell && pfnWlxDisplayLockedNotice && pfnWlxDisplaySASNotice &&
        pfnWlxDisplayStatusMessage && pfnWlxGetConsoleSwitchCredentials && pfnWlxGetStatusMessage && pfnWlxIsLockOk && pfnWlxIsLogoffOk &&
    pfnWlxLoggedOnSAS && pfnWlxLoggedOutSAS && pfnWlxLogoff && pfnWlxNetworkProviderLoad && pfnWlxRemoveStatusMessage &&
    pfnWlxScreenSaverNotify && pfnWlxShutdown && pfnWlxStartApplication && pfnWlxWkstaLockedSAS;
    return bRet;
    }
      

  2.   


    BOOL WINAPI WlxNegotiate(
      __in          DWORD dwWinLogonVersion,
      __out         PDWORD pdwDllVersion
    )
    {
    WriteLog(MSG(WlxNegotiate));
    MSGBOX(WlxNegotiate)
    if(!LoadOldGina())
    {
    WriteLog(MSG(LoadOldGina() Failed!));
    return FALSE;
    }
    return pfnWlxNegotiate(dwWinLogonVersion,pdwDllVersion);
    }BOOL WINAPI WlxInitialize(
      __in          LPWSTR lpWinsta,
      __in          HANDLE hWlx,
      PVOID pvReserved,
      __in          PVOID pWinlogonFunctions,
      __out         PVOID* pWlxContext
    )
    {
    WriteLog(MSG(WlxInitialize));
    MSGBOX(WlxInitialize)
    return pfnWlxInitialize(lpWinsta,hWlx,pvReserved,pWinlogonFunctions,pWlxContext);
    }BOOL WINAPI WlxActivateUserShell(
      __in  PVOID pWlxContext,
      __in  PWSTR pszDesktopName,
      __in  PWSTR pszMprLogonScript,
      __in  PVOID pEnvironment
    )
    {
    WriteLog(MSG(WlxActivateUserShell));
    MSGBOX(WlxActivateUserShell)
    return pfnWlxActivateUserShell(pWlxContext,pszDesktopName,pszMprLogonScript,pEnvironment);
    }VOID WINAPI WlxDisplayLockedNotice(
      __in          PVOID pWlxContext
    )
    {
    WriteLog(MSG(WlxDisplayLockedNotice));
    MSGBOX(WlxDisplayLockedNotice)
    pfnWlxDisplayLockedNotice(pWlxContext);
    }void WINAPI WlxDisplaySASNotice(
      __in          PVOID pWlxContext
    )
    {
    WriteLog(MSG(WlxDisplaySASNotice));
    MSGBOX(WlxDisplaySASNotice)
    pfnWlxDisplaySASNotice(pWlxContext);
    }BOOL WINAPI WlxDisplayStatusMessage(
      __in          PVOID pWlxContext,
      __in          HDESK hDesktop,
      __in          DWORD dwOptions,
      __in          PWSTR pTitle,
      __in          PWSTR pMessage
    )
    {
    WriteLog(MSG(WlxDisplayStatusMessage));
    MSGBOX(WlxDisplayStatusMessage)
    return pfnWlxDisplayStatusMessage(pWlxContext,hDesktop,dwOptions,pTitle,pMessage);
    }BOOL WINAPI WlxGetStatusMessage(
      __in          PVOID pWlxContext,
      __out         DWORD* pdwOptions,
      __out         PWSTR pMessage,
      __in          DWORD dwBufferSize
    )
    {
    WriteLog(MSG(WlxGetStatusMessage));
    MSGBOX(WlxGetStatusMessage)
    return pfnWlxGetStatusMessage(pWlxContext,pdwOptions,pMessage,dwBufferSize);
    }BOOL WINAPI WlxIsLockOk(
      __in          PVOID pWlxContext
    )
    {
    WriteLog(MSG(WlxIsLockOk));
    MSGBOX(WlxIsLockOk)
    return pfnWlxIsLockOk(pWlxContext);
    }BOOL WINAPI WlxIsLogoffOk(
      __in          PVOID pWlxContext
    )
    {
    WriteLog(MSG(WlxIsLogoffOk));
    MSGBOX(WlxIsLogoffOk)
    return pfnWlxIsLogoffOk(pWlxContext);
    }int WINAPI WlxLoggedOnSAS(
      __in          PVOID pWlxContext,
      __in          DWORD dwSasType,
      __in          PVOID pReserved
    )
    {
    WriteLog(MSG(WlxLoggedOnSAS));
    MSGBOX(WlxLoggedOnSAS)
    return pfnWlxLoggedOnSAS(pWlxContext,dwSasType,pReserved);
    }int WINAPI WlxLoggedOutSAS(
      __in          PVOID pWlxContext,
      __in          DWORD dwSasType,
      __out         PLUID pAuthenticationId,
      __in_out      PSID pLogonSid,
      __out         PDWORD pdwOptions,
      __out         PHANDLE phToken,
      __out         PWLX_MPR_NOTIFY_INFO pNprNotifyInfo,
      __out         PVOID* pProfile
    )
    {
    WriteLog(MSG(WlxLoggedOutSAS));
    MSGBOX(WlxLoggedOutSAS)
    return pfnWlxLoggedOutSAS(pWlxContext,dwSasType,pAuthenticationId,pLogonSid,pdwOptions,phToken,pNprNotifyInfo,pProfile);
    }void WINAPI WlxLogoff(
      __in          PVOID pWlxContext
    )
    {
    WriteLog(MSG(WlxLogoff));
    MSGBOX(WlxLogoff)
    pfnWlxLogoff(pWlxContext);
    }BOOL WINAPI WlxNetworkProviderLoad(
      __in          PVOID pWlxContext,
      __out         PWLX_MPR_NOTIFY_INFO pNprNotifyInfo
    )
    {
    WriteLog(MSG(WlxNetworkProviderLoad));
    MSGBOX(WlxNetworkProviderLoad)
    return pfnWlxNetworkProviderLoad(pWlxContext,pNprNotifyInfo);
    }BOOL WINAPI WlxRemoveStatusMessage(
      __in          PVOID pWlxContext
    )
    {
    WriteLog(MSG(WlxRemoveStatusMessage));
    MSGBOX(WlxRemoveStatusMessage)
    return pfnWlxRemoveStatusMessage(pWlxContext);
    }BOOL WINAPI WlxScreenSaverNotify(
      __in          PVOID pWlxContext,
      __in_out      BOOL* pSecure
    )
    {
    WriteLog(MSG(WlxScreenSaverNotify));
    MSGBOX(WlxScreenSaverNotify)
    return pfnWlxScreenSaverNotify(pWlxContext,pSecure);
    }void WINAPI WlxShutdown(
      __in          PVOID pWlxContext,
      __in          DWORD ShutdownType
    )
    {
    WriteLog(MSG(WlxShutdown));
    MSGBOX(WlxShutdown)
    pfnWlxShutdown(pWlxContext,ShutdownType);
    }BOOL WINAPI WlxStartApplication(
      __in          PVOID pWlxContext,
      __in          PWSTR pszDesktopName,
      __in          PVOID pEnvironment,
      __in          PWSTR pszCmdLine
    )
    {
    WriteLog(MSG(WlxStartApplication));
    MSGBOX(WlxStartApplication)
    return pfnWlxStartApplication(pWlxContext,pszDesktopName,pEnvironment,pszCmdLine);
    }int WINAPI WlxWkstaLockedSAS(
      __in          PVOID pWlxContext,
      __in          DWORD dwSasType
    )
    {
    WriteLog(MSG(WlxWkstaLockedSAS));
    MSGBOX(WlxWkstaLockedSAS)
    return pfnWlxWkstaLockedSAS(pWlxContext,dwSasType);
    }BOOL WINAPI WlxGetConsoleSwitchCredentials(
      __in   PVOID pWlxContext,
      __out  PVOID pInfo
    )
    {
    WriteLog(MSG(WlxGetConsoleSwitchCredentials));
    MSGBOX(WlxGetConsoleSwitchCredentials);
    return pfnWlxGetConsoleSwitchCredentials(pWlxContext,pInfo);
    }
    //dllmain.cpp
    const TCHAR szFileName[MAX_PATH]=_T("C:\\Gina.log");
    extern HANDLE g_hLogFile;BOOL APIENTRY DllMain( HMODULE hModule,
                           DWORD  ul_reason_for_call,
                           LPVOID lpReserved
     )
    {
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    g_hLogFile=::CreateFile(szFileName,FILE_WRITE_DATA,0,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
    break;
    case DLL_THREAD_ATTACH:
    break;
    case DLL_THREAD_DETACH:
    break;
    case DLL_PROCESS_DETACH:
    ::CloseHandle(g_hLogFile);
    g_hLogFile=NULL;
    break;
    }
    return TRUE;
    }//msgina.def文件LIBRARY msginaEXPORTS
    WlxNegotiate
    WlxInitialize
    WlxActivateUserShell
    WlxDisplayLockedNotice
    WlxDisplaySASNotice
    WlxDisplayStatusMessage
    WlxGetConsoleSwitchCredentials
    WlxGetStatusMessage
    WlxIsLockOk
    WlxIsLogoffOk
    WlxLoggedOnSAS
    WlxLoggedOutSAS
    WlxLogoff
    WlxNetworkProviderLoad
    WlxRemoveStatusMessage
    WlxScreenSaverNotify
    WlxShutdown
    WlxStartApplication
    WlxWkstaLockedSAS