TN3270 ล้มเหลว ด้วยการละเมิดการเข้าถึงใน ntdll RtlFreeHeap


อาการ


Microsoft จัด 3.0 TN3270 เซิร์ฟเวอร์อาจล้มเหลวโดยไม่คาดหมายกับการละเมิดการเข้าถึง ถ้า DRWTSN32 กำหนดค่าเริ่มต้น Windows NT ดีบัก EXE รายการจะถูกล็อกใน < 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 รุ่นที่ไม่ตรงกัน DLL ถูกติดตั้งบนเครื่องคอมพิวเตอร์ Windows NT ที่เซิร์ฟเวอร์ TN3270 ถูกเรียกใช้ MSVCRT40 DLL สนับสนุนฟังก์ชันไลบรารีรันไทม์ 'C' ซึ่งอาจใช้ และแจกจ่าย โดยโปรแกรมประยุกต์ใน Windows NT ของบุคคลที่สามที่พัฒนาโดยใช้ Visual C++ ของ Microsoft ถ้าแอพลิเคชันของบุคคลที่สามที่เกิดขึ้นในการ ติดตั้ง MSVCRT40 DLL และแทนรุ่นติดตั้ง โดย Windows NT 4.0 (หรือจัดเซิร์ฟเวอร์ 3.0) ซึ่งทำให้การละเมิดการเข้าถึง TN3270 ที่อธิบายไว้ข้างต้น


ต่อไปนี้ Microsoft VC ++ DLL ของมีการจัดส่ง โดย Windows NT 4.0 (จัดเซิร์ฟเวอร์ 3.0) "พื้นฐาน" และ "แฟ้มรุ่น" สามารถดูได้โดยใช้โปรแกรม "ขึ้น" หรือ ด้วยการคลิกขวาบนแต่ละ DLL ที่ใช้ Windows NT 4.0 "คอมพิวเตอร์ของฉัน" โปรแกรม:


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. เรียกใช้ DEPENDS โปรแกรมกับ DLL ของเหล่านี้ และตรวจสอบรุ่นของเทียบกับรายชื่อจัดทำเอกสารข้างต้น (ซึ่งแสดงรายการเวอร์ชันที่มาพร้อมกับ Windows NT 4.0)
  4. เปลี่ยนชื่อรุ่นใด ๆ "เก่า" ซึ่งอาจมีอยู่บนเครื่องคอมพิวเตอร์ และใช้หมายเลขรุ่นของ Windows NT 4.0 ในสถานที่ของพวกเขา ถ้า DLL เดียวกันหลายสำเนามีอยู่ในเส้นทางระบบ เปลี่ยนชื่อสำเนาทั้งหมด และปล่อยให้อยู่เพียงอินสแตนซ์เดียวในไดเรกทอรี \system32 < ntroot >

สถานะ


Microsoft ยืนยันว่า นี่เป็นปัญหาในผลิตภัณฑ์ของ Microsoft ที่แสดงไว้ในตอนต้นของบทความนี้