¡TN3270 produce un error de infracción de acceso en ntdll! RtlFreeHeap


Síntomas


El servidor TN3270 de Microsoft SNA Server 3.0 puede fallar inesperadamente con una infracción de acceso. Si DRWTSN32. EXE está configurado como el depurador de Windows NT de forma predeterminada, se registra una entrada en el elemento < ntroot > \DRWTSN32. El archivo de registro como sigue:



Application exception occurred:
App: exe\tn3servr.DBG <process ID>
When: <date / time >
Exception number: c0000005 (access violation)
Los siguientes son ejemplos de diferentes rutinas y seguimientos de la pila que pueden ser indican cuando este problema produce (tenga en cuenta que todos los errores indican una rutina llamada de 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
* o *

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
* o *

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
Con el depurador NTSD adjunto, el seguimiento de pila puede indicar el error siguiente:


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

Causa


Este problema se produjo después de una versión no coincidente de MSVCRT40. DLL se instaló en el equipo de Windows NT donde se ejecuta el servidor TN3270. MSVCRT40. DLL es compatible con funciones de biblioteca de tiempo de ejecución 'C' que se pueden usar y distribuir aplicaciones de Windows NT de terceros desarrolladas con Microsoft Visual C++. Si ocurre una aplicación de terceros instalar MSVCRT40. DLL y reemplazar la versión instalada por Windows NT 4.0 (o en SNA Server 3.0), esto puede conducir a infracciones de acceso TN3270 descritas anteriormente.


El siguiente Microsoft VC ++ DLL son enviado por Windows NT 4.0 (y SNA Server 3.0). La "Base" y "File Version" se pueden ver mediante el programa "DEPENDE" o pulsando en cada DLL mediante Windows NT 4.0 "Mi equipo" del programa:


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
La infracción de acceso de servidor TN3270 observó cuando el siguiente MSVCRT40. DLL se instaló en el sistema mediante una aplicación de terceros (otras DLL que coincida con las versiones anteriores):


Module Date Time Size Base File Version

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

Solución


Si una versión antigua de MSVCRT40. DLL se encuentra en la ruta de acceso del sistema, debe cambiarse a esta versión y la versión estándar incluida con Windows NT 4.0 debe volver a aplicar. Aquí es el proceso a utilizar para resolver este problema:
  1. Ejecute el comando de ruta para comprobar la ruta del sistema actual.
  2. Busque todas las instancias de la DLL anterior que existe en la ruta de acceso de sistema (tenga en cuenta que la ruta del sistema puede abarcar varias unidades).
  3. Ejecutar la DEPENDS programar estas DLL y comprobar sus versiones contra la lista documentada (que enumera las versiones incluidas con Windows NT 4.0)
  4. Cambiar el nombre de las versiones de "antiguas" que puedan existir en el equipo y aplicar las versiones de Windows NT 4.0 en su lugar. Si hay varias copias del mismo archivo DLL en la ruta de acceso del sistema, cambie el nombre de todas las copias duplicadas y deje una sola instancia en el directorio \system32 de < ntroot >.

Estado


Microsoft ha confirmado que se trata de un problema de los productos de Microsoft enumerados al principio de este artículo.