You are on page 1of 15

Ti liu Lp trnh h thng

Chng 2

Chng 2 NGT V S KIN


1. Khi nim
Ngt (interrupt) l qu trnh dng chng trnh chnh ang chy u tin thc hin mt chng trnh khc, chng trnh ny c gi l chng trnh phc v ngt (ISR Interrupt Service Routine). ISR hon ton ging vi mt chng trnh bnh thng trn my tnh, ngha l n c kh nng truy xut n tt c cc lnh ngn ng my ca P. Tuy nhin cui ISR s kt thc bng lnh IRET (Interrupt Return) P tip tc thc hin lnh kt thc trc y. Cc nguyn nhn dn n ngt l: Bn thn chng trnh ang thc hin b li, v d nh: chia cho 0, Do tc ng ca thit b ngoi vi, v d nh: thc hin lnh in nhng my in li, ghi d liu vo a nhng khng c a, Do lp trnh vin ch ng gi cc ngt c sn.

Mt cch n gin, chng ta c th xem ngt nh l qu trnh gi chng trnh con nhng cc chng trnh con ny c to ra sn trong my tnh v qu trnh gi ny c th xy ra ti thi im khng xc nh trc. S kin (Event) l mt tc ng ln mt i tng trong mi trng Windows. Khi c mt s kin xy ra, Windows s gi thng ip (message) n i tng. Cc s kin thng xy ra l: S kin chut: Click, Double Click, S kin bn phm: nhn phm, nh phm, S kin ca s: Activate, Load, Unload,

2. Cc loi ngt v bng vector ngt


Qu trnh ngt c th m t nh sau:
Chng trnh chnh ISR Lu tr cc thanh ghi cn thit

Khi phc cc thanh ghi Quay v chng trnh chnh (IRET)

Hnh 2.1 Qu trnh thc hin ngt

Phm Hng Kim Khnh

Trang 34

Ti liu Lp trnh h thng

Chng 2

Trong cc qu trnh ngt, ta phn bit thnh 2 loi: ngt cng v ngt mm. Ngt mm l ngt c gi bng mt lnh trong chng trnh ngn ng my. Ngt mm c thc hin trn hp ng thng qua lnh INT. i vi cc ngn ng bc cao hn, vn cho php thc hin gi ngt nhng phi c bin dch thnh lnh INT trong hp ng ri mi thc hin. Khc vi ngt mm, ngt cng khng c khi ng bn trong my tnh m do cc linh kin in t tc ng ln h thng. Ngt cng cng c chia thnh 2 loi: ngt che c v ngt khng che c. Ngt che c l ngt c th cho php hay khng cho php thc thi bng phn mm thng qua c ngt IF (Interrupt Flag): lnh CLI (Clear Interrupt Flag) s cm ngt v lnh STI (Set Interrupt Flag) s cho php cc ngt ny hot ng. Cc loi ngt khc nhau c th m t nh sau:

Ngt

Ngt mm

Ngt cng

Ngt h thng

Ngt do ngi s dng

Trong

Ngoi

HH

BIOS

Che c

Khng che c

Hnh 2.2 Cc loi ngt Khi thc hin lnh gi mt ngt no , chng trnh con phc v cho ngt s c gi. thc hin cc ngt tng ng, a ch thc hin cc chng trnh con phc v ngt c t trong mt bng, gi l bng vector ngt. Bng vector ngt gm c 256 phn t, mi phn t gm 4 byte ng vi 256 ngt (t ngt 0 n ngt 0FFh). Mi phn t trong bng vector ngt cha 2 a ch: a ch thanh ghi on a vo CS v a ch offset ca chng trnh phc v ngt a vo IP.

Phm Hng Kim Khnh

Trang 35

Ti liu Lp trnh h thng

Chng 2

Bng vector ngt c th m t nh sau: a ch 0000h:0000h 0000h:0002h 0000h:0004h 0000h:0006h 0000h:0008h 0000h:000Ah 0000h:03FCh 0000h:03FEh a ch ISR S th t ngt CS IP CS IP CS IP CS IP 0 1 2 255

