Я обнаружил нарушение прав доступа при вызове библиотеки DLL внутри LabVIEW. Назовем DLL "extcode.dll". Его кода у меня нет, он от внешнего производителя.
Запустив его в Windbg, он остановился с сообщением:
(724.1200): Access violation - code c0000005 (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
ntdll!RtlNewSecurityObjectWithMultipleInheritance+0x12a:
И стек вызовов:
ntdll!RtlNewSecurityObjectWithMultipleInheritance+0x12a
ntdll!MD5Final+0xedfc
ntdll!RtlFindClearBitsAndSet+0xdf4
ntdll!RtlFindClearBitsAndSet+0x3a8
ntdll!RtlFindClearBitsAndSet+0x4b9
ntdll!RtlCreateProcessParametersEx+0x829
ntdll!LdrLoadDll+0x9e
KERNELBASE!LoadLibraryExW+0x19c
KERNELBASE!LoadLibraryExA+0x51
LabVIEW!ChangeVINameWrapper+0x36f5
LabVIEW!ChangeVINameWrapper+0x3970
LabVIEW!ExtFuncDynLibWrapper+0x211
Обратите внимание, что зависимости extcode.dll загружаются до нарушения прав доступа.
Ситуация случайна, но когда это случается, все последующие попытки приводят к ней.
Код представляет собой простую функцию LabVIEW, вызывающую функцию в DLL, а прототип очень простой (int function(void)
), поэтому он не может быть неправильной конфигурацией параметров вызова или арифметикой указателя. Я проверил каждую комбинацию соглашений о вызовах и уровней проверки ошибок.
DLL отлично работает при вызове в других средах (.NET и C).
Я обнаружил, что RtlFindClearBitsAndSet
связано с манипуляциями с битовыми массивами
О чем это заставляет задуматься? Как вы думаете, проблема в extcode.dll, LabVIEW или Windows?
PS: Я использую 64-разрядную версию LabVIEW 2010, в 64-разрядной версии Windows 7 (а extcode.dll - 64-разрядная версия). Воспроизвести на 32-битной системе мне не удалось.
ИЗМЕНИТЬ 18/11
Я закончил тем, что создал автономный исполняемый файл, который обертывает DLL; LabVIEW общается с ним по каналам. Он работает отлично, но я все еще не понимаю, почему загрузка DLL в LabVIEW может привести к сбою.