#include <stdio.h> #include <iostream> #include <windows.h> #include <string> int main(int argc, char* argv[]){ SetConsoleTitle(argv[0]); std::string slot_name = "\\\\.\\mailslot\\" + std::string(argv[0]); char buff[100]; HANDLE h_mailslot = CreateMailslot(slot_name.c_str(), 0, MAILSLOT_WAIT_FOREVER, NULL); if(h_mailslot == INVALID_HANDLE_VALUE){ printf("Unable to create mailslot!\n"); throw 1; } while(1){ DWORD n_byte; if(!ReadFile(h_mailslot, buff, sizeof(buff), &n_byte, NULL)) break; buff[n_byte / sizeof(char)] = 0; if(strcmp(buff, "exit")==0) break; printf("%s", buff); } CloseHandle(h_mailslot); return 0; }
console.exe
#include <stdio.h> #include <iostream> #include <windows.h> #include <process.h> #include <direct.h> std::string getExePath(){ char buffer[MAX_PATH]; GetModuleFileName(NULL, buffer, MAX_PATH); std::string str(buffer); std::string::size_type pos = str.find_last_of("\\/"); return str.substr(0, pos); } class Console { public: Console(std::string title = "debug"){ STARTUPINFO info = { sizeof(info) }; PROCESS_INFORMATION process_info; std::string filepath = getExePath() + "\\console.exe"; if(!CreateProcess(filepath.c_str(), const_cast <char *>(title.c_str()), NULL, NULL, false, CREATE_NEW_CONSOLE, NULL, NULL, &info, &process_info)){ printf("CreateProcess() failure.\n"); throw 1; } h_cmd_process = process_info.hProcess; Sleep(1000); // waiting for process std::string slot_name = "\\\\.\\mailslot\\" + title; h_mailslot = CreateFile(slot_name.c_str(), GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if(h_mailslot == INVALID_HANDLE_VALUE){ printf("Unable to create mailslot %d\n", GetLastError()); throw 1; } } void print(const std::string& message){ DWORD exitCode; GetExitCodeProcess(h_cmd_process, &exitCode); if(exitCode != STILL_ACTIVE) { //task exited with code exitCode } DWORD n_byte; if(!WriteFile(h_mailslot, message.c_str(), message.length()*sizeof(char), &n_byte, NULL)){ } } ~Console(){ print("exit"); //TerminateProcess(h_cmd_process, 0); CloseHandle(h_mailslot); } private: HANDLE h_cmd_process; HANDLE h_mailslot; }; void main(){ Console console; for(int i = 0; i < 10; i++){ std::string message = "hello hell? " + std::to_string((_ULonglong)i) + "\n"; console.print(message); } getchar(); }
client.exe
Class Consoles launch process "console.exe" when it is created. It send string by mailslot(msdn). The "client.exe" should be launched as administrator.
No comments:
Post a Comment