1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
|
int DiskIO::write(void *buff,uint32_t buffer_size)
{
DWORD dwWritten=0;
if(buffer_size%disk_geometry.bps==0)
{
if(!WriteFile(hDisk,buff,buffer_size,&dwWritten,0) || dwWritten!=buffer_size)
return ERR_WRITE;
}
else
{
DWORD dwRead;
// create a new buffer where buffer_size%bytes_per_sector==0
unsigned size_new=disk_geometry.bps*( (buffer_size/disk_geometry.bps)+1 );
uint8_t *buff_new=new uint8_t[size_new];
LARGE_INTEGER seek_pos={0};
LARGE_INTEGER tmp={0};
SetFilePointerEx(hDisk,tmp,&seek_pos,FILE_CURRENT);
if(!ReadFile(hDisk,buff_new,size_new,&dwRead,0) || dwRead!=size_new)
{
delete[] buff_new;
return ERR_READ;
}
memcpy(buff_new+seek_pos.QuadPart%disk_geometry.bps,buff,buffer_size);
SetFilePointerEx(hDisk,seek_pos,0,FILE_BEGIN);
if(!WriteFile(hDisk,buff_new,size_new,&dwWritten,0) || dwWritten!=size_new)
{
delete[] buff_new;
return ERR_WRITE;
}
delete[] buff_new;
}
return 0;
}
|