TN3270 nu reușește cu violare de acces în ntdll! RtlFreeHeap


Simptome


Microsoft SNA Server 3.0 TN3270 Server poate să nu reușească în mod neașteptat cu o violare de acces. Dacă DRWTSN32. EXE este configurat ca implicit depanatorul Windows NT, o intrare vor fi înregistrate în < ntroot > \DRWTSN32. Fișierul jurnal după cum urmează:



Application exception occurred:
App: exe\tn3servr.DBG <process ID>
When: <date / time >
Exception number: c0000005 (access violation)
Următoarele sunt exemple de rutine şi urme de stivă care pot fi diferite este indicat atunci când apare această problemă (observați că toate erorile indică o rutină de apelare 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
* sau *

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

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
Cu NTSD depanator atașat, trasarea stivei poate indica următoarea eroare:


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

Cauza


Această problemă a fost cauzată după o versiune nepotrivite de MSVCRT40. DLL-ul a fost instalat pe computer Windows NT în cazul în care a fost execută serverul TN3270. MSVCRT40. DLL acceptă 'C' runtime bibliotecă de funcții care pot fi utilizate și distribuit de terț Windows NT aplicații dezvoltate folosind Microsoft Visual C++. Dacă o aplicație terță parte se întâmplă pentru a instala MSVCRT40. DLL și înlocuiți versiunea instalată de Windows NT 4.0 (sau SNA Server 3.0), acest lucru poate duce la încălcări de acces TN3270 descrise mai sus.


Următoarele Microsoft VC ++ DLL sunt livrate de Windows NT 4.0 (și SNA Server 3.0). "Baza" și "Versiunea de fișier" poate fi vizualizat folosind programul "Depinde" sau făcând clic pe fiecare DLL utilizând Windows NT 4.0 "My Computer" program:


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
Violare de acces TN3270 Server atunci când a fost observată MSVCRT40 următoare. DLL-ul a fost instalat pe sistemul de o aplicație terță parte (cu alte DLL de potrivire la versiunile enumerate mai sus):


Module Date Time Size Base File Version

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

Rezolvare


Dacă o versiune mai veche de MSVCRT40. DLL-ul se află în calea de sistem, această versiune ar trebui să fie redenumit și ar trebui să reutilizată versiunea standard incluse în Windows NT 4.0. Iată procesul se utilizează pentru a rezolva această problemă:
  1. Executați comanda de cale să Verificați calea sistemului curent.
  2. Găsiți toate instanțele de mai sus DLL pe care există în calea de sistem (reţineţi că calea de sistem poate întinde pe mai multe unități).
  3. Executați programul DEPENDS împotriva aceste DLL și pentru a verifica versiunile împotriva lista prezentat mai sus (care listează versiunile incluse în Windows NT 4.0)
  4. Redenumiți orice versiuni "vechi", care pot exista pe computer și se aplică la versiunile de Windows NT 4.0, în locul lor. Dacă mai multe copii ale același DLL există în calea de sistem, redenumiți toate copiile dublate și lăsați o singură instanță în directorul \system32 < ntroot >.

Stare


Microsoft a confirmat că aceasta este o problemă în produsele Microsoft enumerate la începutul acestui articol.