2012-12-19 147 views
3

我正在将一个DLL注入进程中,在该进程的入口点我产生了一个新线程并分配了一个控制台,我将所有std重定向到控制台,当我关闭控制台窗口时整个过程关闭,有没有办法让它不会结束这个过程?这是我的代码:关闭控制台关闭进程

入口点:

#pragma region EntryPoint 
BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) 
{ 
    switch (ul_reason_for_call) 
    { 
     case DLL_PROCESS_ATTACH: 
      { 
       DWORD threadId; 
       hProcess = GetCurrentProcess(); 
       hThread = CreateThread(NULL, 0, Attach, 0, 0, &threadId); 
      } break; 
     case DLL_PROCESS_DETACH: 
      CloseHandle(hThread); 
     break; 
    } 
    return TRUE; 
} 
#pragma endregion EntryPoint 

附:

DWORD WINAPI Attach(LPVOID args) 
{ 
    RedirectIOToConsole(); 
} 

这是控制台代码:

#include "hFatboy.h" 

#ifndef _USE_OLD_IOSTREAMS 
using namespace std; 
#endif 

static const WORD MAX_CONSOLE_LINES = 500; 
extern HANDLE hProcess; 

byte *readMemory(DWORD address, int length) 
{ 
    byte *buffer = new byte[length]; 
    SIZE_T bytesRead; 
    if (ReadProcessMemory(hProcess, (void *)address, buffer, length, &bytesRead)) 
     return buffer; 

    return NULL; 
} 
void RedirectIOToConsole() 
{ 
    int hConHandle; 
    long lStdHandle; 

    CONSOLE_SCREEN_BUFFER_INFO coninfo; 
    FILE *fp; 

    AllocConsole(); 
    GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &coninfo); 
    coninfo.dwSize.Y = MAX_CONSOLE_LINES; 
    SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), coninfo.dwSize); 

    lStdHandle = (long)GetStdHandle(STD_OUTPUT_HANDLE); 
    hConHandle = _open_osfhandle(lStdHandle, _O_TEXT); 

    fp = _fdopen(hConHandle, "w"); 

    *stdout = *fp; 

    setvbuf(stdout, NULL, _IONBF, 0); 

    lStdHandle = (long)GetStdHandle(STD_INPUT_HANDLE); 
    hConHandle = _open_osfhandle(lStdHandle, _O_TEXT); 

    fp = _fdopen(hConHandle, "r"); 

    *stdin = *fp; 

    setvbuf(stdin, NULL, _IONBF, 0); 

    lStdHandle = (long)GetStdHandle(STD_ERROR_HANDLE); 
    hConHandle = _open_osfhandle(lStdHandle, _O_TEXT); 

    fp = _fdopen(hConHandle, "w"); 

    *stderr = *fp; 

    setvbuf(stderr, NULL, _IONBF, 0); 

    ios::sync_with_stdio(); 
} 

回答

1

你可以尝试注册HandlerRoutineSetConsoleCtrlHandler 。然后,您将能够截取结束事件CTRL_CLOSE_EVENT并避免调用ExitProcess的默认行为。

+0

@Dean,你是否能够使控制台控制处理程序正常工作?我[无法让我的处理程序工作](http://stackoverflow.com/a/20234847/2392683)** CTRL_CLOSE_EVENT **。然而,我的** CTRL_C_EVENT **处理程序工作得很好。 – chwarr