⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gina.cpp

📁 这是一本学习 window编程的很好的参考教材
💻 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 + -