TN3270 échoue avec Violation d’accès dans ntdll ! RtlFreeHeap


Symptômes


Le serveur TN3270 de Microsoft SNA Server 3.0 peut échouer de manière inattendue avec une violation d’accès. Si DRWTSN32. EXE est configuré en tant que débogueur par défaut Windows NT, une entrée sera consignée dans le < ntroot > \DRWTSN32. Fichier journal comme suit :



Application exception occurred:
App: exe\tn3servr.DBG <process ID>
When: <date / time >
Exception number: c0000005 (access violation)
Voici des exemples de différents des routines et des traces de la pile qui peuvent être indiqué lorsque ce problème produit (Notez que tous les échecs d’indiquent un appel de la routine 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
* ou *

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

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
Avec le débogueur NTSD, la trace de la pile peut indiquer l’erreur suivante :


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

Cause


Ce problème a été provoqué après une version incompatible de MSVCRT40. DLL a été installé sur la machine Windows NT exécutant le serveur TN3270. MSVCRT40. DLL prend en charge les fonctions de bibliothèque d’exécution « C » qui peuvent être utilisées et distribuées par les applications de Windows NT tiers développées à l’aide de Microsoft Visual C++. Si une application tierce qui se produit à installer MSVCRT40. DLL et remplacer la version installée par Windows NT 4.0 (ou SNA Server 3.0), cela peut entraîner des violations d’accès TN3270 décrites ci-dessus.


Suivant Microsoft VC ++ la DLL sont fournie par Windows NT 4.0 (et SNA Server 3.0). La « Base » et « Version du fichier » peuvent être affichés à l’aide du programme « Dépend », ou en cliquant sur chaque DLL à l’aide de Windows NT 4.0 « Mon ordinateur » du programme :


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 violation d’accès serveur TN3270 a été observée lorsque les MSVCRT40 suivants. DLL a été installé sur le système par une application tierce (associée à la DLL les versions indiquées ci-dessus) :


Module Date Time Size Base File Version

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

Résolution


Si une ancienne version de MSVCRT40. DLL se trouve dans le chemin d’accès système, cette version doit être renommée et la version standard incluse avec Windows NT 4.0 doit être réappliquée. Voici le processus à utiliser pour résoudre ce problème :
  1. Exécutez la commande de chemin d’accès pour vérifier le chemin d’accès système actuel.
  2. Recherchez toutes les instances de la DLL ci-dessus qui existe dans le chemin d’accès système (Notez que le chemin d’accès du système peut s’étendre sur plusieurs disques).
  3. Exécuter la DEPENDS programmer en fonction de ces DLL et vérifier leur version par rapport à la liste décrite ci-dessus (qui répertorie les versions incluses avec Windows NT 4.0)
  4. Renommez toutes les versions « old » qui peuvent exister sur la machine, s’appliquent à leur place, les versions de Windows NT 4.0. Si plusieurs copies de la même DLL existe dans le chemin d’accès système, renommez toutes les copies et laisser une instance unique dans le répertoire \system32 de < ntroot >.

État


Microsoft a confirmé l'existence de ce problème dans les produits Microsoft répertoriés au début de cet article.