Автоматически выполните файл MSI на CD

  • 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 кодам исключений даже легко найти место, где это происходит: enter image description here

    вызывается 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 плохо спроектирован, он создает дополнительный поток в целевом процессе. скажем, хр на этом этапе это вообще было фатально.

6
задан Adam Pierce 26 November 2008 в 05:20
поделиться

2 ответа

Попробуйте shellexecute = вместо открытого =

[autorun]
shellexecute=MyInstaller-1.0.0.msi
label=My CD Label
icon=MyIcon.ico
6
ответ дан 17 December 2019 в 00:16
поделиться

Я могу ответить на свой собственный вопрос. После чтения статей, связанных Лучом, я создал следующий AUTORUN.INF, который работает:

[autorun]
shellexecute=MyInstaller-1.0.0.msi
label=My CD Label
icon=MyIcon.ico

Файл AUTORUN.INF помещается в корневой каталог CD наряду с файлом значка и msi упомянутым файлом.

1
ответ дан 17 December 2019 в 00:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: