?? mylpc.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 + -