#define _WIN32_WINNT 0x0a00 #include #include typedef void *HPCON; #ifndef PROC_THREAD_ATTRIBUTE_PSEUDOCONSOLE #define PROC_THREAD_ATTRIBUTE_PSEUDOCONSOLE 0x00020016L #endif #ifndef ENABLE_VIRTUAL_TERMINAL_PROCESSING #define ENABLE_VIRTUAL_TERMINAL_PROCESSING 0x0004 #endif DWORD WINAPI PipeWriter(LPVOID pipe); DWORD WINAPI PipeReader(LPVOID pipe); int main() { HMODULE h; FARPROC f; COORD size; HPCON hpCon; HANDLE inR, inW, outR, outW; HRESULT (WINAPI *CreatePseudoConsole)(COORD, HANDLE, HANDLE, DWORD, HPCON*); VOID (WINAPI *ClosePseudoConsole)(HPCON); h = GetModuleHandle("kernel32.dll"); if (h == INVALID_HANDLE_VALUE) { fprintf(stderr, "GetModuleHandle() failed.\n"); return 1; } f = GetProcAddress(h, "CreatePseudoConsole"); if (f == NULL) { fprintf(stderr, "GetProcAddress() failed.\n"); return 1; } CreatePseudoConsole = (HRESULT (WINAPI *)(COORD, HANDLE, HANDLE, DWORD, HPCON*))f; f = GetProcAddress(h, "ClosePseudoConsole"); if (f == NULL) { fprintf(stderr, "GetProcAddress() failed.\n"); return 1; } ClosePseudoConsole = (VOID (WINAPI *)(HPCON))f; CloseHandle(h); if (!CreatePipe(&inR, &inW, NULL, 0)) { fprintf(stderr, "CreatePipe() failed.\n"); return 1; } if (!CreatePipe(&outR, &outW, NULL, 0)) { fprintf(stderr, "CreatePipe() failed.\n"); return 1; } size.X = 80; size.Y = 24; printf("Started.\n"); if (S_OK != CreatePseudoConsole(size, inR, outW, 0, &hpCon)) { fprintf(stderr, "CreatePseudoConsole() failed.\n"); return 1; } printf("CreatePseudoConsole() end.\n"); CloseHandle(inR); CloseHandle(outW); ClosePseudoConsole(hpCon); CloseHandle(inW); CloseHandle(outR); printf("ClosePseudoConsole() end.\n"); return 0; }