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

📄 mylpc.cpp

📁 《Windows应用程序捆绑核心编程》配套源码
💻 CPP
字号:
// MyLPC.cpp: 实现CMyLPC类.
//
#include "stdafx.h"
#include "MyLPC.h"

//---------------------------------------------------------------------------
CMyLPC::CMyLPC()
{
	g_hNtDLL = GetModuleHandle( "ntdll.dll" );
    if (g_hNtDLL==NULL)
        return;
	
    (FARPROC&) ZwConnectPort = 
		GetProcAddress(g_hNtDLL,"ZwConnectPort");

	(FARPROC&) RtlInitUnicodeString = 
		GetProcAddress(g_hNtDLL,"RtlInitUnicodeString");
	
	(FARPROC&) ZwCreatePort = 
		GetProcAddress(g_hNtDLL,"ZwCreatePort");
	
	(FARPROC&) ZwAcceptConnectPort =
		GetProcAddress(g_hNtDLL,"ZwAcceptConnectPort");
	
	(FARPROC&) ZwCompleteConnectPort = 
		GetProcAddress(g_hNtDLL,"ZwCompleteConnectPort");
	
	(FARPROC&) ZwReplyWaitReceivePort = 
		GetProcAddress(g_hNtDLL,"ZwReplyWaitReceivePort");
}

//---------------------------------------------------------------------------
CMyLPC::~CMyLPC()
{
	// 释放g_hNtDLL句柄.
    if(g_hNtDLL != NULL)
    {
        FreeLibrary(g_hNtDLL);
    }
	
	if(m_pThread){ 
		// 终止线程并释放线程句柄.
		if(TerminateThread(m_pThread->m_hThread,0))
		{
			if(m_pThread) 
				delete	m_pThread;
			m_pThread = NULL;
		}
	}
}

//---------------------------------------------------------------------------
int CMyLPC::LPCServer(CString strReply)
{
	m_strReply=strReply;
	m_pThread=AfxBeginThread(ServerReadProc, this); // 启动线程.
    return 0;
}

//---------------------------------------------------------------------------
UINT CMyLPC::ServerReadProc(LPVOID lpVoid)
{
	HANDLE PortHandle, AcceptPortHandle;
	LPCMESSAGE LpcMessage;
	LSA_OBJECT_ATTRIBUTES ObjectAttr;
	UNICODE_STRING uString;
	int rc;

    CMyLPC* Parent=(CMyLPC*)lpVoid;
	
	// 初始化对象属性结构.
	Parent->RtlInitUnicodeString(&uString, PORTNAME);

	memset(&ObjectAttr, 0, sizeof(ObjectAttr));
	ObjectAttr.Length = sizeof(ObjectAttr);
	ObjectAttr.ObjectName = &uString;

	// 创建命名端口. 
	rc = Parent->ZwCreatePort(&PortHandle, &ObjectAttr,0x100, 0x0, 0x00000);
	if (rc != 0) {
		TRACE("Error creating port, rc=%x\n", rc);
		return -1;
	}
	
	memset(&LpcMessage, 0, sizeof(LpcMessage));

	while (1) {
		// 在端口上等待消息.
		rc = Parent->ZwReplyWaitReceivePort(PortHandle,
			NULL, NULL, &LpcMessage);
		if (rc != 0) {
			TRACE("ZwReplyWaitReceivePort failed");
			return -1;
		}
		
		// 保存接收到的数据.
		Parent->m_strRequest=LpcMessage.MessageData;

		// 填写发送数据.
		strcpy(LpcMessage.MessageData,Parent->m_strReply);
		
		if(LpcMessage.MessageType==LPC_CONNECTION_REQUEST) 
		{
			// 获得连接请求.
			rc =Parent->ZwAcceptConnectPort(
				&AcceptPortHandle,
				NULL,
				&LpcMessage,
				TRUE, // 接受.
				NULL,
				NULL);

			if (rc != 0) {
				TRACE("ZwAcceptConnectPort failed, rc=%x\n", rc);
				return -1;
			}
			
	        rc = Parent->ZwCompleteConnectPort(AcceptPortHandle);
			if (rc != 0) {
				CloseHandle(AcceptPortHandle);
				TRACE("ZwCompleteConnectPort failed, rc=%x\n",rc);
				return -1;
			}
		}
	}
	
	return 0;
}

//---------------------------------------------------------------------------
int CMyLPC::LPCClient(CString strRequest)
{
	static int Param3;
	HANDLE PortHandle;
	char ConnectDataBuffer[MAX_MESSAGE_DATA];
	UNICODE_STRING uString;
	int rc;
	
	// 初始化对象属性结构.
	RtlInitUnicodeString(&uString, PORTNAME);

	m_strRequest=strRequest;
	strcpy(ConnectDataBuffer,m_strRequest);
	
	int Size=sizeof(ConnectDataBuffer);
	
	rc = ZwConnectPort(&PortHandle,	&uString,
		(PSECURITY_QUALITY_OF_SERVICE)&Param3,
		0, 0, 0, ConnectDataBuffer,(unsigned long*)&Size);
	
	if (rc != 0) {
		TRACE("Connect failed, rc=%x\n", rc);
		return -1;
	}
	
	TRACE("Connect success, PortHandle=%d\n", PortHandle);
	m_strReply=ConnectDataBuffer;
	CloseHandle(PortHandle);

	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -