diff --git a/src/main.rs b/src/main.rs index 116a66c..4ee1be9 100644 --- a/src/main.rs +++ b/src/main.rs @@ -103,7 +103,7 @@ fn main() -> Result<()> { return list_devices(&args.transport); } - let payload = gnerate_payload(&mut args)?; + let payload = generate_payload(&mut args)?; write_payload(&args.transport, payload) } @@ -129,7 +129,7 @@ fn list_devices(transport: &TransportProtocol) -> Result<()> { Ok(()) } -fn gnerate_payload(args: &mut Args) -> Result { +fn generate_payload(args: &mut Args) -> Result { let config_path = args.config.take().unwrap_or_default(); let config = fs::read_to_string(&config_path) .with_context(|| format!("load config: {config_path:?}"))?; diff --git a/src/usb_hid.rs b/src/usb_hid.rs index d9324c1..3622ff4 100644 --- a/src/usb_hid.rs +++ b/src/usb_hid.rs @@ -98,13 +98,43 @@ fn write_raw(device: &HidDevice, data: &[u8]) -> Result<()> { // just to be sure assert!(data.len() <= 8192); - let n = device.write(data).context("write payload")?; + let mut written: usize = 0; + + #[cfg(windows)] + { + written = 0; + + while written < data.len() { + let new_data: &[u8] = &prepend_byte_and_offset(data, written); + let n = device.write(new_data).context("write payload")?; + written = written + n - 1; + } + } + + #[cfg(not(windows))] + { + written = device.write(data).context("write payload")?; + } anyhow::ensure!( - n == data.len(), - "incomplete write: {n} of {} bytes", + written == data.len(), + "incomplete write: {written} of {} bytes", data.len() ); Ok(()) } + +fn prepend_byte_and_offset(data: &[u8], offset: usize) -> [u8; 65] { + let mut result: [u8; 65] = [0u8; 65]; + result[1] = 0x0; + if offset > data.len() { + return result; + } + if data.len() - offset < 64 { + result[1..].copy_from_slice(&data[offset..]); + } else { + result[1..].copy_from_slice(&data[offset..offset + 64]); + } + result +}