3221356611
это 0xC0020043
- RPC_NT_INTERNAL_ERROR
998
это 0x3e6
- ERROR_NOACCESS
( Неверный доступ к ячейке памяти ) [ 1140] ваша главная ошибка, которую вы безоговорочно возвращаете DBG_CONTINUE
всегда. но на EXCEPTION_DEBUG_EVENT
вы должны вернуть этот код, только если вы обрабатываете исключение. в противном случае (и если dwFirstChance == TRUE
, так что это исключение первого шанса), вы должны вернуть DBG_EXCEPTION_NOT_HANDLED
. если вы вернете DBG_CONTINUE
- программа начнет выполнение с текущего контекста. если вы вернете DBG_EXCEPTION_NOT_HANDLED
- KiUserExceptionDispatcher
будет вызван в целевом процессе, который вызовет RtlDispatchException
и где будут вызываться обработчики исключений. читать дальше - Структурная обработка исключений
, но поскольку вы никогда не возвращаете DBG_EXCEPTION_NOT_HANDLED
- обработчики исключений программы никогда не вызывались. по вашим 2 кодам исключений даже легко найти место, где это происходит:
вызывается RpcpRaiseException
, внутренний вызов которого RaiseException(ERROR_NOACCESS..)
, так что вы просматриваете исключение 998 , если вы вернете здесь DBG_EXCEPTION_NOT_HANDLED
- приложение само обработает это исключение и никогда не вернется из вызова RaiseException
. контекст будет перенесен в блок __except{}
. но потому что вы возвращаете DBG_CONTINUE
- управление возвратом RaiseException
и вызов RpcReportFatalError
, внутренний вызов которого RaiseException(RPC_NT_INTERNAL_ERROR..)
, поэтому вы и видите 3221356611 (0xC0020043)
вашу следующую ошибку, которую вы не закрыли hFile
на LOAD_DLL_DEBUG_EVENT
- Когда отладчик завершит работу с этим файлом, он должен закрыть дескриптор с помощью функции CloseHandle. та же ошибка на CREATE_PROCESS_DEBUG_EVENT
и ваша ошибка в том, как вы начинаете процесс отладки - вы не должны использовать флаг CREATE_SUSPENDED
, не должны использовать DebugActiveProcess
и ResumeThread
. вам нужно только установить DEBUG_PROCESS
или DEBUG_ONLY_THIS_PROCESS
и все. не нужно создавать процесс в приостановленном состоянии, а main не вызывать DebugActiveProcess
здесь. этот вызов API плохо спроектирован, он создает дополнительный поток в целевом процессе. скажем, хр на этом этапе это вообще было фатально.
Попробуйте shellexecute = вместо открытого =
[autorun] shellexecute=MyInstaller-1.0.0.msi label=My CD Label icon=MyIcon.ico
Я могу ответить на свой собственный вопрос. После чтения статей, связанных Лучом, я создал следующий AUTORUN.INF, который работает:
[autorun]
shellexecute=MyInstaller-1.0.0.msi
label=My CD Label
icon=MyIcon.ico
Файл AUTORUN.INF помещается в корневой каталог CD наряду с файлом значка и msi упомянутым файлом.