Cấu hình thiết bị bạn (Configuring Your Device ) Cấu hình thiết bị bạn (Configuring Your Device ) Bởi: Khoa CNTT ĐHSP KT Hưng Yên Trong chương trước, thảo luận với bạn IRP-MJ-PNP cho thiết bị cắm chạy (Plug and Play) IRP_MN_START_DEVICE phương tiện để cung cấp cho bạn thông tin nguồn vào/ra mà định PnP Manager bạn sử dụng Tôi cho bạn cách để đạt đồng thời list cách thức đơn giản (chưa tinh tế) cách để dịch mô tả nguồn để gọi trợ giúp hàm StartDevice mà bạn thấy nguyên mẫu sau: NTSTATUS StartDevice(PDEVICE_OBJECT fdo, PCM_PARTIAL_RESOURCE_LIST raw, PCM_PARTIAL_RESOURCE_LIST translated) { } Các cấu trúc CM_PARTIAL_RESOURCE_lIST chứa đựng số đếm mảng cấu trúc CM_PARTIAL_RESOURCE_DESCRIPTOR, minh hoạ hình 7.1 Mỗi kí hiệu nguồn mảng có thành phần Type để biểu thị kiểu nguồn mô tả số thành phần thêm vào mà cung cấp thể cụ thể nguồn định Bạn không bị làm cho ngạc nhiên (bất ngờ) việc tìm mảng theo cách: Nếu thiết bị bạn sử dụng IRQ vùng cổng vào ra, bạn nhận hai kí hiệu nguồn từ mảng Một hai kí hiệu dành cho IRQ bạn kí hiệu lại dành cho phần cổng vào/ra Thật không may, bạn dự đoán trước thứ tự mà kí hiệu xuất mảng Chính vậy, hàm giúp đỡ StartDevice phải bắt đầu với vòng lặp “trải mỏng” mảng cách trích giá trị nguồn vào tập hợp biến cục Bạn sử dụng biến cục sau để liên kết với nguồn định 1/5 Cấu hình thiết bị bạn (Configuring Your Device ) vị trí mmà bạn cần (nó khác với lý thuyết nói, khác chút với thứ tự mà PnP Manager chọn lựa để hiển thị cho bạn) Hình 7-1 Structure of a partial resource list Với phác thảo này, hàm StartDevice có dạng: NTSTATUS StartDevice(PDEVICE_OBJECT fdo, PCM_PARTIAL_RESOURCE_LIST raw, PCM_PARTIAL_RESOURCE_LIST translated) { PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) fdo->DeviceExtension; 2/5 Cấu hình thiết bị bạn (Configuring Your Device ) PCM_PARTIAL_RESOURCE_DESCRIPTOR resource = translated->PartialDescriptors; ULONG nres = translated->Count; for (ULONG i = 0; i < nres; ++i, ++resource) { switch (resource->Type) { case CmResourceTypePort: break; case CmResourceTypeInterrupt: break; case CmResourceTypeMemory: break; case CmResourceTypeDma: 3/5 Cấu hình thiết bị bạn (Configuring Your Device ) break; } } return STATUS_SUCCESS; } Tôi sử dụng trỏ đoạn code để kí hiệu nguồn với độ dài khác mảng Thành phần Count cuả danh sách nguồn có kí hiệu nguồn mảng PartialDescriptor Bạn nên khai báo biến cục thích hợp với nguồn vào/ra mà bạn muốn nhận Tôi cụ thể hoá điều sau mà thảo luận cách làm để liên kết (liên hệ) nguồn vào chuẩn Các kí hiệu nguồn suốt vòng lặp, bạn sử dụng cấu trúc lệnh Switch để lưu thông tin mô tả nguồn vào biến cục tương ứng Trong đoạn text này, ấn định thiết bị mà cần sử dụng cổng vào/ra ngắt, thiết bị đòi hỏi phải tìm kiểu liệu nguồn CmResourceTypePort CmResourceTypeInterup Tôi cho bạn cách kĩ lưỡng hai kiểu liệu nguồn chuẩn CmResourceTypeMemory CmResourceTypeDma Một vòng lặp bên ngoài, biến cục mà bạn khởi tạo nhãn khác giữ thông tin nguồn bạn cần Nếu bạn có nhiều nguồn có kiểu riêng biệt (cụ thể), bạn cần phải tạo cách thức để thông báo cho thành phần kí hiệu nguồn Để đưa ví dụ cụ thể (nhưng tưởng tượng), giả sử thiết bị bạn sử dụng KB vùng nhớ cho mục đích điều khiển 16 KB vùng nhớ để dành cho việc thu thập liệu Bạn mong nhận hai nguồn CmResourceTypeMemory từ Manager PnP Điều khiển nhớ khối có dung lượng KB, nhớ liệu khối có dung lượng 16 KB Nếu code (nguồn) thiết bị bạn có phân biệt kí tự kích cỡ khác ví dụ, bạn nói rõ phần nguồn (code) Bảng 7.1 thể nhìn tổng quát kiểu liệu nguồn 4/5 Cấu hình thiết bị bạn (Configuring Your Device ) Table 7-1 Overview of Processing Steps for I/O Resources Resource Type Overview Port Possibly map port range; save base port address in device extension Memory Map memory range; save base address in device extension Dma Call IoGetDmaAdapter to create an adapter object Interrupt Call IoConnectInterrupt to create an interrupt object that points to your interrupt service routine (ISR) 5/5 .. .Cấu hình thiết bị bạn (Configuring Your Device ) vị trí mmà bạn cần (nó khác với lý thuyết nói, khác chút với thứ tự mà PnP Manager chọn lựa để hiển thị cho bạn) Hình 7-1 Structure... phân biệt kí tự kích cỡ khác ví dụ, bạn nói rõ phần nguồn (code) Bảng 7.1 thể nhìn tổng quát kiểu liệu nguồn 4/5 Cấu hình thiết bị bạn (Configuring Your Device ) Table 7-1 Overview of Processing... break; case CmResourceTypeDma: 3/5 Cấu hình thiết bị bạn (Configuring Your Device ) break; } }