Khi c mt qu trnh ngt xy ra, CPU s tm a ch bt u ca chng trnh ngt c cha trong bng vector ngt theo s th t ngt. Do mt phn t trong bng vector ngt chim 4 byte nn tm gi tr a ch trong bng vector ngt, ta ch cn nhn s th t ngt vi 4. Danh sch cc ngt m t nh sau: STT 00h 01h 02h 03h 04h 05h 06h, 07h 08h 09h 0Ah 0Bh 0Ch 0Dh a ch 0000h 0003h 0004h 0007h 0008h 000Bh 000Ch 000Fh 0010h 0013h 0014h 0017h 0018h 001Fh 0020h 0023h 0024h 0027h 0028h 002Bh 002Ch 002Fh 0030h 0033h 0034h 0037h CPU: chia cho 0 CPU: thc hin tng lnh CPU: Li RAM CPU: thc hin n im dng CPU: trn s In trang mn hnh (Print Screen) Dnh ring IRQ0: ngt ng h (18.2 ln / giy) IRQ1: ngt bn phm IRQ2: Dnh ring IRQ3: Giao tip ni tip 1 IRQ4: Giao tip ni tip 2 IRQ5: a cng Chc nng

Phm Hng Kim Khnh

Trang 36

Ti liu Lp trnh h thng

Chng 2

0Eh 0Fh 10h 11h 12h 13h 14h 15h 16h 17h 18h 19h 1Ah 1Bh 1Ch 1Dh 1Eh 1Fh 20h 21h 22h 23h 24h 25h 26h 27h 40h 41h 46h

0038h 003Bh 003Ch 003Fh 0040h 0043h 0044h 0047h 0048h 004Bh 004Ch 004Fh 0050h 0053h 0054h 0057h 0058h 005Bh 005Ch 005Fh 0060h 0063h 0064h 0067h 0068h 006Bh 006Ch 006Fh 0070h 0073h 0074h 0077h 0078h 007Bh 007Ch 007Fh 0080h 0083h 0084h 0087h 0088h 008Bh 008Ch 008Fh 0090h 0093h 0094h 0097h 0098h 009Bh 009Ch 009Fh 0100h 0103h 0104h 0107h 0118h 011Bh

IRQ6: a mm IRQ7: My in BIOS: mn hnh BIOS: xc nh cu hnh my tnh BIOS: xc nh kch thc RAM BIOS: truy nhp a cng / a mm BIOS: truy nhp giao tip ni tip BIOS: truy nhp cassette hay m rng ngt BIOS: kim tra bn phm BIOS: truy nhp my in Chng trnh xm nhp ROM BASIC BIOS: khi ng h thng (khi nhn Ctrl-Alt-Del) BIOS: c / ghi ngy / gi Nhn phm Break Gi sau INT 08h a ch bng tham s mn hnh a ch bng tham s a mm a ch bng font c k t m rng DOS: kt thc chng trnh DOS: gi cc hm ca DOS a ch kt thc chng trnh Nhn Ctrl-Break a ch chng trnh x l li DOS: c a mm / a cng DOS: ghi a mm / a cng DOS: kt thc chng trnh v thng tr Dnh ring cho DOS BIOS: phc v a mm a ch bng tham s a cng 1 Dnh ring a ch ca bng tham s a cng 2 Dnh cho user

28h 3Fh 00A0h 00FFh

42h 45h 0108h 0117h 47h 49h 011Ch 0127h

Phm Hng Kim Khnh

Trang 37

Ti liu Lp trnh h thng

Chng 2

4Ah

0128h 012Bh

Hn gi Dnh cho user Khng dng IRQ8: ng h thi gian thc IRQ9

4Bh 67h 012Ch 019Fh 68h 6Fh 01A0h 01BFh 70h 71h 72h 73h 74h 75h 76h 77h 01C0h 01C3h 01C4h 01C7h

01C8h 01CBh IRQ10 01CCh 01CFh IRQ11 01D0h 01D3h 01D4h 01D7h IRQ12 IRQ13: t 80x87

01D8h 01DBh IRQ14: a cng 01DCh 01DFh IRQ15 Dnh ring Dng cho b thng dch BASIC Khng s dng

78h 7Fh 01E0h 01FFh 80h F0h 0200h 03C3h F1h FFh 03C4h 03FFh

3. Gi ngt v chn ngt


Qu trnh gi ngt t hp ng n gin l thc hin lnh INT STT_ngt sau khi np cc tham s cn thit cho ngt. Khi thc hin lnh gi ngt, CPU s tm kim trong bng vector ngt a ch ca chng trnh phc v ngt. Ngi s dng cng c th xy dng mt chng trnh c s nh cc chng trnh x l ngt. Sau , cc chng trnh khc c th gi ngt ra s dng. Mt chng trnh c th gi chng trnh con loi ny m khng cn bit a ch ca n. Nh vy, nu mun thay i ngt, ta c th thay i ni dung trong bng vector ngt ch n chng trnh phc v do ngi s dng t xy dng v chng trnh ny s c thc hin khi ngt c gi. lm iu ny, ta ch cn tm v tr ca vector ngt tng ng trong bng v thay i gi tr ca n. iu ny thc hin c do bng vector ngt t trong RAM v c np mi khi khi ng h thng. Qu trnh ly v gn a ch ca chng trnh con phc v ngt c th thc hin thng qua ngt 21h bng cc hm sau: Hm 35h: ly a ch ca ngt Vo: AL = s th t ngt Ra: ES:BX = a ch ca chng trnh phc v ngt Hm 25h: gn a ch ca mt chng trnh phc v cho mt ngt Vo: AL = s th t ngt, DS:DX Ra: khng c

Phm Hng Kim Khnh

Trang 38

Ti liu Lp trnh h thng

Chng 2

thc hin chn mt ngt, ta cn thc hin nh sau:


Dng hm 35h ly a ch ca ngt

Dng hm 25h gn a ch mi cho ngt

Dng hm 25h khi phc li a ch c cho ngt

Hnh 2.2 Qu trnh chn mt ngt Mt v d cho qu trnh chn ngt nh sau:
;******************************************************************************* ;* ;* LAB6-2.ASM - Assembler Laboratory ZMiTAC * ;* ;* Sample program that converts lowercase to uppercase when key pressed * ;* ;******************************************************************************* .MODEL SMALL .STACK 100h .CODE ;******************************************************************************* ;* Variables ;******************************************************************************* old_proc dd 0 ; address of original interrupt handler dot_flag db 0 ; dot flag ;******************************************************************************* ;* 09h interrupt handler ;******************************************************************************* segment_kb EQU 40h ; beggining of keyboard data segment wsk_kb EQU 1Ch ; offset of pointer to keyboard buffer kb_buf_begin EQU 80h ; offset of address of begining of the buffer kb_buf_end EQU 82h ; offset of address of end of the buffer keys PROC FAR

;------------------------------------------------------------------------------; Calling of original interrupt handler ;-------------------------------------------------------------------------------

Phm Hng Kim Khnh

Trang 39

Ti liu Lp trnh h thng

Chng 2

int 60h ;------------------------------------------------------------------------------; Prepare registers ;------------------------------------------------------------------------------push ax ; push registers on the stack push bx push dx push ds mov ax,segment_kb ; address of keyboard data segment to DS mov ds,ax ;------------------------------------------------------------------------------; Read the character and check ASCII code ;------------------------------------------------------------------------------mov bx,ds:[wsk_kb] ; actual pointer to BX mov ax,ds:[kb_buf_begin] ; buffer beggining to AX cmp bx,ax ; is the beggining of the buffer ? jne mid_buf mov bx,ds:[kb_buf_end] ; last character is at the end of the buffer mid_buf: mov ax,ds:[bx-2] ; read last character cmp al,'.' je dot_found cmp al,'Z' ja check_lowercase cmp al,'A' jb keys_end mov dot_flag,0 jmp keys_end check_lowercase: cmp al,'z' ja keys_end cmp al,'a' jb keys_end cmp dot_flag,0 je keys_end ; ; ; ; ; ; compare with dot if dot compare with 'Z' if above check lowercase compare with 'A' end if less

; uppercase - clear flag ; return

; ; ; ; ;

compare with 'z' end if above compare with 'a' end if less was dot pressed? ; end if not

;------------------------------------------------------------------------------; Change lowercase to uppercase ;------------------------------------------------------------------------------sub al,'a'-'A' ; sub difference between cases mov ds:[bx-2],ax mov dot_flag,0 ; uppercase - clear flag jmp keys_end ; return dot_found: mov dot_flag,1 jmp keys_end

; set flag ; return

;------------------------------------------------------------------------------; Pop registers and return from interrupt ;------------------------------------------------------------------------------keys_end: pop ds pop dx pop bx pop ax

