Close

Trying Rust

A project log for USBShare.exe

Replacing unknown exe with opensource

stephengeorgeweststephengeorgewest 09/20/2021 at 04:020 Comments
extern crate hidapi;

use hidapi::HidApi;

fn main() {
  let mut found = false;
  match HidApi::new() {
    Ok(api) => {
      for device in api.device_list() {
        if device.vendor_id() == 0x1a86 && device.product_id() == 0xe041 {
          found = true;
          println!(
            "{:04x}:{:04x}, {:?}",
            device.vendor_id(), device.product_id(), device.serial_number()
          );
          
          match device.open_device(&api){
            Ok(hid_device) => {
              let data = [0x00, 0x55, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00];
              match hid_device.write(&data) {
                Ok(result) => {
                  eprintln!("write: {}", result);
                },
                Err(e) => {
                  eprintln!("write Error: {}", e);
                }
              }
            },
            Err(e) => {
              eprintln!("Open Error: {}", e);
            }
          }
        }
      }
    },
    Err(e) => {
      eprintln!("HIDApi Error: {}", e);
    },
  }
  if !found {
    println!("No device found");
  }
}
PS C:\Users\Stephen\Documents\GitHub\USBSwitch\Rust> cargo build
    Finished dev [unoptimized + debuginfo] target(s) in 0.02s
PS C:\Users\Stephen\Documents\GitHub\USBSwitch\Rust> .\target\debug\usbshare.exe
No device found
PS C:\Users\Stephen\Documents\GitHub\USBSwitch\Rust> .\target\debug\usbshare.exe
1a86:e041, None
write: 9

That was surprisingly not hard. Sometimes the write fails, but it still switches, I think it switches before/while sending the ACK.

Trying linux.

stephen@AO751h:~/Documents/usbshare/usbshare$ cargo build
   Compiling usbshare v0.1.0 (/home/stephen/Documents/usbshare/usbshare)
    Finished dev [unoptimized + debuginfo] target(s) in 3.07s
stephen@AO751h:~/Documents/usbshare/usbshare$ ./target/debug/usbshare
1a86:e041, None
Open Error: Failed opening hid device
stephen@AO751h:~/Documents/usbshare/usbshare$ ls -alh /dev/hidraw0
crw-rw-r-- 1 root plugdev 243, 0 Sep 19 21:17 /dev/hidraw0
stephen@AO751h:~/Documents/usbshare/usbshare$ sudo ./target/debug/usbshare                                                                                                                                                                                                                              
[sudo] password for stephen:             
1a86:e041, None
write Error: hidapi error: hid_error is not implemented yet

 Sudo works.

Oh, udev again, Rust HID is using "0002:0003:00" instead of "/dev/hidraw#". New udev rules:

#works for pyusb control access, and rust hid
SUBSYSTEM=="usb",  ATTR{idVendor}=="1a86", ATTR{idProduct}=="e041", MODE="0664", GROUP="plugdev"

#works or chrome WebHID
KERNEL=="hidraw*", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="e041", MODE="0664", GROUP="plugdev"
stephen@AO751h:~/Documents/usbshare/usbshare$ sudo nano /etc/udev/rules.d/99-hid.rules
stephen@AO751h:~/Documents/usbshare/usbshare$ ./target/debug/usbshare
1a86:e041, None, "0002:0007:00"
Open Error: Failed opening hid device
stephen@AO751h:~/Documents/usbshare/usbshare$ sudo udevadm control --reload-rules
stephen@AO751h:~/Documents/usbshare/usbshare$ sudo udevadm trigger
stephen@AO751h:~/Documents/usbshare/usbshare$ ./target/debug/usbshare
1a86:e041, None, "0002:0007:00"
write Error: hidapi error: hid_error is not implemented yet

Success.

Discussions