 Here is my Code Main Program
I pasted the Child Process but it didn't seem to take so I am going to post it again
in the next post
Thanks for your help
return_code = CreateProcess((LPCSTR) &herc_command[0], (LPCSTR) &herc_parm[0], (LPCSTR) &sa,
NULL,
TRUE,
(DWORD) DEBUG_ONLY_THIS_PROCESS,
NULL,
NULL,
&si,
&pi);
if (return_code == 0 )
errcd = GetLastError();
bContinueDebugging = 1;
dwContinueStatus = DBG_CONTINUE;
while(bContinueDebugging)
{
if (!WaitForDebugEvent(&debug_event, INFINITE))
return;
switch(debug_event.dwDebugEventCode)
{
case CREATE_PROCESS_DEBUG_EVENT:
{
file_name = GetFileNameFromHandle(debug_event.u.CreateProcessInfo.hFile);
}
break;
case CREATE_THREAD_DEBUG_EVENT:
break;
case EXIT_THREAD_DEBUG_EVENT:
break;
case EXIT_PROCESS_DEBUG_EVENT:
bContinueDebugging=0;
break;
case LOAD_DLL_DEBUG_EVENT:
{
file_name = GetFileNameFromHandle(debug_event.u.LoadDll.hFile);
}
break;
case UNLOAD_DLL_DEBUG_EVENT:
break;
case OUTPUT_DEBUG_STRING_EVENT:
{
(void *) msg = malloc (debug_event.u.DebugString.nDebugStringLength);
ReadProcessMemory(pi.hProcess, debug_event.u.DebugString.lpDebugStringData, msg, debug_event.u.DebugString.nDebugStringLength, NULL);
}
break;
case EXCEPTION_DEBUG_EVENT:
{
EXCEPTION_DEBUG_INFO exception = debug_event.u.Exception;
switch( exception.ExceptionRecord.ExceptionCode)
{
case STATUS_DLL_NOT_FOUND:
i = 1;
break;
case STATUS_ACCESS_VIOLATION:
i = 2;
case STATUS_BREAKPOINT:
i = 3;
case STATUS_STACK_BUFFER_OVERRUN:
i = 4;
case STATUS_PRIVILEGED_INSTRUCTION:
i = 5;
case STATUS_INVALID_HANDLE:
i = 6;
case EXCEPTION_FLT_INEXACT_RESULT:
i = 7;
case EXCEPTION_FLT_INVALID_OPERATION:
i = 8;
case EXCEPTION_FLT_OVERFLOW:
i = 9;
case EXCEPTION_FLT_STACK_CHECK:
i = 10;
case EXCEPTION_FLT_UNDERFLOW:
i = 11;
case EXCEPTION_ILLEGAL_INSTRUCTION:
i = 12;
case EXCEPTION_IN_PAGE_ERROR:
i = 13;
case EXCEPTION_INT_DIVIDE_BY_ZERO:
i = 15;
case EXCEPTION_INT_OVERFLOW:
i = 16;
case EXCEPTION_INVALID_DISPOSITION:
i = 17;
case EXCEPTION_NONCONTINUABLE_EXCEPTION:
i = 18;
case EXCEPTION_SINGLE_STEP:
i = 20;
case EXCEPTION_STACK_OVERFLOW:
i = 21;
default:
if(exception.dwFirstChance == 1)
{
}
dwContinueStatus = DBG_EXCEPTION_NOT_HANDLED;
}
break;
}
}
ContinueDebugEvent(debug_event.dwProcessId,
debug_event.dwThreadId,
dwContinueStatus);
dwContinueStatus = DBG_CONTINUE;
}
}
Here is the child process
#include "stdafx.h"
#include "afxsock.h"
#include "Tlhelp32.h"
#include "afxmt.h"
#include "HERC_CMD.h"
#include "mainfrm.h"
#include "resource.h"
#include "Windows.h"
#include "MyBaseEvent.h"
#include "Show_storage.h"
#include "afx.h"
class SockCLeintThread;
#define WM_HERCGUI_MESS (WM_USER + 3)
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
INT i;
HANDLE snap_shot;
PROCESSENTRY32 process32;
BOOL return_cde;
DWORD pid;
DWORD herc_process;
#pragma optimize("",off)
LPCWSTR pipe_name = (LPCWSTR) TEXT("\\\\.\\pipe\\HercPipe");
DWORD errcd;
HANDLE myevent_read, myevent_write;
HANDLE herc_object;
UINT hercgui_commands(LPVOID lparam);
LPVOID lparam;
HANDLE mymutex;
HANDLE thread_handle, herc_thread;
#ifdef _DEBUG
CMemoryState msOld, msnew, diffMemState;
#endif
char buffer[105];
BEGIN_MESSAGE_MAP(CHERC_CMDApp, CWinApp)
END_MESSAGE_MAP()
CHERC_CMDApp theApp;
CHERC_CMDApp::CHERC_CMDApp()
{
__debugbreak();
}
BOOL CHERC_CMDApp::InitInstance()
{
void SetThreadName( DWORD dwThreadID, LPCSTR szThreadName);
static char *thread[] = {"one", "two", "three", "four"};
static AFX_DATA const CRect rectDefaut;
static AFX_DATA const CRect rectDefault;
INITCOMMONCONTROLSEX InitCtrls;
InitCtrls.dwSize = sizeof(InitCtrls);
InitCtrls.dwICC = ICC_WIN95_CLASSES;
InitCommonControlsEx(&InitCtrls);
CWinApp::InitInstance();
if (!AfxOleInit())
{
AfxMessageBox(IDP_OLE_INIT_FAILED);
return FALSE;
}
SetRegistryKey(_T("HERCCMD Hercules GUI interface"));
LoadStdProfileSettings(4); WNDCLASS wcex;
FARPROC hercgui;
LPTSTR command_line = GetCommandLine();
strncpy ((char *) &hercgui,(const char *) command_line,8);
wcex.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hIcon = LoadIcon(IDR_MAINFRAME);
wcex.hCursor = LoadCursor(IDC_ARROW);
wcex.hbrBackground = (HBRUSH) GetStockObject(LTGRAY_BRUSH);
wcex.lpszMenuName = MAKEINTRESOURCE(IDR_MAINFRAME);
wcex.lpszClassName = _T("HERCCMD");
wcex.hIcon = LoadIcon(MAKEINTRESOURCE(IDR_MAINFRAME));
AfxRegisterClass(&wcex);
myshow_storageptr = NULL;
AfxSocketInit(); AfxInitRichEdit();
snap_shot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
process32.dwSize = sizeof(PROCESSENTRY32);
return_cde = Process32First(snap_shot,&process32);
pid = GetCurrentProcessId();
while(pid != process32.th32ProcessID)
{
return_cde = Process32Next(snap_shot,&process32);
}
herc_process = process32.th32ParentProcessID;
my_herc = OpenProcess(PROCESS_ALL_ACCESS,FALSE,herc_process);
if (my_herc == NULL)
errcd= GetLastError();
SECURITY_ATTRIBUTES sa;
LPVOID lparam;
DWORD threadid;
sa.nLength = sizeof(sa);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;
lparam = NULL;
CreateRemoteThread(my_herc,
&sa,
NULL,
(LPTHREAD_START_ROUTINE) hercgui,
lparam,
NULL,
&threadid);
filehdl = CreateFile((LPCTSTR) pipe_name,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED,
NULL);
if (filehdl == INVALID_HANDLE_VALUE)
errcd= GetLastError();
herc_over.hEvent = OpenEvent(EVENT_ALL_ACCESS,FALSE,TEXT("herceventread"));
if (myevent_read == NULL)
errcd= GetLastError();
ResetEvent(herc_over.hEvent);
herc_over1.hEvent = OpenEvent(EVENT_ALL_ACCESS,FALSE,TEXT("herceventwrite"));
if (myevent_write == NULL)
errcd= GetLastError();
ResetEvent(herc_over1.hEvent);
herc_over.hEvent= CreateEvent(NULL,
FALSE, FALSE, NULL);
herc_over1.hEvent= CreateEvent(NULL,
TRUE, FALSE, NULL);
#ifdef _DEBUG
afxMemDF |= checkAlwaysMemDF;
msOld.Checkpoint();
#endif
mybaseeventptr = new MyBaseEvent(FALSE,FALSE,NULL,NULL);
#ifdef _DEBUG
msnew.Checkpoint();
if( diffMemState.Difference(msOld, msnew))
{
diffMemState.DumpStatistics();
diffMemState.DumpAllObjectsSince();
}
msOld.Checkpoint();
#endif
m_pMainWnd = new CMainFrame;
#ifdef _DEBUG
msnew.Checkpoint();
if( diffMemState.Difference(msOld, msnew))
{
diffMemState.DumpStatistics();
diffMemState.DumpAllObjectsSince();
}
#endif
BOOL return_code = static_cast<CFrameWnd *>(m_pMainWnd)->LoadFrame(IDR_MAINFRAME);
if (return_code == NULL)
DWORD errcd = GetLastError();
pevent = new CEvent(FALSE,FALSE,NULL,NULL);
int i;
UINT start_port;
for (i = 0, start_port = 11007; i < 4; start_port++, i++)
{
#ifdef _DEBUG
msOld.Checkpoint();
#endif
threadptr[i] = new SockCLeintThread(start_port);
#ifdef _DEBUG
msnew.Checkpoint();
if( diffMemState.Difference(msOld, msnew))
{
diffMemState.DumpStatistics();
diffMemState.DumpAllObjectsSince();
}
#endif
if (threadptr[i] == NULL)
m_pMainWnd->MessageBox((LPCTSTR)"SockClientThreadFail",NULL,MB_ICONERROR);
threadptr[i]->CreateThread(CREATE_SUSPENDED,0,NULL);
threadptr[i]->flags.is_connected = 0;
threadptr[i]->ipaddr = (LPCTSTR)"192.168.1.4";
threadptr[i]->flags.busy = 0;
SetThreadName(threadptr[i]->m_nThreadID,thread[i]);
threadptr[i]->ResumeThread();
WaitForSingleObject(*pevent,INFINITE);
}
hercthread = AfxBeginThread(hercgui_commands,(LPVOID) mybaseeventptr,THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED); hercthread->m_pThreadParams = this; hercthread->ResumeThread();
m_pMainWnd->SetWindowText((LPCTSTR) TEXT("HERCCMD"));
m_pMainWnd->ShowWindow(m_nCmdShow);
m_pMainWnd->UpdateWindow();
return TRUE;
}
BOOL CHERC_CMDApp::OnIdle()
{
i = 1;
return TRUE;
}
#pragma optimize("",off)
UINT hercgui_commands(LPVOID lparam)
{
int i;
CString storstrg;
BOOL bresult;
UNREFERENCED_PARAMETER(lparam);
void SetThreadName( DWORD dwThreadID, LPCSTR szThreadName);
CMutex mymutex(FALSE,(LPCTSTR)"HercLock",NULL);
CSingleLock HercLock(&mymutex);
DWORD dwbytestoread;
CHERC_CMDApp* main_app;
dwbytestoread = 1500;
MyBaseEvent *my_event;
main_app = (CHERC_CMDApp *)AfxGetApp();
my_event = main_app->mybaseeventptr;
SetThreadName(GetCurrentThreadId(),"HercGUI");
while(1)
{
WaitForSingleObject(my_event->m_hObject, INFINITE);
if (!HercLock.IsLocked())
{
HercLock.Lock(INFINITE);
WriteFile(main_app->filehdl,
(LPCVOID)my_event->buffer_ptr,
30,
NULL,
(LPOVERLAPPED) &main_app->herc_over);
}
bresult = ReadFile(main_app->filehdl,
(LPVOID) my_event->buffer_ptr,
dwbytestoread,
NULL,
(LPOVERLAPPED) &main_app->herc_over1);
WaitForSingleObject(main_app->herc_over1.hEvent,INFINITE);
HercLock.Unlock();
BOOL ret;
DWORD error;
CWnd *pwnd = CWnd::FromHandle(my_event->send_win);
ret = pwnd->PostMessage(WM_HERCGUI_MESS,(WPARAM) my_event->len,(LPARAM) my_event->buffer_ptr);
if (ret == NULL)
error = GetLastError();
i = 1;
}
return 0;
}
#pragma optimize("",on)
typedef struct tagTHREADNAME_INFO
{
DWORD dwType; LPCSTR szName; DWORD dwThreadID; DWORD dwFlags; } THREADNAME_INFO;
void SetThreadName( DWORD dwThreadID, LPCSTR szThreadName)
{
THREADNAME_INFO info;
{
CString a("Socket thread");
a + (LPCTSTR)szThreadName;
info.dwType = 0x1000;
info.szName = (LPCSTR)a.GetBuffer();
info.dwThreadID = dwThreadID;
info.dwFlags = 0;
}
}
|