2012-07-29 20 views

Trả lời

7

Viết trình điều khiển thiết bị để giả vờ là một.

Cụ thể, các trình điều khiển thiết bị Windows xử lý những gì được gọi là Yêu cầu gián đoạn thông qua Giao thức yêu cầu gián đoạn - kết nối với cấu trúc được bao bọc và bộ đệm trong trình điều khiển.

Bây giờ, điều tiếp theo bạn cần biết là nhiều trình điều khiển thực sự được xếp lớp hoặc xếp chồng lên nhau hoặc bất kỳ tên nào bạn muốn sử dụng. Vì vậy, ví dụ để viết một trình điều khiển đĩa, bạn có thể giao diện với trình điều khiển bên trên nó (như một lớp đĩa) nhưng sử dụng một trình điều khiển bên dưới nó (ví dụ cổng scsi) để gửi các lệnh tới thiết bị của bạn.

Đó là cách thiết bị thực hoạt động. Thiết bị giả cần phải tuân thủ các yêu cầu giao diện cấp cao nhất, ví dụ: một đĩa, hoặc một bộ điều khiển, hoặc một con chuột, hoặc bất cứ thứ gì. Tuy nhiên, bên dưới họ có thể làm bất cứ điều gì họ thích - trả lại bất cứ giá trị nào họ thích.

Điều này mở ra khả năng kiểm soát trình điều khiển thông qua ứng dụng chế độ người dùng và giả vờ là "là" một thiết bị. Để gửi tin nhắn trình điều khiển, bạn có thể DeviceIoControl cho nó; để thực sự nhận được những tin nhắn đó, bạn có thể:

  • Nhét chúng vào trong IRp tạo nên DeviceIoControl.
  • Yêu cầu trình điều khiển đọc chúng ra khỏi không gian bộ nhớ của quy trình của bạn.

Trình điều khiển cũng có thể truy cập \\Registry\\Machine và các khu vực đăng ký không dành cho người khám phá không phải người dùng cụ thể khác, để có thể giao tiếp theo cách đó.

Cuối cùng, không có gì nói rằng bạn không thể lọc IO hiện có, thay vì làm cho nó tất cả thông qua một thiết bị mới. Có rất nhiều tùy chọn và cách bạn có thể thực hiện.

Nếu bạn đang đi để làm điều này, bạn sẽ cần:

  • VirtualKD hoặc cáp debugger tốn kém và hai máy tính.
  • Bạn cũng có thể muốn bắt đầu với các tham chiếu trên this blog post. Bạn sẽ thấy rằng về cơ bản có một bazillion tên gọi khác nhau cho mã tài xế, vì vậy tôi sẽ giải thích một số trong số họ:

    • WDM = Windows Mẫu Driver, về cơ bản mô hình điều khiển NT trộn với (một số) Windows 9x .
    • KMDF = Khung điều khiển chế độ hạt nhân - trình điều khiển của loại trên sử dụng điều này, cộng với WDF bổ sung (Windows Driver Foundation) là tập hợp các thư viện trên đầu trang của WDM để sử dụng nhanh hơn.
    • UMDF = Khung điều khiển chế độ người dùng - viết trình điều khiển mà không gặp nguy hiểm về chế độ hạt nhân. Nếu bạn có thể, sử dụng này, như trình điều khiển chế độ hạt nhân mà đi sai sẽ bluescreen (trong trình điều khiển parlance, bugcheck) hệ thống của bạn.

Sửa: Tôi không ồ ạt am hiểu về DirectInput - có thể là một cách để ghi đè lên các điều khiển API khác nhau được sử dụng thông qua chuyển hướng DLL và những thứ tương tự, có thể đơn giản hơn cách tôi đã được mô tả.

+0

Cảm ơn bạn đã giới thiệu cho người lái xe! Ý định thực sự của tôi là sửa chữa hỗ trợ DirectInput của bộ điều khiển 360. Hiện tại, bạn có thể sử dụng nó với DI nhưng có giới hạn; không thể giải quyết các trình kích hoạt riêng biệt, không thể sử dụng trình kích hoạt làm nút (vì vậy nó sẽ không hoạt động với bất kỳ thứ gì mong đợi bốn nút vai), và không rung [...] – Dataflashsabot

+0

[...] ation. Bản chỉnh sửa của bạn là ý định ban đầu của tôi; nhưng DI không sử dụng các hàm truyền thống được liên kết, thay vì chỉ liên kết DirectInputCreate, nó trả về một cấu trúc với các con trỏ hàm, và nó cũng có vẻ cung cấp các giao diện khác nhau cho C và C++. Điều đó khiến tôi rời khỏi tuyến đường đó, nhưng một tài xế giả mạo thậm chí còn khó hơn, vì vậy tôi nghĩ tôi sẽ thử một lần nữa. (Trước khi bất cứ ai đề nghị XBCD, nó phá vỡ hỗ trợ xin chào bản địa.) – Dataflashsabot

4

Giải pháp dễ nhất có thể là mô phỏng thiết bị XInput (Xbox 360 và One). Đây là những hỗ trợ trong hầu hết các trò chơi hiện đại và thiết lập là rất đơn giản. Đây là một dự án C++ ở đây cung cấp điều này mà không cần bất kỳ trình điều khiển nào được cài đặt hoặc phụ thuộc bên ngoài: https://github.com/shauleiz/vXboxInterface/

+0

Điều đó không đúng. Bạn phải cài đặt ScpVBus trên hệ thống của bạn để sử dụng API này cho các tương tác gamepad ảo. Chỉ cần nhìn vào [chú thích phát hành] này (https://github.com/shauleiz/vXboxInterface/releases/tag/v1.0.0). – grill2010

0

Tôi biết đó là một câu hỏi cũ nhưng đối với bất kỳ ai quan tâm đến chủ đề này, nó cũng đáng xem dự án này gọi là ViGEm.

Bạn có thể mô phỏng một số gamepad nổi tiếng như Bộ điều khiển Xbox 360 của Microsoft, Bộ điều khiển Sony DualShock 4 và Bộ điều khiển Microsoft Xbox One. Dự án cũng cung cấp một số API để tương tác với các bộ điều khiển ảo này.

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