(args: ReadFileArgs, vm: &VirtualMachine)
| 1394 | /// ReadFile - Read data from a file or I/O device. |
| 1395 | #[pyfunction] |
| 1396 | fn ReadFile(args: ReadFileArgs, vm: &VirtualMachine) -> PyResult<PyObjectRef> { |
| 1397 | use windows_sys::Win32::Storage::FileSystem::ReadFile as WinReadFile; |
| 1398 | |
| 1399 | let handle = args.handle; |
| 1400 | let size = args.size; |
| 1401 | let use_overlapped = args.overlapped; |
| 1402 | |
| 1403 | if use_overlapped { |
| 1404 | use windows_sys::Win32::Foundation::ERROR_IO_PENDING; |
| 1405 | |
| 1406 | let ov = Overlapped::new_with_handle(handle.0); |
| 1407 | let err = { |
| 1408 | let mut inner = ov.inner.lock(); |
| 1409 | inner.read_buffer = Some(vec![0u8; size as usize]); |
| 1410 | let read_buf = inner.read_buffer.as_mut().unwrap(); |
| 1411 | let mut nread: u32 = 0; |
| 1412 | let ret = unsafe { |
| 1413 | WinReadFile( |
| 1414 | handle.0, |
| 1415 | read_buf.as_mut_ptr() as *mut _, |
| 1416 | size, |
| 1417 | &mut nread, |
| 1418 | &mut *inner.overlapped, |
| 1419 | ) |
| 1420 | }; |
| 1421 | |
| 1422 | let err = if ret == 0 { |
| 1423 | unsafe { windows_sys::Win32::Foundation::GetLastError() } |
| 1424 | } else { |
| 1425 | 0 |
| 1426 | }; |
| 1427 | |
| 1428 | if ret == 0 && err != ERROR_IO_PENDING && err != ERROR_MORE_DATA { |
| 1429 | return Err(vm.new_last_os_error()); |
| 1430 | } |
| 1431 | if ret == 0 && err == ERROR_IO_PENDING { |
| 1432 | inner.pending = true; |
| 1433 | } |
| 1434 | |
| 1435 | err |
| 1436 | }; |
| 1437 | let result = vm |
| 1438 | .ctx |
| 1439 | .new_tuple(vec![ov.into_pyobject(vm), vm.ctx.new_int(err).into()]); |
| 1440 | return Ok(result.into()); |
| 1441 | } |
| 1442 | |
| 1443 | let mut buf = vec![0u8; size as usize]; |
| 1444 | let mut nread: u32 = 0; |
| 1445 | let ret = unsafe { |
| 1446 | WinReadFile( |
| 1447 | handle.0, |
| 1448 | buf.as_mut_ptr() as *mut _, |
| 1449 | size, |
| 1450 | &mut nread, |
| 1451 | null_mut(), |
| 1452 | ) |
| 1453 | }; |
no test coverage detected