Кажется, что я недавно обнаружил большую жирную ошибку в 64-битной версии Windows 7. Странно то, что я ничего не могу найти в Google или MSDN. Кажется невозможным, что я первым обнаружил ошибку в API, столь важную как WriteFileEx
в операционной системе, которая существует на рынке с давних времен?!?!?!?WriteFileEx - CompletionRoutine: Это ошибка в Windows 7 - 64 бит?
Но мой код слишком прост, чтобы быть неправдой.
Кроме того мой код работает отлично на: Windows XP Prof 32 Bit, Windows Vista Ultimate 32 Bit, Windows 7 Ultimate 32 Bit, и он даже работает на Windows 7 Ultimate 64 бит, если скомпилирован как 64-Bit ,
Единственный сбой произошел в Windows 7 - 64 бит, если скомпилирован как 32 бит.
Что происходит, так это то, что файл правильно записан на диск, вызывается процедура завершения, но процедура завершения сообщает, что были записаны нулевые байты, и самое странное, что структура OVERLAPPED
имеет неправильный адрес и недопустимый контент !!
Не могли бы вы подтвердить, что это ошибка?
void WINAPI CompletionRoutine(DWORD u32_ErrorCode, DWORD u32_BytesTransfered,
OVERLAPPED* pk_Overlapped)
{
printf("CompletionRoutine: Transferred: %d Bytes, AddrOverlapped: 0x%X\n",
u32_BytesTransfered, (DWORD_PTR)pk_Overlapped);
}
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
printf("Compiled as: %d Bit\n", sizeof(DWORD_PTR) == 8 ? 64 : 32);
HANDLE h_File = CreateFileW(L"E:\\Temp\\Test.txt", GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE, 0,
CREATE_ALWAYS, 0, 0);
OVERLAPPED k_Over = {0};
printf("Before WriteFileEx AddrOverlapped: 0x%X\n", (DWORD_PTR)&k_Over);
WriteFileEx(h_File, "ABCDEF", 6, &k_Over, CompletionRoutine);
printf("Before SleepEx\n");
SleepEx(1000, TRUE);
printf("Exit\n");
return 0;
}
Вот результаты:
Пожалуйста, не делать «клянчить ошибки», особенно в названиях. Этот вопрос будет получен более благоприятно, если просто укажет на наблюдаемое поведение - без дополнительных комментариев. – user2864740
ОК Я изменил название. Ты сейчас счастлив ? – Elmue
Вы не указали 'FILE_FLAG_OVERLAPPED'. Из документов: 'Если этот флаг не указан, операции ввода/вывода сериализуются, даже если вызовы функций чтения и записи указывают структуру OVERLAPPED.' –