Thực chất việc này không hề đơn giản nhưng ta có thể thực hiện theo một mẫu chuẩn như sẽ đề cập sau đây :
MọI thiết bị USB thực hiện những yêu cầu (request) gồm những thao tác như nhận tập descriptor chuẩn từ thiết bị và thiết lập những thông số thiết bị chuẩn . Việc đầu tiên là xác định lớp HID trong trường bInterfaceClass củaUSB interface descriptor . Giá trị phù hợp là 0x03 , giá trị này cho trình điều khiển USB biết trình điều khiển lớp nào ứng dụng cần phải phù hợp sau khi quá trình liệt kê hoàn thành .
Trong quá trình liêt kê , thiết bị cũng cung cấp một HID class descriptor chứa thông tin phiên bản HID-specification và chiều dài của HID-report descriptor . HID descriptor bao gồm các HID usage , mỗI cái mô tả một trường trong một báo cáo vào hay ra (Tham khảo thêm HID usage table)
Nếu êm dẹp sau đó ứng dụng phải mở thiết bị cho truyền thông , một quá trình khá phức tạp . Ở đây chỉ tóm gọn thành một hàm bOpenHidDevice() , cho một handle thiết bị ,một VID thiết bị , một PID thiết bị như là đối số của hàm . Nếu máy chủ tìm thấy thiết bị hàm trả về TRUE và Windows HID API gán một giá trị hợp lệ cho handle thiết bị . Nếu không hàm trả về FALSE .
Quá trình “mở” thiết bị gồm 7 bước :
*******HidD_GetHidGuid()
SetupDiGetClassDevs()
SetupDiGetClassDevs() --> FALSE (HID device not found)
TRUE
SetupDiGetDeviceInterfaceDetail()
CreateFile()
Desired VID and PID -->TRUE (HID device found)

1.Thu được Windows GUID (globally unique ID) cho thiết bị HID thông qua gọi hàm HidD_GetHidGuid() .
2.Lấy một mảng cấu trúc chứa thông tin về mọi thiết bị HID đã được gắn vào thông qua gọi hàm SetupDiGetClassDevs(). bước này sử dụng HID GUID đã có từ bước 1 để xác định danh sách sẽ chỉ chứa những thiết bị HID .
3.Sủ dụng hàm SetupDiEnumDeviceInterfaces() để lấy thông tin về thiết bị trong danh sách . Chúng ta cần phải qua một số chỉ số trong bảng liệt kê thông tin về thiết bị cho tới khi tìm thấy một cái với VID và PID chính xác .Nếu hàm này trả về FALSE là khi hết danh sách mà không tìm thấy thiết bị mong muốn .
4.Gọi hàm SetupDiGetDeviceInterfaceDetail() trả về dữ liệu chi tiết về thiết bị đã định chỉ số liệt kê ở bước 3 .
5.Gọi hàm CreateFile() để mở thiết bị sử dụng hướng đạt được trong bước 4 . Nếu gọi hàm thành công sẽ trả về một handle hợp lệ , sau đó có thể kiểm tra VID và PID để xác định liệu đó có đúng là thiết bị yêu cầu không .
6.So sánh VID và PID để xác định có đúng thiết bị không . Nếu đúng trả về handle thiết bị và điều kiện TRUE .
7.Nếu sai đóng handle thiết bị và quay lai bước 3 để kiểm tra thiết bị tiếp theo trong danh sách liệt kê .
Ứng dụng HID sau đó phải khai báo việc thiết bị đã được gắn kết hay chưa .Hàm bHidDeviceNotify() tóm gọn quá trình này . Hàm này dẫn đến WindowsUSB system gửi một thông báo WM_DEVICECHANGE tới ứng dụng mỗi khi một thiết bị USB HID được gắn vào hay tháo ra khỏi hệ thống . Hệ thống khai báo không đủ thông minh để chỉ ra sự thay đổi về VID và PID của thiết bị HID nên ứng dụng phải kiểm tra liệu rằng thiết bị vẫn gắn kết bằng một thông điệp khai báo nào đó .
FALSE(tăng chỉ số và quay lại SetupDiGetClassDevs() thử tiếp)







http://itprovn.net/lofiversion/index.php/t2582.html