Непонятки с CreateProcess
От: Selestin  
Дата: 09.07.10 21:45
Оценка:
Добрый день, спрашиваю тут, т.к. сам решения вопроса не вижу.

Задача:
Запустить через критпроцесс консольное приложение, перенаправив потоки ввода вывода в родительскую программу, далее кинуть в поток ввода число, далее прочитать поток вывода.

Вроде задача не сложная, делаем так:
Переменные:
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

Похоже ошибка доступа к памяти гдето в дочерней проге.

С уважением, Александр.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.