Нарушение прав доступа при загрузке DLL - PullRequest
0 голосов
/ 19 июля 2011

Простое приложение C прекрасно компилируется на MSVC6, но при запуске вызывает нарушение прав доступа.

При запуске приложения в WinDbg возникает ошибка AV при загрузке rasadhlp.dll (файл Windows).

Вопрос: Что может вызвать нарушение прав доступа при загрузке Windows DLL?

Я привык работать над различными никсами, а не окнами, поэтомуможет быть что-то действительно очевидное, что я упускаю.

[...]
ModLoad: 77920000 77a13000   C:\WINDOWS\system32\SETUPAPI.dll
ModLoad: 76fc0000 76fc6000   C:\WINDOWS\system32\rasadhlp.dll
  (f38.a08): Access violation - code c0000005 (first chance)
  First chance exceptions are reported before any exception handling.
  This exception may be expected and handled.
  eax=00000000 ebx=00000000 ecx=00000000 edx=0049f8f0 esi=0049f8f0 edi=00000000
  eip=7c918fea esp=0012fbdc ebp=0012fc50 iopl=0         nv up ei ng nz na pe nc
  cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00010286
  ntdll!RtlpWaitForCriticalSection+0x5b:
  7c918fea ff4010          inc     dword ptr [eax+10h]  ds:0023:00000010=????????
0:000> g
  (f38.a08): Access violation - code c0000005 (!!! second chance !!!)
  eax=00000000 ebx=00000000 ecx=00000000 edx=0049f8f0 esi=0049f8f0 edi=00000000
  eip=7c918fea esp=0012fbdc ebp=0012fc50 iopl=0         nv up ei ng nz na pe nc
  cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000286
  ntdll!RtlpWaitForCriticalSection+0x5b:
  7c918fea ff4010          inc     dword ptr [eax+10h]  ds:0023:00000010=????????

Примечание: приложение скомпилировано на win2k, протестировано на XP.(которые по разным странным причинам нельзя изменить прямо сейчас ...)

[править]: трассировка программы:

ntdll!RtlpWaitForCriticalSection+0x5b
ntdll!RtlEnterCriticalSection+0x46
msvcrt!vprintf+0x18
intl!libintl_vfprintf+0xa8
intl!libintl_fprintf+0x1f
image00400000+0x6239
MSCTF!DllGetClassObject+0x1de9
ntdll!RtlpNtMakeTemporaryKey+0x7ec8
ntdll!RtlInitializeSListHead+0x115c0
ntdll!iswdigit+0x339
ntdll!LdrGetProcedureAddress+0x4b
image00400000+0x626f4

[edit 2]: Я знаю, что исключение сначала перехватывается отладчиком, и это совершенно нормально.В журнале вы заметите, что я вручную пропускаю исключение первого шанса и заставляю его подниматься в мою программу.Меня интересует причина возникновения такой ошибки, а не ее обработка.

Ответы [ 2 ]

2 голосов
/ 19 апреля 2012

Нарушения доступа в RtlpWaitForCriticalSection при загрузке библиотеки, как правило, вызваны тем, что библиотека пытается использовать LoadLibrary или код вне kernel32.dll в DllMain, поскольку ОС удерживает «блокировку загрузчика» при вызове этой подпрограммы.

2 голосов
/ 19 июля 2011

См. Поддержка Microsoft - Обработка исключений первого и второго шансов

Обычной практикой является использование SEH в качестве механизма сигнализации.Некоторые интерфейсы прикладного программирования (API) регистрируют обработчик исключений в ожидании состояния сбоя, которое, как ожидается, возникнет на нижнем уровне.

Когда возбуждается исключение, обработчик может исправить или проигнорировать условие, вместо того, чтобы позволить сбою распространяться вверх через промежуточные слои.Это очень полезно в сложных средах, таких как сети, где ожидаются частичные сбои, и нежелательно проваливать всю операцию только из-за сбоя одной из нескольких дополнительных частей.В этом случае исключение можно обработать, чтобы приложение не распознало, что возникло исключение.

Однако, если приложение отлаживается, отладчик видит все исключения раньше, чем программа.Это различие между первым и вторым случайным исключением: отладчик получает первый шанс увидеть исключение (отсюда и имя).Если отладчик позволяет продолжить выполнение программы и не обрабатывает исключение, программа увидит исключение как обычно.Если программа не обрабатывает исключение, отладчик получает второй шанс увидеть исключение.В этом последнем случае программа обычно вылетает, если отладчик не присутствует.

Если вы не хотите видеть исключение первого шанса в отладчике, вы должны отключить обработку исключения первого шанса для конкретного кода исключения,В противном случае при возникновении первого случайного исключения может потребоваться указать отладчику передачу исключения в программу, которая будет обрабатываться как обычно.

...