2012-01-30 32 views
6

Tôi tự hỏi nếu có ai có thể giúp gì cả, một chút vấn đề của chuyên gia này.Thay thế Windows USB Class Driver bằng trình điều khiển tùy chỉnh?

Tôi có một ứng dụng cần đọc và phân tích một số thiết bị USB (không phải đồng thời, chúng được chạy trong các thử nghiệm riêng biệt và có thể được chạy trên các máy khác nhau).

Mỗi thiết bị USB dựa trên lớp USB HID và được sản xuất bởi các công ty khác nhau, không có thiết bị USB nào được thiết kế để chạy trên PC, nhưng có nghĩa là cho một nền tảng khác, tuy nhiên với mục đích kiểm tra các thiết bị mà khách hàng đã yêu cầu rằng ứng dụng thử nghiệm được chạy từ PC.

Một số thiết bị sẽ khởi động, được nhận diện bởi các cửa sổ khởi động và khởi động chính xác bằng trình điều khiển lớp HID chung được tích hợp trong cửa sổ, sau đó thiết bị sẽ gửi gói dữ liệu chính xác của dữ liệu cần kiểm tra.

Một số thiết bị sẽ khởi động, được nhận diện bởi các cửa sổ sẽ cố gắng khởi động chúng nhưng không hoàn toàn khởi tạo chúng để chúng ở trạng thái khởi tạo nửa. Điều này là tốt, vì tôi có thể sử dụng phân tích giao thức beagle của tôi để nắm bắt các gói khởi tạo từ nền tảng chính hãng và sau đó sử dụng thư viện LibUSBDotNet để tái tạo các gói còn lại trong chuỗi khởi tạo và bắt chúng gửi gói chính xác.

Vấn đề tôi gặp phải là với một thiết bị cụ thể (mặc dù có một số thiết bị khác mà tôi chưa thử nghiệm nên có thể một trong số đó cũng có thể xảy ra cùng một vấn đề). Vấn đề là trình điều khiển Windows HID lớp nhận ra thiết bị và trys để khởi tạo và bắt đầu nó, điều này hoạt động sau một thời trang và thiết bị bắt đầu gửi dữ liệu.

Vấn đề là dữ liệu được gửi khác với dữ liệu được gửi tới nền tảng chính hãng (chỉ chứa một tập con của toàn bộ dữ liệu). Nó như thể các cửa sổ đã khởi tạo thiết bị vào một chế độ khác.

Khi tôi chụp các gói khởi tạo từ cả PC và nền tảng chính hãng bằng bộ phân tích giao thức USB, tôi thấy Windows đang gửi một số gói khởi tạo hơi khác nhau. Sử dụng LibUSBDotNet để gửi lại các gói chính xác khi Windows đã khởi động thiết bị dường như không có hiệu lực. Vấn đề của tôi là tôi cần phải ngăn chặn các cửa sổ cố gắng khởi tạo thiết bị bằng trình điều khiển lớp HID chuẩn, tôi đã thử gỡ bỏ trình điều khiển trong Trình quản lý Thiết bị nhưng nó vẫn khởi động nó (và trình điều khiển được gán lại trong thiết bị một cách kỳ diệu giám đốc). Tôi đã thực hiện một số điều tra và có thể lựa chọn:

  1. Tạo một trình điều khiển cụ thể mà các cửa sổ sẽ gán cho VID đặc biệt/PID của thiết bị nhưng điều đó không có gì, sau đó tôi có thể sử dụng LibUSBDotNet để gửi đúng trình tự khởi tạo cho thiết bị từ bên trong mã của riêng tôi.

  2. Sử dụng một cái gì đó giống như WinUSB để tạo ra một trình điều khiển thích hợp cho các thiết bị (hoặc có thể để tạo ra một "chết" lái xe như 1.

sẽ một trình điều khiển với một VID cụ/PID định nghĩa được sử dụng bởi cửa sổ trong sở thích để nó sẵn có trình điều khiển lớp USB HID? Nếu không thì tôi sẽ lãng phí thời gian của tôi đi xuống con đường này?

Lưu ý, mac của tôi khởi tạo thiết bị vấn đề một cách chính xác, và tôi đã hỏi câu hỏi của khách hàng cho dù ứng dụng có thể được phát triển cho Mac và câu trả lời của họ chỉ làm phiền Windows.

Tôi không có kinh nghiệm viết trình điều khiển Windows thích hợp, mặc dù tôi có kinh nghiệm nói chuyện với USB ở mức tương đối thấp (do đó phần đó không lo lắng quá nhiều). Bất cứ ai có thể đề xuất một hành động tốt (trước khi tôi có khả năng lãng phí tuần điều tra làm thế nào để viết trình điều khiển cho máy tính chỉ để tìm khóa học hành động được lựa chọn của tôi không thể cung cấp những gì tôi yêu cầu).

Bất kỳ trợ giúp hoặc đề xuất nào được đánh giá cao.

Cảm ơn, Giàu


vào sau khi cố gắng gợi ý dưới đây:

tôi đã cố gắng sử dụng thuật sĩ inf LibUsbDotNet để tạo ra các tập tin cần thiết và cài đặt chúng và điều này dường như làm việc - chắc chắn thiết bị đã bây giờ xuất hiện trong Device Manager như một thiết bị libusb-win32 - không phải thiết bị HID và trình điều khiển liên quan là trình điều khiển libusb. Ngay cả sau khi thực hiện điều này, thiết bị dường như vẫn được khởi tạo và bắt đầu gửi nhầm loại gói dữ liệu mặc dù bây giờ các gói đó không còn được trình điều khiển lớp xử lý và chỉ bị mất.

Tôi cũng đã gặp Zadig có trình hướng dẫn tạo inf tương tự cho WinUSB và điều này có kết quả giống hệt nhau.

Một đồng nghiệp đã đề xuất rằng có thể không phải là chính cửa sổ đang chuyển thiết bị sang chế độ này, thay vào đó thiết bị xác định rằng thiết bị được kết nối với máy tính Windows và tự chuyển sang chế độ này. Tôi nghi ngờ đây là trường hợp, trong trường hợp đó tôi bị mắc kẹt - thời gian để có một cuộc trò chuyện với khách hàng.

Rất cám ơn sự giúp đỡ.

+1

Bạn có thể đặt câu hỏi này ngắn gọn hơn không? Tôi nghi ngờ nhiều người sẽ đọc tất cả những điều đó. –

Trả lời

4

Bạn đang sử dụng libusb-win32 làm trình điều khiển bộ lọc; đó là, trình điều khiển thiết bị HidUsb được gán và tải cho thiết bị của bạn, nhưng sau đó trình điều khiển libusb-win32 được tải lên trên và cho phép bạn truy cập không bị cản trở vào phần cứng.

Nếu bạn không muốn một HidUsb (hoặc bất kỳ trình điều khiển lớp khác) thực hiện bất kỳ liên lạc nào "thay mặt bạn", chỉ cần kết hợp libusb-win32 làm trình điều khiển thiết bị với phần cứng của bạn. Đối với điều này, bạn phải tạo một tập tin .INF liên kết nó với VID/PID/Revision của mỗi thiết bị USB. Nếu tôi nhớ chính xác, libusb-win32 thậm chí còn đi kèm với một tiện ích để tạo các tệp .INF như vậy.

Nếu bạn cài đặt tệp .INF này, ví dụ: với PnpUtil.exe (có sẵn trên Vista hoặc cao hơn), bạn vẫn có thể gặp sự cố trong đó, mặc dù bạn phù hợp hơn trình điều khiển HID chung, trình điều khiển HID vẫn được chọn.

Trình điều khiển HID chung phù hợp với các thiết bị theo ID tương thích của chúng (ví dụ: bằng lớp giao diện USB) trong khi bạn khớp với ID phần cứng (có mức độ ưu tiên cao hơn). Tuy nhiên, Windows có thể ưu tiên các khía cạnh khác, chẳng hạn như trình điều khiển của bạn chưa được ký. Đọc: How Windows Selects Drivers

May mắn thay, ngay cả trong trường hợp đó, việc ký trình điều khiển với chứng chỉ tự tạo (sử dụng CertUtil.exe, MakeCat.exeSignTool.exe) không quá khó.

+0

Cảm ơn, có rất nhiều thông tin hữu ích ở đó. Có, tôi đang sử dụng bộ lọc mà tôi đã cài đặt qua LibUSBDotNet. Tôi sẽ cố gắng như bạn đề nghị và cài đặt thông qua một tập tin inf. Tôi điều tra tất cả các đề xuất của bạn và cho bạn biết cách tôi tiếp tục. –

+0

Xem thêm bình luận ở trên, giải pháp của bạn hoạt động ở chỗ nó ngăn cản trình điều khiển lớp được tải và ngừng xử lý tiếp theo bởi trình điều khiển lớp, không may là cửa sổ tối thiểu cần thiết để xác định thiết bị và tải trình điều khiển thay thế vẫn đủ để kích hoạt sự cố . Cảm ơn sự giúp đỡ mặc dù, nó là một bài tập rất hữu ích trong việc tìm hiểu về trình điều khiển thiết bị vv. –

+0

Trên một thiết bị đơn giản, Windows chỉ thực hiện lệnh "lấy bộ mô tả thiết bị" và "lấy bộ mô tả cấu hình". Nếu đó là một thiết bị tổng hợp, một số bộ mô tả sẽ được mua lại. Trong mọi trường hợp, Windows không đọc/ghi đến điểm cuối hoặc thực hiện các yêu cầu kiểm soát lạ ở giai đoạn này. Khi bạn nói "trình điều khiển thay thế", một trình điều khiển thay thế có thực sự tải cho thiết bị không và nếu có, trình điều khiển đó là gì? – Ilya

Các vấn đề liên quan