shell host bug fixes
This commit is contained in:
parent
bcb0079251
commit
aed2a003fb
|
@ -129,7 +129,11 @@ int main()
|
||||||
si.hStdOutput = out[1];
|
si.hStdOutput = out[1];
|
||||||
si.hStdError = err[1];
|
si.hStdError = err[1];
|
||||||
|
|
||||||
|
//swprintf(cmd, L"%ls", L"shell-host.exe ping -t 127.0.0.1");
|
||||||
swprintf(cmd, L"%ls", L"shell-host.exe");
|
swprintf(cmd, L"%ls", L"shell-host.exe");
|
||||||
|
SetHandleInformation(in[1], HANDLE_FLAG_INHERIT, 0);
|
||||||
|
SetHandleInformation(out[0], HANDLE_FLAG_INHERIT, 0);
|
||||||
|
SetHandleInformation(out[0], HANDLE_FLAG_INHERIT, 0);
|
||||||
|
|
||||||
|
|
||||||
ret = CreateProcessW(NULL, cmd, NULL, NULL, TRUE, DETACHED_PROCESS, NULL, NULL, &si, &pi);
|
ret = CreateProcessW(NULL, cmd, NULL, NULL, TRUE, DETACHED_PROCESS, NULL, NULL, &si, &pi);
|
||||||
|
|
|
@ -53,13 +53,18 @@ DWORD WINAPI MonitorChild(
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define GOTO_CLEANUP_ON_ERR(exp) do { \
|
#define GOTO_CLEANUP_ON_FALSE(exp) do { \
|
||||||
ret = (exp); \
|
ret = (exp); \
|
||||||
if (ret == FALSE) \
|
if (ret == FALSE) \
|
||||||
goto cleanup; \
|
goto cleanup; \
|
||||||
} while(0) \
|
} while(0) \
|
||||||
|
|
||||||
int main() {
|
#define GOTO_CLEANUP_ON_ERR(exp) do { \
|
||||||
|
if ((exp) != 0) \
|
||||||
|
goto cleanup; \
|
||||||
|
} while(0) \
|
||||||
|
|
||||||
|
int wmain(int ac, wchar_t **av) {
|
||||||
STARTUPINFO si;
|
STARTUPINFO si;
|
||||||
PROCESS_INFORMATION pi;
|
PROCESS_INFORMATION pi;
|
||||||
wchar_t cmd[MAX_PATH];
|
wchar_t cmd[MAX_PATH];
|
||||||
|
@ -95,8 +100,8 @@ int main() {
|
||||||
si.hStdError = pipe_err;
|
si.hStdError = pipe_err;
|
||||||
|
|
||||||
/* disable inheritance on child_pipe_write and pipe_in*/
|
/* disable inheritance on child_pipe_write and pipe_in*/
|
||||||
SetHandleInformation(pipe_in, HANDLE_FLAG_INHERIT, 0);
|
GOTO_CLEANUP_ON_FALSE(SetHandleInformation(pipe_in, HANDLE_FLAG_INHERIT, 0));
|
||||||
SetHandleInformation(child_pipe_write, HANDLE_FLAG_INHERIT, 0);
|
GOTO_CLEANUP_ON_FALSE(SetHandleInformation(child_pipe_write, HANDLE_FLAG_INHERIT, 0));
|
||||||
|
|
||||||
/* create job to hold all child processes */
|
/* create job to hold all child processes */
|
||||||
{
|
{
|
||||||
|
@ -110,8 +115,20 @@ int main() {
|
||||||
CloseHandle(job);
|
CloseHandle(job);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*TODO - pick this up from system32*/
|
||||||
swprintf(cmd, L"%ls", L"cmd.exe");
|
swprintf(cmd, L"%ls", L"cmd.exe");
|
||||||
GOTO_CLEANUP_ON_ERR(CreateProcess(NULL, cmd, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi));
|
ac--;
|
||||||
|
av++;
|
||||||
|
if (ac)
|
||||||
|
GOTO_CLEANUP_ON_ERR(wcscat_s(cmd, MAX_PATH, L" /c"));
|
||||||
|
while (ac) {
|
||||||
|
GOTO_CLEANUP_ON_ERR(wcscat_s(cmd, MAX_PATH, L" "));
|
||||||
|
GOTO_CLEANUP_ON_ERR(wcscat_s(cmd, MAX_PATH, *av));
|
||||||
|
ac--;
|
||||||
|
av++;
|
||||||
|
}
|
||||||
|
|
||||||
|
GOTO_CLEANUP_ON_FALSE(CreateProcess(NULL, cmd, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi));
|
||||||
|
|
||||||
/* close unwanted handles*/
|
/* close unwanted handles*/
|
||||||
CloseHandle(child_pipe_read);
|
CloseHandle(child_pipe_read);
|
||||||
|
@ -130,10 +147,10 @@ int main() {
|
||||||
while (1) {
|
while (1) {
|
||||||
char buf[128];
|
char buf[128];
|
||||||
DWORD rd = 0, wr = 0, i = 0;
|
DWORD rd = 0, wr = 0, i = 0;
|
||||||
GOTO_CLEANUP_ON_ERR(ReadFile(pipe_in, buf, 128, &rd, NULL));
|
GOTO_CLEANUP_ON_FALSE(ReadFile(pipe_in, buf, 128, &rd, NULL));
|
||||||
|
|
||||||
if (!istty) { /* no tty, juet send it accross */
|
if (!istty) { /* no tty, juet send it accross */
|
||||||
GOTO_CLEANUP_ON_ERR(WriteFile(child_pipe_write, buf, rd, &wr, NULL));
|
GOTO_CLEANUP_ON_FALSE(WriteFile(child_pipe_write, buf, rd, &wr, NULL));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -147,7 +164,7 @@ int main() {
|
||||||
|
|
||||||
// Ctrl +C
|
// Ctrl +C
|
||||||
if (buf[i] == '\003') {
|
if (buf[i] == '\003') {
|
||||||
GOTO_CLEANUP_ON_ERR(GenerateConsoleCtrlEvent(CTRL_C_EVENT, 0));
|
GOTO_CLEANUP_ON_FALSE(GenerateConsoleCtrlEvent(CTRL_C_EVENT, 0));
|
||||||
in_cmd_len = 0;
|
in_cmd_len = 0;
|
||||||
i++;
|
i++;
|
||||||
continue;
|
continue;
|
||||||
|
@ -156,7 +173,7 @@ int main() {
|
||||||
// for backspace, we need to send space and another backspace for visual erase
|
// for backspace, we need to send space and another backspace for visual erase
|
||||||
if (buf[i] == '\b') {
|
if (buf[i] == '\b') {
|
||||||
if (in_cmd_len > 0) {
|
if (in_cmd_len > 0) {
|
||||||
GOTO_CLEANUP_ON_ERR(WriteFile(pipe_out, "\b \b", 3, &wr, NULL));
|
GOTO_CLEANUP_ON_FALSE(WriteFile(pipe_out, "\b \b", 3, &wr, NULL));
|
||||||
in_cmd_len--;
|
in_cmd_len--;
|
||||||
}
|
}
|
||||||
i++;
|
i++;
|
||||||
|
@ -168,21 +185,21 @@ int main() {
|
||||||
|
|
||||||
/* TODO - do a much accurate mapping */
|
/* TODO - do a much accurate mapping */
|
||||||
buf[i] = '\n';
|
buf[i] = '\n';
|
||||||
GOTO_CLEANUP_ON_ERR(WriteFile(pipe_out, buf + i, 1, &wr, NULL));
|
GOTO_CLEANUP_ON_FALSE(WriteFile(pipe_out, buf + i, 1, &wr, NULL));
|
||||||
in_cmd[in_cmd_len] = buf[i];
|
in_cmd[in_cmd_len] = buf[i];
|
||||||
in_cmd_len++;
|
in_cmd_len++;
|
||||||
GOTO_CLEANUP_ON_ERR(WriteFile(child_pipe_write, in_cmd, in_cmd_len, &wr, NULL));
|
GOTO_CLEANUP_ON_FALSE(WriteFile(child_pipe_write, in_cmd, in_cmd_len, &wr, NULL));
|
||||||
in_cmd_len = 0;
|
in_cmd_len = 0;
|
||||||
i++;
|
i++;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
GOTO_CLEANUP_ON_ERR(WriteFile(pipe_out, buf + i, 1, &wr, NULL));
|
GOTO_CLEANUP_ON_FALSE(WriteFile(pipe_out, buf + i, 1, &wr, NULL));
|
||||||
in_cmd[in_cmd_len] = buf[i];
|
in_cmd[in_cmd_len] = buf[i];
|
||||||
in_cmd_len++;
|
in_cmd_len++;
|
||||||
if (in_cmd_len == MAX_CMD_LEN - 1) {
|
if (in_cmd_len == MAX_CMD_LEN - 1) {
|
||||||
GOTO_CLEANUP_ON_ERR(WriteFile(child_pipe_write, in_cmd, in_cmd_len, &wr, NULL));
|
GOTO_CLEANUP_ON_FALSE(WriteFile(child_pipe_write, in_cmd, in_cmd_len, &wr, NULL));
|
||||||
in_cmd_len = 0;
|
in_cmd_len = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue