Monday, December 7, 2009

සිංහලෙන් win32 Portable Executable format - part 7

හුග කාලෙකට පස්සෙ සතියක නිවාඩුවක් ලැබුන. ඒ හින්ද ආයෙමත් blog එක ලියන්න වෙලාවක් වෙන් කර ගන්න පුළුවන් කමක් ලැබුන. පසුගිය කොටස් වල ලිව්වෙ resource data ලබා ගන්න ආකාරය, මේ ‍කොටසේ සිට ලියන්නෙ එම resource data තිබෙන format එක ගැනයි.




Resource Data

මෙම කොටසෙහි ඇත්තේ Resource Data වේ. ඒවා ගිය වර කලාපයේ දක්වන ලද Resource types 14 ට හෝ Custom resource එකක් විය හැක. එහි මෙම Resource Data තිබෙන ස්ථානය පිළිබද විස්තරයක් කර ඇත. මෙම එක් එක් Resource Data වලින් data ලබා ගන්නා ආකාරය පහත දක්වා ඇත.

RT_CURSOR (0x00000001)
මෙහි ඇත්තේ PE සදහා යොදා ගන්නා Cursors වේ. මෙහි cursor එකෙහි සම්පූර්ණ data ප්‍රමාණයම නොමැත. මෙහි ඇති data මගින් අප cursor එක නිර්මානය කර ගත යුතුය. මෙය සිදු කිරීමට නම් අප cursor data format එක ගැන දැනගෙන සිටිය යුතුය.

එක් cursor file එකක් තුල images කීපයක් තිබිය හැක. එසේ තිබෙන්නේ වෙනස් bit depths හා වෙනස් dimentions සහිත එකම image එක වේ. නමුත් මෙහිදී ඇති cursor එකක තිබෙන්නේ තනි image එකක් පමණි. RT_CURSORGROUP යටතේ මෙම තනි cursor, group වන ආකාරය සදහන්ව ඇත. අපට අවශ්‍ය පරිදි එක් image එකක් සහිත තනි cursor file එකක් හෝ image කීපයක් එක් කර සාදා ගන්නා තනි cursor file එකක් වුවද ලබා ගත හැක.

Cursor File Format (.cur)
මෙහි පළමු 6 bytes සම්පූර්ණ cursor එකටම අදාල වේ. පළමු බයිට 4, 0x00000200 ලෙස වේ. ඊලග 2 bytes මගින් cursor images ගනන දක්වා ඇත. ඉන් පසු එක් image එකක් සදහා 16 bytes බැගින් වන headers තිබේ. එම header එකක පළමු 2 bytes මගින් dimentions දක්වා ඇත‍. මීලග 2 bytes මගින් Bit depth දක්වා තිබුනද 0x0000 යන අගයේද තිබිය හැක. එය 0x0000 ලෙස ඇත්නම් True color වේ. එම අගය ලබා ගත යුත්තේ RT_CURSORGROUP යන ස්ථානයෙන් වේ. මීලග 2 bytes මගින් click point එකෙහි x කණ්ඩාංකය දක්වා ඇත. එලෙසම ඊලග 2 bytes මගින් y කණ්ඩාංක දක්වා ඇත. මීලග 4 bytes මගින් cursor data හි විශාලත්වය දක්වා ඇත. මීලග 4 bytes මගින් cursor එකෙහි data ආරම්හ වන ස්ථානය headers හි ආරම්භක ස්ථානයට සාපේක්ෂව දක්වා ඇත. ඉන් පසුව cursor data පිහිටා ඇත. එහි පිහිටීම පහත රෑප සටහනේ දක්වා ඇත.



cursor data වෙත ගිය විට ඇත්තේ එම cursor එකෙහි x හා y කණ්ඩාංක හා cursor data පමණි. මෙහි dimentions, cursor data තුලින් ලබා ගත හැක.

RT_BITMAP (0x00000002)
මෙහි ඇත්තේ PE එක සදහා යොදා ගන්නා pictures වේ. ඒවා .bmp ආකාරයෙන් තිබේ. මෙහිද සම්පූර්ණ picture එක දක්නට නොලැබේ. එය අප picture data තුලින් නිර්මාණය කර ගත යුතු වේ.

