Kho tài li u mi n phí c a Ket-noi.com blog giáo d c, công ngh
TRƯỜNG ĐẠI HỌC CẦN THƠ
KHOA CÔNG NGHỆ THÔNG TIN - TRUYỀN THÔNG
-------
LUẬN VĂN TỐT NGHIỆP ĐẠI HỌC
ĐỀ TÀI:
XÂY DỰNG BỘ CÁC CÔNG CỤ
(DRIVER) THEO DÕI HÀNH VI
TRÊN WINDOWS 7
PHẦN I:
XÂY DỰNG PROCESS DRIVER,
REGISTRY DRIVER, FILESYSTEM
DRIVER
Sinh viên thực hiện
Châu Trương Hải My
MSSV: 1101764
Giảng viên hướng dẫn:
TS. LÊ VĂN LÂM
Cần Thơ, 2014
LỜI CẢM ƠN
Trước tiên, tôi xin được gửi lời cảm ơn chân thành đến TS.Lê Văn Lâm,
thầy đã hướng dẫn và chỉ bảo tôi rất nhiệt tình cũng như khơi gợi cho tôi rất
nhiều ý tưởng trong suốt quá trình thực hiện đề tài luận văn này.
Tôi xin chân thành cám ơn các thầy, các cô Khoa Công nghệ thông tin &
Truyền thông trường Đại học Cần Thơ đã cung cấp cho tôi những nền tảng kiến
thức hữu ích và giá trị để tôi có thể hoàn thành được đề tài của mình.
Tôi cũng xin gửi lời cảm ơn đến những người bạn của tôi. Các bạn đã
giúp đỡ tôi rất nhiều trong việc tìm kiếm tài liệu, lời khuyên hữu ích và hướng
dẫn tôi trong việc lập trình có hiệu quả.
Cuối cùng, tôi xin cám ơn đến gia đình và người thân đã luôn tiếp thêm
nguồn động và tinh thần cho tôi, giúp đỡ và chăm sóc tôi trong suôt quá trình học
tập và thời gian thực hiện luận văn này.
Cần Thơ, ngày 15 tháng 05 năm 2014
Sinh viên
CHÂU TRƯƠNG HẢI MY
SVTH: CHÂU TRƯƠNG HẢI MY
GVHD: TS.LÊ VĂN LÂM
PHỤ LỤC BẢNG
Bảng
Bảng 2.2.1.1-1
Bảng 2.2.2.1-1
Bảng 2.3.4-1
Bảng 2.4.1.1-1
Bảng 2.4.1.2-1
Bảng 2.4.1.2- 2
Bảng 2.4.1.2-3
Bảng 2.4.3-1
Bảng 3.2-1
Nội Dung
KMDF object type được sử dụng phổ biến
Các thành phần của KMDF
Một số IRP major function code
Một số routine dùng cho Spin Lock
Kernel dispatch objects
Một số routine dùng cho event object
Một số routine dùng cho timer object
Một số routine liên quan đến bộ nhớ
Phân công làm việc
PHỤ LỤC HÌNH ẢNH
Hình
Hình 2.1.1-1
Hình 2.1.1-2
Hình 2.1.1-3
Hình 2.1.2-1
Hình 2.1.2-2
Hình 2.2.1-1
Hình 2.2.1.3-a.1
Hình 2.2.1.3-b.1
Hình 2.2.1.4-a.1
Hình 2.2.1.4-b.1
Hình 2.2.2.3-a.1
Hình 2.3.2-1
Hình 2.3.5-1
Hình 2.5.2-1
Hình 2.5.3-1
Hình 2.5.4-1
Hình 2.5.5-1
Hình 3.4.1.1-1
Hình 3.4.1.3-1
Hình 3.4.2.1-1
Hình 3.4.2.3-1
Nội Dung
Mối quan hệ giữa Application, OS và Driver
Yêu cầu được giải quyết qua nhiều driver
Sofware driver
Sơ đồ mô tả sự tương tác giữa user-mode và kernel-mode
Các loại driver trong kernel-mode
Windows Driver Foundation và Driver Life Cycle
Các thủ tục tiêu chuẩn mà một driver phải có
Mối quan hệ giữa device object và I/O manager
Device stack trong kernel-mode
Driver stack trong kernel-mode
Luồng xử lý IRP
Mối quan hệ song song gữa driver và I/O stack location
Quá trình xử lý IRP tiêu chuẩn
Cấu hình DDK
OSR Loader
DebugView
Tuỳ chọn khi khởi động máy ảo
Mô hình 5 trạng thái của tiến trình
Kết quả hoạt động của Process driver trong Windows 7
Công cụ quản lý registry
Kết quả hoạt động của Registry driver trong Windows 7
1
SVTH: CHÂU TRƯƠNG HẢI MY
GVHD: TS.LÊ VĂN LÂM
MỤC LỤC
CHƯƠNG 1:TỔNG QUAN ............................................................................................. 4
1.1
BỐI CẢNH ......................................................................................................... 4
1.2
MỤC TIÊU – PHẠM VI ĐỀ TÀI ...................................................................... 4
1.2.1
Mục Tiêu ................................................................................................... 4
1.2.2
Phạm Vi Đề Tài........................................................................................ 5
CHƯƠNG 2: CƠ SỞ LÝ THUYẾT ............................................................................... 6
2.1
TỔNG QUAN VỀ DRIVER ............................................................................. 6
2.1.1
Driver Là Gì? [1] ..................................................................................... 6
2.1.2
Các Loại Driver Trong Windows [2] .................................................. 7
2.2
TỔNG QUAN VỀ WINDOWS 7 KERNEL MODE DRIVER ...................... 9
2.2.1
Windows Driver Foundation (WDF)................................................... 9
2.2.2
Kernel Mode Driver Framework (KMDF) ........................................ 16
2.3
I/O REQUEST PACKET ............................................................................... 26
2.3.1
Cấu Trúc IRP ......................................................................................... 26
2.3.2
I/O Stack Location [7].......................................................................... 27
2.3.3
I/O Status Block [8] .............................................................................. 28
2.3.4
IRP Major Function Code [9] ............................................................. 28
2.3.5
Xử Lý IRP ............................................................................................... 30
2.4
KIẾN THỨC BỔ TRỢ KHÁC ....................................................................... 32
2.4.1
Đồng Bộ Hoá ......................................................................................... 32
2.4.2
IRQL ......................................................................................................... 34
2.4.3
Memory Pool ......................................................................................... 35
2.4.4
Input/oOutput Control (IOCTL) ......................................................... 36
2.5
CÔNG CỤ LẬP TRÌNH VÀ HỖ TRỢ.......................................................... 37
2.5.1
Visual Studio 2008 ............................................................................... 37
2.5.2
Visual DDK/WDK .................................................................................. 37
2.5.3
Install Driver .......................................................................................... 38
2.5.4
View Driver Output............................................................................... 39
2.5.5
WinDbg và VMWare ............................................................................. 40
CHƯƠNG 3: NỘI DUNG VÀ KẾT QUẢ NGHIÊN CỨU.......................................... 43
3.1
CÁCH VIẾT MỘT DRIVER ĐƠN GIẢN ..................................................... 43
3.1.1
Tạo và Giải Thích Tập Tin Makefile ................................................. 43
3.1.2
Tạo và Giải Thích Tập Tin SOURCES ............................................. 43
3.1.3
Tạo và Giải Thích Tập Tin .c.............................................................. 44
3.2
YÊU CẦU ĐỀ TÀI .......................................................................................... 49
3.3
TÓM TẮT KẾT QUẢ HOẠT ĐỘNG TRONG WINDOWS XP & Ý
TƯỞNG PHÁT TRIỂN TRONG WINDOWS 7 ...................................................... 49
3.4
XÂY DỰNG DRIVER ..................................................................................... 51
3.4.1
Process Driver ...................................................................................... 51
3.4.2
Registry Driver ...................................................................................... 60
3.4.3
FileSystem Driver ................................................................................. 71
CHƯƠNG 4: KẾT LUẬN - HƯỚNG PHÁT TRIỂN .................................................. 86
4.1
KẾT LUẬN ...................................................................................................... 86
4.2
HƯỚNG PHÁT TRIỂN .................................................................................. 86
TÀI LIỆU THAM KHẢO ................................................................................................ 87
2
SVTH: CHÂU TRƯƠNG HẢI MY
GVHD: TS.LÊ VĂN LÂM
PHỤ LỤC CÁC THỦ TỤC & CẤU TRÚC .................................................................. 88
PHỤ LỤC CÁC THỦ TỤC ........................................................................................ 88
1. IoCreateDevice.............................................................................................. 88
2. MmGetSystemRoutineAddress ................................................................ 89
3. ObDereferenceObject ................................................................................. 89
4. ObOpenObjectByPointer ........................................................................... 90
5. ObQueryNameString ................................................................................... 90
6. PsLookupProcessByProcessId ............................................................... 92
7. RegistryCallback routine ........................................................................... 92
8. RtlInitUnicodeString .................................................................................... 94
9. RtlUnicodeStringCat ................................................................................... 94
10.
RtlUnicodeStringCatString .................................................................... 95
11.
RtlUnicodeStringCopy ............................................................................ 95
12.
ZwQueryInformationProcess ................................................................ 96
PHỤ LỤC CÁC CẤU TRÚC ..................................................................................... 98
1. DEVICE_OBJECT ......................................................................................... 98
2. FAST_IO_DISPATCH ................................................................................. 102
3. IRP .................................................................................................................. 104
4. IO_STACK_LOCATION ............................................................................. 107
5. IO_STATUS_BLOCK.................................................................................. 108
3
SVTH: CHÂU TRƯƠNG HẢI MY
GVHD: TS.LÊ VĂN LÂM
CHƯƠNG 1:TỔNG QUAN
1.1 BỐI CẢNH
Khi người sử dụng dùng trình duyệt web để truy cập đến các trang web
trên mạng Internet, trình duyệt web sẽ nối kết đến các máy phục vụ web (web
server), yêu cầu tải nội dung mà người dùng yêu cầu và hiển thị nội dung yêu
cầu. Tuy nhiên, nếu người dùng truy cập vào các trang web độc hại (malicious
web pages), ngoài những thông tin mà người dùng yêu cầu, trình duyệt web có
thể nhận được những mã lệnh độc hại, thực thi mã lệnh này trên máy tính
người dùng. Quá trình này được gọi là drive-by-download. Kết quả của quá
trình này có thể là máy tính của người sử dụng sẽ bị cài đặt một cách tự động
các chương trình virus máy tính hoặc các chương trình gián điệp. Nguy hiểm
hơn, máy tính người dùng có thể trở thành một nút trên một hệ thống phân tán
tấn công từ chối dịch vụ (DDos) được điều khiển từ xa.
Một trong các phương pháp để phát hiện và phân tích tấn công drive-by
download là sử dụng High-interaction Client honeypot. Trong phương pháp này,
người ta xây dựng một số hệ thống người dùng đầu cuối với hệ điều hành và
các ứng dụng cụ thể trên đó. Ngoài ra, người ta xây dựng các chương trình
theo dõi các thông số trong hệ thống trên các hệ thống đầu cuối này. Sau đó,
các hệ thống người dùng đầu cuối sẽ được điều khiển để chạy ứng dựng duyệt
web, nối kết đến các trang web cần kiểm tra tính nguy hiểm. Các thông số theo
dõi trên hệ thống sẽ được phân tích và cho ra kết quả để đưa ra quyết định là
các trang web đó có xảy ra tấn công drive-by-download hay không.
Một trong các công cụ High-interaction client honeypot được sử dụng phổ
biến nhất hiện nay là Capture-HPC của Đại học Victoria, Welllington, New
Zealand. Tuy nhiên, ứng dụng này được xây dựng chạy trên nền tảng của
Windows XP – Một hệ điều hành khá phổ biến trong thời gian trước đây.
Nhưng hiện tại, Microsoft đã chính thức khai tử Windows XP và khuyên người
dùng chuyển sang sử dụng các Hệ điều hành mới hơn. Mặc khác, xu hướng
của người dùng hiện tại đang chuyển dần sang sử dụng Windows 7. Chính vì
vậy, việc chuyển đổi ứng dụng Capture-HPC để có thể chạy trên Windows 7 là
một yêu cầu cấp thiết phục vụ cho nghiên cứu tấn công drive-by download. Đề
tài này sẽ thực hiện một trong các bước khá quan trọng trong quá trình chuyển
đổi: Xây dựng các bộ công cụ (Driver) theo dõi hành vi chạy trên nền
Windows 7.
1.2 MỤC TIÊU – PHẠM VI ĐỀ TÀI
1.2.1
Mục Tiêu
Nắm được những kiến thức cơ bản về Driver: vai trò, các đặt điểm cơ bản
và cách thức hoạt động của nó trong môi trường Windows nói chung và
Windows 7 nói riêng, giúp cho mọi người tiếp cận Driver một cách thuận tiện và
dễ dàng hơn.
4
SVTH: CHÂU TRƯƠNG HẢI MY
GVHD: TS.LÊ VĂN LÂM
Bên cạnh đó, giới thiệu các nền tảng để xây dựng một Driver trong môi
trường Windows 7 bao gồm mô hình phát triển trình điều khiển thế hệ tiếp theo
của Microsoft là Windows Driver Foundation(WDF) và nền tảng phát triển
trình điều khiển mạng Windows Filtering Platform (WFP), thay thế cho công
nghệ Transport Driver Interface (TDI) chỉ có trên Windows XP và các phiên
bản trước.
Kết hợp những kiến thức đã trình bày ở trên và sự hỗ trợ của công cụ
Windows Driver Kit (WDK) được tích hợp với Microsoft Visual Studio 2008 và
bộ công cụ gỡ lỗi Debug Tool dành cho Windows. Biết được cách thức xây
dựng một driver đơn giản chạy trên Windows 7 và từ đó áp dụng vào xây dựng
các driver cho đề tài này.
Mục tiêu quan trọng nhất của đề tài này là phải xây dựng được các bộ
công cụ (Driver) theo dõi hành vi tấn công trên Process, Registry, File System
và Network chạy trong môi trường Windows 7. Đề tài này là sự phát triển tiếp
theo của dự án Capture-HPC thực hiện trên Windows XP của Đại học Victoria,
Welllington, New Zealand.
1.2.2
Phạm Vi Đề Tài
- Nghiên cứu về các nền tảng để xây dựng một Driver gồm có Windows
Driver Foundation (WDF) và Windows Filtering Platform (WFP).
- Nghiên cứu về Driver và cách tạo một Driver cơ bản.
- Xây dựng các bộ công cụ theo dõi hành vi trên Windows 7 bao gồm các
Driver sau:
+ Process Driver: theo dõi việc tạo(create) hoặc đóng(terminate) một tiến
trình trên Windows 7.
+ Registry Driver: theo dõi các thao tác liên quan đến khoá và giá trị của
khoá trong registry như: mở (open), tạo (create), xóa (delete), v.v.
+ File System Driver: theo dõi những thay đổi đến tập tin trong hệ thống
tập tin như: đọc (read), ghi (write), truy vấn (query), v.v.
+ Network Driver: theo dõi các gói tin và các thông tin về nó như là địa chỉ
IP (nguồn, đích), cổng (port), các giao thức mạng (protocol), và các ứng
dụng, v.v. Đồng thời xác định được trạng thái (status) của gói tin đó
(connect, receive hay transport).
5
Kho tài li u mi n phí c a Ket-noi.com blog giáo d c, công ngh
SVTH: CHÂU TRƯƠNG HẢI MY
GVHD: TS.LÊ VĂN LÂM
CHƯƠNG 2: CƠ SỞ LÝ THUYẾT
2.1 TỔNG QUAN VỀ DRIVER
2.1.1
Driver Là Gì? [1]
Hầu hết những định nghĩa về driver là “A driver is software that allows
your computer to communicate with hardware or devices” – Driver là một phần
mềm cho phép máy tính (hoặc OS) của bạn giao tiếp với phần cứng hoặc thiết
bị.
Ví dụ, một ứng dụng cần đọc một vài dữ liệu từ một thiết bị. Ứng dụng gọi
một hàm được thực thi bởi hệ điều hành, và hệ điều hành gọi một hàm được
thực thi bởi driver. Driver thì được viết bởi cùng công ty thiết kế và sản xuất
thiết bị. Sau khi driver lấy dữ liệu từ thiết bị, nó trả dữ liệu về cho hệ điều hành,
hệ điều hành trả dữ liệu về ứng dụng.
Hình 2.1.1-1 Mối quan hệ giữa Application, OS và Driver
Lưu ý:
- Không phải tất cả driver đều được viết bởi cùng công ty thiết kế và sản
xuất thiết bị. Trong một số trường hợp, thiết bị được thiết kế theo tiêu
chuẩn chung nên driver có thể được viết bởi Microsoft.
- Không phải tất cả driver đều giao tiếp trực tiếp với thiết bị. Yêu cầu xuất
phát từ ứng dụng có thể được giải quyết qua nhiều driver trong một ngăn
xếp thiết bị như hình bên dưới.
Hình 2.1.1-2 Yêu cầu được giải quyết qua nhiều driver
6
SVTH: CHÂU TRƯƠNG HẢI MY
GVHD: TS.LÊ VĂN LÂM
- Driver trong ngăn xếp giao tiếp trực tiếp với thiết bị được gọi là Function
Driver; Driver mà thực thi những xử lý phụ thì được gọi là Filter Driver.
- Một vài Filetr Driver theo dõi và ghi chép lại thông tin về I/O request
nhưng mà không tham gia tích cực trong việc xử lý. Ví dụ, những filter
driver xác định thì hành động như là xác nhận để đảm bảo cho những
driver khác trong ngăn xếp xử lý chính xác I/O request.
- Tuy nhiên định nghĩa về driver như bên trên thì chưa đầy đủ vì một số
driver thì không kết hợp với bất kỳ thiết bị phần cứng nào. Ví dụ, bạn
cần truy cập vào cấu trúc dữ liệu của lõi OS và chỉ truy cập được khi chạy
trong chế độ hạt nhân – kernel mode. Bạn có thể làm điều này bằng cách
tách thành hai phần. Phần đầu tiên chạy trong chế độ người dùng và mô
tả giao diện người dùng, phần này được gọi application - ứng dụng. Phần
thứ hai chạy trong chế độ hạt nhân và truy cập đến cấu trúc dữ liệu của
lõi OS, phần này được gọi là software driver và không kết hợp với bất cứ
thiết bị phần cứng nào.
Hình 2.1.1-3 Sofware driver
2.1.2
Các Loại Driver Trong Windows [2]
Có hai loại driver Microsoft Windows cơ bản:
- User-mode driver thực thi trong chế độ người dùng, giữ vai trò cung cấp
một giao diện giữa một ứng dụng Win32 và kernel-mode driver hoặc các
thành phần khác hệ điều hành.
- Kernel-mode driver thực thi trong chế độ hạt nhân như một phần của điều
hành, nó bao gồm những thành phần hệ điều hành chế độ hạt nhân mà điển
hình là I/O manager, Plug and Play memory, processes và threads, security.
Kernel-mode driver thường phân lớp. Nói chung, driver cấp cao hơn thường
nhận được dữ liệu từ các ứng dụng, lọc dữ liệu, và gửi nó để một driver cấp
thấp hơn có hỗ trợ chức năng thiết bị.
7
SVTH: CHÂU TRƯƠNG HẢI MY
GVHD: TS.LÊ VĂN LÂM
Windows Applications Windows
Services
Win32 API
user-mode
kernel-mode
Windows I/O System
I/O Manager
Power Manager
PnP Manager
Hình 2.1.2-1 Sơ đồ mô tả sự tương tác giữa user-mode và kernel-mode
Riêng đối với kernel-mode driver, có ba loại driver khác nhau thể hiện ba
mức độ trong một driver stack: highest-level, intermediate-level và lowest-level.
Và tầng bên trên bao giờ cũng nhận sự hỗ trợ từ những tầng thấp hơn nó.
Hình 2.1.2-2 Các loại driver trong kernel-mode
8
SVTH: CHÂU TRƯƠNG HẢI MY
GVHD: TS.LÊ VĂN LÂM
Highest-level driver bao gồm những trình điều khiển hệ thống tập tin (File
system drivers - FSDs) hỗ trợ hệ thống tập tin như là: NTFS, File allocation
table (FAT), CD-ROM file system.
Intermediate-level driver được chia nhỏ hơn và bao gồm:
- Function driver điều khiển các thiết bị ngoại vi cụ thể trên một chuyến xe I/O.
- Filter driver thêm nó trên hoặc dưới function driver.
- Sofware bus driver trình bày một tập hợp các thiết bị con mà tầng cao hơn
có thể gắn vào.
Lowest-level driver điều khiển một I/O bus mà thiết bị ngoại vi được kết nối.
2.2 TỔNG QUAN VỀ WINDOWS 7 KERNEL MODE DRIVER
2.2.1
Windows Driver Foundation (WDF)
Microdoft Windows Driver Foundation (WDF) là một mô hình phát triển
trình điều khiển thế hệ tiếp theo của Microsoft. WDF bao gồm một bộ các thành
phần hỗ trợ cho sự phát triển, triển khai, và duy trì cho cả hai trình điều khiển
chế độ hạt nhân và người dùng. Hình 2.2.1-1 mô tả những thành phần của
WDF làm việc với những công cụ phát triển trình điều khiển hiện có để xử lý
chu kỳ sống trình điều khiển hoàn toàn:
Hình 2.2.1-1 Windows Driver Foundation và Driver Life Cycle
- Driver model hỗ trợ việc tạo trình điều khiển hướng đối tượng, hướng sự
kiện. Bằng cách sử dụng WDF, người viết trình điều khiển có thể tập trung
vào phần cứng thiết bị của họ, chứ không phải là hệ điều hành. Trình điều
khiển WDF có thể được viết cho một trong hai chế độ hạt nhân hoặc chế độ
người dùng .
9
SVTH: CHÂU TRƯƠNG HẢI MY
GVHD: TS.LÊ VĂN LÂM
- Framework và Windows Driver Kit (WDK). WDF định nghĩa một mô hình
trình điều khiển đơn và bao gồm framework cho sự phát triển trình điều
khiển cả hai chế độ hạt nhân và người dùng. Framework cung cấp cơ sở hạ
tầng cơ bản để hỗ trợ các mô hình WDF. Họ thực hiện tính năng phổ biến,
cung cấp mặc định thông minh và quản lý hầu hết các tương tác với hệ điều
hành.
Kernel Mode Driver Framework (KMDF) hỗ trợ những tính năng được yêu
cầu bởi Windows và được phổ biến đến tất cả các trình điều khiển chế độ
hạt nhân.
User Mode Driver Framework (UMDF) cung cấp sự hỗ trợ chức năng
tương tự như trong KMDF, nhưng trình điều khiển có khả năng cho một số
loại thiết bị chạy trong chế độ người dùng thay vì trong chế độ hạt nhân.
Tất cả các trình điều khiển WDF được xây dựng bằng cách sử dụng các
WDK xây dựng môi trường .
- Tracing and static analysic tools. Cả KMDF và UMDF đã được xây dựng
sẵn mã xác minh và hỗ trợ tích hợp theo dõi thông qua Event Tracing cho
Windows (ETW). Các dấu vết được tạo ra có thể giúp đỡ trong việc gỡ lỗi
trình điều khiển trong quá trình phát triển và trong việc chẩn đoán các vấn
đề trong những trình điều khiển tung ra thị trường. Trình điều khiển WDF
cũng làm việc với người xác minh điều khiển hiện tại. Ngoài ra, công cụ xác
minh trình điều khiển thời gian biên dịch, chẳng hạn như PREfast và Static
Driver Verifier (SDV).
- Driver Signing. Trình điều khiển WDF được ký kết trong cùng một cách
như trình điều khiển WDM .
- Driver insallation tools.Trình điều khiển WDF được cài đặt bằng cách sử
dụng các tập tin INF và làm việc với các công cụ cài đặt trình điều khiển
hiện có, bao gồm công cụ Driver install framewotk (DIFx).
- Versioning. WDF hỗ trợ versioning để một nhị phân điều khiển duy nhất có
thể chạy trên bất kỳ phiên bản của hệ điều hành và sử dụng cùng một phiên
bản của khuôn khổ mà nó đã được xây dựng và thử nghiệm.
2.2.1.1 WDF Object Model
Mô hình này định nghĩa một tập các object - đối tượng đại diện cho cấu
trúc điều khiển thông thường, chẳng hạn như các thiết bị, hàng đợi, I/O
requests, và trình điều khiển riêng của mình. Các đối tượng có các thuộc tính,
phương pháp, và các sự kiện .
- Properties - thuộc tính mô tả đặc điểm của đối tượng. Mỗi thuộc tính được
kết hợp với những phương pháp mà get và set giá trị của thuộc tính.
- Methods – phương pháp thực hiện hành động trên các đối tượng. Có giá
trị trả về.
- Events - sự kiện là những điều kiện mà một trình điều khiển cần để hành
động. WDF xác định các sự kiện có thể cho từng đối tượng và xác định
những hành động mặc định cho hầu hết chúng. Trình điều khiển bao gồm
10
SVTH: CHÂU TRƯƠNG HẢI MY
GVHD: TS.LÊ VĂN LÂM
mã để xử lý các sự kiện cho các hành động mặc định không phù hợp hoặc
không đầy đủ cho các thiết bị của nó. Thông báo đến trình điều khiển về sự
thay đối trạng thái. Khi sự kiện xảy ra, WDF gọi những callback.
Trình điều khiển WDF tạo ra các instance – thể hiện của các đối tượng
mà nó đòi hỏi để phục vụ thiết bị của nó và điều chỉnh những thể hiện cho phù
hợp với những yêu cầu của nó. Đối với mỗi thể hiện, trình điều khiển cung cấp
những callback cho các sự kiện. Callbacks gọi các phương thức trên đối tượng
để thực hiện bất kỳ hành động bổ sung.
Đối tượng được tổ chức phân cấp. WDF driver object là đối tượng gốc; tất
cả các đối tượng thì phụ thuộc vào đối tượng gốc. Đối với hầu hết các loại đối
tượng, một trình điều khiển có thể xác định parent - cha khi nó tạo ra đối tượng.
Nếu trình điều khiển không xác định đối tượng cha khi tạo đối tượng,
framework sẽ thiết lập đối tượng cha là WDF driver object như mặc định. Tuy
nhiên, một số loại đối tượng đã được xác định trước đối tượng cha và không
thay đổi khi được tạo ra. Khi đối tượng cha bị xoá thì đối tượng con sẽ tự động
bị xoá nhưng phải theo qui tắc “Đối tượng con xoá trước, sau đó tới đối tượng
cha”.
Driver tương tác với WDF object thông qua Device Driver Interface (DDIs)
và thông qua giao diện đó mỗi bên thực hiện những hành động riêng của mình
lên đối tưọng:
- Driver actions
+ Tạo object.
+ Định nghĩa callback routine để xử lý sự kiện cho mỗi object.
+ Định nghĩa loại và sự cấp phát tài nguyên.
+ Đòi hỏi DDIs trên object khi trả lời sự kiện.
- WDF actions
+ Quản lý quan hệ cha/con của object.
+ Quản lý thời gian sống của object.
+ Gọi callback routine mà driver đã định nghĩa trước đó khi sự kiện xảy ra.
+ Thực hiện hành động mặc định khi driver không xác định được callback.
Mặc dù mô hình đối tượng áp dụng cho cả các KMDF và UMDF, WDF
object được thực hiện khác nhau trong hai framework.
- Kernel-mode object
Trình điều khiển không bao giờ truy cập trực tiếp thể hiện của KMDF object.
Thay vào đó, trình điều khiển tham chiếu đến thể hiện của đối tượng bằng
handle. Những hành động như read, write trên một đối tượng, trình điều
khiển gọi một method - phương thức trên đối tượng và gửi đến handle.
KMDF định nghĩa hơn 20 loại đối tượng. Bảng 2.2.1.1-1 liệt kê một số loại
thông dụng nhất.
11
SVTH: CHÂU TRƯƠNG HẢI MY
GVHD: TS.LÊ VĂN LÂM
Bảng 2.2.1.1-1 KMDF object type được sử dụng phổ biến
Object Type Name
WDFDRIVER
WDFDEVICE
WDFQUEUE
WDFINTERRUPT
WDFREQUEST
WDFMEMORY
WDFIOTARGET
Description`
Đại diện driver object
Đại diện device object
Đại diện một hàng đợi của I/O requests
Đại diện một interrupt resource
Mô tả một I/O request
Mô tả một bộ đệm cho một I/O request
Đại diện cho I/O target của một I/O request
KMDF object không được quản lý bởi Windows object manager và do đó
không được thao tác bằng cách sử dụng chức năng ObXxx của hệ thống.
Chỉ có framework và WDF driver có thể tạo ra và thao tác chúng.
Tương tự như vậy, KMDF event không liên quan đến các kernel-dispatcher
event mà Windows sử dụng như cơ chế đồng bộ hóa. Một trình điều khiển
không thể tạo, thao tác, hoặc chờ đợi vào một sự kiện WDF. Thay vào đó,
driver đăng ký callback cho sự kiện này và WDF gọi trình điều khiển khi sự
kiện xảy ra.
- User-mode object
UMDF object được dựa trên component object model (COM). UMDF sử
dụng một tập hợp con nhỏ của COM cho giao diện truy vấn và tính tham
khảo tính năng. Handle là không cần thiết bởi vì các giao diện là các lớp cơ
sở trừu tượng và xác định đối tượng.
Các UMDF xác định đối tượng ít hơn KMDF vì trình điều khiển chế độ
người dùng không thể truy cập trực tiếp phần cứng và do đó không thực
hiện truy cập bộ nhớ trực tiếp (DMA) hoặc xử lý ngắt quãng.
2.2.1.2 Driver Framework
Framework cung cấp cơ sở hạ tầng cơ bản cho driver và thực hiện các
dịch vụ sau cho WDF driver:
- Quản lý thời gian sống của object.
- Cung cấp DDIs để driver gọi các thao tác trên object.
- Cung cấp sự thực thi phổ biến các tính năng mà driver thường yêu cầu,
chẳng hạn như Plug and Play, power manager, synchronizaion, I/O queue,
truy cập vào registry.
- Quản lý luồng của I/O request và PnP từ hệ điều hành đến driver.
Thay vì gọi trực tiếp hệ điều hành, driver tương tác với các framework phù
hợp cho hầu hết các dịch vụ. Các framework quản lý hầu hết các tương tác với
hệ điều hành thay mặt cho driver.
2.2.1.3 Driver Object và Device Object
a.
Driver Object [3]
12
SVTH: CHÂU TRƯƠNG HẢI MY
GVHD: TS.LÊ VĂN LÂM
I/O manager tạo ra một driver object cho mỗi driver mà được cài đặt và
nạp vào OS. Driver object được mô tả bởi cấu trúc DRIVER_OBJECT. Khi I/O
manager gọi thủ tục DriverEntry, nó cung cấp địa chỉ cho driver object. Driver
object chứa sự lưu trữ cho các entry point cho nhiều thủ tục tiêu chuẩn của
driver. Driver có trách nhiệm điền vào các entry point.
Hình 2.2.1.3-a.1 Các thủ tục tiêu chuẩn mà một driver phải có
Mỗi thủ tục tiêu chuẩn với một dấu sao bên cạnh tên của nó nhận một IRP
là đầu vào và cũng nhận được một con trỏ đến device object mục tiêu cho I/O
request.
I/O manager xác định loại driver object và sử dụng các driver object để
đăng ký và theo dõi thông tin về những hình ảnh của driver được tải vào OS.
Lưu ý các entry point (DDDispatchXxx và DDDispatchYyy) trong hình trên tương
ứng với major function code (IRP_MJ_XXX).
Người lập trình driver phải biết về một số thành phần của một driver
object để khởi tạo một driver cũng như tháo dỡ driver. Các thành phần dưới
đây có thể truy cập đến driver .
PDEVICE_OBJECT DeviceObject
Trỏ đến driver object được tạo ra bởi driver. Thành phần này được tự động
cập nhật khi driver gọi IoCreateDevice thành công. Một driver có thể sử dụng
thành phần này và thành phần của NextDevice của DEVICE_OBJECT để
bước qua một danh sách của tất cả các device object mà driver tạo ra.
PDRIVER_EXTENSION DriverExtension
Trỏ tới driver extension. Chỉ có thể truy cập thành phần của driver extension
là DriverExtension->AddDevice, thủ tục DriverEntry lưu trữ thủ tục AddDevice.
PUNICODE_STRING HardwareDatabase
Trỏ đến đường dẫn Registry\Machine\Hardware để thông tin cấu hình
phần cứng trong registry.
PFAST_IO_DISPATCH FastIoDispatch
Trỏ đến một cấu trúc định nghĩa các entry point fast I/O của driver. Thành
phần này chỉ được sử dụng bởi FSDs và network transport driver - trình
điều khiển giao thông mạng.
13
SVTH: CHÂU TRƯƠNG HẢI MY
GVHD: TS.LÊ VĂN LÂM
PDRIVER_INITIALIZE DriverInit
Entry point cho thủ tục DriverEntry, được thành lập bởi I/O manager .
PDRIVER_STARTIO DriverStartIo
Entry point cho thủ tục StartIo của driver, được thiết lập bởi thủ tục
DriverEntry khi driver khởi tạo, nếu driver không có thủ tục StartIo thành
phần này là NULL.
PDRIVER_UNLOAD DriverUnload
Entry point cho thủ tục Unload của driver, được thiết lập bởi thủ tục
DriverEntry khi driver khởi tạo. nếu driver không có thủ tục StartIo thành
phần này là NULL.
PDRIVER_DISPATCH MajorFunction [ IRP_MJ_MAXIMUM_FUNCTION 1 ]
Một bảng dispatch bao gồm một mảng các entry point cho thủ tục
DispatchXxx của driver. Giá trị của chỉ số của mảng là những giá trị
IRP_MJ_XXX đại diện cho mỗi IRP major function code. driver phải thiết lập
entry point trong mảng này cho các IRP_MJ_XXX request mà driver xử lý,
xem Writing Dispatch Routine.
b.
Device Object [4]
Hệ điều hành mô tả các thiết bị bởi các device object. Một hoặc nhiều
device object được kết hợp với mỗi thiết bị. Các device object phục vụ như là
mục tiêu của tất cả các hoạt động trên thiết bị. Trình điều khiển kernel-mode
phải tạo ra ít nhất một device object cho mỗi thiết bị.
Một số device object không đại diện cho physical device - thiết bị vật lý,
xử lý I/O request không được gửi đến phần cứng, nhưng vẫn phải tạo ra một
device object, xem Creating device object để biết thêm về cách tạo ra device
object.
-
Device object có những đặc điểm như sau:
Được mô tả bởi cấu trúc DEVICE_OBJECT.
Được tổ chức trong một device stack – ngăn xếp thiết bị.
Được quản lý bởi object manager.
Một device object có thể được đặt tên, xem Named Device Object.
Hệ thống cung cấp sự lưu trữ dành riêng cho từng device object, được gọi
là device extension. Device extension được tạo ra và được giải phóng bởi
hệ thống cùng với các device object, xem Device Extensions.
Hình dưới đây minh họa mối quan hệ giữa device object và I/O manager.
14
SVTH: CHÂU TRƯƠNG HẢI MY
GVHD: TS.LÊ VĂN LÂM
Hình 2.2.1.3-b.1 Mối quan hệ giữa device object và I/O manager
2.2.1.4 Device Stack và Driver Stack
a.
Device Stack [5]
Trong Windows, các device được đại diện bởi các device node trong PnP
device tree. Thông thường, khi một I/O request được gửi tới một device, những
driver khác nhau giúp xử lý các request. Mỗi driver được liên kết với một
device object, và các device object được sắp xếp trong một stack. Trình tự
của các device object cùng với các driver liên quan được gọi là một
device stack. Mỗi device node có device stack riêng của mình.
Windows tổ chức các device trong một cấu trúc cây gọi là PnP device tree.
Thông thường, một node trong device tree đại diện cho hoặc là một device
hoặc một chức năng cá nhân của device. Như vậy, một device có thể có một
hoặc nhiều device node. Tuy nhiên, một số các nút đại diện cho các thành
phần phần mềm mà không có liên kết với các thiết bị vật lý. Một node trong
device tree được gọi là một device node. Root node của cây thiết bị được gọi
là root device node. Theo quy ước, các root device node được vẽ ở dưới cùng
của device tree.
Một device object là một thể hiện của một DEVICE_OBJECT structure. Mỗi
device node trong PnP device tree có một danh sách của các device object, và
mỗi device object được kết hợp với một driver.
Theo quy ước, một device stack có một đầu và đáy. Các device object
đầu tiên được tạo ra trong devicd stack là ở phía dưới, và các device object
cuối cùng được tạo ra và gắn vào phần đầu của device stack. Hình 2.2.2.4-a.1
trình bày mô hình device stack trong kernel-mode.
15
SVTH: CHÂU TRƯƠNG HẢI MY
GVHD: TS.LÊ VĂN LÂM
Device Stack
device object
driver
device object
driver
device object
driver
Hình 2.2.1.4-a.1 Device stack trong kernel-mode
b.
Driver Stack [6]
Hầu hết các yêu cầu được gửi đến trình điều khiển thiết bị được đóng gói
trong I/O request packets (IRPs). Mỗi device được đại diện bởi một device
node, và mỗi device node có một device stack. Để gửi một read, write, device
request đến device, I/O manager đặt các device node cho device và sau đó gửi
một IRP cho các device stack của node đó. Đôi khi có nhiều hơn một device
stack tham gia vào xử lý một I/O request. Trình tự của các driver tham gia
xử lý I/O request được gọi là driver stack.
Xem xét trình tự của bốn driver tham gia xử lý I/O request được minh họa
trong biểu đồ trước đó. Sơ đồ dưới đây cho thấy các driver theo thứ tự từ trên
xuống dưới. Chú ý rằng Disk.sys được liên kết với một device object, nhưng
mỗi một trong ba driver khác có liên quan đến hai device object. Như vậy, một
driver có thể thực thi cho nhiều device.
Hình 2.2.1.4-b.1 Driver stack trong kernel-mode
2.2.2
Kernel Mode Driver Framework (KMDF)
Kernel Mode Driver Framework (KMDF) là một cơ sở hạ tầng cho sự phát
triển trình điều khiển chế độ hạt nhân (Kernel Mode Driver). Nó cung cấp một
16
SVTH: CHÂU TRƯƠNG HẢI MY
GVHD: TS.LÊ VĂN LÂM
giao diện trình điều khiển thiết bị - Device Driver Interface (DDI) ngôn ngữ C và
có thể được sử dụng để tạo trình điều khiển cho Windows 7. Về bản chất,
framework là một trình điều khiển thiết bị xương sống mà có thể được tùy biến
cho các thiết bị cụ thể. KMDF thực thi mã lệnh để xử lý những yêu cầu trình
điều khiển thông thường. Trình điều khiển tùy chỉnh framework bằng cách thiết
lập thuộc tính đối tượng, đăng ký callback để được thông báo về sự kiện quan
trọng, và bao gồm cả mã chỉ dành cho các tính năng mà là duy nhất cho thiết bị
của họ .
KMDF cung cấp một mô hình đối tượng được định nghĩa tốt và kiểm soát
thời gian sống của các đối tượng và cấp phát bộ nhớ. Đối tượng được tổ chức
phân cấp trong một mô hình cha /con , và cấu trúc dữ liệu trình điều khiển quan
trọng được duy trì bởi KMDF thay vì bởi trình điều khiển.
Chương này giới thiệu cho chúng ta biết về kiến trúc và các điểm đặc
trưng của KMDF và các yêu cầu cho trình điều khiển sử dụng KMDF (đôi khi
được gọi là trình điều khiển dựa trên KMDF hoặc đơn giản là trình điều khiển
DMDF).
2.2.2.1 Những Thành Phần Của KMDF
KMDF được phân phối như một phần của Windows Driver Kit (WDK) và
bao gồm header file, libraries, sample drivers, development tools, public
debugging symbols, và tracing format files. Theo mặc định, KMDF được cài đặt
trong thư mục con WDF của thư mục cài đặt gốc WDK. Trình điều khiển dựa
trên KMDF được xây dựng trong WDK build environment. Bảng 2.2.2.1-1 liệt
kê các thành phần KMDF được cài đặt như một phần của WDF.
Bảng 2.2.2.1-1 Các thành phần của KMDF
Thành phần
Vị trí
Header files
Libraries
Wdf/inc
Wdf/lib
Sample Drivers
Wdf/src
Tools
Wdf/bin
Debugging symbol
Wdf/symbols
Tracing format files
Wdf/tracing
Mô tả
Yêu cầu để xây dựng KMDF driver
Thư viện cho các kiến trúc x86, x64 và Intel
Itanium.
Các driver mẫu về các loại driver; hầu hết
được cung cấp từ các mẫu Windows
Device Kit (DDM)WDM
Các công cụ cho việc kiểm thử, gỡ lỗi, và
cài đặt driver
Những tập tin Public symbol database
(.psd) cho thư viện và đồng cài đặt cho
việc Check and free uilds
Theo dõi những tập tin định dạng và lần
theo những thông điệp được tạo bởi thư
viện KMDF và đồng cài đặt.
17
Kho tài li u mi n phí c a Ket-noi.com blog giáo d c, công ngh
SVTH: CHÂU TRƯƠNG HẢI MY
GVHD: TS.LÊ VĂN LÂM
2.2.2.2 Device Object và Vai Trò Của Driver
Tất cả driver tạo ra một hoặc nhiều device object để đại diện cho vai trò
của driver trong việc xử lý I/O request và quản lý thiết bị của mình. KMDF hỗ
trợ các loại device object sau đây:
- Filter device objects (filter DOs) đại diện cho vai trò của một filter driver.
Filter DOS "lọc" hoặc sửa đổi một hoặc nhiều loại I/O request mục tiêu trong
thiết bị. Filter DOs được gắn vào PnP device stack.
- Functional device objects (FDOs) đại diện cho vai trò của một function
driver, nó là driver chính cho một thiết bị. FDOs được gắn vào PnP device
stack.
- Physical device objects (PDOs) đại diện cho vai trò của bus driver, liệt kê
các thiết bị con. PDOs được gắn vào PnP device stack.
- Control device object (CDOs) đại diện cho một di sản Non-PnP device
hoặc một giao diện điều khiển. Không phải là một phần của PnP device
stack.
Tùy thuộc vào thiết kế của thiết bị và các driver khác trong device stack,
một driver có thể giả định có một hoặc nhiều vai trò. Mỗi thiết bị PnP có một
function driver và một bus driver, nhưng có thể có bất kỳ số lượng các filter
driver. Trong PnP device stack, một driver thỉnh thoảng hành động như function
driver cho một thiết bị và như bus driver cho các thiết bị mà thiết bị của nó liệt
kê.
Function driver và Function device object
Function driver là các trình điều khiển chính cho các thiết bị của họ.
Function driver giao tiếp với thiết bị của mình để thực hiện I/O và thường quản
lý chính sách năng lượng cho thiết bị của nó. Trong PnP device stack, một
function driver bộc lộ một FDO.
Để hỗ trợ function driver, KMDF bao gồm một giao diện FDO, trong đó
định nghĩa một tập hợp các method, các event, và property áp dụng cho FDOs
trong suốt quá trình cài đặt và hoạt động. Bằng cách sử dụng giao diện FDO,
một driver có thể:
- Đăng ký các event callback có liên quan đến tài nguyên phân bổ cho các
thiết bị của nó .
- Lấy thuộc tính của thiết bị vật lý của nó .
- Mở một registry key.
- Quản lý một danh sách các thiết bị con, nếu thiết bị liệt kê một hoặc nhiều
con.
Khi driver tạo ra device object cho nó, KMDF tạo ra một FDO. Theo mặc
định, KMDF giả định rằng các function driver quản lý chính sách năng lượng
cho thiết bị của mình. Nếu thiết bị hỗ trợ đánh thức các tín hiệu, các function
driver thường cũng thiết lập các event callback chính sách năng lượng để thực
hiện tính năng này. Tất cả các trình điều khiển mẫu, ngoại trừ các trình điều
khiển KbFiltr và Firefly, tạo ra một FDO .
18
- Xem thêm -