Đề tài Chương trình nghiên cứu các phương pháp nhận dạng từ dưới cursor mouse trên Desktop Windows

Tài liệu Đề tài Chương trình nghiên cứu các phương pháp nhận dạng từ dưới cursor mouse trên Desktop Windows: MỤC LỤC LỜI MỞ ĐẦU 3 CHƯƠNG 1: TÌM HIỂU VỀ LẬP TRÌNH WINDOWS 4 I. Khái quát về lập trình trong Windows 5 II. Thông điệp và xử lý thông điệp 7 III. Giao diện thiết bị đồ họa GDI 11 IV. Cửa sổ trong Windows 15 V. Chương trình Windows tiếp nhận thông điệp chuột 22 CHƯƠNG 2: TÌM HIỂU VỀ HOOK 26 1 - Chuỗi hook 27 2 - Thủ tục hook 27 3 - Các loại hook 28 4 - Sử dụng hook 30 5 - Hook trong Windows 3.x 31 6 - Giới thiệu một số hàm liên quan đến hook 33 CHƯƠNG 3: KỸ THUẬT OVERRIDE HÀM API 36 I. Khái quát về kỹ thuật override 37 II. Lý do sử dụng kỹ thuật override trong lập trình Windows 37 III. Cơ chế hoạt động và quản lý bộ nhớ trên Windows 16bits 38 IV. Cơ chế hoạt động và quản lý bộ nhớ trên Windows 32bits 41 V. Hiện thực kỹ thuật override trên Windows 16bits 45 VI. Một số hàm được sử dụng trong kỹ thuật override 50 CHƯƠNG 4: KẾT XUẤT VĂN BẢN TRONG WINDOWS 54 I. Kết x...

doc98 trang | Chia sẻ: haohao | Lượt xem: 1130 | Lượt tải: 0download
Bạn đang xem trước 20 trang mẫu tài liệu Đề tài Chương trình nghiên cứu các phương pháp nhận dạng từ dưới cursor mouse trên Desktop Windows, để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
MUÏC LUÏC LÔØI MÔÛ ÑAÀU 3 CHÖÔNG 1: TÌM HIEÅU VEÀ LAÄP TRÌNH WINDOWS 4 I. Khaùi quaùt veà laäp trình trong Windows 5 II. Thoâng ñieäp vaø xöû lyù thoâng ñieäp 7 III. Giao dieän thieát bò ñoà hoïa GDI 11 IV. Cöûa soå trong Windows 15 V. Chöông trình Windows tieáp nhaän thoâng ñieäp chuoät 22 CHÖÔNG 2: TÌM HIEÅU VEÀ HOOK 26 1 - Chuoãi hook 27 2 - Thuû tuïc hook 27 3 - Caùc loaïi hook 28 4 - Söû duïng hook 30 5 - Hook trong Windows 3.x 31 6 - Giôùi thieäu moät soá haøm lieân quan ñeán hook 33 CHÖÔNG 3: KYÕ THUAÄT OVERRIDE HAØM API 36 I. Khaùi quaùt veà kyõ thuaät override 37 II. Lyù do söû duïng kyõ thuaät override trong laäp trình Windows 37 III. Cô cheá hoaït ñoäng vaø quaûn lyù boä nhôù treân Windows 16bits 38 IV. Cô cheá hoaït ñoäng vaø quaûn lyù boä nhôù treân Windows 32bits 41 V. Hieän thöïc kyõ thuaät override treân Windows 16bits 45 VI. Moät soá haøm ñöôïc söû duïng trong kyõ thuaät override 50 CHÖÔNG 4: KEÁT XUAÁT VAÊN BAÛN TRONG WINDOWS 54 I. Keát xuaát vaên baûn trong Windows 55 II. Caùc haøm caên baûn ñeå keát xuaát vaên baûn 55 CHÖÔNG 5: PHAÂN TÍCH VAØ THIEÁT KEÁ CHÖÔNG TRÌNH 66 I. Phaân tích vaán ñeà 67 II. Thieát keá chöông trình 68 III. Giôùi thieäu moät soá haøm coù lieân quan 78 IV. Giôùi thieäu moät soá caáu truùc döõ lieäu coù lieân quan 92 KEÁT QUAÛ VAØ HÖÔÙNG PHAÙT TRIEÅN 97 Ñeà taøi : Nghieân cöùu caùc phöông phaùp nhaän daïng töø döôùi cursor mouse treân Desktop Windows. Vieát chöông trình nhaän daïng töø naøy. Lôøi Môû Ñaàu gaøy nay, haàu nhö moïi coâng vieäc haøng ngaøy lieân quan ñeán cuoäc soáng cuûa chuùng ta ñeàu dieãn ra treân maùy tính. Töø vieäc soaïn thaûo vaên baûn, gôûi nhaän thoâng tin ñeán vieäc tra cöùu, truy caäp thoâng tin töø heä thoáng maïng maùy tính toaøn caàu Internet ñoái vôùi ngöôøi söû duïng laø coâng vieäc thöôøng ngaøy vaø raát phoå bieán. Töø ñoù, seõ phaùt sinh vaán ñeà laø ngöôøi söû duïng seõ caàn tìm hieåu yù nghóa cuûa moät töø, moät caâu hoaëc caàn phaûi dòch moät ñoaïn vaên baûn, moät file döõ lieäu naøo ñoù ra tieáng Vieät vaø ngöôïc laïi. Ñaây laø moät nhu caàu caàn thieát vaø haàu nhö xaûy ra thöôøng xuyeân ñoái vôùi nhieàu ngöôøi, do ñoù nhaän daïng töø ñaëc bieät laø nhaän daïng töø treân maøn hình trong moâi tröôøng Windows laø vieäc laøm caàn thieát vaø coù yù nghóa thöïc teá. Keát quaû cuûa vieäc nhaän daïng töø seõ ñöôïc duøng ñeå xaây döïng neân caùc öùng duïng khaùc chaúng haïn nhö caùc töø ñieån ñöôïc tra cöùu theo kieåu töông taùc tröïc tieáp seõ raát thuaän tieän cho ngöôøi söû duïng bôûi vì theo caùch naøy thì cho duø ñang ôû trong baát kyø öùng duïng naøo khi caàn tra cöùu thì thao taùc tröïc tieáp ngay treân öùng duïng ñang duøng töùc laø chæ caàn click chuoät vaøo ñoù chöù khoâng caàn phaûi môû töø ñieån roài tra cöùu töø ñoù theo kieåu coå ñieån. Vì theá, trong thôøi gian laøm Luaän AÙn Toát nghieäp ñöôïc söï höôùng daãn cuûa thaày Leâ Taán Huøng nhoùm sinh vieân chuùng toâi thöïc hieän ñeà taøi: “ Nhaän daïng töø döôùi cursor mouse treân deskop Windows. Vieát chöông trình nhaän daïng töø naøy ”. Trong giai ñoaïn ñaàu cuûa Luaän AÙn Toát Nghieäp chuùng toâi ñaõ nghieân cöùu ñöôïc moät soá vaán ñeà quan troïng vaø caên baûn coù yù nghóa trong vieäc thöïc hieän yeâu caàu ñaõ ñaët ra cuûa ñeà taøi. Ñeà taøi naøy chæ taäp trung nhaän daïng töø ôû daïng text treân desktop cuûa moâi tröôøng Windows roài xuaát keát quaû ra. Trong thôøi gian laøm Luaän AÙn Toát Nghieäp nhoùm sinh vieân chuùng toâi ñaõ tieán haønh nghieân cöùu cô cheá hoaït ñoäng vaø quaûn lyù cuûa heä ñieàu haønh Windows. Nghieân cöùu veà phöông thöùc laäp trình trong moâi tröôøng Windows vaø caùc phöông tieän maø Windows hoã trôï khi laäp trình. Tham khaûo vaø nghieân cöùu kyõ thuaät override caùc haøm giao tieáp cuûa Windows ôû cheá ñoä 16 bit vaø 32 bit. Nghieân cöùu caùch xöû lyù caùc thoâng ñieäp trong Windows vaø tìm hieåu veà caùch keát xuaát vaên baûn, veà cheá ñoä aùnh xaï, vaán ñeà toïa ñoä . . . vaø caùch xöû lyù vaên baûn. Treân cô sôû ñoù böôùc ñaàu chuùng toâi ñaõ xaây döïng xong moät öùng duïng coù khaû naêng nhaän daïng ñöôïc töø treân neàn Windows 16 bit ñöôïc vieát baèng ngoân ngöõ Visual C++ version 1.5 vaø höôùng phaùt trieån trong thôøi gian tôùi laø hieän thöïc noù treân neàn Win32. Baùo caùo cuûa chuùng toâi seõ laàn löôït ñieåm qua nhöõng noäi dung maø chuùng toâi ñaõ nghieân cöùu vaø tìm hieåu ñöôïc trong thôøi gian qua. Sau ñoù laø phaàn giôùi thieäu chi tieát veà chöông trình töø khaâu phaân tích-thieát keá cho ñeán phaàn chöông trình nguoàn vaø cuoái cuøng seõ laø neâu nhöõng vaán ñeà coøn toàn taïi vaø höôùng phaùt trieån trong töông lai. Chöông 1: TÌM HIEÅU VEÀ LAÄP TRÌNH WINDOWS I - KHAÙI QUAÙT VEÀ LAÄP TRÌNH TRONG WINDOWS: 1 - Khaùi quaùt veà laäp trình trong Windows: Moâi tröôøng laäp trình Windows veà cô baûn laø döïa treân boä haøm API (Application Programmer Interface), noù coù chöùc naêng nhö caùc ngaét trong baûng vector ngaét cuûa DOS, nhöng noù thaân thieän hôn ôû choã caùch goïi haøm API gioáng heät caùch goïi haøm cuûa ngoân ngöõ caáp cao, moãi haøm coù moät teân goïi haún hoi, vaø teân goïi thöôøng ñöôïc ñaët raát phuø hôïp vôùi coâng duïng cuûa haøm (maëc duø coù hôi daøi doøng) töø ñoù taïo khaû naêng gôïi nhôù cao. Vôùi Windows, ngöôøi laäp trình khoâng coøn phaûi laäp trình theo kieåu assembly nöõa maø laäp trình theo kieåu ngoân ngöõ caáp cao, moïi hoaït ñoäng trong maùy ôû möùc thaáp töø haøm API trôû xuoáng thuoäc phaïm vi cuûa Windows, vaø Windows khoâng khuyeán khích vieäc caùc öùng duïng can thieäp vaøo lónh vöïc naøy. Buø laïi, baèng caùc haøm API, noù hoã trôï raát hieäu quaû cho ngöôøi laäp trình, giuùp khai thaùc khaû naêng cuûa thieát bò trieät ñeå, deã daøng vaø tieän lôïi hôn bao giôø heát. Coù theå noùi Windows ñaõ môû ra cho ngöôøi laäp trình khoâng gian roäng lôùn ñeå phaùt trieån öùng duïng, vaø haïn cheá khoâng gian phaùt trieån heä thoáng. Ñieàu naøy daãn ñeán heä quaû laø caùc öùng duïng ñöôïc taïo ra heát söùc deã daøng, vaø quan troïng laø heä thoáng chaïy oån ñònh hôn, khoâng bò treo do loãi cuûa öùng duïng, khoâng theå xaâm nhaäp, nhöng seõ raát khoù khaên neáu ngöôøi laäp trình muoán tröïc tieáp ñieàu khieån hoaït ñoäng trong maùy vaø phaùt trieån veà laäp trình heä thoáng. - Tìm hieåu haøm Windows API: Windows laø moät heä ñieàu haønh ña nhieäm (multitasking) maø qua ñoù caùc öùng duïng ôû trong moâi tröôøng Windows seõ giao tieáp vôùi user thoâng qua moät hay nhieàu giao dieän. Ñeå truy caäp caùc giao dieän naøy thì caùc öùng duïng ñöôïc xaây döïng treân moâi tröôøng Windows seõ söû duïng taäp caùc haøm ñöôïc goïi laø giao dieän chöông trình öùng duïng API (Application Program Interface). Chöông trình cuûa ngöôøi söû duïng coù theå goïi tôùi caùc haøm API ñeå truy caäp tôùi moïi taøi nguyeân cuûa Windows. GDI laø moät boä phaän cuûa API, giao dieän thieát bò ñoà hoïa GDI (Graphic Device Interface) coù nhieäm vuï duy trì söï ñoäc laäp cuûa Windows ñoái vôùi caùc thieát bò ñoà hoïa hay coøn goïi laø khaû naêng ñoäc laäp thieát bò (device independent) töùc laø cho pheùp Windows laøm vieäc vôùi nhieàu kieåu thieát bò ñoà hoïa khaùc nhau. 2 - Thö vieän lieân keát ñoäng DLL (Dynamic Link Library): Thö vieän lieân keát ñoäng laø caùc taäp tin ñöôïc Windows löu döôùi daïng nhò phaân chöùa caùc haøm maø moïi öùng duïng treân Windows ñeàu coù theå söû duïng. Neùt ñaëc tröng cuûa DLL laø noù coù theå ñöôïc söû duïng bôûi nhieàu öùng duïng taïi cuøng moät thôøi ñieåm hay noùi caùch khaùc thö vieän lieân keát ñoäng coù theå cuøng moät luùc ñöôïc goïi bôûi nhieàu chöông trình. DLL laø moät döõ lieäu chia seû ñöôïc (shared data). Coù 3 loaïi DLL khaùc nhau: - Thö vieän lieân keát ñoäng API: thuoäc heä thoáng Windows, khi caøi heä ñieàu haønh thì noù ñaõ coù saün. Chuùng ñöôïc naïp khi Windows khôûi ñoäng. - Thö vieän lieân keát ñoäng third party: do caùc coâng ty khaùc taïo ra treân moâi tröôøng Windows, hoã trôï theâm coâng taùc laäp trình trong Windows. - Thö vieän lieân keát ñoäng do chuùng ta taïo ra. Windows söû duïng caáu truùc thö vieän lieân keát ñoäng DLL (Dynamic Link Library) nhaèm muïc ñích khoâng sao cheùp moät khoái löôïng lôùn caùc maõ vaøo trong chöông trình nhö ôû caùc thö vieän thoâng thöôøng. Nhôø caáu truùc ñoäng cuûa DLL neân moïi chöông trình ñeàu coù theå truy caäp thö vieän trong thôøi gian thöïc thi. Caùc haøm API ñöôïc Windows giöõ döôùi daïng hoãn hôïp trong moät soá DLL. Trong quaù trình dòch khi gaëp leänh goïi haøm API töø chöông trình öùng duïng thì chöông trình dòch khoâng theâm maõ naøy vaøo module thöïc hieän maø chæ theâm caùc leänh lieân keát (chöùa teân cuûa DLL beân trong coù haøm caàn naïp) vaø teân haøm ñoù. Khi thöïc thi chöông trình thì haøm API thöïc söï môùi ñöôïc naïp vaøo boä nhôù ñeå thöïc hieän. Cuøng vôùi söï phaùt trieån cuûa Windows laø söïï phaùt trieån cuûa laäp trình höôùng ñoái töôïng, vaø ñeå hoã trôï cho vieäc laäp trình höôùng ñoái töôïng, Microsoft ñaõ cung caáp cho ngöôøi laäp trình moät boä thö vieän caùc lôùp cô baûn ñeå phaùt trieån caùc öùng duïng höôùng ñoái töôïng goïi laø MFC (Microsoft Foundation Classes), noäi dung cuûa noù bao goàm thoâng tin veà caùc lôùp cô baûn ñöôïc chuaån hoùa nhö lôùp application; document; view; OLE; cöûa soå; nuùt baám; text; v.v…, trong caùc lôùp naøy moïi thöù lieân quan ñeán noù (bao goàm döõ lieäu vaø caùc chöông trình xöû lyù cuûa noù) ñeàu ñöôïc laøm hoaøn chænh, ngöôøi laäp trình chæ vieäc laáy ra söû duïng, hoaëc coù theå theâm bôùt moät ít tính naêng ñaëc tröng cho ñoái töôïng cuûa mình. Muïc tieâu chính cuûa MFC laø heä thoáng hoùa caùc haøm API, cung caáp moät theå thöùc goïi goïn caùc haøm API, cung caáp moät “khung laøm vieäc” (framework) cöïc maïnh ñeå ngöôøi laäp trình khoâng caàn phaûi quan taâm ñeán nhöõng ñoaïn chöông trình thuoäc veà “thuû tuïc” maø chæ caàn quan taâm ñeán phaàn coát loõi ñeå ñaït ñöôïc muïc ñích. II - THOÂNG ÑIEÄP VAØ XÖÛ LYÙ THOÂNG ÑIEÄP: 1 - Khaùi nieäm: Laäp trình treân moâi tröôøng Windows khaùc vôùi laäp trình ôû caùc moâi tröôøng khaùc ôû ñieåm laø laäp trình treân Windows luoân luoân gaén lieàn vôùi nhöõng thoâng ñieäp. Moïi hoaït ñoäng xaûy ra treân moät chöông trình Windows ñeàu thoâng qua caùc thoâng ñieäp. Thoâng ñieäp seõ ñöôïc heä thoáng baùo cho caùc öùng duïng bieát caùc taùc ñoäng töø beân ngoaøi vaøo heä thoáng Windows. Moät cöûa soå coù theå gôûi ñi moät thoâng ñieäp cho moät cöûa soå khaùc vaø caùc cöûa soå ñaùp öùng laïi thoâng ñieäp baèng caùch gôûi ñi moät thoâng ñieäp khaùc cho moät cöûa soå khaùc. Trong Windows coù 3 loaïi thoâng ñieäp cô baûn: - Nhöõng thoâng ñieäp toång quaùt: coù maõ nhaän dieän mang tieàn toá WM_ ñöôïc coi laø phaàn lôùn trong öùng duïng vaø Windows ñaõ cung caáp caùc haøm ñeå giaûi quyeát. - Nhöõng control notification: ñaây laø nhöõng thoâng ñieäp WM_COMMAND ñöôïc chuyeån töø cöûa soå con tôùi cöûa soå boá meï. - Nhöõng nuùt leänh: laø thoâng ñieäp WM_COMMAND phaùt ñi töø trình ñôn, töø caùc nuùt ñieàu khieån. Ñaây laø loaïi thoâng ñieäp yeâu caàu öùng duïng phaûi thöïc hieän moät coâng vieäc gì ñoù. 2 - Gôûi ñi caùc thoâng ñieäp: Windows cho pheùp öùng duïng gôûi ñi nhöõng thoâng ñieäp cho mình, cho caùc öùng duïng khaùc hoaëc cho heä thoáng. Coù 3 haøm Windows API ñeå gôûi thoâng ñieäp ñi: a) Haøm SendMessage: Cuù phaùp: LRESULT SendMessage(hwnd, uMsg, wParam, lParam) HWND hwnd; // handle cuûa cöûa soå nhaän (ñích) UINT uMsg; // thoâng ñieäp ñeå gôûi WPARAM wParam; // thoâng soá thoâng ñieäp ñaàu tieân LPARAM lParam; // thoâng soá thoâng ñieäp thöù hai - Haøm SendMessage gôûi thoâng ñieäp tôùi moät hay nhieàu cöûa soå. Haøm goïi thuû tuïc cöûa soå cho cöûa soå vaø khoâng trôû veà cho ñeán luùc thuû tuïc cöûa soå ñaõ xöû lyù thoâng ñieäp. - Giaù trò traû veà: cho bieát keát quaû xöû lyù thoâng ñieäp vaø phuï thuoäc vaøo thoâng ñieäp ñöôïc gôûi. b) Haøm PostMessage: - Cuù phaùp: BOOL PostMessage(hwnd, uMsg, wParam, lParam) HWND hwnd; // handle cuûa cuûa soå ñích UINT uMsg; // thoâng ñieäp gôûi WPARAM wParam; // thoâng soá thoâng ñieäp ñaàu tieân LPARAM lParam; // thoâng soá thoâng ñieäp thöù hai - Haøm PostMessage gôûi (ñaët) moät thoâng ñieäp vaøo trong haøng thoâng ñieäp cöûa soå vaø roài trôû veà maø khoâng ñôïi cöûa soå töông öùng xöû lyù thoâng ñieäp. Nhöõng thoâng ñieäp trong moät haøng thoâng ñieäp ñöôïc laáy baèng caùch goïi haøm SetMessage hay PeekMessage. - Giaù trò traû veà: traû veà khaùc 0 neáu thaønh coâng, ngöôïc laïi 0. c) Haøm SendDlgItemMessage: - Cuù phaùp: LRESULT SendDlgItemMessage(hwndDlg,idDlgItem,uMsg,wParam,lParam) HWND hwndDlg; // handle cuûa hoäp hoäi thoaïi int idDlgItem; // maõ nhaän dieän oâ ñieàu khieån seõ nhaän thoâng ñieäp UINT uMsg; // thoâng ñieäp gôûi ñi WPARAM wParam; // thoâng soá thoâng ñieäp ñaàu tieân LPARAM lParam; // thoâng soá thoâng ñieäp thöù hai - Haøm SendDlgItemMessage gôûi moät thoâng ñieäp tôùi moät ñieàu khieån trong hoäp hoäi thoaïi. - Giaù trò traû veà: cho bieát keát quaû xöû lyù thoâng ñieäp vaø phuï thuoäc vaøo thoâng ñieäp ñöôïc gôûi. 3 - Voøng laëp thoâng ñieäp: Moät thread hoaëc moät process ñaåy moät thoâng ñieäp ra khoûi haøng ñôïi baèng caùch duøng voøng laëp thoâng ñieäp. Voøng loop chính cuûa moät öùng duïng ñaët taïi cuoái haøm WinMain() cuûa öùng duïng ñoù. Voøng laëp thoâng ñieäp coù daïng nhö sau: while GetMessage(&msg,NULL,0,0) { TranslateMessage(&msg); DispatchMessage(&msg); } Sau ñaây laø Sô ñoà doøng thoâng ñieäp: Noù moâ taû ñôn giaûn hoùa quaù trình xöû lyù thoâng ñieäp. Thoâng ñieäp coù theå baét nguoàn töø nhieàu caùch khaùc nhau, sô ñoà sau ñaây seõ giaûi thích chi tieát hôn veà voøng laëp thoâng ñieäp vaø chæ ra caùch thoâng ñieäp ñöôïc ñaët vaøo haøng ñôïi nhö theá naøo: Thoâng ñieäp khoâng chæ phaùt xuaát töø söï kieän phaàn cöùng, cuõng coù theå coù thoâng ñieäp cuûa chöông trình phaùt xuaát töø moät chöông trình ñang chaïy. Caùc threads coù theå gôûi döõ lieäu trôû veà sau vaø veà tröôùc baèng caùch gôûi thoâng ñieäp. Thoâng ñieäp coù theå gôûi vaøo haøng ñôïi baèng haøm PostMessage() , hoaëc chuùng coù theå ñöôïc gôûi tröïc tieáp cho voøng laëp thoâng ñieäp ñeå xöû lyù ngay laäp töùc baèng haøm SendMessage(). 4 - Xöû lyù thoâng ñieäp: Vieäc xöû lyù thoâng ñieäp laø yeáu toá chính laøm cho caùc öùng duïng Windows vaän haønh ñöôïc. Heä thoáng vaø caùc öùng duïng khaùc sinh ra caùc thoâng ñieäp cho moïi söï kieän xuaát hieän trong heä thoáng thoâng ñieäp cuûa Windows seõ cho pheùp Windows chaïy ña nhieäm trong moät thôøi ñieåm. Windows 95 vaø Windows NT môû roäng khaû naêng cuûa version Windows tröôùc baèng vieäc caáp phaùt cho moãi doøng xöû lyù (thread) hay moãi tieán trình (proccess) moät haøng ñôïi thoâng ñieäp rieâng. Trong version Windows cuõ thì taát caû öùng duïng ñeàu duøng chung moät haøng ñôïi thoâng ñieäp, vì theá ñeå caùc öùng duïng khaùc xöû lyù thoâng ñieäp, öùng duïng phaûi traû quyeàn ñieàu khieån veà cho Windows moãi khi noù coù theå. Vôùi Windows 95 vaø Windows NT, ñieàu naøy khoâng coøn nöõa. Windows sinh ra thoâng ñieäp cho moïi söï kieän phaàn cöùng, ví duï nhö ngöôøi duøng nhaán moät phím hoaëc di chuyeån chuoät. Noù gôûi thoâng ñieäp ñeán haøng ñôïi thoâng ñieäp cuûa thread thích hôïp, neáu thoâng ñieäp ñöôïc daønh cho nhieàu thread thì noù cuõng ñöôïc ñöa vaøo caùc haøng ñôïi cuûa caùc thread ñoù. Moät thoâng ñieäp treân thöïc teá laø moät caáu truùc döõ lieäu nhö sau: typedef struct tagMSG { HWND hwd; // handle cöûa soå UINT message; //soá chæ ñònh loaïi message WPARAM wParam; //ñöôïc chuyeån cho WndProc() LPARAM wParam; //ñöôïc chuyeån cho WndProc() DWORD time; //soá mili giaây töø luùc baét ñaàu POINT pt; //caáu truùc ñieåm POINT } III - GIAO DIEÄN THIEÁT BÒ ÑOÀ HOÏA GDI (GRAPHIC DEVICE INTERFACE): 1 - Khaùi nieäm: Windows laø moät heä ñieàu haønh ña nhieäm (multitasking) trong ñoù caùc öùng duïng giao tieáp vôùi user thoâng qua moät hay nhieàu giao dieän. Ñeå truy xuaát caùc giao dieän thì chöông trình öùng duïng phaûi söû duïng caùc haøm Giao dieän chöông trình öùng duïng. API laø taäp caùc leänh maø moät öùng duïng söû duïng ñeå yeâu caàu vaø tieán haønh caùc dòch vuï caáp thaáp ñöôïc thi haønh bôûi Windows. Giao dieän thieát bò ñoà hoïa GDI (Graphic Device Interface) laø moät phaàn cuûa API coù nhieäm vuï duy trì söï ñoäc laäp cuûa Windows ñoái vôùi caùc thieát bò ñoà hoïa (cho pheùp Windows laøm vieäc vôùi nhieàu thieát bò ñoà hoïa khaùc nhau). Windows GDI laø moät thö vieän bao goàm moät soá haøm giuùp keát xuaát ñoà hoïa (graphic output) leân maøn hình, maùy in…GDI seõ taïo ra: ñieåm, ñöôøng keû, hình daïng (shape: chöõ nhaät, troøn…), chöõ vaên baûn. 2 - Device Context: Ngöõ caûnh thieát bò DC (Device Context) laø moät phaàn quan troïng cuûa GDI Windows. Moät DC laø moät caáu truùc döõ lieäu daøi khoaûng 800 bytes ñöôïc Windows duy trì coù nhieäm vuï lo löu giöõ nhöõng thoâng tin caàn thieát maø öùng duïng seõ caàn ñeán khi phaûi hieån thò keát xuaát leân moät thieát bò vaät lyù. GDI khoâng bao giôø cho pheùp chöông trình laøm vieäc tröïc tieáp vôùi moät DC maø GDI phaân phoái cho chöông trình moät handle ñeå nhaän daïng moät DC cuï theå. Taát caû caùc haøm API; GDI ñeàu nhaän thoâng soá ñaàu tieân laø moät handle – hdc. DC laø moät coâng cuï chöùa caùc thuoäc tính veõ, DC cho pheùp keát noái logic moät chöông trình veà moät thieát bò cuï theå naøo ñoù. Ngoaøi ra do Windows laø moät heä ñieàu haønh ña nhieäm neân caùc chöông trình khoâng theå truy xuaát tröïc tieáp caùc thieát bò vaät lyù ñeå traùnh xung ñoät. Thay vaøo ñoù, chöông trình Windows phaûi söû duïng keát noái logic do DC ñaïi dieän. Nghóa laø taát caû caùc chöông trình caùch tieáp caän naøy ñeå GDI coù theå giaûi quyeát tranh chaáp khi 2 chöông trình yeâu caàu duøng cuøng moät thieát bò neân DC coøn coù vai troø laøm permission slip. DC löu tröõ thoâng tin lieân quan ñeán maët baèng veõ vaø nhöõng khaû naêng cuûa noù. Tröôùc khi söû duïng baát kyø haøm veõ GDI naøo thì ñieàu phaûi taïo moät DC cho thieát bò, vaø khi söû duïng xong thì phaûi traû noù veà cho Windows nhaèm ñaûm baûo cho hoaït ñoäng cuûa heä thoáng ñöôïc thoâng suoát bôûi vì soá löôïng DC maø Windows quaûn lyù laø coù giôùi haïn. DC ôû Win16: Ngöõ caûnh thieát bò (DC) laø moät noái keát giöõa moät öùng duïng Windows, moät driver thieát bò vaø moät thieát bò ñaàu ra (output device). Windows duy trì moät cache goàm 5 DC ñaëc bieät cho hoaït ñoäng heä thoáng. ÖÙng duïng phaûi giaûi phoùng caùc DC naøy sau khi söû duïng. Luoàng thoâng tin töø öùng duïng Windows qua DC vaø device driver tôùi thieát bò ñaàu ra: Truy xuaát thieát bò ñaàu ra (Accessing Output Devices): Baát kyø öùng duïng Windows naøo cuõng coù theå söû duïng haøm GDI ñeå truy xuaát moät thieát bò ñaàu ra. GDI chuyeån caùc goïi ñoäc laäp thieát bò töø öùng duïng tôùi driver thieát bò. Roài driver thieát bò thoâng dòch caùc goïi ñoù vaøo trong söï hoaït ñoäng ñoäc laäp thieát bò. Nhöõng ñaëc tính cuûa DC moâ taû caùc ñoái töôïng veõ ñöôïc choïn (pens vaø brushes), font ñöôïc choïn vaø maøu cuûa noù, caùch thöùc maø ñoái töôïng ñöôïc veõ (hay aùnh xaï) tôùi thieát bò, vuøng treân thieát bò coù saün cho output (vuøng xeùn) vaø nhöõng thoâng tin quan troïng khaùc. Caáu truùc chöùa nhöõng ñaëc tính DC ñöôïc goïi laø khoái döõ lieäu DC. Windows Application GDI Device Context Device Driver Output Device Windows Application Windows Application Device Driver Device Driver Output Device Output Device 3 - Cheá doä aùnh xaï (mapping mode): Ñeå duy trì söï ñoäc laäp thieát bò, GDI taïo ra output ôû khoâng gian luaän lyù vaø aùnh xaï noù leân maøn hình. Cheá ñoä aùnh xaï cho bieát moái quan heä giöõa khoâng gian luaän lyù vaø nhöõng pixel treân thieát bò. Coù tôùi 8 cheá ñoä aùnh xaï khaùc nhau nhöng chuùng toâi chæ quan taâm tôùi cheá ñoä aùnh xaï MM_TEXT vì ñaây laø cheá ñoä aùnh xaï maëc ñònh. Trong cheá ñoä naøy moät ñôn vò luaän lyù ñöôïc aùnh xaï tôùi moät pixel treân thieát bò hay maøn hình. Nhö vaäy ñôn vò tính luaän lyù laø pixel vaø caùc toïa ñoä x, y cuõng ñöôïc tính theo pixel, trò x taêng khi qua phaûi vaø giaûm khi qua traùi, trò y taêng khi ñi xuoáng vaø giaûm khi ñi leân. Origin cuûa heä thoáng toïa ñoä laø goùc traùi-treân (upper-left) cuûa maøn hình. 4 - Heä thoáng toïa ñoä windows: Windows söû duïng caùc heä thoáng toïa ñoä khaùc nhau tuøy theo hoaøn caûnh nhö: Heä toaï ñoä thieát bò (Device coordinate system) Heä toaï ñoä toaøn maøn hình (Full screen coordinate system) Heä toaï ñoä vuøng client (Client area coordinate system) Heä toaï ñoä toaøn cöûa soå (Whole window coordinate system) Heä toaï ñoä logic (Logical coordinate system) Trong phaïm vi öùng duïng cuûa ñeà taøi chuùng toâi chæ quan taâm ñeán caùc heä toaï ñoä : a) Full screen coordinate system: Laø heä thoáng toïa ñoä thieát bò lieân quan tôùi troïn maøn hình. Toïa ñoä maøn hình ñöôïc tính theo pixel vaø choïn toïa ñoä (0,0) laøm goùc upper-left cuûa maøn hình. Heä thoáng naøy söû duïng khi lieân quan ñeán troïn maøn hình treân toïa ñoä maøn hình. Thöôøng vò trí cuûa moät ñoái töôïng nhö con nhaùy hoaëc con troû hoaëc cöûa soå so vôùi goùc upper-left cuûa maøn hình thì duøng heä toïa ñoä naøy. b) Client area coordinate system: Cuõng laø heä toïa ñoä thieát bò, noù khaùc vôùi heä toïa ñoä troïn maøn hình ôû origin cuûa heä toïa ñoä. Toïa ñoä troïn maøn hình laø töông ñoái so vôùi upper-left cuûa maøn hình coøn toïa ñoä vuøng client laø töông ñoái so vôùi upper-left cuûa vuøng client. Toïa ñoä naøy cuõng tính theo device unit (pixel) gioáng nhö toïa ñoä maøn hình. Haøm ClientToScreen ñeå chuyeån toïa ñoä vuøng client qua toïa ñoä troïn maøn hình. Haøm ScreenToClient chuyeån toïa ñoä troïn maøn hình qua toïa ñoä vuøng client. c) Whole window coordinate system: Gaàn gioáng heä toïa ñoä vuøng client, laø töông ñoái so vôùi goùc upper-left cuûa cöûa soå, ñöôïc söû duïng khi veõ vuøng nonclient cuûa cöûa soå. d) Logical coordinate: Haàu heát caùc haøm GDI söû duïng heä toïa ñoä naøy. Heä thoáng toïa ñoä logic khoâng phaûi laø heä thoáng toïa ñoä thieát bò, heä thoáng toïa ñoä logic bao giôø cuõng ñöôïc aùnh xaï leân moät heä thoáng toïa ñoä thieát bò. Heä toïa ñoä logic coù theå ñöôïc aùnh xaï leân heä toïa ñoä toaøn maøn hình, heä toïa ñoä vuøng client hoaëc heä toïa ñoä toaøn cöûa soå. Duøng haøm DPtoLP ñeå chuyeån toïa ñoä thieát bò sang heä toïa ñoä logic. Duøng haøm LPtoDP ñeå chuyeån toïa ñoä logic sang heä toïa ñoä thieát bò. Nhö vaäy ñieàu quan troïng trong vieäc tính toaùn söû duïng heä toïa ñoä laø phaûi kieåm soaùt ñöôïc vieäc söû duïng caùc heä toïa ñoä moät caùch ñoàng boä bôûi vì vieäc chuyeån ñoåi giöõa caùc heä toïa ñoä ñaõ ñöôïc cung caáp bôûi caùc haøm neâu treân. 5 - Viewport vaø window: Mapping mode cho bieát aùnh xaï toïa ñoä logic vaø nhöõng kích thöôùc ñöôïc cung caáp khi goïi caùc haøm GDI qua heä thoáng toïa ñoä thieát bò gaén lieàn vôùi DC. Töùc laø mapping mode quyeát ñònh GDI aùnh xaï vieäc aùnh xaï moät window (toïa ñoä logic) qua moät viewport (toïa ñoä thieát bò). Viewport nghóa laø moät vuøng hình chöõ nhaät cuûa heä thoáng toïa ñoä thieát bò ñöôïc ñònh nghóa bôûi moät DC coøn window khi söû duïng ñeå qui chieáu GDI mapping mode laø moät hình chöõ nhaät cuûa heä thoáng toïa ñoä logic ñöôïc ñònh nghóa bôûi moät DC. Coâng thöùc ñeå chuyeån ñoåi moät heä toïa ñoä window (logic) qua moät heä toïa ñoä viewport (thieát bò): xviewport = (xwindow - xwindowOrg)(xviewportExt / xwindowExt) + xviewportOrg yviewport = (ywindow - ywindowOrg)(yviewportExt / ywindowExt) + yviewportOrg Trong ñoù: (xwindow,ywindow) laø ñieåm treân toïa ñoä logic ñöôïc chuyeån ñoåi thaønh ñieåm (xviewport,yviewport) (xwindowOrg,ywindowOrg) vaø (xviewportOrg,yviewportOrg) laø origin cuûa vuøng hình chöõ nhaät window vaø viewport theo maëc nhieân caùc ñieåm naøy ñöôïc cho veà (0,0) treân DC maëc nhieân. Coâng thöùc söû duïng 2 ñieåm cho bieát extent cuûa moät vuøng theo toïa ñoä logic (xwindowExt,ywindowExt) vaø cuûa moät vuøng theo heä toïa ñoä thieát bò (xviewportExt,yviewportExt). Tæ leä cuûa (viewpot extent / window extent) laø heä soá scaling duøng ñeå dòch ñôn vò logic qua ñôn vò thieát bò. Vieäc chuyeån ñoåi ngöôïc laïi töông töï baèng caùc bieán ñoåi coâng thöùc treân. IV - CÖÛA SOÅ TRONG WINDOWS: Cöûa soå laø khaùi nieäm cô baûn trong giao dieän GDI cuûa Windows, noù laø moät kieán truùc chuaån möïc ñeå töø ñoù xaây döïng neân caùc ñoái töôïng khaùc nhö: cöûa soå chính cuûa öùng duïng (main frame); text box; edit control; button; combo box; menu; scroll bar;... noùi chung laø toaøn boä nhöõng coâng cuï taïo neân giao dieän GDI ñeàu coù theå goïi laø cöûa soå. Cuõng coù theå xem cöûa soå nhö vuøng chöõ nhaät maøn hình maø nôi ñoù öùng duïng in ra caùc keát xuaát vaø nhaän caùc döõ lieäu töø ngöôøi duøng. Windows quaûn lyù taát caû cöûa soå hieän coù trong heä thoáng baèng caùch gaùn cho moãi cöûa soå moät handle (treân thöïc teá noù laø moät soá nguyeân)ø, ta chæ caàn coù ñöôïc handle cöûa soå thì coù theå thao taùc moïi thöù treân cöûa soå ñoù. Moät cöûa soå chia seû maøn hình vôùi caùc cöûa soå khaùc, keå caû caùc cöûa soå cuûa öùng duïng khaùc. Chæ coù moät cöûa soå trong moät thôøi ñieåm coù theå nhaän döõ lieäu nhaäp töø ngöôøi duøng. Ngöôøi duøng coù theå duøng chuoät, baøn phím, hay caùc thieát bò nhaäp khaùc ñeå töông taùc vôùi cöûa soå naøy vaø öùng duïng sôû höõu noù. 1 - Caùc loaïi cöûa soå: Windows cung caáp nhieàu kieåu cöûa soå khaùc nhau ñeå coù theå keát hôïp hình thaønh neân caùc hình thöùc cöûa soå khaùc nhau. Caùc kieåu ñöôïc söû duïng trong haøm CreateWindow khi cöûa soå ñöôïc taïo. Moät soá kieåu cöûa soå sau: - Cöûa soå choàng leân nhau (Overlapped windows hay top-level window): laø cöûa soå khoâng bao giôø coù cöûa soå cha meï. - Cöûa soå bò sôû höõu (Owned windows): laø kieåu ñaëc bieät, ñöôïc sôû höõu bôûi moät cöûa soå bò choàng - Cöûa soå pop-up: laø kieåu ñaëc bieät cuûa cöûa soå overlapped nhöng coù theå coù hoaëc khoâng title bar. - Cöûa soå con: laø cöûa soå xaùc ñònh vuøng client cuûa cöûa soå cha meï, ñöôïc söû duïng ñeå chia vuøng client cuûa cöûa soå cha meï ra thaønh caùc vuøng chöùc naêng khaùc nhau. Moät öùng duïng duøng haøm ShowWindow ñeå cho thaáy hay che daáu moät cöûa soå con. Moãi cöûa soå con phaûi coù moät cöûa soå cha meï. Cöûa soå cha meï nhöôøng moät phaàn trong vuøng cuûa noù cho cöûa soå con vaø cöûa soå con seõ nhaän taát caû caùc taùc ñoäng töø beân ngoaøi vaøo vuøng naøy. Moät cöûa soå con coù theå coù nhieàu cöûa soå con khaùc vaø moãi cöûa soå con ñeàu coù cho rieâng noù moät handle rieâng ñeå giao dòch khi gôûi thoâng ñieäp cho cöûa soå cha meï. Moãi cöûa soå con laø moät cöûa soå ñoäc laäp, noù nhaän taùc ñoäng beân ngoaøi cuûa rieâng noù vaø caùc thoâng ñieäp khaùc. Nhöõng input gôûi cho cöûa soå con ñöôïc ñi tröïc tieáp tôùi cöûa soå con vaø khoâng chuyeån qua cöûa soå cha meï ngoaïi tröø tröôøng hôïp cöûa soå con bò haøm EnabledWindow cho disabled. Trong tröôøng hôïp naøy thì Windows chuyeån baát kyø input naøo tôùi cöûa soå con ñoù cho cöûa soå cha meï cuûa noù. Ñieàu naøy cho pheùp cöûa soå cha meï kieåm tra ñöôïc input vaø laøm cho cöûa soå con ôû traïng thaùi enabled neáu noù thaáy ñieàu ñoù laø caàn thieát. Nhöõng hoaït ñoäng cuûa cöûa soå cha meï cuõng aûnh höôûng ñeán cöûa soå con nhö sau: - Shown: Cöûa soå cha meï seõ ñöôïc hieån thò tröôùc cöûa soå con. - Hidden: Cöûa soå cha meï seõ bò che sau cöûa soå con. Cöûa soå con seõ ñöôïc nhìn thaáy (heát bò che) (visible) chæ khi cöûa soå cha meï ñöôïc nhìn thaáy. - Destroyed: Cöûa soå cha meï bò huyû sau cöûa soå con. - Moved: Cöûa soå con bò di chuyeån cuøng vôùi vuøng client cuûa cöûa soå cha meï. Cöûa soå con ñaùp öùng cho vieäc toâ veõ sau khi di chuyeån. - Gia taêng kích thöôùc hay ôû traïng thaùi kích thöôùc cöïc ñaïi: toâ veõ baát kyø phaàn naøo cuûa cöûa soå cha meï maø ñaõ ñöôïc phôi baøy ra nhö laø keát quaû cuûa kích thöôùc taêng leân cuûa vuøng client. Windows khoâng töï ñoäng xeùn (clip) moät cöûa soå con ra khoûi vuøng client cuûa cöûa soå cha meï. Ñieàu naøy nghóa laø cöûa soå cha meï veõ leân treân cöûa soå con neáu neáu noù tieán haønh baát kyø söï toâ veõ naøo trong cuøng vò trí vôùi vò trí cuûa cöûa soå con. Windows chæ xeùn cöûa soå con ra khoûi vuøng client cuûa cöûa soå cha meï neáu cöûa soå cha meï coù kieåu WS_CLIPCHILDREN. Neáu cöûa soå con bò xeùn thì cöûa soå cha meï khoâng theå toâ veõ leân noù. Moät cöûa soå con coù theå choàng leân caùc cöûa soå con khaùc trong cuøng vuøng client. Cöûa soå anh em (cuøng cha meï) coù theå toâ veõ trong moãi vuøng client cuûa caùc cöûa soå khaùc tröø khi moät cöûa soå con coù kieåu WS_CLIPSIBLINGS. Neáu öùng duïng xaùc ñònh kieåu naøy cho moät cöûa soå con thì baát kyø phaàn naøo cuûa cöûa soå anh em cuûa cöûa soå con ñoù naèm trong cöûa soå naøy ñeàu bò xeùn. Neáu moät cöûa soå coù kieåu WS_CLIPCHILDREN hoaëc WS_CLIPSIBLINGS thì moät maát maùt nhoû trong söï thöïc hieän (performance) xaûy ra. Moãi cöûa soå chieám taøi nguyeân heä thoáng bôûi vaäy öùng duïng seõ khoâng söû duïng caùc cöûa soå con moät caùch böøa baõi. Ñeå hoaït ñoäng toái öu moät öùng duïng caàn chia luaän lyù cöûa soå chính cuûa noù trong thuû tuïc cöûa soå cuûa cöûa soå chính coøn hôn laø duøng caùc cöûa soå con. 2 - Thuû tuïc cöûa soå (Window Procedures): Moät thuû tuïc cöûa soå xöû lyù taát caû nhöõng thoâng ñieäp ñöôïc gôûi tôùi taát caû caùc cöûa soå trong lôùp ñöôïc ñöa ra. Windows gôûi caùc thoâng ñieäp tôùi thuû tuïc cöûa soå khi noù nhaän input töø user coù yù ñònh chuyeån cho cöûa soå ñöôïc ñöa ra hay khi noù caàn thuû tuïc ñeå thöïc hieän moät vaøi haønh ñoäng treân cöûa soå cuûa noù nhö vieäc toâ veõ laïi beân trong vuøng client. Thuû tuïc cöûa soå nhaän caùc kieåu thoâng ñieäp nhö: nhaäp vaøo töø baøn phím, chuoät; yeâu caàu tieâu ñeà cöûa soå; töôøng thuaät söï thay ñoåi gaây ra bôûi cöûa soå khaùc (nhö thay ñoåi file WIN.INI); cô hoäi söûa ñoåi ñaùp öùng heä thoáng tieâu chuaån ñeán nhöõng hoaït ñoäng chaéc chaén (nhö ñieàu chænh menu tröôùc luùc hieån thò); yeâu caàu thöïc hieän moät vaøi haønh ñoäng treân cöûa soå hay vuøng client cuûa noù (caäp nhaät vuøng client); thoâng tin veà tình traïng cuûa noù trong moái quan heä vôùi caùc cöûa soå khaùc (truy xuaá nhaát ñònh thaát baïi cuûa noù tôùi baøn phím hay trôû thaønh cöûa soå hoaït ñoäng). Moät thuû tuïc cöûa soå nhaän haàu heát caùc thoâng ñieäp laø töø Windows nhöng noù cuõng coù theå nhaän thoâng ñieäp töø caùc cöûa soå khaùc goàm caû nhöõng cöûa soå noù sôû höõu. Nhöõng thoâng ñieäp naøy coù theå laø nhöõng yeâu caàu veà thoâng tin hay thoâng baùo maø moät sö kieän ñöôïc ñöa ra ñaõ xaûy ra trong moät cöûa soå khaùc. Moät thuû tuïc cöûa soå tieáp tuïc nhaän thoâng ñieäp föø heä thoáng vaø coù theå chaáp nhaän nhöõng cöûa soå khaùc trong heä thoáng cho ñeán khi thuû tuïc cöûa soå, thuû tuïc cöûa soå cuûa moät cöûa soå cha meï hay heä thoáng huûy cöûa soå. Ngay caû khi cöûa soå ôû trong quaù trình ñang bò huûy, thuû tuïc cöûa soå nhaän nhöõng thoâng ñieäp theâm vaøo ñöa tôùi noù cô hoäi ñeå tieán haønh baát kyø nhieäm vuï laøm saïch (cleanup) naøo tröôùc luùc keát thuùc. Nhöõng thoâng ñieäp naøy goàm WM_ , WM_DESTROY, WM_QUERYENDSESSION vaø WM_ENDSESSION. Nhöng khi cöûa soå bò huûy thì khoâng coù theâm thoâng ñieäp naøo ñöôïc ñöa tôùi thuû tuïc cho cöûa soå cuï theå ñoù. Neáu coù nhieàu hôn moät cöûa soå cuûa lôùp, tuy nhieân, thuû tuïc cöûa soå tieáp tuïc nhaän thoâng ñieäp cho nhöõng cöûa soå khaùc cho ñeán khi cuõng chính chuùng bò huûy. Moät thuû tuïc cöûa soå chæ roõ laøm theá naøo taát caû cöûa soå cuûa moät cöûa soå ñöa ra thöïc söï coù haønh vi baèng caùch ñaùp öùng nhöõng gì caùc cöûa soå taïo ra nhöõng leänh töø user hay heä thoáng. Thuû tuïc cöûa soå phaûi kieåm tra nhöõng thoâng ñieäp maø noù nhaän töø heä thoáng vaø quyeát ñònh baát kyø haønh ñoäng gì seõ dieãn ra. Thuû tuïc cöûa soå cuõng coù theå choïn khoâng ñaùp öùng moät thoâng ñieäp ñöôïc ñöa ra. Neáu khoâng ñaùp öùng thuû tuïc phaûi chuyeån thoâng ñieäp tôùi haøm DefWindowProc ñeå ñöa cho heä thoáng cô hoäi ñeå ñaùp öùng. Haøm naøy thöïc hieän haønh ñoäng coù saün treân cô sôû thoâng ñieäp ñöôïc ñöa ra vaø nhöõng thoâng soá cuûa noù. Nhieàu thoâng ñieäp (ñaëc bieät laø thoâng ñieäp vuøng non-client) phaûi ñöôïc xöû lyù vì theá DefWindowProc ñöôïc yeâu caàu trong taát caû caùc thuû tuïc cöûa soå. Thuû tuïc cöûa soå cuõng nhaän caùc thoâng ñieäp maø thöïc söï ñaõ döï ñònh ñöôïc xöû lyù bôûi heä thoáng. Nhöõng thoâng ñieäp vuøng-nonclient thoâng baùo cho thuû tuïc bieát user thöïc hieän moät vaøi haønh ñoäng trong vuøng client cuûa cöûa soå hoaëc moät vaøi thoâng tin veà cöûa soå ñöôïc yeâu caàu bôûi heä thoáng ñeå thöïc hieän moät haønh ñoäng. Maëc duø Windows chuyeån nhöõng thoâng ñieäp naøy tôùi thuû tuïc cöûa soå thì thuû tuïc seõ chuyeån chuùng cho haøm DefWindowProc vaø khoâng coá gaéng xöû lyù chuùng. ÔÛ tröôøng hôïp naøy thuû tuïc cöûa soå phaûi phôùt lôø thoâng ñieäp hay traû veà khoâng chuyeån noù tôùi DefWindowProc. 3) Thoâng ñieäp cöûa soå: Moät thoâng ñieäp cöûa soå laø moät taäp nhöõng giaù trò maø Windows gôûi tôùi thuû tuïc cöûa soå ñeå cung caáp input cho cöûa soå hay yeâu caàu cöûa soå thöïc hieän moät vaøi haønh ñoäng. Windows tính ñeán moät söï thay ñoåi roäng khaép nhöõng thoâng ñieäp maø noù hay öùng duïng cuûa noù coù theå gôûi tôùi thuû tuïc cöûa soå. Haàu heát nhöõng thoâng ñieäp ñöôïc gôûi tôùi cöûa soå nhö laø keát quaû cuûa haøm ñöa ra ñang ñöôïc thöïc thi hay nhö laø keát quaû cuûa input töø user. Moãi thoâng ñieäp goàm 4 giaù trò: moät handle xaùc ñònh cöûa soå, moät danh hieäu thoâng ñieäp, moät giaù trò thoâng ñieäp-ñaëc bieät 16-bit vaø moät giaù trò thoâng ñieäp-ñaëc bieät 32-bit. Nhöõng giaù trò naøy ñöôïc chuyeån tôùi thuû tuïc cöûa soå nhö laø nhöõng thoâng soá rieâng leû. Roài thuû tuïc cöûa soå kieåm tra danh hieäu thoâng ñieäp ñeå quyeát ñònh nhöõng ñaùp öùng gì phaûi laøm vaø laøm theá naøo ñeå thoâng dòch giaù trò 16-bit vaø 32-bit. Cuù phaùp thuû tuïc cöûa soå: LONG FAR PASCAL WndProc(hwnd, wMsg, wParam, lParam) HWND hwnd; WORD wMsg; WORD wParam; DWORD lParam; Caùc thoâng soá: hwnd cho bieát cöûa soå nhaän thoâng ñieäp wMsg loaïi thoâng ñieäp wParam thoâng tin thoâng ñieäp-ñaëc bieät theâm vaøo 16-bit lParam thoâng tin thoâng ñieäp-ñaëc bieät theâm vaøo 32-bit Haøm traû veà giaù trò 32-bit cho bieát keát quaû xöû lyù thoâng ñieäp 4 - Default window procedure: Haøm DefWindowProc laø phaàn xöû lyù thoâng ñieäp coù saün cho nhöõng thuû tuïc cöûa soå khoâng hay khoâng theå truy xuaát moät vaøi thoâng ñieäp ñöôïc gôûi tôùi cho chuùng. Haàu heát caùc thuû tuïc cöûa soå thì haøm DefWindowProc thöïc hieän haàu heát, neáu khoâng muoán noùi laø taát caû, vieäc xöû lyù thoâng ñieäp vuøng client. Ñaây laø caùc thoâng ñieäp bieåu hieän nhöõng haønh ñoäng ñöôïc thöïc hieän treân caùc phaàn khaùc cuûa cöûa soå hôn laø vuøng client. 5 - Vaán ñeà toâ veõ maøn hình: Khi moät cöûa soå bò di chuyeån thì Windows töï ñoäng sao cheùp noäi dung cuûa vuøng client tôùi vò trí môùi. Ñieàu naøy tieát kieäm thôøi gian bôûi vì moät cöûa soå khoâng phaûi tính toaùn laïi vaø veõ laïi noäi dung cuûa vuøng client nhö laø phaàn cuûa söï di chuyeån. Neáu cöûa soå di chuyeån hay thay ñoåi kích thöôùc thì Windows chæ sao cheùp phaàn lôùn vuøng client tröôùc ñoù khi noù caàn ñieàn vò trí môùi. Neáu cöûa soå gia taêng kích thöôùc thì Windows sao cheùp toaøn boä vuøng client vaø gôûi thoâng baùo WM_PAINT tôùi cöûa soå ñeå ñieàn vaøo trong vuøng ñöôïc phôi baøy môùi hôn. Khi cöûa soå bò di chuyeån thì Windows cho raèng noäi dung cuûa vuøng client vaãn hôïp leä vaø coù theå ñöôïc sao cheùp khoâng caàn thay doåi tôùi vò trí môùi. Tuy nhieân vôùi moät vaøi cöûa soå thì noäi dung cuûa vuøng client khoâng coøn hôïp leä sau khi di chuyeån ñaëc bieät laø neáu di chuyeån luoân söï thay ñoåi kích thöôùc. Ñeå toâ veõ laïi toaøn boä vuøng client thay cho sao cheùp noäi dung tröôùc ñoù moãi laàn moät cöûa soå thay ñoåi kích thöôùc thì moät cöûa soå seõ xaùc ñònh kieåu CS_VREDRAW vaø trong lôùp cöûa soå. Ñeå quaûn lyù hieån thò maøn hình, Windows tieán haønh nhieàu hoaït ñoäng aûnh höôûng tôùi noäi dung cuûa vuøng client. Neáu Windows di chuyeån, ñònh kích thöôùc hay thay ñoåi beà maët maøn hình, söï thay ñoåi coù theå aûnh höôûng cöûa soå ñöôïc ñöa ra. Neáu vaäy, Windows ñaùnh daáu vuøng bò thay ñoåi baèng hoaït ñoäng saün saøng cho vieäc caäp nhaät vaø ôû cô hoäi tieáp theo noù gôûi thoâng ñieäp WM_PAINT tôùi cöûa soå vì theá noù coù theå caäp nhaät cöûa soå trong vuøng caàn caäp nhaät. Neáu moät cöûa soå veõ trong vuøng client cuûa noù thì noù phaûi goïi BeginPaint ñeå laáy handle cuûa ngöõ caûnh maøn hình, phaûi caäp nhaät vuøng bò thay ñoåi nhö ñaõ ñònh nghóa bôûi vuøng caäp nhaät vaø cuoái cuøng noù phaûi goïi EndPaint ñeå hoaøn taát coâng vieäc. Moät cöûa soå coù theå veõ trong vuøng client cuûa noù baát kyø luùc naøo töùc laø ngoaøi thôøi ñieåm maø noù ñaùp öùng thoâng ñieäp WM_PAINT chæ caàn noù laáy ngöõ caûnh maøn hình cho vuøng client tröôùc luùc noù tieán haønh veõ. Thoâng ñieäp WM_PAINT: laø moät yeâu caàu cuûa Windows tôùi moät cöûa soå ñeå caäp nhaät maøn hình cöûa noù. Windows gôûi WM_PAINT baát cöù khi naøo caàn veõ moät phaàn laïi cöûa soå. Khi cöûa soå nhaän thoâng ñieäp WM_PAINT thì noù seõ laáy vuøng caäp nhaät baèng haøm BeginPaint vaø noù seõ tieán haønh baát kyø hoaït ñoäng gì caàn thieát ñeå caäp nhaät phaàn ñoù cuûa vuøng client. InvalidateRect vaø InvalidateRgn thöïc söï khoâng sinh ra thoâng ñieäp WM_PAINT. Windows tích luyõ nhöõng thay ñoåi ñöôïc taïo ra bôûi caùc haøm naøy vaø nhöõng thay ñoåi cuûa rieâng noù trong luùc moät cöûa soå xöû lyù nhöõng thoâng ñieäp khaùc trong haøng thoâng ñieäp cuûa noù. Laøm treã WM_PAINT laøm cho cöûa soå xöû lyù taát caû nhöõng thay ñoåi cuøng moät luùc thay vì caäp nhaät nhöõng nhöõng maãu nhoû trong nhöõng böôùc rieâng leû laøm laõng phí thôøi gian. Ñeå chæ thò Windows gôûi thoâng ñieäp WM_PAINT moät öùng duïng coù theå söû duïng UpdateWindow, haøm naøy gôûi thoâng ñieäp tröïc tieáp tôùi cöûa soå, baát chaáp nhöõng thoâng ñieäp khaùc trong haøng thoâng ñieäp cuûa öùng duïng. UpdateWindow ñöôïc söû duïng khi moät cöûa soå caàn caäp nhaät vuøng client cuûa noù ngay laäp töùc (chaúng haïn chæ ngay sau cöûa soå ñöôïc taïo). Khi moät cöûa soå nhaän WM_PAINT noù phaûi goïi BeginPaint ñeå laáy ngöõ caûnh maøn hình cho vuøng client vaø laáy thoâng tin khaùc nhö vuøng caäp nhaät vaø background bò xoùa hay khoâng. Windows töï ñoäng choïn vuøng caäp nhaät nhö laø vuøng xeùn cuûa ngöõ caûnh maøn hình. GDI huyû boû (xeùn) nhöõng gì ñöôïc veõ beân ngoaøi vuøng xeùn chæ nhöõng gì ôû beân trong vuøng caäp nhaät laø thöïc söï nhìn thaáy ñöôïc. BeginPaint xoùa vuøng caäp nhaät ñeå ngaên chaën vuøng gioáng nhau töø vieäc sinh ra caùc thoâng ñieäp WM_PAINT ñeán sau. Sau khi veõ xong Windows phaûi goïi haøm EndPaint ñeå giaûi phoùng DC. Vuøng caäp nhaät: Moät vuøng caäp nhaät xaùc ñònh phaàn cuûa vuøng client ñöôïc ñaùnh daáu cho vieäc veõ cho thoâng ñieäp WM_PAINT keá tieáp. Muïc ñích cuûa vuøng caäp nhaät laø ñeå löu caùc öùng duïng thôøi ñieåm noù ñöa ra ñeå veõ toaøn boä noäi dung cuûa vuøng client. Neáu chæ coù phaàn maø caàn veõ ñöôïc coäng vaøo vuøng caäp nhaät thì chæ coù phaàn ñoù ñöôïc veõ. Haøm InvalidateRect vaø InvalidateRgn coäng moät hình chöõ nhaät hay moät vuøng vaøo vuøng caäp nhaät. Hình chöõ nhaät hay vuøng phaûi ñöôïc ñöa ra ôû trong toïa ñoä client. Vuøng caäp nhaät baûn thaân noù ñöôïc ñònh nghóa trong toïa ñoä client. Windows coäng nhöõng vuøng vaø hình chöõ nhaät cuûa chính noù vaøo moät vuøng caäp nhaät cuûa cöûa soå sau khi nhöõng hoaït ñoäng nhö di chuyeån, ñònh kích thöôùc vaø cuoän cöûa soå. Haøm ValidateRect vaø ValidateRgn xoùa moät hình chöõ nhaät hay moät vuøng ra khoûi vuøng caäp nhaät. Nhöõng haøm naøy ñöôïc söû duïng ñieån hình khi cöûa soå ñaõ caäp nhaät moät phaàn ñaëc bieät cuûa maøn hình trong vuøng caäp nhaät tröôùc khi nhaän thoâng ñieäp WM_PAINT. Haøm GetUpdateRect laáy hình chöõ nhaät nhoû nhaát bao laáy toaøn boä vuøng caäp nhaät. Haøm GetUpdateRgn laáy vuøng caäp nhaät chính noù. Nhöõng haøm naøy coù theå ñöôïc söû duïng ñeå tính toaùn kích thöôùc hieän haønh cuûa vuøng caäp nhaät ñeå quyeát ñònh nhöõng coâng vieäc veõ naøo ñöôïc yeâu caàu. V – CHÖÔNG TRÌNH WINDOWS TIEÁP NHAÄN THOÂNG ÑIEÄP CHUOÄT: Giôùi thieäu doøng chaûy döõ lieäu thoâng ñieäp nhaäp töø con chuoät: Hardware event queue Device driver Mouse GetMessage() DispatchMessage() WindowProc() DefWindowProc() Hook chain Virtual & Scan code 1 - Mouse: Khi mouse baùo vò trí cuûa mình (vò trí cursor) vaø coù taùc ñoäng leân mouse thì moät tín hieäu ñöôïc phaùt ñi töø mouse gaây ra moät ngaét quaõng, mouse driver giaûi quyeát ngaét quaõng naøy. 2 - Mouse device driver: Khi Windows khôûi ñoäng thì mouse driver töï ñoäng naïp vaøo vaø kieåm tra xem coù chuoät hay khoâng. Neáu coù thì Windows goïi driver cung caáp moät thuû tuïc ñeå baùo caùo caùc bieán coá xaûy ra treân chuoät. Khi coù moät mouse event thì driver thoâng baùo cho Windows bieát. Neáu event laø di chuyeån mouse thì öu tieân ñaùp öùng vò trí con troû di chuyeån ngay luùc ngaét. Coøn laïi taát caû caùc event khaùc ñeàu ñöôïc ñöa vaøo hardware event queue. 3 - Hardware event queue: Caùc mouse event ñöôïc ñöa vaøo hardware event queue chôø giao cho message loop cuûa chöông trình giaûi quyeát. Queu naøy laø moät vuøng ñeäm coù theå chöùa toái ña 120 event. Nhöõng event trong queue chöa thuoäc moät chöông trình cuï theå naøo cho tôùi khi noù ñöôïc tieáp nhaän bôûi haøm GetMessage(). Ñieàu naøy ñaûm baûo cho heä thoáng hoaït ñoäng ñuùng ñaén. Sau ñoù laø voøng laëp GetMessage(). 4 - GetMessage() loop: GetMessage() loop ñöa caùc thoâng ñieäp vaøo xöû lyù. GetMessage() seõ quyeát ñònh chöông trình naøo seõ tieáp nhaän thoâng ñieäp baèng caùch xem chöông trình naøo sôû höõu cöûa soå maø con troû chuoät naèm treân ñoù. Tuøy theo vò trí cuûa con troû maø phaùt sinh hai loaïi thoâng ñieäp: thoâng ñieäp vuøng client vaø thoâng ñieäp vuøng non-client. Muoán bieát cursor ôû vuøng naøo thì GetMessage() chuyeån ñi moät thoâng ñieäp WM_NCHITTEST cho thuû tuïc cöûa soå. Haøm GetMessage() döïa vaøo cô cheá pull-model ñeå ñoïc thoâng tin tình huoáng trong queue vaø laïi döïa vaøo push-model ñeå bieát vò trí cuûa cursor. Töùc laø GetMessage() seõ goïi thuû tuïc cöûa soå nhö laø moät chöông trình thöôøng truù vaäy. GetMessage() söû duïng haøm SendMessage() ñeå goïi thuû tuïc cöûa soå. Trò traû veà naèm trong phaïm vi cuûa thoâng ñieäp WM_NCHITTEST maø GetMessage() gôûi cho thuû tuïc cöûa soå cuûa ta. WM_NCHITTEST laø thoâng ñieäp ñeán ñaàu tieân trong haøng loaït thoâng ñieäp maø mouse phaùt ra. Noù yeâu caàu thuû tuïc cöûa soå nhaän dieän vò trí cursor. Ña soá chöông trình chuyeån thoâng ñieäp naøy cho DefWindowProc() lo tìm vò trí cursor vaø cung caáp moät hit-test code nhö laø trò traû veà. Khi DefWindowProc() traû veà keát quaû khaùc HTCLIENT, HTERROR, HTNOWHERE, HTTRANSPARENT thì cursor naèm treân vuøng non-client thì Windows seõ phaùt ñi thoâng ñieäp non-client. Coøn khi DefWindows traû veà keát quaû HTCLIENT thì cursor naèm treân vuøng client vaø nhöõng thoâng ñieäp do Windows phaùt ñi luùc naøy thì seõ ñöôïc trình öùng duïng xöû lyù. Haøm SendMessage() seõ söû duïng maõ hit-test code ñeå quyeát ñònh xem loaïi thoâng ñieäp chuoät naøo maø cho phaùt sinh. Khi hit-test code baèng HTCLIENT thì moät thoâng ñieäp vuøng client seõ ñöôïc phaùt sinh coøn taát caû caùc hit-test code khaùc seõ phaùt sinh ra nhöõng thoâng ñieäp chuoät vuøng non-client. Tröôùc khi SendMessage() traû veà moät thoâng ñieäp chuoät cho chöông trình cuûa ta thì coù moät vieäc maø haøm naøy phaûi thi haønh: noù phaûi baûo ñaûm laø hình daùng cursor phuø hôïp vò trí hieän thôøi cuûa mouse. Muoán theá noù phaûi gôûi ñi moät thoâng ñieäp khaùc cho thuû tuïc cöûa soå WM_GETCURSOR. Töông töï nhö thoâng ñieäp WM_NCHITTEST ña soá chöông trình phôùt lôø thoâng ñieäp naøy vaø giao cho DefWindowProc() thöïc hieän. Maõ hit-test code ñöôïc cho ôû trong byte thaáp cuûa thoâng soá lParam ñeå cho DefWindowProc() bieát maø thieát ñaët hình daùng cuûa con troû. Hai thoâng ñieäp WM_NCHITTEST vaø WM_SETCURSOR bao giôø cuõng ñi tröôùc moät thoâng ñieäp chuoät. Vì Windows phaûi tìm ra xem vò trí cursor hieän ôû trong vuøng client hay vuøng non-client ñeå phaùt ra thoâng ñieäp vuøng client hay thoâng ñieäp vuøng non-client moät caùch thích hôïp. Moät khi ñaõ ñöôïc nhaän dieän thì Windows phaûi ñaûm baûo laø ngöôøi söû duïng nhaän ñöôïc hình daùng cursor thích hôïp. Windows cho pheùp ñaët message hook ñeå thay ñoåi doøng chaûy caùc thoâng ñieäp. Moät WH_GETMESSAGE hook coù theå thay ñoåi doøng chaûy cuûa baát cöù thoâng ñieäp chuoät cuûa vuøng client hoaëc vuøng non-client. Khi GetMessage() saün saøng ñem moät thoâng ñieäp vaøo chöông trình cuûa ta thì noù seõ goïi hook xem coù thay ñoåi gì khoâng tröôùc khi thoâng ñieäp ñöôïc chuyeån cho chöông trình. Khi GetMessage() ñaõ ñöa thoâng ñieäp vaøo chöông trình roài thì thoâng ñieäp seõ ñöôïc trao tröïc tieáp cho thuû tuïc cöûa soå thích hôïp bôûi haøm DispatchMessage(). Baây giôø thoâng ñieäp ñaõ naèm trong thuû tuïc cöûa soå. 5 - Thuû tuïc cöûa soå: Hôn 20 thoâng ñieäp cuûa Windows veà chuoät (tröø WM_NCHITTEST) thì coù 10 thoâng ñieäp thuoäc vuøng non-client do DefWindowProc() giaûi quyeát. Hai thoâng soá wParam, lParam cuûa thuû tuïc cöûa soå seõ cho bieát thoâng tin veà thoâng ñieäp. Trò cuûa hai thoâng soá lParam vaø wParam ñeàu töông töï nhau cho caùc thoâng ñieäp chuoät treân vuøng client. Trò cuûa thoâng soá lParam chöùa vò trí cursor theo toïa ñoä cuûa vuøng client. Toïa ñoä naøy cho origin veà goùc upper-left cuûa vuøng client vôùi ñôn vò tính laø pixel. Trò x naèm ôû word thaáp coøn y naèm ôû word cao cuûa lParam. Trò cuûa wParam laø moät loâ côø hieäu moâ taû traïng thaùi cuûa caùc nuùt chuoät cuõng nhö traïng thaùi caùc nuùt , 6 – DefWindowProc(): Ñoái vôùi chuoät thì DefWindowProc() khoâng quan taâm ñeán nhöõng thoâng ñieäp thuoäc vuøng client maø chæ quan taâm ñeán nhöõng thoâng ñieäp thuoäc vuøng non-client. DefWindowProc() coù nhieäm vuï cung caáp moät giao dieän chung cho baøn phím vaø con chuoät baèng caùch dòch phaàn nhaäp lieäu töø baøn phím hoaëc con chuoät thaønh caùc leänh heä thoáng (system command) vaø cho hieän leân nhö caùc thoâng ñieäp WM_SYSCOMMAND. Cuoái cuøng DefWindowProc() giaûi quyeát caùc thoâng ñieäp WM_NCHITTEST vaø WM_SETCURSOR cung caáp tröôùc cho caùc thoâng ñieäp chuoät khaùc. Chöông 2: TÌM HIEÅU VEÀ HOOKS Hook laø moät cô cheá cöïc maïnh cho pheùp ta caøi ñaët moät thuû tuïc ñeå ñieàu khieån hoaëc chaän höùng caùc thoâng ñieäp tröôùc khi caùc thoâng ñieäp naøy tôùi ñöôïc nôi tieáp nhaän. Hay noùi moät caùch khaùc hook laø moät ñieåm trong kyõ thuaät message-handling heä thoáng, nôi maø moät öùng duïng coù theå ñaët moät thuû tuïc ñeå quaûn lyù söï löu thoâng cuûa caùc thoâng ñieäp trong heä thoáng vaø xöû lyù moät kieåu thoâng baùo naøo ñoù tröôùc khi chuùng tôùi ñöôïc thuû tuïc cöûa soå ñích. Do coù khaû naêng can thieäp maïnh neân hook coù xu höôùng laøm chaäm laïi heä thoáng vì chuùng laøm taêng soá löôïng caùc hoaït ñoäng cuûa heä thoáng ñoái vôùi moãi thoâng ñieäp. Chæ ñaët hook khi thöïc söï caàn thieát vaø dôõ boû chuùng khi khoâng caàn ñeán. 1 - Chuoãi hook: Heä thoáng cho pheùp nhieàu kieåu hook khaùc nhau: moãi kieåu cung caáp vieäc truy xuaát tôùi moät khía caïnh khaùc nhau cuûa kyõ thuaät message-handling. Chaúng haïn, moät öùng duïng coù theå söû duïng hook WM_MOUSE ñeå quaûn lyù nhöõng thoâng ñieäp chuoät trong luoàng thoâng ñieäp. Heä thoáng duy trì moät chuoãi hook rieâng leû ñoái vôùi moãi kieåu hook. Moät chuoãi hook laø moät danh saùch caùc pointer chæ tôùi caùc haøm callback application-defined ñaëc bieät maø nhöõng haøm naøy goïi caùc thuû tuïc hook. Khi moät thoâng ñieäp xaûy ra laø noù ñaõ ñöôïc toå chöùc vôùi moät kieåu hook cuï theå, heä thoáng chuyeån thoâng ñieäp tôùi moãi thuû tuïc hook coù maët trong chuoãi hook, theo traät töï caùi noï sau caùi kia. Hoaït ñoäng cuûa moät thuû tuïc hook coù theå phuï thuoäc vaøo kieåu hook maø noù lieân quan. Caùc thuû tuïc hook cho moät vaøi kieåu hook coù theå chæ quaûn lyù nhöõng thoâng ñieäp; nhöõng caùi khaùc coù theå thay ñoåi nhöõng thoâng ñieäp hay döøng söï phaùt trieån cuûa noù trong chuoãi, ngaên chaën chuùng tìm tôùi thuû tuïc hook keá tieáp hay cöûa soå cuoái cuøng (ñích). 2 – Thuû tuïc hook: Ñeå coù ñöôïc söï tieän lôïi cuûa moät loaïi hook chi tieát, ngöôøi laäp trình cung caáp moät thuû tuïc hook vaø söû duïng haøm SetWindowsHookEx ñeå ñaët noù vaøo trong chuoãi hook. Moät thuû tuïc hook coù cuù phaùp: LRESULT CALLBACK HookProc ( Int nCode, WPARAM wParam, LPARAM lParam ); HookProc laø moät placeholder cho moät öùng duïng ñaõ ñöôïc ñònh nghóa tröôùc. Thoâng soá nCode laø moät maõ hook phuï thuoäc vaøo kieåu hook; moãi kieåu coù moät taäp caùc ñaëc tính caùc maõ hook. Nhöõng giaù trò cuûa thoâng soá wParam vaø lParam phuï thuoäc vaøo maõ hook, nhöng ñieån hình thì chuùng chöùa thoâng tin veà moät thoâng ñieäp ñöôïc send hay ñöôïc post. Haøm SetWindowsHookEx luoân luoân ñaët moät thuû tuïc hook ôû ñaàu moät chuoãi hook. Khi moät söï kieän xaûy ra maø söï kieän naøy ñöôïc quaûn lyù bôûi moät kieåu hook cuï theå thì heä thoáng goïi thuû tuïc ôû ñaàu chuoãi hook ñaõ ñöôïc toå chöùc. Moãi thuû tuïc hook trong chuoãi quyeát ñònh neân chuyeån hay khoâng chuyeån söï kieän tôùi thuû tuïc tieáp theo. Moät thuû tuïc hook chuyeån moät söï kieän tôùi thuû tuïc tieáp theo baèng caùch goïi haøm CallNextHookEx. Chuù yù raèng nhöõng thuû tuïc hook daønh cho caùc kieåu hook chæ coù theå quaûn lyù caùc thoâng ñieäp, heä thoáng chuyeån thoâng ñieäp tôùi moãi thuû tuïc hook, chöù khoâng dính daùng gì ñeán coù hay khoâng moät thuû tuïc cuï theå goïi CallNextHookEx. Moät thuû tuïc hook coù theå toaøn cuïc, quaûn lyù nhöõng thoâng ñieäp ñoái vôùi taát caû caùc thread trong heä thoáng hay noù coù theå laø thread cuï theå, quaûn lyù caùc thoâng ñieäp cho chæ moät thread rieâng bieät. Moät thuû tuïc hook toaøn cuïc coù theå ñöôïc goïi trong ngöõ caûnh cuûa baát kyø öùng duïng naøo, bôûi theá thuû tuïc phaûi ôû trong moät module DLL rieâng leû. Moät thuû tuïc hook loaïi thread cuï theå chæ ñöôïc goïi trong ngöõ caûnh cuûa thread ñaõ ñöôïc toå chöùc. Neáu moät öùng duïng ñaët moät thuû tuïc hook cho moät trong caùc thread cuûa rieâng noù thì thuû tuïc hook coù theå ôû trong caû module gioáng nhau nhö quaõng nghó giöõa caùc maõ öùng duïng hoaëc trong moät DLL. Neáu öùng duïng ñaët moät thuû tuïc hook cho moät thread cuûa moät öùng duïng khaùc thì thuû tuïc phaûi ôû trong moät DLL. Chuù yù chæ söû duïng hook toaøn cuïc cho muïc ñích debug coøn khoâng thì neân traùnh khoâng söû duïng. Hook toaøn cuïc coù theå gaây toån haïi cho hoaït ñoäng cuûa heä thoáng vaø gaây neân xung ñoät vôùi nhöõng öùng duïng khaùc coù cuøng kieåu hook toaøn cuïc. 3 – Caùc loaïi hook: Moät loaïi hook laøm cho moät öùng duïng coù theå quaûn lyù moät maët khaùc nhau cuûa kyõ thuaät message-handling heä thoáng. Bao goàm caùc loaïi hook sau ñaây: WH_CALLWNDPROC hook quaûn lyù caùc thoâng ñieäp tröôùc luùc heä thoáng gôûi chuùng tôùi cöûa soå ñích. WH_CALLWNDPROCRET hook quaûn lyù caùc thoâng ñieäp sau khi chuùng ñöôïc xöû lyù bôûi thuû tuïc cöûa soå ñích. WH_CBT hook nhaän nhöõng thoâng baùo coù ích tôùi öùng duïng huaán luyeän treân cô sôû tính toaùn (CBT). WH_DEBUG hook coù ích cho vieäc debug nhöõng thuû tuïc hook khaùc. WH_FOREGROUNDIDLE hook seõ ñöôïc goïi khi thread foreground cuûa öùng duïng seõ trôû thaønh khoâng duøng ñeán. Hook naøy coù ích cho hoaït ñoäng nhöõng nhieäm vuï (task) ñoä öu tieân thaáp trong thôøi gian khoâng ñöôïc duøng ñeán. WH_GETMESSAGE hook quaûn lyù caùc thoâng ñieäp ñöôïc post tôùi haøng thoâng ñieäp. WH_JOURNALPLAYBACK hook post nhöõng thoâng ñieäp ñöôïc ghi tröôùc ñoù bôûi thuû tuïc hook WH_JOURNALRECORD. WH_JOURNALRECORD hook ghi nhöõng thoâng ñieäp ñaàu vaøo ñöôïc post tôùi haøng thoâng ñieäp heä thoáng. Hook naøy coù ích cho vieäc ghi caùc macro. WH_KEYBOARD hook quaûn lyù caùc thoâng ñieäp keystroke. WH_KEYBOARD_LL Windows NT: hook quaûn lyù nhöõng söï kieän nhaäp vaøo töø keyboard möùc thaáp. WH_MOUSE hook quaûn lyù caùc thoâng ñieäp chuoät. WH_MOUSE_LL Windows NT: hook quaûn lyù nhöõng söï kieän ñaàu vaøo chuoät möùc thaáp. WH_MSGFILTER hook quaûn lyù caùc thoâng ñieäp ñöôïc keát sinh nhö laø moät keát quaû cuaû söï kieän ñaàu vaøo ôû trong dialog box, message box, menu hay scroll bar. WH_SHELL hook quaûn lyù caùc thoâng ñieäp nhaän thoâng baùo höõu ích ñeå shell caùc öùng duïng. WH_SYSMSGFILTER ñaët moät öùng duïng caùc thoâng ñieäp ñöôïc keát sinh nhö laø keát quaû cuûa moät söï kieän ñaàu vaøo ôû trong dialog box, message box, menu hay scroll bar. Thuû tuïc hook quaûn lyù nhöõng thoâng ñieäp naøy cho taát caû caùc öùng duïng trong heä thoáng. 4 – Söû duïng hook: a) Caøi ñaët hook: Ñaët moät thuû tuïc hook baèng caùch goïi haøm SetWindowsHookEx ñaëc taû kieåu hook goïi thuû tuïc, thuû tuïc coù phaûi ñöôïc toå chöùc vôùi taát caû caùc thread hay chæ ñöôïc toå chöùc vôùi moät thread cuï theå vaø moät pointer chæ tôùi moät ñieåm vaøo thuû tuïc. Phaûi ñaët moät thuû tuïc hook toaøn cuïc vaøo moät DLL rieâng bieät töø öùng duïng caøi ñaët thuû tuïc hook. ÖÙng duïng caøi ñaët phaûi coù handle chæ tôùi module DLL tröôùc khi noù coù theå ñaët thuû tuïc hook. Haøm LoadLibrary khi ñöôïc ñöa teân cuûa DLL seõ traû handle cho module DLL. Sau khi coù handle, coù theå goïi haøm GetProcAddress ñeå laáy laïi ñòa chæ cuûa thuû tuïc hook. Cuoái cuøng söû duïng haøm SetWindowsHookEx ñeå ñaët ñòa chæ hook vaøo trong chuoãi hook daønh rieâng. SetWindowsHookEx chuyeån handle module, moät pointer chæ tôùi ñieåm vaøo thuû tuïc hook vaø cho danh hieäu thread, chæ ra raèng thuû tuïc hook phaûi ñöôïc toå chöùc vôùi taát caû caùc thread trong heä thoáng. Ví duï minh hoïa: HOOKPROC hkprcSysMsg; static HINSTANCE hinstDLL; static HHOOK hhookSysMsg; hinstDLL = LoadLibrary("c:\windows\sysmsg.dll"); hkprcSysMsg = (HOOKPROC)GetProcAddress(hinstDLL, SysMessageProc); hhookSysMsg = SetWindowsHookEx( WH_SYSMSGFILTER, hkprcSysMsg, hinstDLL, 0 ); b) Giaûi phoùng hook: Coù theå giaûi phoùng moät procedure loaïi thread cuï theå töùc xoùa ñòa chæ cuûa noù khoûi chuoãi hook baèng caùch goïi haøm UnhookWindowsHookEx nhöng haøm naøy khoâng traû töï do cho DLL chöùa thuû tuïc hook. Ñaây laø lyù do maø thuû tuïc hook toaøn cuïc ñöôïc goïi trong ngöõ caûnh quaù trình cuûa moãi öùng duïng trong heä thoáng, gaây neân moät goïi tuyeät ñoái tôùi haøm LoadLibrary cho taát caû caùc quaù trình ñoù. Bôûi vì moät goïi tôùi haøm FreeLibrary khoâng theå ñöôïc taïo ra cho moät quaù trình khaùc, roài thì khoâng coù caùch naøo ñeå giaûi phoùng cho DLL. Heä thoáng cuoái cuøng giaûi phoùng DLL sau khi taát caû caùc quaù trình noái hoaøn toaøn vôùi DLL ñaõ keát thuùc hay goïi FreeLibrary vaø taát caû caùc quaù trình ñaõ goïi thuû tuïc hook laïi tieáp tuïc quaù trình xöû lyù beân ngoaøi DLL. Moät phöông phaùp löïa choïn cho vieäc ñaët thuû tuïc toaøn cuïc laø cung caáp moät haøm caøi ñaët trong DLL, cuøng vôùi thuû tuïc hook. Vôùi phöông phaùp naøy, öùng duïng caøi ñaët khoâng caàn handle chæ tôùi module DLL. Baèng caùch noái vôùi DLL, öùng duïng gia taêng vieäc truy xuaát tôùi haøm caøi ñaët. Haøm caøi ñaët coù theå cung caáp handle module DLL vaø nhöõng chi tieát khaùc ôû trong caùi goïi tôùi SetWindowsHookEx. DLL cuõng coù theå chöùa moät haøm giaûi phoùng thuû tuïc hook toaøn cuïc; öùng duïng coù theå goïi haøm giaûi phoùng hook naøy khi keát thuùc. 5 – Hook trong Windows 3.x: Hook laø moät ñieåm trong kyõ thuaät message-handling cuûa Windows maø moät öùng duïng coù theå söû duïng ñeå laøm taêng khaû naêng truy xuaát tôùi doøng thoâng ñieäp. Windows cung caáp nhieàu kieåu hook khaùc nhau, moãi kieåu cho pheùp truy xuaát tôùi moät kieåu thoâng ñieäp cuï theå hay moät vuøng caùc thoâng ñieäp. Ñeå coù ñöôïc moät hook cuï theå thì moät öùng duïng coù theå caøi ñaët moät haøm loïc (filter function) ñeå xöû lyù nhöõng thoâng ñieäp ñöôïc toå chöùc vôùi hook. Moät haøm loïc xöû lyù nhöõng thoâng ñieäp tröôùc khi chuùng ñeán thuû tuïc cöûa soå ñích. Chuoãi haøm loïc (Filter-Function Chain): Moät chuoãi haøm loïc laø moät loaït nhöõng haøm loïc hoï haøng cho moät hook heä thoáng cuï theå. Moät öùng duïng chuyeån moät haøm loïc cho moät hook heä thoáng baèng caùch goïi haøm SetWindowsHook. Moãi laàn goïi thì coäng theâm moät haøm loïc môùi vaøo ñaàu cuûa chuoãi. Baát cöù khi naøo moät öùng duïng chyeån ñòa chæ moät haøm loïc cho hook heä thoáng noù phaûi giöõ vuøng nhôù cho ñòa chæ haøm loïc keá tieáp trong chuoãi. SetWindowsHook caøi moät haøm hook vaøo chuoãi hook vaø traû veà handle cuûa hook. Khi moãi haøm loïc hoaøn thaønh nhieäm vuï noù phaûi goïi haøm DefHookProc, haøm naøy söû duïng ñòa chæ ñöôïc löu trong vò trí ñöôïc giöõ bôûi öùng duïng ñeå truy xuaát haøm loïc keá tieáp trong chuoãi. Ñeå xoùa moät haøm loïc trong chuoãi loïc moät öùng duïng phaûi goïi haøm UnhookWindowsHook vôùi thoâng soá laø kieåu hook vaø moät con troû chæ tôùi haøm. Sau ñaây laø caùc hook cöûa soå tieâu chuaån: Kieåu Chöùc naêng WH_CALLWNDPROC Caøi ñaët loïc cöûa soå WH_CBT Caøi ñaët loïc computer-based training (CBT) WH_DEBUG Caøi ñaët loïc debug WH_GETMESSAGE Caøi ñaët loïc thoâng ñieäp (chæ treân nhöõng version debug) WH_HARDWARE Caøi ñaët loïc thoâng ñieäp-phaàn cöùng khoâng tieâu chuaån WH_JOURNALPLAYBACK Caøi ñaët loïc journaling playback WH_JOURNALRECORD Caøi ñaët loïc journaling record WH_KEYBOARD Caøi ñaët loïc baøn phím WH_MOUSE Caøi ñaët loïc thoâng ñieäp chuoät WH_MSGFILTER Caøi ñaët loïc thoâng ñieäp WH_SYSMSGFILTER Caøi ñaët loïc thoâng ñieäp treân toaøn heä thoáng Trong ñoù hook WH_CALLWNDPROC vaø WH_GETMESSAGE aûnh höôûng hoaït ñoäng cuûa heä thoáng, chæ söû duïng ñeå debug. Ñeå caøi ñaët moät haøm loïc thì öùng duïng phaûi traûi qua 4 böôùc: 1 - Export haøm trong file .DEF 2 - Laáy ñòa chæ haøm baèng caùch duøng haøm GetProcAddress (MakeProcInstance chæ ñöôïc söû duïng khi haøm loïc khoâng ôû trong moät DLL) 3 - Goïi SetWindowsHook , xaùc ñònh kieåu haøm hook vaø ñòa chæ cuûa haøm (ñöôïc traû veà bôûi GetProcAddress) 4 - Löu giaù trò traû veà töø SetWindowsHook trong vò trí ñöôïc giöõ. Giaù trò naøy laø handle cuûa haøm loïc tröôùc. Nhöõng haøm cho hook toaøn heä thoáng phaûi ñöôïc cho vaøo trong moät DLL. Nhö vaäy qua nhöõng lyù thuyeát veà hook trong moâi tröôøng Win32 hay trong moâi tröôøng Win16 cho chuùng ta coù nhaän xeùt: duøng kyõ thuaät hook cho pheùp ta ñaët moät thuû tuïc ñeå theo doõi, ñieàu khieån vaø xöû lyù caùc thoâng ñieäp cuûa heä thoáng Windows theo yù cuûa ta tröôùc luùc thoâng ñieäp ñoù ñeán ñöôïc cöûa soå ñích. Tuy nhieân kyõ thuaät hook ôû trong moâi tröôøng Win32 maïnh hôn, noù coù theå cho pheùp ta thöïc hieän ñöôïc caùc coâng vieäc coù vai troø töông töï nhö kyõ thuaät override trong Win16. 6 - Giôùi thieäu moät soá haøm coù lieân quan ñeán hook: a) CallMsgFilter: - Cuù phaùp: BOOL CallMsgFilter(lpmsg, nCode) MSG FAR* lpmsg; int nCode; - CallMsgFilter chuyeån thoâng ñieäp ñöa ra vaø maõ tôùi haøm loïc thoâng ñieäp hieän haønh. Haøm loïc thoâng ñieäp laø moät haøm ñaëc taû öùng duïng kieåm tra vaø söûa ñoåi taát caû caùc thoâng ñieäp. Moät öùng duïng xaùc ñònh haøm baèng caùch söû duïng haøm SetWindowsHook. - Thoâng soá: lpmsg troû tôùi caáu truùc MSG chöùa thoâng ñieäp ñöôïc loïc. nCode xaùc ñònh moät maõ ñöôïc söû duïng bôûi haøm loïc ñeå quyeát ñònh laøm theá naøo ñeå truy xuaát thoâng ñieäp. - Giaù trò traû veà: chæ ra traïng thaùi cuûa quaù trình xöû lyù thoâng ñieäp. Traû veà 0 neáu thoâng ñieäp ñöôïc xöû lyù vaø khaùc 0 neáu thoâng ñieäp khoâng ñöôïc xöû lyù. - Chuù yù: haøm CallMsgFilter thöôøng ñöôïc goïi bôûi Windows ñeå cho caùc öùng duïng kieåm tra vaø ñieàu khieån luoàng thoâng ñieäp trong suoát quaù trình xöû lyù noäi ôû trong menu, scroll bar hay khi di chuyeån hoaëc laøm thay ñoåi kích thöôùc moät cöûa soå. b) SetWindowsHookEx: - Cuù phaùp: HHOOK SetWindowsHookEx(idHook, hkprc, hinst, htask) int idHook; HOOKPROC hkprc; HINSTANCE hinst; HTASK htask; - Haøm SetWindowsHookEx caøi ñaët moät haøm hook application-defined vaøo trong moät chuoãi hook. Haøm naøy laø version môû roäng cuûa haøm SetWindowsHook. - Thoâng soá: idHook Kieåu cuûa hook ñöôïc caøi ñaët. Thoâng soá naøy goàm caùc kieåu hook nhö ñaõ trình baøy ôû phaàn lyù thuyeát neâu treân. hkprc Ñòa chæ procedure-instance cuûa thuû tuïc hook application-defined ñöôïc caøi ñaët. hinst Instance cuûa module chöùa haøm hook. htask Nhieäm vuï cho hook ñöôïc caøi ñaët. Neáu NULL thì haøm hook ñöôïc caøi ñaët coù taàm vöïc heä thoáng vaø coù theå ñöôïc goïi ôû trong ngöõ caûnh cuûa baát kyø quaù trình naøo hay nhieäm vuï naøo ôû trong heä thoáng. - Giaù trò traû veà: giaù trò traû veà laø handle cuûa hook ñöôïc caøi ñaët neáu haøm thaønh coâng. ÖÙng duïng hay thö vieän phaûi söû duïng handle naøy ñeå xaùc ñònh hook khi noù goïi haøm CallNextHookeEx vaø UnhookWindowsHookEx. Giaù trò traû veà laø NULL neáu coù loãi. c) Haøm gôõ boû moät haøm hook UnhookWindowsHookEx: - Cuù phaùp: BOOL UnhookWindowsHookEx(hhook) HHOOK hhook; - Haøm UnhookWindowsHookEx boû ñi moät haøm hook application ra khoûi moät chuoãi haøm hook. Moät haøm hook xöû lyù caùc söï kieän tröôùc khi chuùng ñöôïc gôûi tôùi voøng laëp thoâng ñieäp öùng duïng trong haøm WinMain. - Thoâng soá: hhook Chæ ra haøm hook ñöôïc dôõ boû. Ñaây laø giaù trò ñöôïc traû veà bôûi haøm SetWindowsHookExIdentifies khi haøm hook ñöôïc caøi ñaët. - Chuù yù: Haøm UnhookWindowsHookEx phaûi ñöôïc söû duïng trong söï kieát hôïp vôùi haøm SetWindowsHookEx. d) Haøm goïi hook keá tieáp trong hook-chain CallNextHookEx: - Cuù phaùp: LRESULT CallNextHookEx(hHook, nCode, wParam, lParam) HHOOK hHook; int nCode; WPARAM wParam; LPARAM lParam; - Haøm CallNextHookEx function chuyeån caùc thoâng tin hook ñeán haøm xöû lyù hook keá tieáp trong hook chain. - Thoâng soá hHook Chæ ñònh hook handle nCode Chæ ñònh hook code ñeå gôûi ñeán hook keá tieáp. Haøm xöû lyù hook duøng giaù trò naøy ñeå chæ ñònh xöû lyù thoâng ñieäp ñöôïc gôûi töø hook theá naøo. wParam Chæ ñònh 16 bits thoâng tin môû roäng cuûa thoâng ñieäp lParam Chæ ñònh 32 bits thoâng tin môû roäng cuûa thoâng ñieäp - Giaù trò traû veà: Giaù trò traû veà laø keát quaû cuûa quaù trình xöû lyù vaø tuøy thuoäc vaøo thoâng soá nCode. Chöông 3: KYÕ THUAÄT OVERRIDE HAØM API I - Khaùi quaùt veà kyõ thuaät override: Override coù nghóa laø: Thay theá moät giaù trò luùc run-time cho moät giaù trò ñaõ coù trong taäp tin hoaëc trong chöông trình. Hoaëc taïo ra moät ñaùp öùng luùc run-time thay cho tình huoáng döï kieán trong chöông trình. Ñoái vôùi caùc haøm giao tieáp trong moâi tröôøng Windows thì khi Windows goïi ñeán caùc DLL (Dynamic Link Library – Thö vieän lieân keát ñoäng) taïi caùc ñieåm nhaäp cuûa caùc haøm Kernel, User, GDI… ñeå xöû lyù caùc haøm ñöôïc goïi trong öùng duïng thì chính ôû thôøi ñieåm naøy ta coù theå chen vaøo ñeå coù theå thöïc hieän vieäc hoaøn taát baát kyø thao taùc xöû lyù gì. Vieäc chen vaøo ôû thôøi ñieåm ñoù seõ coù 2 caùch nhö sau döïa vaøo thôøi ñieåm ñeå chen vaøo: - Caùch 1 : chen vaøo tröôùc khi haøm API bò goïi ñöôïc thi haønh (front-end processing) - Caùch 2 : sau khi haøm API ñaõ keát thuùc vieäc thöïc thi thì ta cho chen vaøo daãn ñeán vieäc thöïc thi moät thao taùc gì hoaëc moät coâng vieäc theo yeâu caàu cuûa ta (back-end processing). Nhö vaäy override caùc haøm thuoäc giao tieáp Windows laø moät kyõ thuaät cho pheùp developer can thieäp vaøo tieán trình goïi haøm API nhaèm thöïc hieän moät thao taùc, moät coâng vieäc gì ñoù theo muïc ñích cuûa developer tröôùc khi quaù trình thöïc thi haøm API baét ñaàu (theo caùch 1) hoaëc laø ngay sau khi ñaõ keát thuùc vieäc thöïc thi haøm API (theo caùch 2). II - Lyù do ñeå söû duïng kyõ thuaät override trong laäp trình treân moâi tröôøng Windows: Nhö vaäy neáu söû duïng kyõ thuaät override thì developer coù theå laäp trình ñeå chen vaøo tieán trình thöïc thi caùc haønh vi, thao taùc xöû lyù rieâng cuûa mình baèng caùch ñoùn ñôïi thoâng baùo goïi haøm API töông öùng töø chöông trình öùng duïng vaø chuyeån höôùng ñieàu khieån cho thöïc thi ñoaïn chöông trình rieâng ñoù maø khoâng caàn söûa ñoåi, bieân dòch laïi chöông trình öùng duïng. Khi khoâng caàn thieát thì cô cheá override coù theå ñöôïc taét ñi vaø chöông trình öùng duïng coù theå trôû veà thöïc thi bình thöôøng ñuùng chöùc naêng cuûa mình . Ngoaøi ra, override caùc haøm Windows API laø moät quaù trình can thieäp ñoäng vaøo heä thoáng neân kyõ thuaät override laø raát caàn thieát trong tröôøng hôïp developer muoán boå xung theâm hoaëc söûa ñoåi moät soá tính naêng hoaït ñoäng cuûa taát caû hay chæ moät soá öùng duïng ñang chaïy trong heä thoáng maø khoâng caàn phaûi söûa chöõa hay bieân dòch laïi caùc chöông trình nguoàn cuûa öùng duïng. Maø duø coù muoán thì developer cuõng khoâng theå laøm ñöôïc ñieàu naøy bôûi vì Windows khoâng cho pheùp thaâm nhaäp cuõng nhö coâng boá baûn maõ nguoàn cuûa caùc öùng duïng ñoù. Töø ñoù ta thaáy override xöû lyù caùc tình huoáng naøy hoaøn toaøn moät caùch töï ñoäng. Nhö vaäy, trong Windows thì kyõ thuaät override laø moät trong nhöõng kyõ thuaät coù theå ñöôïc duøng nhö laø phöông tieän naâng cao tính naêng cuûa chöông trình öùng duïng maø vaãn ñöôïc söï chaáp thuaän cuûa heä thoáng Windows. Moät vaøi chöông trình xöû lyù ngaét trong heä ñieàu haønh DOS coù theå ñöôïc override bôûi ñoaïn chöông trình xöû lyù ngaét rieâng cuûa user baèng caùch gaùn ñòa chæ boä nhôù nôi maø chöông trình xöû lyù ngaét môùi vaøo baûng vector ngaét töông öùng vôùi soá hieäu ngaét ñoàng thôøi löu giöõ ñòa chæ cuûa chöông trình xöû lyù ngaét ñeå trôû veà hoaëc phuïc hoài baûng vector ngaét khi caàn thieát. Moãi khi coù ngaét xaûy ra heä thoáng seõ tham khaûo baûng vector ngaét ñeå xaùc ñònh ñòa chæ cuûa chöông trình phuïc vuï caàn thi haønh vaø chuyeån ñieàu khieån ñeán ñoù, luùc naøy ñoaïn chöông trình cuûa user coù ñòa chæ ñaët trong baûng vector ngaét môùi seõ thöïc thi. Ñieåm trôû veà cuûa chöông trình seõ do user quyeát ñònh: chuyeån ñieàu khieån ñeán leänh keá tieáp sau leänh ñaõ xaûy ra ngaét hoaëc tieáp tuïc thi haønh leänh ngaét cuõ roài môùi trôû veà. Töø ñoù trong Windows chuùng ta seõ tìm caùch troû tôùi ñòa chæ ñoaïn chöông trình seõ override haøm API thay vì heä thoáng phaûi chuyeån ñieàu khieån tôùi ñòa chæ ñoaïn maõ thöïc söï cuûa haøm API moãi khi haøm ñöôïc goïi. Tuy nhieân do cô cheá quaûn lyù boä nhôù cuûa Windows khaùc vôùi DOS neân chuùng ta phaûi tìm hieåu thaät kyõ veà cô cheá quaûn lyù boä nhôù cuûa Windows ñeå coù theå tìm ra ñöôïc giaûi phaùp kyõ thuaät thaät toát cho vaán ñeà override. Ñaëc bieät chuùng ta cuõng caàn tìm hieåu söï khaùc nhau giöõa Windows 16-bit vaø Windows 32-bit. III - Cô cheá hoaït ñoäng vaø quaûn lyù boä nhôù treân Windows 16bits : Windows 16bits töï ñoäng chaïy ôû cheá ñoä “386 enhanced mode” ôû caùc maùy 386, boä nhôù toái thieåu 2MB. Ñoù thöïc chaát laø cheá ñoä standard vôùi 2 ñaëc tính boå sung: Windows duøng caùc thanh ghi trang cuûa 386 ñeå hieän thöïc boä nhôù aûo Windows söû duïng cheá ñoä aûo 8086 cuûa 386 ñeå ñaùp öùng cheá ñoä ña nhieäm MS-DOS. Cheá ñoä 386 enhanced vaø cheá ñoä standard ñem laïi cho Windows nhöõng lôïi ích töø cô cheá baûo veä (protected mode) cuûa caùc boä vi xöû lyù 286, 386. Boä nhôù môû roäng (extended memory) ñöôïc boå sung tröïc tieáp vaøo boä nhôù conventional (conventional memory) vaø ñöôïc söû duïng nhö moät khoái nhôù lieân tuïc. Cô cheá baûo veä coøn cung caáp caùc hoã trôï ñaëc bieät veà quaûn lyù boä nhôù maø ôû cheá ñoä thöïc khoâng coù nhö vieäc aùp buoäc caùc truy xuaát boä nhôù phaûi tuaân thuû moät soá quy luaät nhaèm trôï giuùp ñaûm baûo tính toaøn veïn cuûa moãi chöông trình, cuûa moãi döõ lieäu cuûa chöông trình vaø cuûa chính baûn thaân heä thoáng. Caùc öùng duïng Windows trong cheá ñoä naøy coù theå truy xuaát ñeán moät vuøng naøo ñoù treân ñóa cöùng vaø söû duïng noù nhö moät phaàn cuûa boä nhôù. Ñeå truy xuaát ñuùng phaàn ñòa chæ aûo naøy Windows coù boä quaûn lyù boä nhôù aûo VMM (Virtual Memory Manager), noù laøm vieäc cuøng vôùi phaàn cöùng phaân trang ñöôïc thieát keá saün trong con 386. Trong cheá ñoä naøy, khoâng gian ñòa chæ coù theå leân gaáp 4 laàn kích thöôùc boä nhôù vaät lyù khaû duïng. Cheá ñoä baûo veä (protected mode): laø traïng thaùi cuûa boä vi xöû lyù quy ñònh moät soá quy luaät khi boä nhôù ñöôïc ñaùnh ñòa chæ nhaèm laøm giaûm nhöõng ruûi ro maø chöông trình coù theå ghi ñeø phaàn boä nhôù khoâng thuoäc veà noù. Trong cheá ñoä baûo veä moät chöông trình seõ duøng moät segment goàm 2 phaàn: segment identifier vaø offset ñeå ñaùnh ñòa chæ boä nhôù. Söï chuyeån ñoåi töø ñòa chæ luaän lyù sang ñòa chæ vaät lyù nhö sau: boä vi xöû lyù seõ tham khaûo caùc baûng mieâu taû (descriptor table) (baûng chöùa döõ lieäu ñaëc bieät) ñöôïc heä ñieàu haønh khôûi taïo vaø quaûn lyù. Coù 2 loaïi: baûng mieâu taû toaøn cuïc GDT (Global Descriptor Tables) vaø baûng mieâu taû cuïc boä LDT (Local Descriptor Table). Moät baûng mieâu taû goàm moät maûng caùc maãu tin veà thoâng tin cuûa segment ñöôïc goïi laø boä mieâu taû phaân ñoaïn (segment selector). Phaàn ñòa chæ boä nhôù maø chuùng ta goïi laø segment identifier ñöôïc tham khaûo ñeán nhö laø moät boä choïn phaân ñoaïn (segment selector). Moät segment selector laø moät chæ soá vaøo maûng caùc boä mieâu taû taïo neân baûng mieâu taû, noù xaùc ñònh segment descriptor cung caáp chi tieát caàn thieát ñeå truy xuaát phaân ñoaïn döõ lieäu. Khi chöông trình tham chieáu ñeán moät vò trí nhôù, CPU seõ naïp segment descriptor vaøo caùc thanh ghi ñaëc bieät ñeå xaùc ñònh ñòa chæ vaät lyù cuûa segment sau ñoù offset ñöôïc coäng vaøo ñòa chæ neàn (base address) ñeå truy xuaát ñeán caùc byte boä nhôù mong muoán. Caáu truùc cuûa boä choïn cheá ñoä baûo veä (protected mode selector): chæ coù 13 trong soá 16 bit giaù trò segment ñöôïc duøng nhö chæ soá cuûa baûng mieâu taû, 3 bit coøn laïi chia thaønh 2 phaàn quan troïng trong sô ñoà ñòa chæ hoùa vaø cô cheá baûo veä. Bit 2 laø côø baùo baûng mieâu taû naøo ñang ñöôïc duøng cho pheùp heä ñieàu haønh thieát laäp khoâng gian ñòa chæ cuûa chöông trình baèng caùch duøng 2 baûng mieâu taû: GDT bao haøm toaøn boä boä nhôù ñöôïc chia seû cho toaøn heä thoáng coøn LDT laø khoâng gian ñòa chæ rieâng cuûa chöông trình. Bit 0 vaø bit 1 moâ taû möùc ñaëc quyeàn yeâu caàu cuûa phaân ñoaïn RPL (requested privilege level), chuùng ñöôïc phaàn meàm heä ñieàu haønh thieát laäp ñeå khôûi taïo vaø eùp buoäc sô ñoà baûo veä boä nhôù vôùi 4 möùc ñaëc quyeàn (0,1,2,3): möùc 0 laø cao nhaát daønh rieâng cho haàu heát phaàn meàm heä ñieàu haønh tin caäy. Caùc chöông trình vaø thö vieän Windows ñöôïc ñaëc thöôøng truù ôû möùc ñaëc quyeàn thaáp nhaát – vaønh 3 ñeå giaûi phoùng vaø trao caùc möùc ñaëc quyeàn cao hôn cho caùc thaønh phaàn khaùc cuûa heä ñieàu haønh. Trong cheá ñoä hoã trôï boä nhôù aûo cuûa Windows: chæ coù trong cheá ñoä 386 enhanced vaø cuøng laøm vieäc beân caïnh cô cheá baûo veä. Caùc byte döõ lieäu caàn laøm vieäc ñöôïc xaùc ñònh gioáng nhö ôû cheá ñoä baûo veä bình thöôøng nhöng khaùc ôû choã caùch dòch ñòa chæ base+offset. Trong cheá ñoä baûo veä bình thöôøng ñòa chæ boä nhôù dòch ra laø ñòa chæ vaät lyù. Nhöng trong cheá ñoä 386 enhanced phaàn cöùng phaân trang ñöôïc thieát keá saün trong boä vi xöû lyù Intel 80386 seõ ñöôïc kích hoaït cho pheùp ñòa chæ ñöôïc xem nhö laø moät ñòa chæ aûo. Caùc giaù trò segment vaø offset seõ ñöôïc giaûi maõ ñeå thaønh khoâng gian ñòa chæ aûo. Khoâng gian ñòa chæ aûo naøy ñöôïc phaân thaønh caùc trang nhôù 4K, moãi trang naøy coù theå hoaëc naèm treân boä nhôù vaät lyù hoaëc naèm trong taäp tin hoaùn chuyeån treân ñóa. Khi moät tham khaûo ñöôïc thieát laäp ñeán moät vò trí thöôøng truù treân ñóa, moät loãi trang seõ ñöôïc baät, laø moät ngaét noäi tôùi CPU. Ngay luùc naøy, trình quaûn lyù boä nhôù aûo seõ ñoïc trang nhôù mong muoán töø ñóa vaøo ñeå truy xuaát ñöôïc döõ lieäu. Chæ thò baät loãi trang seõ ñöôïc khôûi ñoäng laïi vaø cô cheá phaân trang hoaøn toaøn trong suoát vôùi phaàn meàm. Söû duïng boä nhôù: Söû duïng caùc khoái boä nhôù: trong Windows boä nhôù ñöôïc quaûn lyù theo khoái, coù theå di chuyeån vaø huyû boû (discardable) ñöôïc. Moãi khoái nhôù di chuyeån ñöôïc seõ khoâng coù ñòa chæ coá ñònh neân Windows coù theå di chuyeån noù ñeán vò trí môùi vaø cuõng coù theå taän duïng toái ña phaàn boä nhôù coøn laïi. Ñoái vôùi khoái nhôù huûy boû ñöôïc Windows coù theå huûy noù ñeå caáp cho nhu caàu khaùc vaø öùng duïng coù theå naïp trôû laïi döõ lieäu khi caàn thieát. Khi xin caáp moät khoái nhôù thì user seõ nhaän töø windows moät handle boä nhôù , duøng handle ñeå laáy ñòa chæ khoái nhôù khi caàn truy xuaát, trong khi ñang caäp nhaät khoái nhôù thì handle phaûi ñöôïc khoùa laïi ñeå khoái nhôù khoâng di chuyeån ñöôïc, khi caäp nhaät xong thì môû khoùa cho handle ñeå Windows coù theå di chuyeån ñöôïc. Söû duïng boä nhôù toaøn cuïc (Global Memory): Boä nhôù toaøn cuïc goàm boä nhôù cuûa maùy tính ñöôïc söû duïng cho caùc öùng duïng vaø thö vieän cuûa Windows. ÖÙng duïng coù theå xin caáp boä nhôù lôùn tuyø yù phuï thuoäc vaøo boä nhôù toaøn cuïc coøn laïi. Söû duïng boä nhôù cuïc boä (Local Memory): nhaèm ñaùp öùng nhu caàu caáp phaùt nhöõng ñoái töôïng kích thöôùc nhoû, nhöng khoâng ñöôïc vöôït quaù 64 KB. IV – Cô cheá hoaït ñoäng vaø quaûn lyù boä nhôù trong Windows 32bits: Windows 32bits söû duïng moâ hình boä nhôù phaúng 4GB ñaõ loaïi tröø ñöôïc nhieàu vaán ñeà naûy sinh trong heä ñieàu haønh DOS bôûi vieäc thay theá kieán truùc boä nhôù phaân trang thay cho kieán truùc boä nhôù phaân ñoaïn voán chaäm chaïp. Moãi öùng duïng DOS chaïy trong maùy aûo VM (Virtual Machine) cuûa noù. Ñieàu naøy taïo cho moãi quaù trình DOS moät möùc baûo veä khoûi caùc quaù trình khaùc vaø gia taêng löôïng vuøng nhôù thaáp khaû duïng. Vieäc söû duïng boä nhôù ñöôïc ñieàu khieån bôûi caùc quaù trình VxD 32 bit laøm gia taêng toác ñoä xöû lyù. Caû hai trình VCACHE vaø VMM laø caùc quaù trình 32 bit laøm giaûm thieåu toång phí vaø gia taêng toác ñoä cho vieäc ñaùnh ñòa chæ vaø vieäc hoaùn ñoåi thoâng tin giöõa boä nhôù vaø ñóa. Windows 32bits chæ coù theå hoaït ñoäng treân heä thoáng 386 trôû leân do yeâu caàu phaûi coù phaàn cöùng hoã trôï sô ñoà ñòa chæ hoùa 32 bit vaø cô cheá phaân trang boä nhôù. Kieán truùc boä nhôù: Kieán truùc boä nhôù cuûa Windows 32bits ñöôïc ñònh nghóa laø heä thoáng boä nhôù aûo ñoøi hoûi phaân trang döïa treân neàn moâ hình boä nhôù phaúng 4GB baèng caùch söû duïng sô ñoà ñòa chæ hoùa 32 bit. Heä thoáng yeâu caàu phaân trang (demand-paged) ñieàu khieån vieäc truy xuaát vaøo boä nhôù chính vaø vieäc thöïc thi quaù trình , döïa treân caùc phaàn meàm yeâu caàu cho heä ñieàu haønh maø phaàn meàm ñang xöû lyù ñaët ra. Heä ñieàu haønh cuõng giaùm saùt caùc taøi nguyeân heä thoáng, xaùc ñònh quaù trình naøo ñang yeâu caàu boä nhôù vaø cung caáp moät vaøi cô cheá ñeå ñaùp öùng caùc yeâu caàu ñoù. Boä nhôù aûo laø khoâng gian bao goàm caû boä nhôù vaät lyù lieân keát vôùi heä thoáng löu tröõ treân ñóa cöùng nhaèm laøm cho vieäc thi haønh cuûa caùc quaù trình coù ñuû vuøng nhôù ñeå thöïc thi caùc chæ thò phaàm meàm. Moâ hình boä nhôù phaúng tuyeán tính cho pheùp ñaùnh ñòa chæ baét ñaàu taïi moät vaøi vò trí naøo ñoù, 0 hay 0000h vaø tieáp tuïc cho ñeán giôùi haïn lôùn nhaát, 4G hay FFFF:FFFFh baèng caùch duøng sô ñoà ñaùnh ñòa chæ taêng daàn. Sô ñoà ñòa chæ hoùa naøy chæ ñöôïc hoã trôï bôûi phaàn cöùng cuûa heä thoáng 386 hoaëc cao hôn. Moâ hình laäp trình 386: Caùc thanh ghi vaø ñöôøng daãn döõ lieäu 32 bit cuûa heä thoáng 386 (vaø cao hôn) cho pheùp 4GB khoâng gian ñòa chæ vaät lyù. Khoâng gian boä nhôù aûo cuûa cheá ñoä baûo veä 30386 goàm coù 16383 tuyeán tính cho moãi boä nhôù 4GB. Vieäc bieåu hieän boä nhôù tuyeán tính 4GB ñöôïc goïi laø moâ hình boä nhôù phaúng (flat memory model). Moãi thanh ghi ñôn coù theå ñöôïc coi nhö moät con troû chæ vaøo khoâng gian ñòa chæ 4GB naøy. Caùc thanh ghi trong 80386 coù giaù trò 32 bit, goàm 5 nhoùm chính: Nhoùm thanh ghi ña duïng (general purpose register): duøng di chuyeån döõ lieäu ra vaøi boä vi xöû lyù, kieåm tra vaø laäp caùc côø traïng thaùi. Nhoùm caùc thanh ghi gôõ roái (debuging register): cho pheùp ngöôøi laäp trình thieát laäp moät vaøi ñòa chæ ngaét (breakpoint address) trong quaù trình ñeå theo doõi, gôõ loãi cho chöông trình. Nhoùm caùc thanh ghi traïng thaùi vaø ñieàu khieån (status and control register): cung caáp caùc côø traïng thaùi chæ ra keát quaû cuûa caùc pheùp toaùn vaø ñöôïc duøng ñeå thay ñoåi caùc böôùc thöïc thi cuûa chöông trình döïa vaøo keát quaû kieåm tra côø. Caùc thanh ghi côø traïng thaùi ñöôïc boä quaûn lyù boä nhôù aûo VMM söû duïng roäng raõi ñeå quaûn lyù boä nhôù. EIP laø thanh ghi leänh môû roäng (extended instruction register): chæ ra ñòa chæ cuûa leänh tieáp theo seõ ñöôïc thi haønh. Nhoùm caùc thanh ghi ñieàu khieån (control register): ñöôïc heä ñieàu haønh duøng ñieàu khieån vieäc thöïc thi chöông trình vaø ñöôïc duøng bôûi VMM ñeå ñaùnh ñòa chæ cho boä nhôù aûo, hoã trôï ñaëc ñieåm toå chöùc boä nhôù theo trang cuûa 386. Caùc thanh ghi phaân ñoaïn (segment register): duy trì söï töông thích vôùi heä thoáng 80286 vaø cung caáp ñòa chæ phaân ñoaïn khi 386 chaïy trong cheá ñoä thöïc hoaëc cheá ñoä chuaån. Ñòa chæ hoùa boä nhôù aûo: Windows 32bits duøng sô ñoà ñòa chæ phaân trang laøm cho boä nhôù vaät lyù döôøng nhö roäng theâm hôn. Thö muïc trang (page directory): laø moät baûng chöùa ñöïng ñòa chæ cuûa 1024 baûng trang (page table), moãi ñòa chæ roäng 32 bit neân kích thöôùc cuûa thö muïc trang laø 4096 bytes. Baûng trang (page table): bao goàm laø caùc ñieåm nhaäp, moãi ñieåm nhaäp laø söï keát hôïp cuûa ñòa chæ vaät lyù vaø caùc côø traïng thaùi cuûa boä nhôù vaät lyù. Söï keát hôïp giöõa thö muïc trang vaø moät baûng trang ñôn ñoäc seõ ñaùnh ñòa chæ cho 4MB boä nhôù. Vì vaäy neáu RAM ñöôïc theâm vaøo thì ñoøi hoûi cuõng phaûi theâm baûng trang cho moãi 4MB. Caùc ñòa chæ baûng trang tuaàn töï ñöôïc löu giöõ trong thö muïc trang cho ñeán toái ña 1024 ñòa chæ. Caùch ñaùnh ñòa chæ trang nhö treân laø lyù do giaûi thích taïi sao boä nhôù toái thieåu cho Windows 32bits laø 4MB. Moãi quaù trình trong Windows 32bits coù moät taäp caùc ñòa chæ baûng trang ñöôïc gaùn cho noù. Moãi ñòa chæ naøy bao goàm phaàn 20 bit cao laø moät ñòa chæ vaät lyù vaø phaàn 12 bit thaáp laø caùc côø traïng thaùi. Caùc côø naøy cung caáp thoâng tin caàn thieát cho thaønh phaàn Kernel cuûa Windows vaø chöông trình ngöôøi söû duïng. Khung trang (page frame): moãi khung trang ñöôïc ñaùnh ñòa chæ duy nhaát bôûi moät ñieåm nhaäp trong baûng trang. Phaàn 12 bit thaáp cuûa ñòa chæ aûo 32 bit naøy ñaëc taû cho 1 byte duy nhaát cuûa boä nhôù. Vieäc söû duïng 12 bit naøy seõ ñaùnh ñòa chæ toaøn boä 4096 byte cuûa khung trang vaø nhö vaäy khung trang seõ chæ vaøo caùc ñòa chæ RAM vaät lyù. Nhö vaäy moät ñòa chæ aûo 32 bit ñöôïc chia laøm 3 phaàn: 10 bit cao (22 - 31) chæ ra baûng trang ñöôïc choïn trong thö muïc trang 10 bit tieáp theo (12 - 21) chæ ra ñòa chæ cuûa khung trang thuoäc baûng trang 12 bit thaáp (0 - 11) ñaëc taû cho ñòa chæ byte vaät lyù beân trong ranh giôùi 4K cuûa trang Khoâng gian boä nhôù aûo cuûa trình öùng duïng: Trong Windows 32bits, moãi quaù trình coù moät khoâng gian ñòa chæ 4GB rieâng cuûa noù. Caùc nhaùnh (thread) thuoäc quaù trình chæ coù theå truy xuaát ñeán khoâng gian nhôù thuoäc veà quaù trình ñoù maø thoâi. Khoâng gian ñòa chæ cuûa taát caû caùc quaù trình khaùc ñeàu khoâng theå truy xuaát ñoái vôùi nhaùnh ñang chaïy. Tuy nhieân rieâng trong Windows 32bits thì khoâng hoaøn toaøn troïn veïn nhö vaäy, vuøng nhôù thuoäc veà heä ñieàu haønh khoâng ñöôïc che giaáu ñoái vôùi nhaùnh ñang chaïy do vaäy raát coù khaû naêng nhaùnh ñang chaïy vì moät söï coá naøo ñoù seõ truy xuaát vaøo vuøng döõ lieäu cuûa heä ñieàu haønh vaø laøm hoûng heä thoáng. Khoâng gian ñòa chæ cuûa moãi quaù trình ñöôïc phaân thaønh caùc vuøng nhö sau: Vuøng ñòa chæ töø 0x00000000 ñeán 0x003FFFFF: Ñaây laø vuøng nhôù kích thöôùc 4MB ôû phaàn ñaùy cuûa khoâng gian ñòa chæ, Windows 32bits duøng ñeå ñaûm baûo tính töông thích vôùi MS-DOS vaø Windows 16 bit. Caùc öùng duïng 32 bit khoâng neân ñoïc ghi vaøo vuøng naøy. Veà maët lyù thuyeát thì CPU seõ taïo ra loãi truy xuaát (access violation) neáu moät nhaùnh naøo ñoù cuûa quaù trình chaïm vaøo vuøng nhôù naøy, tuy nhieân vì lyù do kyõ thuaä thì thöïc teá Microsoft khoâng theå baûo veä toaøn boä vuøng nhôù naøy maø chæ coù theå baûo veä vuøng 4KB thaáp nhaát. Vì theá neáu moät nhaùnh naøo ñoù cuûa quaù trình coá gaéng ñoïc ghi vaøo vuøng nhôù coù ñòa chæ töø 0x00000000 ñeán 0x00000FFF thì CPU seõ phaùt hieän vaø baùo loãi truy xuaát. Vieäc baûo veä vuøng 4KB naøy ñaëc bieät höõu ích cho vieäc phaùt hieän caùc pheùp gaùn con troû roãng. Vuøng ñòa chæ töø 0x00040000 ñeán 0x7FFFFFFF: Phaàn khoâng gian 2.143.289.344 (= 2GB – 4KB) laø nôi thöôøng truù cuûa khoâng gian ñòa chæ rieâng (khoâng chia seû) cuûa quaù trình. Moät quaù trình Win32 khoâng theå ñoïc/ghi hoaëc baèng baát kyø caùch naøo truy xuaát truy xuaát döõ lieäu cuûa quaù trình khaùc ñang thöôøng truù treân vuøng naøy. Ñoái vôùi taát caû caùc öùng duïng Win32, vuøng naøy laø nôi maø phaàn chính yeáu cuûa döõ lieäu quaù trình ñang caát giöõ. Vuøng ñòa chæ töø 0x80000000 ñeán 0xBFFFFFFF: Vuøng 1GB naøy laø nôi heä thoáng caát giöõ döõ lieäu duøng chia seõ giöõa taát caû caùc quaù trình Win32 chaúng haïn nhö caùc thö vieän lieân keát ñoäng heä thoáng, kernel32.dll, user32.dll, gdi32.dll, advapi32.dll ñeàu ñöôïc naïp vaøo vuøng khoâng gian ñòa chæ naøy. Chính ñieàu naøy laøm cho 4 thö vieän heä thoáng trôû neân deã daøng khaû duïng ñoái vôùi toaøn boä caùc quaù trình Win32 moät caùch ñoàng thôøi. Heä thoáng cuõng aùnh xaï toaøn boä caùc taäp tin aùnh xaï boä nhôù (memory-mapped file) vaøo vuøng naøy. Vuøng ñòa chæ töø 0xC0000000 ñeán 0xFFFFFFFF: Vuøng 1GB naøy laø nôi maõ leänh cuûa heä ñieàu haønh ñöôïc ñònh vò, bao goàm caùc trình ñieàu khieån thieát bò aûo cuûa heä thoáng (VxD), maõ leänh quaûn lyù boä nhôù ôû möùc thaáp, maõ leänh taäp tin heä thoáng. Cuõng gioáng nhö vuøng nhôù tröôùc, toaøn boä maõ leänh trong vuøng naøy ñöôïc chia seõ cho taát caû quaù trình Win32. Tuy nhieân döõ lieäu trong vuøng naøy laïi khoâng ñöôïc baûo veä, baát kyø moät öùng duïng Win32 naøo cuõng coù theå ñoïc/ghi vaøo vuøng naøy vaø laøm hoûng heä thoáng. Nhö vaäy thì yù töôûng cô baûn cho vieäc thöïc hieän kyõ thuaät override trong Windows 32 laø cuõng nhaûy tôùi ñòa chæ cuûa haøm override töông öùng moãi khi haøm API naøo ñoù ñöôïc goïi. Tuy nhieân, ñoái vôùi Windows 32bits thì moãi quaù trình trong heä thoáng ñeàu ñöôïc thöïc thi trong moät khoâng gian ñòa chæ rieâng reõ. Neân muoán can thieäp vaøo quaù trình goïi haøm cuûa öùng duïng thì chuùng ta phaûi baèng moïi caùch thaâm nhaäp vaøo khoâng gian ñòa chæ cuûa öùng duïng, thì luùc ñoù chuùng ta môùi coù theå ñieàu khieån ñöôïc quaù trình goïi haøm API. Nhöng ôû Windows 16 bit thì caùc haøm duøng ñeå thay ñoåi thuoäc tính caùc trang nhôù chöùa maõ haøm API thì nay ôû trong Windows 32 bit khoâng coøn ñöôïc hoã trôï nöõa. Nhö vaäy laøm theo caùch nhö ôû Windows 16 bit laø khoâng khaû thi, vaán ñeà ñaët ra laø phaûi tìm caùch thay ñoåi thuoäc tính caùc trang nhôù ñang chöùa maõ haøm API nguyeân thuûy. Chuùng toâi ñaõ coá gaéng nghieân cöùu coâng vieäc naøy baèng caùc phöông phaùp ñöôïc giôùi thieäu trong chöông 16: Breaking Through Process Boundary Walls cuûa cuoán Advance Windows – The Developer’s Guide to the Win32 API for Windows NT 3.5 and Windows 95 vaø tìm caùch thöïc hieän nhöng chöa ñaït ñöôïc keát quaû khaû quan. Do haïn cheá veà thôøi gian cuõng nhö taøi lieäu tham khaûo veà caùc kyõ thuaät naøy raát ít neân vieäc nghieân cöùu ñeå tìm ra caùch giaûi quyeát vaán ñeà söû duïng kyõ thuaät override trong Windows 32bits chöa ñi ñeán keát quaû neân chuùng toâi buoäc phaûi choïn kyõ thuaät override trong Windows 16bits ñeå overrride caùc haøm xuaát vaên baûn coù saün ñeå aùp duïng vaøo chöông trình cuûa mình. V – Hieän thöïc kyõ thuaät override treân Windows 16bits: Phöông phaùp maø chuùng toâi choïn ñeå aùp duïng vaøo chöông trình laø ôû daïng front-end processing töùc laø 5 bytes leänh ñaàu tieân cuûa ñoaïn maõ leänh haøm API seõ ñöôïc ghi ñeø baèng 5 bytes cuûa leänh JMP address trong ñoù byte thöù nhaát laø maõ hôïp ngöõ cuûa leänh CALL, 4 byte keá tieáp laø offset vaø segment töông öùng cuûa ñoaïn maõ leänh haøm override. Trình töï hieän thöïc bao goàm caùc böôùc sau: 1 - Xaùc ñònh ñòa chæ boä nhôù nôi ñoaïn maõ leänh override thöôøng truù: Thöôøng chuùng ñöôïc taäp hôïp döôùi daïng caùc taäp tin .DLL, .EXE cuûa developer. Coù 2 haøm ñeå laáy ñòa chæ logic trong boä nhôù cuûa baát kyø haøm API naøo: GetProcAddress vaø MakeProcInstance. 2 - Xaùc ñònh ñòa chæ boä nhôù nôi baét ñaàu ñoaïn maõ töông öùng cuûa haøm API caàn override: Ñaây cuõng chính laø ñieåm nhaäp cuûa caùc haøm trong thö vieän lieân keát ñoäng ñaõ ñöôïc naïp vaøo boä nhôù. Caùc thö vieän naøy laø thaønh phaàn cô baûn cuûa Windows vaø ñöôïc naïp vaøo boä nhôù khi Windows khôûi ñoäng. Taïi ñòa chæ boä nhôù cuûa haøm API coù ñöôïc ta coù theå taïo moät leänh nhaûy töø ñaây ñeán ñòa chæ ñoaïn maõ leänh override. Nhöng Windows chæ cho pheùp ghi leân data segment chöù khoâng cho pheùp ghi leân code segment. Vì vaäy ta phaûi coù böôùc trung gian: 3 - Thay ñoåi thuoäc tính cuûa segment chöùa maõ haøm API trong Windows: Baèng caùch duøng haøm PrestoChangoSelector ñeå coù theå thay ñoåi thuoäc tính segment theo 2 chieàu: töø code sang data hoaëc töø data sang code. 4 - Ghi maõ leänh nhaûy vaøo ñòa chæ baét ñaàu ñoaïn maõ haøm API: Duøng leänh nhaûy khoâng ñieàu kieän JMP thì luùc ñoù stack cuûa öùng duïng seõ khoâng ñoåi, ñænh stack vaãn laø ñòa chæ trôû veà öùng duïng sau leänh goïi haøm API, do vaäy khi gaëp leänh return trong thaân haøm override thì ñòa chæ trôû veà laø ñòa chæ leänh keá tieáp sau leänh goïi haøm API trong öùng duïng. Nhö vaäy ñeå laøm ñieàu naøy thì chuùng ta ghi ñeø 5 bytes ñaàu tieân taïi ñòa chæ baét haøm API vôùi doäi dung laø maõ hôïp ngöõ cuûa leänh JMP address trong ñoù byte ñaàu tieân laø maõ leänh JMP, coù giaù trò laø 0EAh, 4 byte keá tieáp laø ñòa chæ logic daïng kieán truùc ñoaïn offset (2 byte)-segment (2 byte) nôi baét ñaàu ñoaïn maõ leänh override cuûa developer. 5 - Phuïc hoài 5 bytes nguyeân thuûy maõ leänh ñaàu tieân cuûa haøm API: - Ñeå gôõ boû override, traû laïi haøm API nhö cuõ. - Giaûi thuaät thöïc hieän noùi chung gioáng heät nhö vieäc caøi ñaët override, chæ khaùc laø thay vì ghi maõ leänh nhaûy vaø ñòa chæ thì baây giôø ghi 5 bytes nguyeân thuûy cuûa haøm API. - Naêm bytes nguyeân thuûy cuûa haøm API laø haèng soá, neân coù theå duøng moät trong hai caùch sau: * Ghi thaúng caùc maõ leänh naøy vaøo trong chöông trình. Caùch naøy ñôn giaûn deã laøm neân vieäc hieän thöïc chöông trình nhanh, vaø khoâng phuï thuoäc vaøo nhaân toá beân ngoaøi (phaàn boä nhôù löu tröõ 5 bytes nguyeân thuûy) neân traùnh ñöôïc vieäc chöông trình chaïy sai leäch neáu voâ yù thay ñoåi 5 bytes naøy, nhöng khoâng toång quaùt. * Khi caøi ñaët override thì ñoïc 5 bytes nguyeân thuûy, löu vaøo trong DLL, ñeán khi gôõ boû thì laáy 5 bytes ñoù ghi trôû laïi. Caùch naøy toång quaùt hôn, nhöng chöông trình seõ phöùc taïp hôn vaø phaûi laøm nhieàu vieäc hôn moät caùch khoâng caàn thieát. 6 - Thieát keá haøm override API: Ñieàu tröôùc nhaát caàn nhôù khi thieát keá haøm override API laø vieäc ñaët caùc parameters cuûa noù: phaûi gioáng heät nhö haøm API nguyeân thuûy, vaø töø caùc parameters naøy ta seõ chöùa caùc thoâng tin caàn thieát. Ñoàng thôøi thoâng tin traû veà cuõng phaûi cuøng kieåu döõ lieäu vôùi haøm API nguyeân thuûy. Vieäc xöû lyù beân trong haøm override thì tuøy yù ñoà cuûa öùng duïng, noùi chung laø coù theå laøm baát cöù vieäc gì. Chæ coù moät vieäc ñaëc bieät vaø caàn thieát laø goïi laïi haøm nguyeân thuûy, noùi chung vieäc naøy cuõng ñôn giaûn, bao goàm 3 böôùc nhö sau: - Gôõ boû override : Haøm API trôû laïi bình thöôøng - Goïi laïi haøm API - Caøi ñaët override laïi nhö cuõ. 7 – Caùch laáy noäi dung 5 bytes ñaàu tieân cuûa moät haøm API: Chuùng toâi choïn phöông phaùp thöù nhaát ñeå phuïc hoài noäi dung 5 bytes ñaàu cuûa haøm API khi gôõ boû override. Muoán vaäy phaûi xaùc ñònh tröôùc giaù trò 5 bytes naøy. Caùc böôùc hieän thöïc ñeå laáy noäi dung 5 bytes ñaàu tieân cuûa moät haøm API nhö sau: Laáy ñòa chæ cuûa haøm API thöôøng truù trong boä nhôù Laáy ñòa chæ offset vaø segment cuûa haøm Sau ñoù duøng ñoaïn chöông trình vieát baèng hôïp ngöõ ñeå chuyeån noäi dung töøng byte moät vaøo trong 1 bieán coù caáu truùc chæ goàm 1 tröôøng laø moät maûng 5 byte. Töø ñoù cho hieån thò ñeå bieát noäi dung. Nhö vaäy ta coù theå ñoïc noäi dung cuûa baát kyø haøm API naøo. Sau ñaây laø chöông trình thöïc hieän: // kieu du lieu struct First5 { BYTE memb[5]; }; typedef struct First5 ARRAY5BYTE; // doan chuong trinh ARRAY5BYTE FAR PASCAL Get5ByteOrgFunction( LPCSTR APIFunctionName) { HINSTANCE hinstDll; FARPROC fpFunction; UINT fpFunctionOff, fpFunctionSeg; BYTE Byte5temp[5]; ARRAY5BYTE Array5temp; hinstDll= LoadLibrary("USER.EXE"); if (hinstDll < HINSTANCE_ERROR) { MessageBox(NULL,"Can not load library", NULL,MB_ICONEXCLAMATION); return(NULL); } fpFunction= GetProcAddress(hinstDll,APIFunctionName); fpFunctionSeg=SELECTOROF(fpFunction); fpFunctionOff=OFFSETOF(fpFunction); FreeLibrary(hinstDll); // lay noi dung cua 5 bytes dau cho vao cau truc Byte5temp // bang ngon ngu Assembly _asm { push ds mov ds,fpFunctionSeg mov bx,fpFunctionOff inc fpFunctionOff inc fpFunctionOff mov ax,[bx] mov Byte5temp[0],al mov Byte5temp[1],ah mov bx,fpFunctionOff inc fpFunctionOff inc fpFunctionOff mov ax,[bx] mov Byte5temp[2],al mov Byte5temp[3],ah mov bx,fpFunctionOff mov ax,[bx] mov Byte5temp[4],al pop ds } Array5temp.memb[0]=Byte5temp[0]; Array5temp.memb[1]=Byte5temp[1]; Array5temp.memb[2]=Byte5temp[2]; Array5temp.memb[3]=Byte5temp[3]; Array5temp.memb[4]=Byte5temp[4]; return(Array5temp); } Noäi dung 5 bytes ñaàu tieân cuûa 5 haøm xuaát vaên baûn cuûa Windows 3.x: Haøm Noäi dung TextOut ExtTextOut TabbedTextOut DrawText GrayString 55 8B EC 68 DD h B8 8F 05 45 55 h 55 8B EC 68 66 h C8 10 00 00 1E h 66 58 6A 19 66 h VI – Moät soá haøm ñöôïc söû duïng trong kyõ thuaät override: 1 – Haøm LoadLibrary: - Cuù phaùp: HINSTANCE LoadLibrary(lpszLibFileName) LPCSTR lpszLibFileName; - Haøm LoadLibrary naïp library module. - Thoâng soá lpszLibFileName: Troû tôùi moät chuoãi keát thuùc baèng kyù töï null laø teân cuûa file thö vieän ñöôïc naïp. Neáu chuoãi khoâng chöùa ñöôøng daãn thì Windows seõ tìm kieám thö vieän theo trình töï sau: Thö muïc hieän haønh Thö muïc Windows (chöùa trong WIN.COM), haøm GetWindowsDirectory laáy ñöôøng daãn cuûa thö muïc naøy. Thö muïc heä thoáng Windows (chöùa trong file heä thoáng nhö GDI.EXE), haøm GetSystemDirectory laáy ñöôøng daãn cuûa thö muïc naøy. Thö muïc chöùa file thöïc thi cho task hieän haønh, haøm GetModuleFileName laáy ñöôøng daãn cuûa thö muïc naøy. Thö muïc ñaõ lieät keâ trong bieán moâi tröôøng PATH. Danh saùch thö muïc ñaõ aùnh xaï trong maïng. Giaù trò traû veà: laø handle cuûa module thö vieän ñöôïc naïp neáu haøm thaønh coâng, ngöôïc laïi laø loãi neáu giaù trò nhoû hôn HINSTANCE_ERROR. 2 – Haøm FreeLibrary: - Cuù phaùp: void FreeLibrary(hinst) HINSTANCE hinst; - Haøm FreeLibrary giaûm soá laàn tham chieáu cuûa module library ñöôïc naïp. Khi soá laàn tham chieáu laø 0 thì boä nhôù seõ chieám laïi. - Thoâng soá: hinst Library module ñöôïc naïp. - Giaù trò traû veà: haøm khoâng traû veà giaù trò gì. 3 – Haøm GetProcAddress: - Cuù phaùp: FARPROC GetProcAddress(hinst, lpszProcName) HINSTANCE hinst; LPCSTR lpszProcName; - Haøm GetProcAddress laáy ñòa chæ cuûa haøm module - Thoâng soá: hinst module chöùa haøm lpszProcName Con troû tôùi ñòa chæ chuoãi null-terminated chöùa teân haøm hay soá thöù töï cuûa haøm. Neáu laø soá thöù töï thì giaù trò phaûi ôû trong word thaáp vaø word cao phaûi laø 0. Giaù trò traû veà: laø giaù trò ñieåm nhaäp cuûa haøm module neáu haøm thaønh coâng,ngöôïc laïi traû veà NULL. Thoâng soá lpszProcName laø moät giaù trò soá thöù töï vaø haøm ñöôïc xaùc ñònh bôûi soá thöù töï ñoù khoâng toàn taïi trong module thì haøm vaãn coù theå traû veà giaù trò non-NULL. Xaùc ñònh haøm baèng teân toát hôn. 4 – Haøm MakeProcInstance: - Cuù phaùp: FARPROC MakeProcInstance(lpProc, hinst) FARPROC lpProc; HINSTANCE hinst; - MakeProcInstance traû veà ñòa chæ cuûa prolog code moät haøm exported. Prolog code buoäc moät instance data segment vôùi moät haøm exported. Khi haøm ñöôïc goïi noù truy xuaát tôùi caùc bieán vaø döõ lieäu trong instance data segment ñoù. - Thoâng soá: lpProc ñòa chæ cuûa haøm exported. hinst instance ñöôïc toå chöùc vôùi data segment yeâu caàu. - Giaù trò traû veà: chæ tôùi prolog code cho haøm exported neáu thaønh coâng, ngöôïc laïi laø NULL. 5 – Haøm FreeProcInstance: - Cuù phaùp: void FreeProcInstance(lpProc) FARPROC lpProc; - Haøm FreeProcInstance giaûi phoùng haøm ra khoûi data segment buoäc laáy noù bôûi haøm MakeProcInstance. - Thoâng soá: lpProc: chæ tôùi ñòa chæ procedure-instance address cuûa haøm ñöôïc giaûi phoùng. Noù phaûi ñöôïc taïo bôûi haøm MakeProcInstance. - Haøm khoâng traû veà giaù trò gì. 6 – Haøm AllocSelector: - Cuù phaùp: UINT AllocSelector(uSelector) UINT uSelector; - Haøm AllocSelector caáp phaùt moät selector môùi. Windows khoâng khuyeán khích söû duïng haøm naøy, chæ söû duïng khi thöïc söï caàn thieát, trong Windows 32bit khoâng support. - Thoâng soá: uSelector laø selector ñeå traû veà. Neáu laø selector khoâng hôïp leä thì traû veà moät moät selector môùi laø moät baûn sao chính xaùc cuûa caùi ñaõ xaùc ñònh ôû ñaây. Neáu laø 0 thì traû veà moät selector môùi khoâng ñöôïc khôûi taïo. - Giaù trò traû veà: laø moät selector baûn sao cuûa selector ñaõ toàn taïi hoaëc laø moät selector môùi chöa ñöôïc khôûi taïo, ngöôïc laïi laø 0. 7 – Haøm PrestoChangoSelector: - Cuù phaùp: UINT PrestoChangoSelector( uSourceSelector, uDestSelector) UINT uSourceSelector; UINT uDestSelector; - Haøm PrestoChangoSelector taïo ra moät code selector töông öùng vôùi data selector ñaõ cho hoaëc taïo ra moät data selector töông öùng vôùi moät code selector ñaõ cho. Windows khoâng khuyeán khích söû duïng haøm naøy, chæ söû duïng khi thöïc söï caàn thieát, trong Windows 32bit khoâng support. - Thoâng soá: uSourceSelector selector caàn ñoåi uDestSelector selector ñöôïc caáp tröôùc ñoù bôûi haøm AllocSelector. Selector ñöôïc caáp tröôùc naøy nhaän selector ñöôïc chuyeån ñoåi. - Giaù trò traû veà: laø selector ñaõ ñöôïc ñoåi neáu thaønh coâng, ngöôïc laïi laø 0. Chöông 4: KEÁT XUAÁT VAÊN BAÛN TRONG WINDOWS I - Keát xuaát vaên baûn trong Windows: Trong phaàn lôùn caùc öùng duïng thì vaên baûn laø phaàn keát xuaát chính. Do Windows laø moät heä ñieàu haønh ñoäc laäp thieát bò (device independent) neân vieäc keát xuaát vaên baûn cuõng töông ñoái deã chòu. Cuõng nhö caùc thaønh phaàn ñoà hoïa khaùc trong Windows, vieäc xuaát vaên baûn leân maøn hình phaûi thoâng qua trung gian laø DC (device context). Nhö theá, ñaëc tính ñoäc laäp thieát bò cuûa heä ñieàu haønh Windows baét buoäc developer phaûi laøm vieäc giaùn tieáp ñeå hieån thò vaên baûn nhöng Windows ñaûm baûo laø chöông trình cuûa ta seõ chaïy ñöôïc treân baát kyø thieát bò naøo. Trong ña soá tröôøng hôïp Windows seõ giaûi quyeát hoaït ñoäng cuûa thieát bò thoâng qua caùc driver thieát bò maø ngöôøi söû duïng ñaõ cho caøi ñaët treân heä thoáng. Caùc driver thieát bò seõ chaän höùng döõ kieän maø öùng duïng muoán cho hieån thò roài cho dòch caùc döõ lieäu naøy ra daïng thích hôïp cuûa thieát bò maø noù seõ hieån thò leân nhö maøn hình, maùy in… Moãi thieát bò ñeàu coù moät driver do nhaø saûn xuaát taïo ra. Device Context (DC) chaúng qua laø moät caáu truùc döõ lieäu laøm gaïch noái giöõa chöông trình öùng duïng vaø driver cuûa thieát bò. Keát xuaát vaên baûn theo GDI hoaøn toaøn khaùc vôùi keát xuaát treân moâi tröôøng laäp trình coå ñieån DOS, vì GDI coi vaên baûn nhö laø moät loaïi ñoái töôïng ñoà hoïa. Caùch tieáp caän ñeå keát xuaát vaên baûn cuûa GDI coù theå ñöôïc goïi laø keát xuaát thieân veà pixel (pixel oriented output), GDI söû duïng khung löôùi pixel ñeå cho ta xuaát vaên baûn vaø ta coù theå xuaát vaên baûn ôû baát kyø vò trí naøo treân cöûa soå. Vaø do coi vaên baûn nhö laø moät ñoái töôïng ñoà hoïa neân ta coù theå deã daøng troän vaên baûn vôùi caùc ñoái töôïng ñoà hoïa khaùc. Nhöng khaùc vôùi caùc ñoái töôïng ñoà hoïa khaùc ta phaûi duøng phoâng chöõ (font) ñeå xuaát vaên baûn. Font laø moät ñoái töôïng cuûa GDI duøng ñeå ñònh nghóa nhöõng kyù töï ñeå xuaát ra trong moät chöông trình Windows. Font thöôøng laø moät caên cöù döõ lieäu hoïa tieát moâ taû hình daùng vaø kích thöôùc cuûa moãi chöõ caùi, soá vaø daáu. Moãi thieát bò GDI ñeàu coù theå hoã trôï ñöôïc moät hoaëc nhieàu font. II – Caùc haøm caên baûn ñeå keát xuaát vaên baûn: Cuõng nhö caùc ñoái töôïng GDI khaùc, font cuõng phaûi ñöôïc söû duïng vôùi moät DC vaø bò aûnh höôûng bôûi tình traïng hieän haønh cuûa DC naøy nhö mapping mode, maøu saéc. Trong Win 16bit maø ñaïi dieän laø Windows 3.X thì coù 5 haøm chuû yeáu ñeå keát xuaát vaên baûn, ñoù laø: TextOut(), ExtTextOut(), DrawText(), TabbedTextOut() vaø cuoái cuøng laø GrayString(). Trong ñoù: TextOut(): xuaát moät chuoãi kyù töï leân moät DC ñöôïc chæ ñònh söû duïng font chöõ hieän ñöôïc choïn. ExtTextOut(): xuaát moät chuoãi kyù töï trong moät hình chöõ nhaät söû duïng font chöõ hieän ñöôïc choïn, vuøng chöõ nhaät naøy coù theå bò opaque töùc laø bò toâ ñaày bôûi maøu neàn hieän haønh hoaëc coù theå laø moät vuøng xeùn (clipping region). DrawText(): xuaát vaên baûn ñöôïc ñònh daïng trong moät hình chöõ nhaät, haøm coù theå suy dieãn 4 kyù töï nhö laø nhöõng kyù töï ñieàu khieån: carriage return (CR), linefeed (LF), space, tab vaø coù theå canh phaûi, canh traùi, canh giöõa. TabbedTextOut(): xuaát chuoãi kyù töï leân moät DC ñöôïc chæ ñònh söû duïng font chöõ hieän haønh vaø cho bung nhöõng ñieåm canh coät (tab) theo nhöõng coät ñöôïc khai baùo. GrayString(): xuaát moät haøng vaên baûn bò laøm môø taïi moät vò trí chæ ñònh. Thöôøng ñöôïc aùp duïng ñeå baùo laø ñoái töôïng ñoù bò voâ hieäu hoùa (disabled). Trong caùc haøm treân thì chæ coù 2 haøm TextOut() vaø ExtTextOut() laø thuoäc GDI.EXE coøn 3 haøm coøn laïi ñeàu laø thaønh phaàn cuûa Windows Manager töùc laø thuoäc USER.EXE. Treân thöïc teá laø haàu nhö caùc doøng vaên baûn ñöôïc hieån thò treân maøn hình cuûa Windows 3.X ñeàu ñöôïc xuaát bôûi 2 haøm TextOut vaø ExtTextOut, vì caùc haøm coøn laïi cuõng goïi vaøo 2 haøm naøy ñeå veõ ra, vaø vì vaäy trong chöông trình chuùng toâi cuõng chæ tieán haønh override 2 haøm naøy vaø trong phaàn naøy chuùng toâi xin giôùi thieäu chi tieát 2 haøm TextOut(), ExtTextOut(). 1 - Haøm TextOut: - Laø haøm keát xuaát vaên baûn ñôn giaûn nhaát cuûa GDI duøng ñeå xuaát moät doøng vaên baûn ñôn taïi vò trí (spx,spy) söû duïng font chöõ ñöôïc choïn. - Cuù phaùp: TextOut( HDC hdc, Int spx, Int spy, LPCTSTR lpszString, Int cbString ); Thoâng soá: hdc handle cuûa DC spx, spy toïa ñoä logic cho bieát ñieåm ñieàu khieån (control point) duøng canh vò trí khôûi ñi cuûa doøng vaên baûn. Ñieåm ñieàu khieån laø moät vò trí trong heä toïa ñoä ñöôïc ñònh nghóa trong DC. Vôùi heä toïa ñoä MM_TEXT thì ñôn vò tính laø pixels. lpszString con troû chæ tôùi chuoãi kyù töï khoâng coù kyù töï keát thuùc laø kyù töï roãng. nString soá kyù töï (soá byte) trong chuoãi vaên baûn. Maëc ñònh GDI canh doøng vaên baûn veà goùc traùi-treân ôû ñieåm ñieàu khieån (spx,spy). Giaù trò traû veà: haøm traû veà khaùc 0 neáu thaønh coâng, ngö

Các file đính kèm theo tài liệu này:

  • docdataiLVTNDH.doc
Tài liệu liên quan