# مهندسی نرم افزار > مباحث مرتبط با مهندسی نرم‌افزار > امنیت در نرم افزار و برنامه نویسی >  رفع مشکل نمایش فایلهای CHM,MHT (یک باگ باستانی از win98 تا Vista)

## BOB

Key: “CHM help files error: The page cannot be displayed” “CHM MHT error Hash # sign in path” “CHM error on network resource”

سلام

ممکن است تا به حال با مشکل عدم نمایش فایلهای راهنمای CHM یا صفحات آرشیو MHT مواجه شده باشید. فایلهایی که از صحت محتوای آنها اطمینان دارید، ناگهان بدون هیچ دلیلی از کار باز می‌ایستند.
اولین بار (شاید هفت سال پیش) در ویندوز 98 با این مشکل برخورد کردم. فایلهای CHM موجود در پوشه “..\..\#Library\..” هیچکدام نمایش داده نمیشدند. مسلما امکان نداشت که همه فایلها ناگهان تخریب شده باشند. (Corruped Files!)

بعد از کمی بررسی دقیقتر متوجه شدم که در صورت کپی کردن فایلها در مسیر دیگر، همگی بدون هیچ مشکلی اجرا میشوند. در نهایت به این نکته رسیدم که مشکل اصلی مربوط تغییر نام پوشه “Library” به “#Library” میباشد. ... واقعا احمقانه بود! در صورت وجود کاراکتر “#” (Hash sign or Sharp) در مسیر فایل مربوطه، چه در نام یکی از پوشه‌های والد و چه در نام خود فایل CHM ، پروسه “HH.exe” قادر به نمایش فایل مربوطه نبود.

مدتها بعد از این ماجرا، به مشکل مشابه‌ای در زمان ظهور ویندوز XP، در مورد فایلهای MHT برخورد کردم. واقعا جالب بود که بعد از این همه سال هنوز این مشکل پابرجا بود. البته همان موقع گزارشی از مشکل مزبور را به همراه چند فایل ضمیمه به Micro$oft ارسال نمودم.
و اکنون پس از گذشت سالها، شاهد تکرار این رسوایی بزرگ در ویندوز Vista هستم. شاید این مشکل باستانی‌ترین باگ ویندوز عزیز باشد. (1998 to 2007)

در هر صورت، پس از جستجو در اینترنت متوجه شدم افراد زیادی تا به حال با این مشکل روبرو بوده و چه بسا فایلهایCHM , MHT یسیار بسیار زیادی به این خاطر پاک شده باشند. نمیدانم تا به حال مرجعی رسما به خاطر این مشکل ادعای غرامت کرده یا خیر..؟؟ (امیدوارم مبلغی از آن غرامت کذایی به من برسه)


با توجه به نکات فوق، برای رفع مشکل به نکات زیر توجه کنید:

1. در صورت وجود کاراکترهای “%” (Percent) , “#” (Hash sign or Sharp) در نام فایل CHM یا MHT ، و یا در نام یکی از پوشه‌های والد فایل مورد نظر، میبایست نام مذکور را تغییر داده و کاراکتر مورد نظر را حذف کنید. مثلا اگر مدتها به این مسئله فکر میکردید که چرا فایلهای CHM موجود در پوشه “..\C#‎\..” خراب شده‌اند، دلیل، وجود کاراکتر "#" در نام پوشه بوده است. پس آن را به “..\C \..” و یا “..\C Sharp\” تغییر دهید.


2. در صورتی که با مشکل مشابه‌ای در حین باز کردن این فایلها در درایوهای شبکه (Network Resources) برخورد کردید، روی فایل مورد نظر راست کلیک کرده و در صفحه Properties روی دکمه Unblock و سپس Apply کلیک کنید. البته روش ساده‌تر اینست که فایل مربوطه را در سیستم خود کپی کرده تا به صورت Local آن را باز کنید. همچنین روش دیگری در سایت Drexplain.com به شرح زیر ذکر شده:

ابتدا Regedit را باز کرده و کلید (key) زیر را بسازید:

 
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\HTMLHelp\1.x  \ItssRestrictions


سپس درون این کلید مقدار DWORD با نام MaxAllowedZone ایجاد کنید. (برای ایجاد آن، کافی است روی کلید ItssRestrictions راست کلیک کرده و” New\DWORD Value” را انتخاب کنید) حال مقدار آن را با توجه به گزینه‌های زیر، به یکی از اعداد 0 تا 4 تغییر دهید. (ترجیحا عدد 1)

 
0 = My Computer 1 = Local Intranet Zone 
2 = Trusted sites Zone 3 = Internet Zone 4 = Restricted Sites Zone