Bitmap Image File Format (.bmp)
මෙම format එකෙහි පළමු 2 bytes 0x424D ලෙස වේ. මීලග 4 bytes මගින් image data හි විශාලත්වය දක්වා ඇත. මීලග 4 bytes 0x00000000 ලෙස තබන්න. මීලග 4 bytes, bit depth මත තීරනය වේ. නිල් පාටින් දක්වා ඇති ස්ථානයේ ඇත්තේ 0x00000000 නම්, රතු පාටින් දක්වා ඇති ස්ථානයේ අගය 0x0004 වන විට 0x00000076 ලෙසද, 0x0008 වන විට 0x00000436 ලෙසද, 0x0018 හෝ 0x0020 වන විට 0x00000036 ලෙසද විය යුතුය. නිල් පාටින් ඇති ස්ථානයේ වෙනත් අගයක් ඇත්නම් එම අගය 0x04 න් ගුණ කර 0x36 ක් එකතු කර ලිවිය යුතුය. ඉන් පසුව image data තිබේ.



RT_ICON (0x00000003)
මෙහි ඇත්තේ PE එක සදහා භාවිතා කරන icons වේ. මෙයට ඇත්තේ cursor format එකට සමාන format එකකි.

Icon File Format (.ico)
එහි පළමු 4 bytes, 0x00000100 ලෙස යොදන්න. ඊලග 2 bytes මගින් icon images ගනන දක්වා ඇත. header එකක පළමු 2 bytes මගින් dimentions දක්වා ඇත. ඊලග 2 bytes මගින් bit depth එක දක්වා ඇත. එය 0x0000 ලෙස ඇත්නම් True color වේ. එම අගය ලබා ගත යුත්තේ RT_ICONGROUP යන ස්ථානයෙන් වේ. මීලග 4 bytes සදහා 0x00000000 යොදන්න. මීලග 4 bytes මගින් icon data හි විශාලත්වය දක්වා ඇත. මීලග 4 bytes මගින් icon එකෙහි data ආරම්හ වන ස්ථානය දක්වා ඇත. ඉන් පසුව icon image එකට අදාල data තිබේ.



group කරන ලද icon එකෙහි පිහිටීමද මෙහි දක්වා ඇත.



RT_MENU (0x00000004)
මෙහි තිබෙන්නේ PE එකෙහි ඇති Menus වේ. මෙහි menu ආකාර දෙකකින් තිබේ. මෙහි පළමු byte එක 0x00 ලෙස ඇත්නම් එක් ආකාරයක්ද, 0x01 ලෙස ඇත්නම් තවත් ආකාරයක්ද වේ. එය පහත විස්තර කර ඇත.

පළමු byte එක 0x00 ලෙස ඇත්නම්,
පළමු 4 bytes අත් හරින්න. පසුව ඇත්තේ menu items වේ. එක් menu item එකක් ගත් විට
එහි පළමු 2 bytes මගින් පෙන්නුම් කරනුයේ attributes වේ. එය bit ආකාරයෙන් ගත් විට එහි 9 වැනි bit එක 1 ලෙස සටහන්ව ඇත්නම් එම menu item එක එම munu level එකෙහි අවසන් munu item එක වේ. එසේම 12 වැනි bit එක 1 ලෙස ඇත්නම් එම menu item එකෙන් sub menu එකක් ආරම්භ වේ. මෙම 2 bytes 0x0000 ලෙස ඇත්නම් එය ඉහත ආකාර දෙකට අයත් නොවන menu item එකක් වේ.
දෙවන 2 bytes මගින් menu item ID එක දැක්වේ. මෙම ආකාරයේ menu වල sub menu එකක් ආරම්භ වන items (popup items) commands ලබා දීම සදහා භාවිතයට නොගනී. එම නිසා එකම item ID එක වුවද තිබිය හැක. මීලගට ඇත්තේ menu text එක වේ. එය 2 bytes බැගින් 0x0000 හමු වන තෙක් කියවිය යුතුය. menu text එක NULL අගයක් නම් එමගින් කියවනුයේ එය separator එකක් බවය.
එක් menu item හි සැකසුම පහත ආකාර වේ.



