См. Этот фрагмент кода из этого файла на собственном Git от Microsoft:
// sync read. works in stopped state as well as run state.
// need not be aligned. Will fail if read is beyond actual total
// length.
STDMETHODIMP SyncRead(
LONGLONG llPosition, // absolute file position
LONG lLength, // nr bytes required
BYTE* pBuffer); // write data here
// return total length of stream, and currently available length.
// reads for beyond the available length but within the total length will
// normally succeed but may block for a long period.
STDMETHODIMP Length(
LONGLONG* pTotal,
LONGLONG* pAvailable);
В соответствии с этими двумя задокументированными декларациями, я думаю, довольно безопасно вывести количество байтов, прочитанное следующим образом. Скажем, вы хотите прочитать 70 байтов из позиции 800:
LONGLONG total, available;
pReader->Length(&total, &available);
LONG bytesRead = 70;
LONGLONG position = 800;
if (S_FALSE == readerPtr->SyncRead(800, bytesRead, bufferPtr))
bytesRead = total - position;
Если произойдет сбой, то число байтов, которые он мог прочитать, ограничено только общим размером.