#include #include "WinDiskReader.h" #include "kernelmisc.h" #include // for SG_REQ #include "debug.h" #ifdef WITHDEBUG #define wdiskdebug debug #else #define wdiskdebug while(0) #endif //............................... bool Disk_ReadSectors(HANDLE hDisk, ULONGLONG llOffset, DWORD dwLength, BYTE *buffer, DWORD &dwBytesRead, DWORD dwSectorSize) { SG_REQ req; req.sr_start= (DWORD)(llOffset/dwSectorSize); req.sr_num_sec= dwLength/dwSectorSize; req.sr_num_sg= 1; req.sr_status= 0; req.sr_callback= NULL; req.sr_sglist[0].sb_len= dwLength; req.sr_sglist[0].sb_buf= globalptr(const_cast(buffer)); wdiskdebug("disk_readsectors: reading %I64x %08lx ss=%08lx\n", llOffset, dwLength, dwSectorSize); DWORD nReturned=0; if (!DeviceIoControl(hDisk, DISK_IOCTL_READ, &req, sizeof(req), NULL, NULL, &nReturned, NULL)) { error("DISK_IOCTL_READ(%08lx, %I64x, %x)", hDisk, llOffset, dwLength); return false; } dwBytesRead= req.sr_sglist[0].sb_len; wdiskdebug("disk_readsectors: read %08lx\n", dwBytesRead); return true; } //............................... bool Disk_WriteSectors(HANDLE hDisk, ULONGLONG llOffset, DWORD dwLength, const BYTE *buffer, DWORD &dwBytesWritten, DWORD dwSectorSize) { SG_REQ req; req.sr_start= (DWORD)(llOffset/dwSectorSize); req.sr_num_sec= dwLength/dwSectorSize; req.sr_num_sg= 1; req.sr_status= 0; req.sr_callback= NULL; req.sr_sglist[0].sb_len= dwLength; req.sr_sglist[0].sb_buf= globalptr(const_cast(buffer)); wdiskdebug("disk_writesectors: writing %I64x %08lx ss=%08lx\n", llOffset, dwLength, dwSectorSize); DWORD nReturned=0; if (!DeviceIoControl(hDisk, DISK_IOCTL_WRITE, &req, sizeof(req), NULL, NULL, &nReturned, NULL)) { error("DISK_IOCTL_WRITE(%08lx, %I64x, %x)", hDisk, llOffset, dwLength); return false; } dwBytesWritten= req.sr_sglist[0].sb_len; wdiskdebug("disk_writesectors: wrote %08lx\n", dwBytesWritten); return true; }