ظاهرا این مسئله به دلیل وجود برخی ملاحظات امنیتی در رابطه با صدور اجازه دسترسی به برخی فایلها، در منابع شبکه بوجود می‌آید.

 
 
http://support.microsoft.com/kb/896054
 
http://support.microsoft.com/kb/312456
 
http://www.drexplain.com/press/chm-f...isplayed-error 


موشکافی:
در مورد گزینه دوم (مسیرهای شبکه) مسئله کاملا حل شده و دلیل آن مشخص است، اما در مورد گزینه اول به بررسی بیشتری نیاز است.
عده‌ای معتقد‌اند دلیل این حساسیت به کاراکتر "#"، انتخاب آن به عنوان Anchor در HTML بوده، و به این دلیل که فایلهای CHM در واقع مجموعه‌ای کامپایل شده از فایلهای Htm هستند، در حین نمایش آنها توسط IE این مشکل بروز می‌کند.(IE و HH در واقع، دو دست در یک جیب هستند)
اما مسلما در مورد کاراکتر "%" این مسئله صادق نیست. همچنین در صورتی که فایلهای MHT مذکور را توسط HH بازکنیم، این مشکل دیده نمیشود. (حالتهای مختلفی که در این زمینه ممکن است روی دهد، در فایل ضمیمه قابل مشاهده‌اند)

فی‌الحال در حین دیباگ کردن پروسه HH متوجه شدم که پس از طی چند مرحله، رشته (String) حاوی مسیر مربوطه (مثلا “C:\Test\AbC#‎cba.Chm” ) از مکان "#" به بعد حذف شده (Truncated) و به چیزی مانند (مثلا “C:\Test\Abc” ) تبدیل می‌شود. 

ممکن است این مسئله مربوط به خطایی در یکی از توابع رشته‌ای (مثلا RTLstring functions در Ntdll.dll ) باشد. هرچند که در انتهای اجرای پروسه مذکور، تابع SetWindowText به درستی، رشته کامل را در نوار عنوان پنجره ثبت کرد. لازم به ذکر است که در حین دیباگ این پروسه در WinME با نتایج متفاوت زیر روبرو شدم:

 
"access violation at 0x5d30e386: read of address 0xffffffff"
"hh.exe error in hhctrl.ocx"


در حال حاظر نیز (اگر فرصتی باشد) می‌خواهم به بررسی گزینه‌های زیر بپردازم:

 
url.dll, mshtml.dll, shdoclc.dll, ntdll.dll, WS2_32.dll, jscript.dll
RtlGetFullPathName_U, RtlInitUnicodeString, RtlDosPathNameToNtPathName_U, 
RtlAnsiStringToUnicodeString, RtlInitAnsiString


در هر صورت از دوستان علاقمند به اینگونه مسائل فنی خواهش میکنم زمانی را صرف دیباگ کردن پروسه‌های HH و IE کرده، تا شاید دلیل اصلی این مشکل را بیابیم.


موفق باشید

----------


## Folaani

شاید مشکل ربطی به این داشته باشه که هش مارک در آدرس فایلهای اچ تی ام ال بعنوان مشخص کنندهء Fragment Identifier بکار میره. البته ظاهرا خودتون هم اشاره کردید بهش!
پس چندان عجیب و بعید نیست که IE باهاشون به مشکل میخوره! حداقل براحتی قابل حدسه. HH هم با % به مشکل نمیخوره چون % تنها در یوآرال ها هست که بنا به محدودیت و مشخصات پروتکل معنای خاصی پیدا میکنه (بطور مثال %20 به معنای فاصلهء خالی هست و غیره) نه در اپلیکیشنهای لوکال که با آدرسهای سیستم فایل کار میکنن.
با این توصیفات ممکنه این یک باگ نبوده باشه به اون معنا؛ گرچه ممکنه اصلاح پذیر بوده باشه.
برای کار با اینطور آدرسها هم بنظرم کافیه فرم URL Encode شدهء اون آدرسها رو وارد کنید.

----------


## 1234567

واقعا  باگ جالبیه
یه ایده خوب برای امنیت نرم افزار بهم دادی
ممنون

----------


## Mohammad_Mnt

راه‌حل: xCHM

----------

