Добрый день, спрашиваю тут, т.к. сам решения вопроса не вижу.
Задача:
Запустить через критпроцесс консольное приложение, перенаправив потоки ввода вывода в родительскую программу, далее кинуть в поток ввода число, далее прочитать поток вывода.
Вроде задача не сложная, делаем так:
Переменные:
STARTUPINFO si;
PROCESS_INFORMATION pi;
SECURITY_DESCRIPTOR sd;
SECURITY_ATTRIBUTES sa;
LPSECURITY_ATTRIBUTES lpsa = NULL;
Объявим хендлы:
HANDLE hStdOutLocal;
HANDLE hStdOutRemote;
HANDLE hStdInLocal;
HANDLE hStdInRemote;
Инициализация дескриптора:
InitializeSecurityDescriptor(&sd,SECURITY_DESCRIPTOR_REVISION);
SetSecurityDescriptorDacl(&sd, true, NULL, false);
Инициализация атрибутов дискриптора:
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.bInheritHandle = true;
sa.lpSecurityDescriptor = &sd;
lpsa = &sa;
Создание каналов передачи данных:
CreatePipe(&hStdOutLocal, &hStdOutRemote, lpsa,25000);
CreatePipe(&hStdInRemote, &hStdInLocal, lpsa,25000);
Заполним структуру запуска:
memset(&si, 0, sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
si.dwFlags = STARTF_USESHOWWINDOW |STARTF_USESTDHANDLES;
si.wShowWindow = SW_HIDE;
si.hStdOutput = hStdOutRemote;
si.hStdInput = hStdInRemote;
Ну и собственно критпроцесс:
if(!CreateProcess(NULL,filename, NULL, NULL, TRUE, 0, 0, 0, &si, &pi))
{
dialog_send("Could not open file (error %d)\r\n", GetLastError());
return;
}
Работает нормально, однако запуская приложение написанное на Assembler'е я получаю Краш дочерней проги без каких либо объяснений, ошибку критпроцесс не возвращает, опытным путем выяснил, что без использования перенаправления stdin/stdout(STARTF_USESTDHANDLES) запускается нормально.
В чем проблема непонятно, может есть какие-то ньюансы работы потоковых перенаправлений с ASM программами?
После детальных исследований было выявлено место краша:
00401063 mov bl,byte ptr [esi]
Дизасм запускаемой ассемблеровской проги прилагается:
http://paste.org/pastebin/view/20366
Похоже ошибка доступа к памяти гдето в дочерней проге.
С уважением, Александр.