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 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
|
else
{
vDiskPos += FILE_BUFFER;
//not first read so switch buffers if done
dwError = GetLastError();
bResult = GetOverlappedResult(hfile,
&stOverlapped,
&byteRead,
FALSE) ;
if (!bResult)
{
switch (dwError = GetLastError())
{
case ERROR_HANDLE_EOF:
{
// Handle an end of file
return 0;
break;
}
case ERROR_IO_INCOMPLETE:
{
// Operation is still pending, allow while loop
// to loop again after printing a little progress.
do
{
bResult = GetOverlappedResult(hfile,
&stOverlapped,
&byteRead,
FALSE) ;
if (!bResult)
{
Sleep(15);
}
check++;
}while ((!bResult) && (check < 300));
if (check == 300)
{
dwError = GetLastError();
printf("Error occured reading disk before end of disk, error: %d\n",dwError);
return 0;
}
byteRead -= 200;
_UpdateOffset(&stOverlapped, byteRead);
break;
}
default:
{
//an error occured
return 0;
}
}
}
//all good now switch buffers
std::swap(fileBuffer, fileBufferNext);
//start next read
byteRead -= 200;
_UpdateOffset(&stOverlapped, byteRead);
ReadFile(hfile, fileBufferNext, FILE_BUFFER, &byteRead, &stOverlapped);
return 1;
}
void _UpdateOffset(OVERLAPPED* inPtr, __int64 inOffset) {
__int64 tempOffset;
tempOffset = inPtr->OffsetHigh;
tempOffset <<= 32;
tempOffset |= inPtr->Offset;
tempOffset += inOffset;
inPtr->Offset = (DWORD)(tempOffset & 0x00000000FFFFFFFFULL);
inPtr->OffsetHigh = (DWORD)(tempOffset >> 32ULL);
}
|