Phm Hng Kim Khnh

Trang 40

Ti liu Lp trnh h thng keys iret ENDP

Chng 2

;******************************************************************************* ;* Main program ;******************************************************************************* ;------------------------------------------------------------------------------; Get interrupt ;------------------------------------------------------------------------------start proc mov ah,35h mov al,09h int 21h mov word ptr old_proc,bx mov word ptr old_proc+2,es push cs pop ds mov dx,offset keys mov ah,25h mov al,09h int 21h mov dx,word ptr old_proc+2 mov ds,dx mov dx,word ptr old_proc mov ah,25h mov al,60h int 21h

; function 35h - read handler address ; of interrupt 09h ; store 32-bit address ; of original interrupt handler ; ; ; ; handler code segment to DS offset of handler address to DX function 25h - set new handler of interrupt 09h

; function 25h - set new adress ; of original interrupt handler ; 60h instead of 09h

;------------------------------------------------------------------------------; Main loop ;------------------------------------------------------------------------------looping:mov ah,08h ; function 08h - read character int 21h ; ASCII code is returned in AL cmp al,1Bh ; ESC je ending ; if ESC end of the loop mov dl,al ; not ESC - move char to DL mov ah,02h ; function 02h - display character int 21h ; ASCII code of char in DL jmp looping ;------------------------------------------------------------------------ending: mov dx,word ptr old_proc+2 mov ds,dx mov dx,word ptr old_proc mov ah,25h ; function 25h - set old handler mov al,09h ; of interrupt 09h int 21h mov ah,4Ch int 21h endp start ; end of the program

start END

4. To v bt cc s kin
Trong h iu hnh Windows, hook (cu mc) l c ch cho php mt hm chn mt s kin (thng ip, chut, phm nhn) trc khi a n i tng cn x l. Hm ny cho php thay i hoc thm ch cm s kin xy ra. Chng c gi l hm lc (filter) v c

Phm Hng Kim Khnh

Trang 41

Ti liu Lp trnh h thng

Chng 2

phn loi da theo loi s kin b chn. gi c hm lc, ta cn phi thc hin qu trnh gn (attach) vo qu trnh cu mc (nh cu mc bn phm). Vic gn mt hay nhiu hm lc vo mt qu trnh cu mc c gi l thit lp (setting) mt qu trnh cu mc. Nu mt qu trnh cu mc c nhiu hn mt hm lc, Windows s duy tr mt chui cc hm lc trong hm c ci t vo gn nht s nm u chui v hm ci t lu nht s nm cui chui. Nu s kin xy ra lm khi ng qu trnh cu mc, Windows s gi hm lc u tin trong chui. Qu trnh cu mc vo mt s kin c s dng bng hm SetWindowsHookEx v hm UnhookWindowsHookEx dng xa b hm lc khi qu trnh. C ch cu mc cung cp cc kh nng mnh m cho mt ng dng Windows. Cc ng dng ny c th dng qu trnh cu mc : X l v thay i cc thng ip gi n cc dialog box, message box, scroll bar v menu ca mt ng dng (WH_MSGFILTER). X l v thay i cc thng ip gi n cc dialog box, message box, scroll bar v menu ca h thng (WH_SYSMSGFILTER). X l v thay i cc thng ip ca h thng bt c khi no hm GetMessage hay PeekMessage c gi (WH_GETMESSAGE). X l v thay i cc thng ip ca h thng bt c khi no hm SendMessage c gi (WH_CALLWNDPROC). Ghi hay thc hin li cc s kin bn phm v chut (WH_JOURNALRECORD, WH_JOURNALPLAYBACK). X l, sa i hay cm s kin chut (WH_MOUSE). X l, sa i hay cm s kin bn phm (WH_KEYBOARD). p ng vi cc hot ng no ca h thng, c kh nng pht trin CBT (computer-based training) cho ng dng (WH_CBT). Cm cc hm lc khc (WH_DEBUG). Dng phm F1 h tr cho menu, dialog box v message box (WH_MSGFILTER). Lu li qu trnh thc hin khi nhn phm hay chut (thng dng cho macro). V d nh Windows Recorder s dng hook h tr chc nng record v playback (WH_JOURNALRECORD, WH_JOURNALPLAYBACK). Qun l thng ip xc nhn thng ip c gi ti ca s hay c to ra (WH_GETMESAGE, WH_CALLWNDPROC). M phng ng vo chut v bn phm (WH_JOURNALPLAYBACK). Qu trnh cu mc l phng php tin cy thc hin hot ng ny. Nu ta thc hin m phng bng cch gi thng ip, Windows s khng thc hin cp nht trng thi ca bn phm hay chut dn n cc hot ng khng mong mun. Nu qu trnh cu mc thc hin iu ny, n s c x l ging nh s kin chut hay bn