මෙහි පළමු item එකෙහි පළමු 2 bytes හි 12 වන bit එක 1 බැවින් එමගින් sub menu එකක් ආරම්භ වේ. එම නිසා Properties යන item එක Printer යන item එකෙහි sub menu එකක් වේ. Close යන item එකෙහි පළමු 2 bytes හි 9 වැනි bit එක 1 ලෙස ඇති බැවින් එම ස්ථානයෙන් sub menu එක අවසන් වේ. එම නිසා Document යන්න Printer යන item එක ඇති level එකෙහිම ඇති item එකක් වේ. Help යන item එකෙහි පළමු 2 bytes හි 9 වැනි bit එක 1 බැවින් එම ස්ථානයෙන් menu එක අවසන් වේ.

පළමු byte එක 0x01 ලෙස ඇත්නම්,
පළමු 8 bytes අත් හරින්න. ඒවායින් කෙරෙනුයේ menu එකෙහි වර්ගය හදුනා ගැනීමයි. ඉන් පසුව ඇත්තේ menu items වේ. මෙම සෑම menu item එකක්ම ආරම්භ වනුයේ file offset එක 4 හි ගුණාකාරයක් වන ස්ථානයකිනි. එනම් මෙම කොටසෙහි file alignment එක 4 ක් වේ. මෙම එක් menu item එකක් ගත් විට
එහි පළමු 8 bytes මගින් properties පෙන්නුම් කරයි. properties පහත ආකාර විය හැක.
MFT_STRING
මෙහි අඩංගු වන්නේ string එකක් බව කියවේ.



MFT_SEPARATOR
මෙම 8 bytes හි 7 වන byte එක 0x08 ලෙස ඇත්නම් මෙය separator එකක් බව කියවේ.



MFT_RADIOCHECK
මෙහි 7 වන byte එක 0x02 ලෙස ඇත්නම් menu item කිහිපයක් අතුරින් එක් item එකක් පමණක් තෝරා ගත හැකි සේ සැකසේ.



MFT_RIGHTORDER
මෙහි 7 වන byte එක 0x20 ලෙස ඇත්නම් එම ස්ථානයේ සි‍ට එකම level එකෙහි ඉදිරියට ඇති menu items දකුණු කෙලවරේ සිට සැකසේ.



MFT_RIGHTJUSTIFY
මෙහි 7 වන byte එක 0x40 ලෙස ඇත්නම් menu bar එකෙහි එම ස්ථානයේ සි‍ට ඉදිරියට ඇති menu items දකුණු කෙලවරේ සිට සැකසේ.



MFT_MENUBARBREAK
මෙහි 8 වන byte එක 0x20 ලෙස ඇත්නම් menu bar එක දෙකකට වෙන් වේ.



MFT_MENUBREAK
මෙහි 8 වන byte එක 0x40 ලෙස ඇත්නම් menu එක දෙකකට වෙන් වේ.



MFS_DEFAULT
3 වන byte එක 0x10 ලෙස ඇත්නම් select වී තිබිය යුතු menu item එක දක්වා ඇත.



MFS_CHECKED
4 වන byte එක 0x08 ලෙස ඇත්නම් මෙහි checked = true ලෙස සැකසේ.



MFS_ENABLED
මෙමගින් menu item එක enable බව කියවේ.

MFS_GRAYED
4 වන byte එක 0x03 ලෙස ඇත්නම් එම menu item එක disable බව කියවේ.



properties වලින් පසුව ඇති 4 bytes මගින් menu item ID එක දැක්වේ.
ඉන් පසු ඇති 2 bytes මගින් attributes දක්වා ඇත. මෙය bit ආකාරයෙන් ගත් විට 9 වැනි bit එක 1 ලෙස ඇත්නම් එම menu item එක එම level එකෙහි අවසන් menu item එක වේ. එසේම 16 වන bit එක 1 ලෙස ඇත්නම් එම ස්ථානයෙන් sub menu එකක් ආරම්භ වේ.
ඉන් පසුව ඇත්තේ menu item text එක වේ. එය 2 bytes බැගින් 0x0000 හමු වන තෙක් කියවිය යුතුය.
අදාල menu item එක sub menu එකක ආරම්භක ස්ථානයක් නම් menu text එකට පසුව bytes 4 ක් 0x00000000 ලෙස තැබිය යුතුය. ඉන් පසුව file alignment එකට අදාල bytes ප්‍රමානය 0x00 ලෙස තැබිය යුතුය.



අදට ලියන එක මෙතනින් නවත්වනවා. ආයෙමත් කොටසක් ලගදීම ලියනවා.