CreateProcess с флагом DEBUG_PROCESS вызывает ошибку 50 на некоторых исполняемых файлах

Я пытаюсь написать небольшой отладчик. Мой упрощенный код

STARTUPINFOA sui;
ZeroMemory( &sui, sizeof(sui) );
sui.cb = sizeof(sui);
PROCESS_INFORMATION pi;
ZeroMemory( &pi, sizeof(pi) );

DWORD dwFlags = DEBUG_PROCESS;
string program = "program.exe";
if (! CreateProcessA(NULL, (char*) program.c_str(), NULL, NULL, TRUE, dwFlags, NULL, NULL, &sui, &pi))
printf("%s failed. LastError = %d", program.c_str(), GetLastError());

На большом количестве исполняемых файлов работает нормально.

Но, например, на исполняемых файлах, скомпилированных в C #, этот фрагмент кода выводит «program.exe fail. LastError = 50». Ошибка 50: ERROR_NOT_SUPPORTED (http://msdn.microsoft.com/en-us/library/windows/desktop/ms681382(v=vs.85).aspx). Что может быть причиной этого? Как я могу отлаживать все виды двоичных файлов?

4

Решение

Вам не нужно будет много использовать для неуправляемого отладчика для отладки управляемого исполняемого файла. Проверьте Образец MDbg чтобы увидеть, что это займет.

Ошибка ERROR_NOT_SUPPORTED, однако, не является исключительной для управляемых исполняемых файлов, хотя, скорее всего, вы также получите ее при попытке отладки 64-разрядного исполняемого файла с помощью 32-разрядного отладчика. Добавьте целевую платформу x64 в свой проект, чтобы создать ее 64-битную версию.

5

Другие решения

Это потому, что вы используете CreateProcessA, а не CreateProcessW. Переключитесь на UNICODE-версию (кстати, вы всегда должны использовать ее в новых приложениях):

STARTUPINFOW sui;
ZeroMemory(&sui, sizeof(sui));
sui.cb = sizeof(sui);
PROCESS_INFORMATION pi;
ZeroMemory(&pi, sizeof(pi));

DWORD dwFlags = DEBUG_PROCESS;
wchar_t *program = L"c:\\temp\\test.exe";
if (!CreateProcessW(NULL, program, NULL, NULL, TRUE, dwFlags, NULL, NULL, &sui, &pi))
wsprintf(L"%s failed. LastError = %d", program, GetLastError());
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector