diff --git a/contrib/win32/RedirectedIO-exp/RedirectedIO/RedirectedIO.sln b/contrib/win32/RedirectedIO-exp/RedirectedIO/RedirectedIO.sln new file mode 100644 index 0000000..6b8d1cf --- /dev/null +++ b/contrib/win32/RedirectedIO-exp/RedirectedIO/RedirectedIO.sln @@ -0,0 +1,28 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 14 +VisualStudioVersion = 14.0.24720.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "RedirectedIO", "RedirectedIO\RedirectedIO.vcxproj", "{47CB1D05-8813-415A-BB85-042E09B8A794}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {47CB1D05-8813-415A-BB85-042E09B8A794}.Debug|x64.ActiveCfg = Debug|x64 + {47CB1D05-8813-415A-BB85-042E09B8A794}.Debug|x64.Build.0 = Debug|x64 + {47CB1D05-8813-415A-BB85-042E09B8A794}.Debug|x86.ActiveCfg = Debug|Win32 + {47CB1D05-8813-415A-BB85-042E09B8A794}.Debug|x86.Build.0 = Debug|Win32 + {47CB1D05-8813-415A-BB85-042E09B8A794}.Release|x64.ActiveCfg = Release|x64 + {47CB1D05-8813-415A-BB85-042E09B8A794}.Release|x64.Build.0 = Release|x64 + {47CB1D05-8813-415A-BB85-042E09B8A794}.Release|x86.ActiveCfg = Release|Win32 + {47CB1D05-8813-415A-BB85-042E09B8A794}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/contrib/win32/RedirectedIO-exp/RedirectedIO/RedirectedIO/RedirectedIO.cpp b/contrib/win32/RedirectedIO-exp/RedirectedIO/RedirectedIO/RedirectedIO.cpp new file mode 100644 index 0000000..9f27fc6 --- /dev/null +++ b/contrib/win32/RedirectedIO-exp/RedirectedIO/RedirectedIO/RedirectedIO.cpp @@ -0,0 +1,156 @@ +// RedirectedIO.cpp : Defines the entry point for the console application. +// + +#include +#include + +int pipe_counter = 0; +HANDLE in[2]; +HANDLE out[2]; +HANDLE err[2]; + +DWORD WINAPI OutThreadProc( + _In_ LPVOID lpParameter + ) +{ + char buf[1024]; + DWORD tmp; + BOOL ret = TRUE; + while (ret) { + ret = ReadFile(out[0], buf, 1024, &tmp, NULL); + if (ret) + ret = WriteFile(GetStdHandle(STD_OUTPUT_HANDLE), buf, tmp, &tmp, NULL); + } + + return ret; +} + +DWORD WINAPI InThreadProc( + _In_ LPVOID lpParameter + ) +{ + DWORD mode; + GetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), &mode); + //SetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), mode & ~(ENABLE_ECHO_INPUT | ENABLE_LINE_INPUT | ENABLE_PROCESSED_INPUT)); + GetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), &mode); + char buf[1024]; + DWORD tmp; + BOOL ret = TRUE; + while (ret) { + ret = ReadFile(GetStdHandle(STD_INPUT_HANDLE), buf, 1024, &tmp, NULL); + if (ret) + ret = WriteFile(in[1], buf, tmp, &tmp, NULL); + } + + return ret; +} + +BOOL WINAPI HandlerRoutine( + _In_ DWORD dwCtrlType + ) { + if (dwCtrlType == CTRL_C_EVENT) { + return TRUE; + } + return FALSE; +} + +int +fileio_pipe(HANDLE pio[2]) { + HANDLE read_handle = INVALID_HANDLE_VALUE, write_handle = INVALID_HANDLE_VALUE; + char pipe_name[MAX_PATH]; + SECURITY_ATTRIBUTES sec_attributes; + + pio[0] = INVALID_HANDLE_VALUE; + pio[1] = INVALID_HANDLE_VALUE; + + /* create name for named pipe */ + if (-1 == sprintf_s(pipe_name, MAX_PATH, "\\\\.\\Pipe\\W32PosixPipe.%08x.%08x", + GetCurrentProcessId(), pipe_counter++)) { + goto error; + } + + sec_attributes.bInheritHandle = TRUE; + sec_attributes.lpSecurityDescriptor = NULL; + sec_attributes.nLength = 0; + + /* create named pipe */ + read_handle = CreateNamedPipeA(pipe_name, + PIPE_ACCESS_INBOUND | FILE_FLAG_OVERLAPPED, + PIPE_TYPE_BYTE | PIPE_WAIT, + 1, + 4096, + 4096, + 0, + &sec_attributes); + if (read_handle == INVALID_HANDLE_VALUE) { + goto error; + } + + /* connect to named pipe */ + write_handle = CreateFileA(pipe_name, + GENERIC_WRITE, + 0, + &sec_attributes, + OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, + NULL); + if (write_handle == INVALID_HANDLE_VALUE) { + goto error; + } + + pio[0] = read_handle; + pio[1] = write_handle; + return 0; + +error: + if (read_handle != INVALID_HANDLE_VALUE) + CloseHandle(read_handle); + if (write_handle != INVALID_HANDLE_VALUE) + CloseHandle(write_handle); + return -1; +} + + +int main() +{ + + STARTUPINFO si; + PROCESS_INFORMATION pi; + DWORD tmp; + BOOL ret; + char buf[1024]; + wchar_t cmd[MAX_PATH]; + + fileio_pipe(in); + fileio_pipe(out); + fileio_pipe(err); + + memset(&si, 0, sizeof(STARTUPINFO)); + si.cb = sizeof(STARTUPINFO); + si.lpReserved = 0; + si.lpTitle = NULL; /* NULL means use exe name as title */ + si.dwFillAttribute = 0; + si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESIZE | STARTF_USECOUNTCHARS | STARTF_USESHOWWINDOW ; + si.wShowWindow = 1; // FALSE ; + si.cbReserved2 = 0; + si.lpReserved2 = 0; + si.hStdInput = in[0]; + si.hStdOutput = out[1]; + si.hStdError = err[1]; + + swprintf(cmd, L"%ls", L"cmd.exe"); + ret = CreateProcessW(NULL, cmd, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi); + if (!ret) + exit(-1); + + HANDLE t[2]; + t[0] = CreateThread(NULL, 0, OutThreadProc, NULL, 0, NULL); + t[1] = CreateThread(NULL, 0, InThreadProc, NULL, 0, NULL); + + //SetConsoleCtrlHandler(HandlerRoutine, TRUE); + + WaitForMultipleObjects(2, t, TRUE, INFINITE); + + +} + diff --git a/contrib/win32/RedirectedIO-exp/RedirectedIO/RedirectedIO/RedirectedIO.vcxproj b/contrib/win32/RedirectedIO-exp/RedirectedIO/RedirectedIO/RedirectedIO.vcxproj new file mode 100644 index 0000000..ae326d8 --- /dev/null +++ b/contrib/win32/RedirectedIO-exp/RedirectedIO/RedirectedIO/RedirectedIO.vcxproj @@ -0,0 +1,150 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + {47CB1D05-8813-415A-BB85-042E09B8A794} + Win32Proj + RedirectedIO + 8.1 + + + + Application + true + v140 + Unicode + + + Application + false + v140 + true + Unicode + + + Application + true + v140 + Unicode + + + Application + false + v140 + true + Unicode + + + + + + + + + + + + + + + + + + + + + true + + + true + + + false + + + false + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + + + Console + true + + + + + + + Level3 + Disabled + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + + + Console + true + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + + + Console + true + true + true + + + + + Level3 + + + MaxSpeed + true + true + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + + + Console + true + true + true + + + + + + + + + \ No newline at end of file diff --git a/contrib/win32/RedirectedIO-exp/RedirectedIO/RedirectedIO/RedirectedIO.vcxproj.filters b/contrib/win32/RedirectedIO-exp/RedirectedIO/RedirectedIO/RedirectedIO.vcxproj.filters new file mode 100644 index 0000000..c810d62 --- /dev/null +++ b/contrib/win32/RedirectedIO-exp/RedirectedIO/RedirectedIO/RedirectedIO.vcxproj.filters @@ -0,0 +1,14 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + Source Files + + + \ No newline at end of file