root/lang/objective-cplusplus/i3/trunk/src/os-windows/CygwinPty.cpp @ 34664

Revision 34664, 3.4 kB (checked in by saturday06, 5 years ago)

osososososo

Line 
1#include <PrecompiledHeaders.h>
2#include "CygwinPty.h"
3
4namespace i3 {
5template <size_t Size>
6bool query_registory(HKEY root, const TCHAR* SubKey, const TCHAR* value, TCHAR (&retval)[Size]) {
7    HKEY hkResult = NULL;
8    LONG result = RegOpenKeyEx(
9        root,
10        SubKey,
11        0,
12        KEY_EXECUTE,
13        &hkResult);
14   
15    if (result != ERROR_SUCCESS) {
16        return false;
17    }
18
19    DWORD type = 0;
20    DWORD cbCd = sizeof(retval);
21    result = RegQueryValueEx(
22        hkResult,
23        value,
24        NULL,
25        &type,
26        (BYTE*)retval,
27        &cbCd);
28
29    if (result != ERROR_SUCCESS) {
30        return false;
31    }
32    return true;
33}
34
35
36CygwinPty::CygwinPty() {
37}
38
39bool CygwinPty::interrupt() {
40    BOOL result = GenerateConsoleCtrlEvent(CTRL_C_EVENT, pi.dwProcessId);
41    return (result != 0);
42    //return write("\003", 1);
43}
44
45bool CygwinPty::connect() {
46    //XXX clean handles ???
47    //XXX MAX_PATH safe???
48
49    TCHAR fakecygpty[2000] = {};
50    {
51        DWORD result = GetModuleFileName(
52                           GetModuleHandle(NULL),
53                           fakecygpty,
54                           _countof(fakecygpty));
55
56        if (result == 0 || result == _countof(fakecygpty)) { // error
57            return false;
58        }
59        if (PathRemoveFileSpec(fakecygpty) == FALSE) {
60            return false;
61        }
62        if (_tcscat_s(fakecygpty, _T("\\misc\\fakecygpty.exe")) != 0) {
63            return false;
64        }
65    }
66
67    TCHAR cd[2000] = {};
68    if (!query_registory(HKEY_LOCAL_MACHINE, TEXT("SOFTWARE\\Cygwin\\setup"), TEXT("rootdir"), retval) &&
69        !query_registory(HKEY_LOCAL_MACHINE, TEXT("SOFTWARE\\Wow6432Node\\Cygwin\\setup"), TEXT("rootdir"), retval) &&
70        !query_registory(HKEY_LOCAL_MACHINE, TEXT("SOFTWARE\\Cygnus Solutions\\Cygwin\\mounts v2\\/"), TEXT("native"), retval) &&
71        !query_registory(HKEY_LOCAL_MACHINE, TEXT("SOFTWARE\\Wow6432Node\\Cygnus Solutions\\Cygwin\\mounts v2\\/"), TEXT("native"), retval)) {
72        return false;
73    }
74
75    SECURITY_ATTRIBUTES sa = {};
76    sa.bInheritHandle = TRUE;
77
78    STARTUPINFO si = {};
79    memset((void*)&pi, 0, sizeof(pi));
80
81    CreatePipe(&hStdInput    , &hMyStdInput , &sa, 0);
82    CreatePipe(&hMyStdOutput , &hStdOutput  , &sa, 0);
83    CreatePipe(&hMyStdError  , &hStdError   , &sa, 0);
84
85    if (!DuplicateHandle(GetCurrentProcess(),hMyStdInput ,GetCurrentProcess(),NULL, 0, FALSE, DUPLICATE_SAME_ACCESS) ||
86        !DuplicateHandle(GetCurrentProcess(),hMyStdOutput,GetCurrentProcess(),NULL, 0, FALSE, DUPLICATE_SAME_ACCESS) ||
87        !DuplicateHandle(GetCurrentProcess(),hMyStdError ,GetCurrentProcess(),NULL, 0, FALSE, DUPLICATE_SAME_ACCESS)) {
88
89        return false;
90    }
91
92    si.cb = sizeof(STARTUPINFO);
93    si.dwFlags = STARTF_USESTDHANDLES;
94
95    si.hStdInput = hStdInput;
96    // si.hStdOutput = hStdOutput;
97    // si.hStdError  = hStdError;
98    // si.hStdInput  = GetStdHandle(STD_INPUT_HANDLE);
99    si.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE);
100    si.hStdError  = GetStdHandle(STD_ERROR_HANDLE);
101    {
102        TCHAR arg[] = _T("fakecygpty.exe /bin/zsh --login -i");
103        BOOL result = CreateProcess(fakecygpty, arg, NULL, NULL, TRUE, CREATE_NEW_PROCESS_GROUP, NULL, cd, &si, &pi);
104        if (result == 0) {
105            return false;
106        }
107    }
108    return true;
109}
110}
111
Note: See TracBrowser for help on using the browser.