TN3270 与 ntdll 中的访问冲突会失败 !RtlFreeHeap


症状


Microsoft SNA 服务器 3.0 TN3270 服务器可能会由于存在访问冲突意外失败。如果 DRWTSN32。EXE 将被配置为默认 Windows NT 调试程序、 一个条目将记录在 < ntroot > \DRWTSN32。日志文件中,如下所示:



Application exception occurred:
App: exe\tn3servr.DBG <process ID>
When: <date / time >
Exception number: c0000005 (access violation)
以下是 ntdll 的各种例程和堆栈跟踪可能的示例指示发生此问题 (请注意所有的故障指示调用的例程 !RtlFreeHeap):


function: RtlpCoalesceFreeBlocks
FAULT ->77f7cf1b 8908 mov [eax],ecx

*----> Stack Back Trace <----*

FramePtr ReturnAd Param#1 Param#2 Param#3 Param#4 Function Name
0c09ff14 77f64c12 01450000 0099a2e8 0c09ff40 00000000 ntdll!RtlpCoalesceFreeBlocks
0c09ff44 10201ba4 01450000 00000000 0099a2f0 762b1da9 ntdll!RtlFreeHeap
* 或 *

function: RtlDestroyHeap
FAULT ->77f7d0d8 8908 mov [eax],ecx

*----> Stack Back Trace <----*

FramePtr ReturnAd Param#1 Param#2 Param#3 Param#4 Function Name
0bfaff14 77f64c12 01450000 00a71638 0bfaff40 00000000 ntdll!RtlDestroyHeap
0bfaff44 10201ba4 01450000 00000000 00a71640 762b1da9 ntdll!RtlFreeHeap
* 或 *

function: RtlpInsertUnCommittedPages
FAULT ->77f642fb 8b4d00 mov ecx,[ebp]

*----> Stack Back Trace <----*

FramePtr ReturnAd Param#1 Param#2 Param#3 Param#4 Function Name
00e5fcac 77f64ea7 00000000 00ec4000 00066000 00c50000 ntdll!RtlpInsertUnCommittedPages
00e5fcec 77f64c3a 00c50000 00ec3370 0000cf00 001425f8 ntdll!RtlpDeCommitFreeBlock
00e5fd18 0041ad47 00c50000 00000000 00ec3378 0041b22a ntdll!RtlFreeHeap
使用 NTSD 调试器附加,堆栈跟踪可能指示时出现以下错误:


NTSD: access violation
eax=00000000 ebx=00000000 ecx=0ce83040 edx=01450548 esi=0099fea0 edi=01450000
eip=77f64cfe esp=0c09ff2c ebp=0c09ff44 iopl=0 nv up ei pl zr na po nc
cs=001b ss=0023 ds=0023 es=0023 fs=0038 gs=0000 efl=00010246 ntdll!RtlFreeHeap+0x168:
77f64cfe 8908 mov [eax],ecx ds:0023:00000000=????????

0:013> kb
ChildEBP RetAddr Args to Child
0c09ff44 10201ba4 01450000 00000000 0099fec0 ntdll!RtlFreeHeap+0x168
0c09ffec 00000000 0101b2c0 00000000 00000000 Image@10200000!free+0x17

原因


这个问题已引起之后的 MSVCRT40 版本不匹配。在 TN3270 服务器所运行的 Windows NT 计算机上已安装 DLL。MSVCRT40。DLL 支持 'C' 这可能使用并由第三方 Windows NT 应用程序是使用 Microsoft Visual C++ 开发的分布式运行时库函数。如果第三方应用程序不会安装 MSVCRT40。DLL 中,并替换版本安装的 Windows NT 4.0 (或 SNA 服务器 3.0),这可能会导致上述 TN3270 访问冲突。


通过 Windows NT 4.0 (和 SNA 服务器 3.0) 附带以下 Microsoft VC + + DLL。"基础"和"文件版本"使用"取决于"程序中,可以查看,或通过使用 Windows NT 4.0 的每个 DLL 右键单击"我的电脑"计划:


Module Date Time Size Base File Version

MSVCRT.DLL 10/14/96 02:38a 267,536 0x779F0000 4.20.0.6201
MSVCRT40.DLL 10/14/96 02:38a 65,024 0x779D0000 4.2000.0.6172
MFC40.DLL 10/14/96 02:38a 924,432 0x762B0000 4.1.0.6139
MSVCIRT.DLL 10/14/96 02:38a 74,752 0x780A0000 4.20.0.6201
TN3270 服务器访问冲突已观察到当下面的 MSVCRT40。DLL 在系统上安装由第三方应用程序 (使用该 DLL 的匹配上面列出的版本):


Module Date Time Size Base File Version

MSVCRT40.DLL 9/16/96 07:50a 312,832 0x10200000 4.0.0.5270

解决方案


如果旧版本的 MSVCRT40。DLL 位于系统路径中,应重命名此版本应重新应用包括 Windows NT 4.0 中的标准版本。下面是用来解决这一问题的过程:
  1. 运行路径命令来检查当前系统路径。
  2. 找到系统路径 (注意,系统路径可能跨多个驱动器) 中的上述 DLL 的存在的所有实例。
  3. 上面的运行依赖于对这些 DLL 的程序并检查其版本对照列表记录 (其中列出了包含在 Windows NT 4.0 版本)
  4. 重命名所有"旧"版本,其中可能会存在在机上,并应用在其位置的 Windows NT 4.0 版本。 如果同一个 DLL 的多个副本存在于系统路径中,重命名所有复制副本和 < ntroot > \system32 目录中保留的一个实例。

状态


Microsoft 已经确认这是在本文开头部分列出的 Microsoft 产品中的问题。