c - 加载dll时访问冲突

标签 c windows visual-c++ dll access-violation

普通 C 应用程序可以在 MSVC6 上正常编译,但在运行时会引发访问冲突。

在 WinDbg 中运行应用程序时,加载 rasadhlp.dll(Windows 文件)时出现 AV 错误。

问题:加载 windows dll 时什么可能导致访问冲突?

我习惯于处理各种 nixes 而不是 windows,所以可能有一些非常明显的东西我错过了。

[...]
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

[编辑 2]: 我知道异常首先被调试器捕获,这是完全正常的。您会在日志中注意到我手动跳过了第一次机会异常,并强制将其上升到我的程序中。我想知道这种错误的起源,而不是处理。

最佳答案

加载库时 RtlpWaitForCriticalSection 中的访问冲突通常是由于库试图在 DllMain 中使用 LoadLibrary 或 kernel32.dll 之外的代码引起的,因为操作系统在调用时持有“加载程序锁”那个例程。

关于c - 加载dll时访问冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6746316/

相关文章:

c - C 中 SLL 的 Delete(node ) 的正确语法是什么?

c - C eventcounter + sequencer 中的死锁并发问题

windows - 什么是 452/0x1C4 CPU?

C++判断当天软件是否未打开(Win​​dows)

c++ - Windows::Storage::ApplicationData::Current 在 C++ 中找不到

c++ - 最新的 OpenGL 应用程序是否必须使用 GLEW?

c - 在 C 中使用 win32 在父线程中创建未知数量的子线程?

c - C中的简单多线程错误?

c - 我可以在 Windows 上用 C 创建多少个定时器?

c++ - 我可以在写入磁盘之前修改 ofstream 吗?