15,466
社区成员
发帖
与我相关
我的任务
分享// HiddenConsole.h: interface for the CHiddenConsole class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_HIDDENCONSOLE_H__09908658_E7ED_4BAB_BF7A_8CC31FAEED10__INCLUDED_)
#define AFX_HIDDENCONSOLE_H__09908658_E7ED_4BAB_BF7A_8CC31FAEED10__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include <afxmt.h>
class CHiddenConsole
{
public:
CHiddenConsole();
virtual ~CHiddenConsole();
void Start();
BOOL _StartConsole();
protected:
HANDLE m_hConsoleIptRead;
HANDLE m_hConsoleIptWrite;
HANDLE m_hConsoleOptRead;
HANDLE m_hConsoleOptWrite;
CEvent m_eventBreak;
};
BOOL CreateConsolePipe(PHANDLE p_hRead, PHANDLE p_hWrite);
BOOL StartConsole();
UINT ThreadStartConsole(LPVOID lpParam);
#endif // !defined(AFX_HIDDENCONSOLE_H__09908658_E7ED_4BAB_BF7A_8CC31FAEED10__INCLUDED_)
/ HiddenConsole.cpp: implementation of the CHiddenConsole class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "HiddenConsole.h"
#include <string>
using namespace std;
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CHiddenConsole::CHiddenConsole()
{
CreateConsolePipe(&m_hConsoleIptRead, &m_hConsoleIptWrite);
CreateConsolePipe(&m_hConsoleOptRead, &m_hConsoleOptWrite);
// 在这里设断点,记录这几个成员变量的值。
}
CHiddenConsole::~CHiddenConsole()
{
m_eventBreak.SetEvent();
CloseHandle(m_hConsoleIptRead);
CloseHandle(m_hConsoleOptRead);
CloseHandle(m_hConsoleIptWrite);
CloseHandle(m_hConsoleOptWrite);
}
void CHiddenConsole::Start()
{
AfxBeginThread(ThreadStartConsole, this);
}
UINT ThreadStartConsole(LPVOID lpParam)
{
CHiddenConsole *p_hiddenConsole = (CHiddenConsole *)lpParam;
p_hiddenConsole->_StartConsole();
return 0;
}
BOOL CHiddenConsole::_StartConsole()
{
string strSysDir;
string strAppPathName;
string strParam;
strSysDir.resize(255);
GetSystemDirectory((char *)strSysDir.data(), strSysDir.size());
strSysDir.resize(strlen(strSysDir.c_str()));
strAppPathName = strSysDir + "\\diskpart.exe";
return LaunchAndWait(strAppPathName.c_str(), (LPSTR)strParam.c_str(), SW_HIDE,
m_hConsoleIptRead, m_hConsoleOptWrite, m_hConsoleOptWrite, m_eventBreak.m_hObject); // 在这里设断点,发现这几个成员变量的值都不对了,导致后面的操作得到错误结果。请问这是怎么一回事?在新的线程中,通过类指针还是不能访问类的所有成员变量吗?
}
BOOL CreateConsolePipe(PHANDLE p_hRead, PHANDLE p_hWrite)
{
SECURITY_ATTRIBUTES saSecurityAttributes;
CString cstrMsg;
BOOL bResult = TRUE;
saSecurityAttributes.nLength = sizeof(SECURITY_ATTRIBUTES);
saSecurityAttributes.lpSecurityDescriptor = NULL;
saSecurityAttributes.bInheritHandle = TRUE;
return CreatePipe(p_hRead, p_hWrite, &saSecurityAttributes, 0);
}