Cc ng dng thng dng qu trnh cu mc :

Phm Hng Kim Khnh

Trang 42

Ti liu Lp trnh h thng

Chng 2

phm xy ra. V d nh Microsoft Excel dng hook thc hin macro SENDKEYS. Cung cp kh nng CBT cho ng dng thc hin trn mi trng Windows (WH_CBT) lm cho qu trnh pht trin ng dng CBT d dng hn.

Phm vi s dng: Mt trong nhng c trng ca Win32 Hook l cho php ch nh qu trnh cu mc l h thng hay dng lung (thread). Hook h thng cho php tc ng n cc ca s khc trong h thng cn hook lung ch cho php tc ng n ca s hin hnh. Cch thc s dng qu trnh cu mc: s dng qu trnh cu mc, ta cn phi bit: Lm th no dng hm cu mc ca Windows thm vo hay xa b mt hm lc trong chui hm x l ca mt qu trnh cu mc. Cn phi thc hin cc hot ng g ci t mt hm lc. C th thc hin c hm cu mc no v chng c th lm c g, gi nhng thng tin no.

4.1. Hm cu mc ca Windows
Cc ng dng trn nn Windows s dng cc hm SetWindowsHookEx, UnhookWindowsHookEx v CallNextHookEx qun l chui hm lc trong mt qu trnh cu mc. Trc phin bn 3.1, Windows thc hin qun l bng cc hm SetWindowsHook, UnhookWindowsHook v DefHookProc. Mc d cc hm ny cng c kh nng thc hin c trn nn Win32 nhng s c mt s c trng khng s dng c nh cc phin bn mi (Ex). 4.1.1. Hm SetWindowsHookEx Dng thm mt hm lc vo mt qu trnh cu mc. Khai bo: Public Declare Function SetWindowsHook Lib "user32" Alias "SetWindowsHookA" (ByVal nFilterType As Long, ByVal pfnFilterProc As Long) As Long Public Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long Hm SetWindowsHookEx gm c 4 tham s: idHook: xc nh loi hm cu mc s ci t. Thng s ny gm cc gi tr sau: WH_KEYBOARD: ci t hm cu mc qun l thng ip gi i khi nhn phm (ngoi tr t hp Ctrl Alt Del). WH_MOUSE: ci t hm cu mc qun l thng ip khi iu khin chut. WH_CALLWNDPROC: ci t hm cu mc qun l thng ip trc khi h thng gi n ca s, ch cho php x l thng ip m khng c thay i thng ip.

Phm Hng Kim Khnh

Trang 43

Ti liu Lp trnh h thng

Chng 2

WH_CALLWNDPROCRET: ci t hm cu mc qun l thng ip sau khi ca s x l. Loi ny cho php thay i gi tr tr v ca thng ip. WH_MSGFILTER: ci t hm cu mc qun l cc thng ip c to ra ging nh c mt s kin ca dialog box, message box, menu hay scroll bar. WH_GETMESSAGE: ci t hm cu mc qun l cc thng ip c gi ti hng i. WH_CBT: ci t hm cu mc nhn thng bo t ng dng CBT. WH_DEBUG: ci t hm cu mc g ri mt hm cu mc khc. WH_FOREGROUNDIDLE: ci t hm cu mc trong hm ny c gi khi lung (thread) foreground ca ng dng rnh (idle). Qu trnh ny thng s dng thc thi cc tc v c u tin thp khi lung u tin rnh. WH_JOURNALPLAYBACK: ci t hm cu mc gi cc thng ip c lu bng hm cu mc WH_JOURNALRECORD. WH_JOURNALRECORD: ci t hm cu mc lu li cc thng ip gi n hng i. WH_KEYBOARD_LL: ci t hm cu mc qun l s kin bn phm mc thp (dng cho Windows NT/2000/XP). WH_MOUSE_LL: ci t hm cu mc qun l s kin chut mc thp (dng cho Windows NT/2000/XP). WH_SHELL: ci t hm cu mc cho mt ng dng shell. WH_SYSMSGFILTER: ci t hm cu mc qun l cc thng ip c to ra ging nh c mt s kin ca dialog box, message box, menu hay scroll bar. Hm ny qun l cho tt c ng dng trong cng mt desktop. lpfn: Con tr ch n a ch ca hm lc. Nu tham s dwThreadId = 0 hay ch n mt lung c to bi mt tin trnh (process) khc, tham s lpfn phi ch n mt hm cu mc trong mt th vin lin kt ng (DLL). Ngc li, lpfn ch n hm cu mc cha trong bn thn tin trnh hin hnh. hMod: handle ch n DLL cha hm x l xc nh bng tham s lpfn. Tham s hMod phi t l NULL nu hm cu mc nm trong tin trnh hin hnh dwThreadId: Xc nh ID ca lung thc hin qu trnh cu mc. Nu dwThreadId = 0, hm cu mc s tc ng n tt c cc lung. ng dng c th dng hm GetCurrentThreadId xc nh ID ca lung hin hnh.

Phm Hng Kim Khnh

Trang 44

Ti liu Lp trnh h thng

Chng 2

Phm vi thc hin ca hm cu mc m t nh sau:


Hook WH_CALLWNDPROC WH_CBT WH_DEBUG WH_GETMESSAGE WH_JOURNALRECORD Phm vi Lung hay h thng Lung hay h thng Lung hay h thng Lung hay h thng H thng

WH_JOURNALPLAYBACK H thng WH_FOREGROUNDIDLE WH_SHELL WH_KEYBOARD WH_MOUSE WH_MSGFILTER WH_SYSMSGFILTER Lung hay h thng Lung hay h thng Lung hay h thng Lung hay h thng Lung hay h thng H thng

Hm SetWindowsHookEx tr v handle ca qu trnh cu mc ci t v tr v NULL nu qu trnh ci t khng thnh cng. Handle ny c dng xa qu trnh cu mc khi s dng hm UnhookWindowsHookEx. Cc thng bo li khi qu trnh cu mc khng thnh cng l: ERROR_INVALID_HOOK_FILTER: m cu mc sai ERROR_INVALID_FILTER_PROC: hm lc sai ERROR_HOOK_NEEDS_HMOD: mt qu trnh cu mc ton cc s dng tham s hMod = NULL hay ch n mt lung khng tn ti. ERROR_GLOBAL_ONLY_HOOK: mt qu trnh cu mc ch dng c cho h thng nhng c ci t cho mt lung xc nh. ERROR_INVALID_PARAMETER: ID ca lung sai. ERROR_JOURNAL_HOOK_SET: Ci t thm mt qu trnh cu mc dng nht k (WH_JOURNALRECORD v WH_JOURNALPLAYBACK) trong khi mt qu trnh dng ny ang tn ti (ti mt thi im ch cho php mt qu trnh dng nht k). ERROR_MOD_NOT_FOUND: Tham s hMod ch n mt hm khng xc nh c. Khc: khng cho php do bo mt ca h thng hay b nh trn.

Phm Hng Kim Khnh

Trang 45

Ti liu Lp trnh h thng

Chng 2

4.1.2. Hm UnhookWindowsHookEx: Dng xo mt hm lc ra khi chui x l mt qu trnh cu mc. Hm ny ly handle ca qu trnh cu mc tr v t lnh gi hm SetWindowsHookEx v lun tr v gi tr TRUE. Khai bo: Public Declare Function UnhookWindowsHook Lib "user32" Alias "UnhookWindowsHook" (ByVal nCode As Long, ByVal pfnFilterProc As Long) As Long Public Declare Function UnhookWindowsHookEx Lib "user32" Alias "UnhookWindowsHookEx" (ByVal hHook As Long) As Long 4.1.3. Hm CallNextHookEx: Dng chuyn thng tin cu mc n hm cu mc k tip trong chui x l. Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal ncode As Long, ByVal wParam As Long, lParam As Any) As Long hHook: handle ca qu trnh cu mc, l gi tr tr v t lnh gi hm SetWindowsHookEx. Thng thng Windows b qua gi tr ny. nCode: m ca qu trnh cu mc, hm cu mc dng m ny xc nh phng php x l thng tin. wParam: xc nh tham s c x l bi hm cu mc. lParam: ging nh wParam.

Khi mt qu trnh cu mc khi ng, Windows gi hm u tin trong chui hm lc v kt thc qun l qu trnh, cc hm lc pha sau s khng x l. thc hin cc hm pha sau trong chui hm, Windows cung cp hm CallNextHookEx cho php gi mt hm k tip trong chui hm lc. Nh vy, nu mt hm lc no khng thc hin hm CallNextHookEx th cc hm lc pha sau s khng thc hin. Mt v d s dng cc hm x l cu mc nh sau: 'Cha trong mt file module Public Const WH_KEYBOARD = 2 Public Const VK_SHIFT = &H10 Public Const VK_CONTROL = &H11 Public Const VK_MENU = &H12 Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal ncode As Long, ByVal wParam As Long, lParam As Any) As Long Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer Xc nh trng thi ca mt phm (Bit15)

Phm Hng Kim Khnh

Trang 46

Ti liu Lp trnh h thng

Chng 2

Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long Public hHook As Long Public Function KeyboardProc(ByVal idHook As Long, ByVal wParam As Long, ByVal lParam As Long) As Long If idHook < 0 Then 'Gi hm x l k tip KeyboardProc = CallNextHookEx(hHook, idHook, wParam, ByVal lParam) Else 'Nu nhn Shift-C If (GetKeyState(VK_SHIFT) And &H8000) And wParam = Asc("C") Then 'th hin th kt qu Form1.Print "Shift-C pressed ..." End If If (GetKeyState(VK_CONTROL) And &H8000) And wParam = Asc("C") Then Form1.Print "Ctrl-C pressed ..." End If If (GetKeyState(VK_MENU) And &H8000) And wParam = Asc("C") Then Form1.Print "Alt-C pressed ..." End If 'Gi hm x l k tip KeyboardProc = CallNextHookEx(hHook, idHook, wParam, ByVal lParam) End If End Function ----------------------------------------------'Cha trong form Private Sub Form_Load() 't qu trnh cu mc hHook = SetWindowsHookEx(WH_KEYBOARD, AddressOf KeyboardProc, App.hInstance, App.ThreadID) End Sub Private Sub Form_Unload(Cancel As Integer)

Phm Hng Kim Khnh

Trang 47

Ti liu Lp trnh h thng

Chng 2

'Xo qu trnh cu mc UnhookWindowsHookEx hHook End Sub

4.2. Hm lc
Hm lc thng c dng nh sau: Function FilterFunc (ByVal nCode As Integer, ByVal wParam As Long, ByVal lParam As Long) Hm lc nhn 3 tham s: nCode: m ca qu trnh cu mc, l mt s nguyn xc nh hm lc, v d nh loi s kin lm khi ng qu trnh cu mc. M ny c xc nh khi hm lc x l s kin hay gi hm DefHookProc. Nu m cu mc < 0 th hm lc s khng x l s kin m s gi hm DefHookProc truyn 3 tham s cn li cho hm lc k tip trong chui hm lc bng hm CallNextHookEx. Tham s th hai wParam v th ba lParam cha cc thng tin cn thit cho hm lc. Mi qu trnh cu mc dng cc gi tr wParam v lParam khc nhau. V d nh, qu trnh cu mc bn phm WH_KEYBOARD cha m phm nhn trong wParam v trng thi bn phm trong lParam. Hay qu trnh cu mc WH_MSGFILTER cha gi tr NULL trong wParam v mt con tr ch n thng ip cha trong lParam.

Hm lc dng trong DLL: i vi cc qu trnh cu mc cc b, hm lc c th t ngay trong m lnh ca ng dng nhng i vi cc qu trnh cu mc h thng, hm lc phi c t trong mt DLL. Ch c qu trnh cu mc dng nht k (WH_JOURNALRECORD v WH_JOURNALPLAYBACK) l ngoi l. Hm lc ca qu trnh cu mc h thng phi chia s d liu cho tin trnh thc hin qu trnh cu mc. Cc bin ton cc s dng trong DLL phi c xc nh r hay phi t trong vng d liu chia s.

Phm Hng Kim Khnh

Trang 48

You might also like