Всем привет.
Ситуация такая
1)Открываем файл, с флагами FILE_FLAG_OVERLAPPED и FILE_FLAG_NO_BUFFERING.
2)Читаем из файла первый блок
3)Читаем из файла второй блок
4)Смотрим результаты оверлапеда, по первому блоку = ОК
5)Смотрим результаты оверлапеда, по второму блоку = ОК, но GetOverlappedResult в переменной "кол-во" прочитанных байт возвращает 0.
Но когда трассировать или делая задержки между пунктами 2 и 3, то всё работает. В чём проблема подскажите плиз

.
Ниже функция, которая это показывает.
Платформа Win 2000
Размер кластера 512
Размер читаемого файла 2 694 215
вроде всё ровно.
P.S. Похоже что винда не позволяет делать два оверлапеда на одном хендле. Кто чем может помогите
void Test(TCHAR *sFileName)
{
OVERLAPPED ov1;
OVERLAPPED ov2;
DWORD bytes1;
DWORD bytes2;
BYTE b1[0x10000];
BYTE b2[0x10000];
bool lock1 = false;
bool lock2 = false;
memset(&ov1, 0, sizeof(ov1));
memset(&ov2, 0, sizeof(ov2));
ov2.Offset = sizeof(b1);
HANDLE hFile = ::CreateFile(sFileName,
GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE,
0,
OPEN_EXISTING,
0
| FILE_FLAG_OVERLAPPED
| FILE_FLAG_NO_BUFFERING,
0);
if(hFile == INVALID_HANDLE_VALUE)
return ;
//чтение первого буфера
if(!::ReadFile(hFile,
b1,
sizeof(b1),
&bytes1,
&ov1))
{
if(::GetLastError() != ERROR_IO_PENDING)
{
::MessageBox(0, "ERROR", "ERROR", 0);
}
lock1 = true;
}
//чтение второго буфера
if(!::ReadFile(hFile,
b2,
sizeof(b2),
&bytes2,
&ov2))
{
if(::GetLastError() != ERROR_IO_PENDING)
{
::MessageBox(0, "ERROR", "ERROR", 0);
return;
}
lock2 = true;
}
if(lock1)
{
if(!::GetOverlappedResult(hFile,
&ov1,
&bytes1,
TRUE))
::MessageBox(0, "GetOverlappedResult1", "ERROR", 0);
}
if(lock2)
{
if(!::GetOverlappedResult(hFile,
&ov2,
&bytes2,
TRUE))
::MessageBox(0, "GetOverlappedResult2", "ERROR", 0);
}
if(!bytes1)
{
::MessageBox(0, "KOSYK bytes1 == 0", "ERROR", 0);
}
if(!bytes2)
{
::MessageBox(0, "KOSYK bytes2 == 0", "ERROR", 0);
}
::CloseHandle(hFile);
}
вылетает сообщение "KOSYK bytes2 == 0"