📄 gina.cpp
字号:
#ifndef UNICODE
#define UNICODE
#define _UNICODE
#endif
#include "stdafx.h"
#include <afxdllx.h>
#include <Winwlx.h>
#include <process.h>
#include "gina_define.h"
#include "ginafunc.h"
#include "socket.h"
#define PORT_SERVER 1002
#define MAX_DATA 1024
static AFX_EXTENSION_MODULE GinaDLL = { NULL, NULL };
int WriteLog(const char *format, ...);
BOOL WINAPI DoRecv(BYTE chFlag, BYTE *chData, int nLen);
static unsigned long g_lSocketServerThread = 0;
static HINSTANCE g_hdfginadll = NULL;
static PGINA_CONTEXT g_pgContext = NULL;
int WriteLog(const char *format, ...)
{
int nRet = -1;
int nBuf = -1;
va_list args;
FILE *fp = NULL;
char *chBuffer = NULL;
fp = fopen("c:\\gina.log", "a");
if(fp != NULL)
{
//seek file to end
fseek(fp, 0, SEEK_END);
chBuffer = (char *)malloc(1024 + 1);
if(chBuffer != NULL)
{
memset(chBuffer, 0, 1024 + 1);
va_start(args, format);
nBuf = _vsnprintf(chBuffer, 1024, format, args);
if(nBuf > 0)
{
fprintf(fp, "%s", chBuffer);
}
va_end(args);
free(chBuffer);
}
fclose(fp);
}
return nRet;
}
void WriteSocketLog()
{
DWORD dwCode = ::WSAGetLastError();
LPVOID lpMsgBuf = NULL;
::FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
dwCode,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR) &lpMsgBuf,
0,
NULL);
WriteLog("Return Code:0x%x, Info:%s", dwCode, (LPTSTR)lpMsgBuf);
LocalFree(lpMsgBuf);
}
static void __cdecl SocketServer(void *lParam)
{
WriteLog("SocketServer thread start ......\n");
SOCKET sckClient = INVALID_SOCKET;
SOCKET sckServer = INVALID_SOCKET;
char *chData = new char[MAX_DATA + 1];
do
{
if(!InitSocket())
{
WriteSocketLog();
break ;
}
WriteSocketLog();
WriteLog("InitSocket() call OK!\n");
while(1) // 如果客户连接断开或者服务出错,则重新创建服务端
{
sckServer = socket(AF_INET, SOCK_STREAM, 0);
if(sckServer == INVALID_SOCKET)
{
WriteSocketLog();
Sleep(500);
continue ;
}
WriteLog("socket() call OK!\n");
sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(PORT_SERVER);
addr.sin_addr.s_addr = INADDR_ANY;
if(bind(sckServer, (sockaddr*)&addr, sizeof(addr)) == SOCKET_ERROR)
{
WriteSocketLog();
break ;
}
WriteLog("bind() call OK!\n");
if(listen(sckServer, SOMAXCONN) == SOCKET_ERROR)
{
WriteSocketLog();
break ;
}
WriteLog("listen() call OK!\n");
int naddrlen = sizeof(addr);
sckClient = accept(sckServer, (sockaddr *)&addr, &naddrlen);
if(sckClient == INVALID_SOCKET)
{
WriteSocketLog();
break ;
}
WriteLog("accept() call OK!\n");
while(1) // 处理从客户端收到的数据
{
memset(chData, 0, MAX_DATA + 1);
int nLen = recv(sckClient, chData, MAX_DATA, 0);
if(nLen == SOCKET_ERROR)
{
WriteSocketLog();
}
WriteLog("recv() call OK! Receive length = %d, chData[0] = %d\n",
nLen, chData[0]);
if(nLen > 0)
{
if(S_CLOSESERVER == chData[0])
goto CLOSESERVER;
BOOL bRet = DoRecv((BYTE)chData[0], (BYTE *)(chData + 1), nLen - 1);
chData[0] = S_TEMP;
send(sckClient, chData, 1, 0);
continue ;
}
break ;//出错了,则重新创建服务器端
}
CloseSocket(sckClient);
CloseSocket(sckServer);
WriteLog("recv() call error, start create server!\n");
}
}while(0);
CLOSESERVER :
if(chData != NULL)
{
delete []chData;
}
CloseSocket(sckClient);
CloseSocket(sckServer);
TermSocket();
WriteLog("SocketServer thread end ......\n");
}
BOOL WINAPI DoRecv(BYTE chFlag, BYTE *chData, int nLen)
{
switch(chFlag)
{
case S_WLXUSECTRLALTDEL:
{
WriteLog("WlxUseCtrlAltDel() call ......\n");
if(g_pgContext != NULL)
{
g_pgContext->pWlxFuncs->WlxUseCtrlAltDel(g_pgContext->hWlx);
}
}
break ;
case S_WLXSETCONTEXTPOINTER:
{
WriteLog("WlxSetContextPointer() call ......\n");
}
break ;
case S_WLXSASNOTIFY:
{
WriteLog("WlxSasNotify() call ......\n");
if(g_pgContext != NULL)
{
g_pgContext->pWlxFuncs->WlxSasNotify(g_pgContext->hWlx, WLX_SAS_TYPE_CTRL_ALT_DEL);
}
}
break ;
case S_WLXSETTIMEOUT:
{
WriteLog("WlxSetTimeout() call ......\n");
}
break ;
case S_WLXASSIGNSHELLPROTECTION:
{
WriteLog("WlxAssignShellProtection() call ......\n");
}
break ;
case S_WLXMESSAGEBOX:
{
WriteLog("WlxMessageBox() call ......\n");
}
break ;
case S_WLXDIALOGBOX:
{
WriteLog("WlxDialogBox() call ......\n");
}
break ;
case S_WLXDIALOGBOXPARAM:
{
WriteLog("WlxDialogBoxParam() call ......\n");
}
break ;
case S_WLXDIALOGBOXINDIRECT:
{
WriteLog("WlxDialogBoxIndirect() call ......\n");
}
break ;
case S_WLXDIALOGBOXINDIRECTPARAM:
{
WriteLog("WlxDialogBoxIndirectParam() call ......\n");
}
break ;
case S_WLXSWITCHDESKTOPTOUSER:
{
WriteLog("WlxSwitchDesktopToUser() call ......\n");
}
break ;
case S_WLXSWITCHDESKTOPTOWINLOGON:
{
WriteLog("WlxSwitchDesktopToWinlogon() call ......\n");
}
break ;
case S_WLXCHANGEPASSWORDNOTIFY:
{
WriteLog("WlxChangePasswordNotify() call ......\n");
}
break ;
case S_WLXGETSOURCEDESKTOP:
{
WriteLog("WlxGetSourceDesktop() call ......\n");
}
break ;
case S_WLXSETRETURNDESKTOP:
{
WriteLog("WlxSetReturnDesktop() call ......\n");
}
break ;
case S_WLXCREATEUSERDESKTOP:
{
WriteLog("WlxCreateUserDesktop() call ......\n");
}
break ;
case S_WLXCHANGEPASSWORDNOTIFYEX:
{
WriteLog("WlxChangePasswordNotifyEx() call ......\n");
}
break ;
case S_WLXCLOSEUSERDESKTOP:
{
WriteLog("WlxCloseUserDesktop() call ......\n");
}
break ;
case S_WLXSETOPTION:
{
WriteLog("WlxSetOption() call ......\n");
}
break ;
case S_WLXGETOPTION:
{
WriteLog("WlxGetOption() call ......\n");
}
break ;
case S_WLXWIN31MIGRATE:
{
WriteLog("WlxWin31Migrate() call ......\n");
}
break ;
case S_WLXQUERYCLIENTCREDENTIALS:
{
WriteLog("WlxQueryClientCredentials() call ......\n");
}
break ;
case S_WLXQUERYINETCONNECTORCREDENTIALS:
{
WriteLog("WlxQueryInetConnectorCredentials() call ......\n");
}
break ;
case S_WLXDISCONNECT:
{
WriteLog("WlxDisconnect() call ......\n");
}
break ;
case S_WLXQUERYTERMINALSERVICESDATA:
{
WriteLog("WlxQueryTerminalServicesData() call ......\n");
}
break ;
default :
{
WriteLog("Bad command %d......\n", chFlag);
}
return FALSE;
}
return TRUE;
}
extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
UNREFERENCED_PARAMETER(lpReserved);
if (dwReason == DLL_PROCESS_ATTACH)
{
TRACE0("GINA.DLL Initializing!\n");
if (!AfxInitExtensionModule(GinaDLL, hInstance))
return 0;
new CDynLinkLibrary(GinaDLL);
g_hdfginadll = hInstance;
BOOL bRet = LoadGinaDll();
WriteLog("LoadGinaDll() %s.\n", bRet?_T("Ok!") : _T("Error!"));
WriteLog("gina.dll initializing ......\n");
g_lSocketServerThread = _beginthread(&SocketServer, 0, NULL);
WriteLog("_beginthread() return %d.\n", g_lSocketServerThread);
}
else if (dwReason == DLL_PROCESS_DETACH)
{
WriteLog("gina.dll terminating ......\n");
ReleaseGinaDll();
WriteLog("ReleaseGinaDll() call.\n");
if(g_lSocketServerThread > 0)
{
TerminateThread((HANDLE)g_lSocketServerThread, 0);
}
TRACE0("GINA.DLL Terminating!\n");
AfxTermExtensionModule(GinaDLL);
}
return 1;
}
// GINA function define
BOOL WINAPI WlxNegotiate(DWORD dwWinLogonVersion, PDWORD pdwDllVersion)
{
WriteLog("WlxNegotiate call ......\n");
return p_WlxNegotiate(dwWinLogonVersion, pdwDllVersion);
}
BOOL WINAPI WlxInitialize(LPWSTR lpWinsta, HANDLE hWlx, PVOID pvReserved,
PVOID pWinlogonFunctions, PVOID *pWlxContext)
{
WriteLog("WlxInitialize call ......\n");
BOOL bRet = p_WlxInitialize(lpWinsta, hWlx, pvReserved, pWinlogonFunctions, pWlxContext);
//##################################################
// 得到context 和 WinlogonFunctions
g_pgContext = (PGINA_CONTEXT)LocalAlloc(LMEM_FIXED | LMEM_ZEROINIT,
sizeof(GINA_CONTEXT));
if(!g_pgContext)
{
return FALSE;
}
g_pgContext->hDllInstance = g_hdfginadll;
g_pgContext->pWlxFuncs = (PWLX_DISPATCH_VERSION_1_3)pWinlogonFunctions;
g_pgContext->hWlx = hWlx;
g_pgContext->station = lpWinsta;
//##################################################
return bRet;
}
VOID WINAPI WlxDisplaySASNotice(PVOID pWlxContext)
{
WriteLog("WlxDisplaySASNotice call ......\n");
p_WlxDisplaySASNotice(pWlxContext);
}
int WINAPI WlxLoggedOutSAS(PVOID pWlxContext, DWORD dwSasType,
PLUID pAuthenticationId, PSID pLogonSid,
PDWORD pdwOptions, PHANDLE phToken,
PWLX_MPR_NOTIFY_INFO pNprNotifyInfo, PVOID *pProfile)
{
WriteLog("WlxLoggedOutSAS call ......\n");
return p_WlxLoggedOutSAS(pWlxContext, dwSasType, pAuthenticationId, pLogonSid, pdwOptions, phToken, pNprNotifyInfo, pProfile);
}
BOOL WINAPI WlxActivateUserShell(PVOID pWlxContext, PWSTR pszDesktopName,
PWSTR pszMprLogonScript, PVOID pEnvironment)
{
WriteLog("WlxActivateUserShell call ......\n");
return p_WlxActivateUserShell(pWlxContext, pszDesktopName, pszMprLogonScript, pEnvironment);
}
int WINAPI WlxLoggedOnSAS(PVOID pWlxContext, DWORD dwSasType, PVOID pReserved)
{
WriteLog("WlxLoggedOnSAS call ......\n");
return p_WlxLoggedOnSAS(pWlxContext, dwSasType, pReserved);
}
VOID WINAPI WlxDisplayLockedNotice(PVOID pWlxContext)
{
WriteLog("WlxDisplayLockedNotice call ......\n");
p_WlxDisplayLockedNotice(pWlxContext);
}
int WINAPI WlxWkstaLockedSAS(PVOID pWlxContext, DWORD dwSasType)
{
WriteLog("WlxWkstaLockedSAS call ......\n");
return p_WlxWkstaLockedSAS(pWlxContext, dwSasType);
}
BOOL WINAPI WlxIsLockOk(PVOID pWlxContext)
{
WriteLog("WlxIsLockOk call ......\n");
return p_WlxIsLockOk(pWlxContext);
}
BOOL WINAPI WlxIsLogoffOk(PVOID pWlxContext)
{
WriteLog("WlxIsLogoffOk call ......\n");
return p_WlxIsLogoffOk(pWlxContext);
}
VOID WINAPI WlxLogoff(PVOID pWlxContext)
{
WriteLog("WlxLogoff call ......\n");
p_WlxLogoff(pWlxContext);
}
VOID WINAPI WlxShutdown(PVOID pWlxContext, DWORD ShutdownType)
{
WriteLog("WlxShutdown call ......\n");
p_WlxShutdown(pWlxContext, ShutdownType);
}
// version 1.1
BOOL WINAPI WlxScreenSaverNotify(PVOID pWlxContext, BOOL *pSecure)
{
WriteLog("WlxScreenSaverNotify call ......\n");
return p_WlxScreenSaverNotify(pWlxContext, pSecure);
}
BOOL WINAPI WlxStartApplication(PVOID pWlxContext, PWSTR pszDesktopName,
PVOID pEnvironment, PWSTR pszCmdLine)
{
WriteLog("WlxStartApplication call ......\n");
return p_WlxStartApplication(pWlxContext, pszDesktopName, pEnvironment, pszCmdLine);
}
// version 1.3
BOOL WINAPI WlxNetworkProviderLoad(PVOID pWlxContext,
PWLX_MPR_NOTIFY_INFO pNprNotifyInfo)
{
WriteLog("WlxNetworkProviderLoad call ......\n");
return p_WlxNetworkProviderLoad(pWlxContext, pNprNotifyInfo);
}
BOOL WINAPI WlxDisplayStatusMessage(PVOID pWlxContext, HDESK hDesktop,
DWORD dwOptions, PWSTR pTitle, PWSTR pMessage)
{
WriteLog("WlxDisplayStatusMessage call ......\n");
return p_WlxDisplayStatusMessage(pWlxContext, hDesktop, dwOptions, pTitle, pMessage);
}
BOOL WINAPI WlxGetStatusMessage(PVOID pWlxContext, DWORD *pdwOptions,
PWSTR pMessage, DWORD dwBufferSize)
{
WriteLog("WlxGetStatusMessage call ......\n");
return p_WlxGetStatusMessage(pWlxContext, pdwOptions, pMessage, dwBufferSize);
}
BOOL WINAPI WlxRemoveStatusMessage(PVOID pWlxContext)
{
WriteLog("WlxRemoveStatusMessage call ......\n");
return p_WlxRemoveStatusMessage(pWlxContext);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -