leanh_hi

New Member

Download miễn phí Giáo trình Lập trình hệ thống máy tính





Hàm lọc dùng trong DLL:
Đối với các quá trình câu móc cục bộ, hàm lọc có thể đặt ngay trong mã lệnh của ứng
dụng nhưng đối với các quá trình câu móc hệthống, hàm lọc phải được đặt trong một DLL.
Chỉcó quá trình câu móc dạng nhật ký (WH_JOURNALRECORD và
WH_JOURNALPLAYBACK) là ngoại lệ. Hàm lọc của quá trình câu móc hệthống phải
chia sẻdữliệu cho tiến trình thực hiện quá trình câu móc. Các biến toàn cục sửdụng trong
DLL phải được xác định rõ hay phải đặt trong vùng dữliệu chia sẻ.



Để tải bản Đầy Đủ của tài liệu, xin Trả lời bài viết này, Mods sẽ gửi Link download cho bạn sớm nhất qua hòm tin nhắn.
Ai cần download tài liệu gì mà không tìm thấy ở đây, thì đăng yêu cầu down tại đây nhé:
Nhận download tài liệu miễn phí

Tóm tắt nội dung tài liệu:


Phạm Hùng Kim Khánh Trang 47
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
'G•i hàm x• lý k• ti•p
KeyboardProc = CallNextHookEx(hHook, idHook, wParam,
ByVal lParam)
Else
'N•u nh•n Shift-C
If (GetKeyState(VK_SHIFT) And &H8000) And wParam =
Asc("C") Then
'thì hi•n th• k•t 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
'G•i hàm x• lý k• ti•p
KeyboardProc = CallNextHookEx(hHook, idHook, wParam,
ByVal lParam)
End If
End Function
-----------------------------------------------
'Ch•a trong form
Private Sub Form_Load()
'••t quá trình câu móc
hHook = SetWindowsHookEx(WH_KEYBOARD, AddressOf
KeyboardProc, App.hInstance, App.ThreadID)
End Sub
Private Sub Form_Unload(Cancel As Integer)
Tài liệu Lập trình hệ thống Chương 2
Phạm Hùng Kim Khánh Trang 48
'Xoá quá trình câu móc
UnhookWindowsHookEx hHook
End Sub
4.2. Hàm lọc
Hàm lọc thường có dạng như sau:
Function FilterFunc (ByVal nCode As Integer, ByVal wParam
As Long, ByVal lParam As Long)
Hàm lọc nhận 3 tham số:
- nCode: mã của quá trình câu móc, là một số nguyên xác định hàm lọc, ví dụ như
loại sự kiện làm khởi động quá trình câu móc. Mã này được xác định khi hàm lọc
xử lý sự kiện hay gọi hàm DefHookProc. Nếu mã câu móc < 0 thì hàm lọc sẽ
không xử lý sự kiện mà sẽ gọi hàm DefHookProc để truyền 3 tham số còn lại cho
hàm lọc kế tiếp trong chuỗi hàm lọc bằng hàm CallNextHookEx.
- Tham số thứ hai wParam và thứ ba lParam chứa các thông tin cần thiết cho hàm
lọc. Mỗi quá trình câu móc dùng các giá trị wParam và lParam khác nhau. Ví dụ
như, quá trình câu móc bàn phím WH_KEYBOARD chứa mã phím nhấn trong
wParam và trạng thái bàn phím trong lParam. Hay quá trình câu móc
WH_MSGFILTER chứa giá trị NULL trong wParam và một con trỏ chỉ đến
thông điệp chứa trong lParam.
Hàm lọc dùng trong DLL:
Đối với các quá trình câu móc cục bộ, hàm lọc có thể đặt ngay trong mã lệnh của ứng
dụng nhưng đối với các quá trình câu móc hệ thống, hàm lọc phải được đặt trong một DLL.
Chỉ có quá trình câu móc dạng nhật ký (WH_JOURNALRECORD và
WH_JOURNALPLAYBACK) là ngoại lệ. Hàm lọc của quá trình câu móc hệ thống phải
chia sẻ dữ liệu cho tiến trình thực hiện quá trình câu móc. Các biến toàn cục sử dụng trong
DLL phải được xác định rõ hay phải đặt trong vùng dữ liệu chia sẻ.
Tài liệu Lập trình hệ thống Chương 3
Phạm Hùng Kim Khánh Trang 49
Chương 3
GIAO TIẾP THIẾT BỊ CHUẨN
1. Giao tiếp bàn phím
1.1. Nguyên lý hoạt động
Hình 3.1 - Sơ đồ nguyên lý và các ghép nối của bàn phím
Chip xử lý bàn phím liên tục kiểm tra trạng thái của ma trận quét (scan matrix) để
xác định công tắc tại các tọa độ X, Y đang được đóng hay mở và ghi một mã tương ứng vào
bộ đệm bên trong bàn phím. Sau đó mã này sẽ được truyền nối tiếp tới mạch ghép nối bàn
phím trong PC. Cấu trúc của SDU (Serial Data Unit) cho việc truyền số liệu:
0 10
STRT DB0 DB1 DB2 DB3 DB4 DB5 DB6 DB7 PAR STOP
STRT: bit start (luôn bằng 0)
DB0 - DB7: bit số liệu từ 0 đến 7.
PAR: bit parity (luôn lẻ)
STOP: bit stop (luôn bằng 1).
X
-
De
co
de
r
D7
11 bits SDU
D5
Keyboard Interface
IRQ1 Y- Decoder
D2
Keyboard
Scan
Enable
Keyboard cable Ke
yb
oa
rd
c
hi
p(PC/XT)
or
Keyboard
Controller
D1 Serial Interface
Scan
Matrix
IRQ Logic
D6
8042/8741/8742
(AT ect)
D3
D0
D4
Tài liệu Lập trình hệ thống Chương 3
Phạm Hùng Kim Khánh Trang 50
Mỗi phím nhấn sẽ được gán cho 1 mã quét (scan code) gồm 1 byte. Nếu 1 phím được
nhấn thì bàn phím phát ra 1 mã make code tương ứng với mã quét truyền tới mạch ghép nối
bàn phím của PC. Ngắt cứng INT 09h được phát ra qua IRQ1.
Chương trình xử lý ngắt sẽ xử lý mã này tuỳ theo phím SHIFT có được nhấn hay
không. Ví dụ: nhấn phím SHIFT trước, không rời tay và sau đó nhấn ‘C’:
make code được truyền - 42(SHIFT) - 46 (‘C’).
Nếu rời tay nhấn phím SHIFT thì bàn phím sẽ phát ra break code và mã này được
truyền như make code. Mã này giống như mã quét nhưng bit 7 được đặt lên 1, do vậy nó
tương đương với make code cộng với 128. Tuỳ theo break code, chương trình con xử lý
ngắt sẽ xác định trạng thái nhấn hay rời của các phím. Thí dụ, phím SHIFT và ‘C’ được rời
theo thứ tự ngược lại với thí dụ trên:
break code được truyền 174 ( bằng 46 cộng 128 tương ứng với ‘C’) và 170
(bằng 42 cộng 128 tương ứng với SHIFT).
Phần cứng và phần mềm xử lý bàn phím còn giải quyết các vấn đề vật lý sau:
- Nhấn và nhả phím nhưng không được phát hiện.
Chân 1: clock
Chân 2: dữ liệu
Chân 3: Reset
Chân 4: GND
Chân 5: Vcc
Hình 3.2 – Đầu cắm bàn phím AT
Chân 1: dữ liệu
Chân 2: không dùng
Chân 3: GND
Chân 4: Vcc
Chân 5: clock
Chân 6: không dùng
Hình 3.3 – Đầu cắm bàn phím PS/2
Tài liệu Lập trình hệ thống Chương 3
Phạm Hùng Kim Khánh Trang 51
- Khử nhiễu rung cơ khí và phân biệt 1 phím được nhấn nhiều lần hay được
nhấn chỉ 1 lần nhưng được giữ trong một khoảng thời gian dài.
1.2. Lập trình giao tiếp qua các cổng
Bàn phím cũng là một thiết bị ngoại vi nên về nguyên tắc có thể truy xuất nó qua các
cổng vào ra.
™ Các thanh ghi và các port:
Sử dụng 2 địa chỉ port 60h và 64h có thể truy xuất bộ đệm vào, bộ đệm ra và thanh
ghi điều khiển của bàn phím.
Port Thanh ghi R/W
60h Đệm ngõ ra R
60h Đệm ngõ vào W
64h Thanh ghi điều khiển W
64h Thanh ghi trạng thái R
Thanh ghi trạng thái xác định trạng thái hiện tại của bộ điều khiển bàn phím. Thanh
ghi này chỉ đọc (read only) và đọc bằng lệnh IN tại port 64h.
7 0
PARE TIM AUXB KEYL C/D SYSF INPB OUTB
PARE: Lỗi chẵn lẻ của byte cuối cùng được vào từ bàn phím; 1 = có lỗi chẵn lẻ, 0
= không có.
TIM: Lỗi quá thời gian (time-out); 1 = có lỗi, 0 = không có.
AUXB: Đệm ra cho thiết bị phụ (chỉ có ở máy PS/2); 1 = giữ số liệu cho thiết bị,
0 = giữ số liệu cho bàn phím.
KEYL: Trạng thái khóa bàn phím; 1 = không khóa, 0 = khóa.
C/D: Lệnh/dữ liệu; 1 = Ghi qua port 64h, 0 = Ghi qua port 60h.
SYSF: cờ hệ thống; 1 = tự kiểm tra thành công, 0 = reset khi cấp điện
INPB: Trạng thái đệm vào; 1 = dữ liệu CPU trong bộ đệm vào, 0 = đệm vào rỗng.
OUTB: Trạng thái đệm ra; 1 = dữ liệu bộ điều khiển bàn phím trong bộ đệm ra, 0
= đệm ra rỗng.
Thanh ghi điều khiển
Các lệnh cho bộ điều khiển bàn phím:
Mã Mô tả
A7h Cấm thiết bị phụ
A8h Cho phép thiết bị phụ
A9h Kiểm tra giao tiếp thiết bị phụ và lưu mã kiểm tra vào bộ đệm ra
00h: không lỗi
01h: CLK ở mức thấp
02h: CLK ở mức cao
03h: DATA ở mức thấp
Tài liệu Lập trình hệ thống Chương 3
Phạm Hùng Kim Khánh Trang 52
04h: DATA ở mức cao
FFh: lỗi khác
AAh Tự kiểm tra (ghi 55h vào bộ đệm ra nếu không lỗi
ABh Kiểm tra giao tiếp bàn phím và lưu mã kiểm tra vào bộ đệm ra
ADh Cấm bàn phím
AEh Cho phép bàn phím
C0h Đọc cổng vào và truyền dữ liệu đến bộ đệm ra
C1h Đọc các bit 3 – 0 của cổng vào và truy...
 

Các chủ đề có liên quan khác

Top