Il y a quelques explications dans la documentation du ReadFile(), http://msdn.microsoft.com/en-us/li [...] S.85).aspx
Il y aurait deux solutions : 1. soit en mode synchrone, 2. soit en mode asynchrone (ouverture du fichier avec FILE_FLAG_OVERLAPPED).
Dans les deux cas, pour chaque ReadFile(), il faudrait se créer son propre timer, avec SetTimer() ou avec time_before_read = GetTickCount();... while (time_before_read + quelques_diziemes < GetTickCount())
Si le temps est dépassé et que la lecture n'a pas renvoyé quelque chose de satisfaisant, il faudrait faire CancelSynchronousIo() si on est en mode synchrone, ou faire CancelIo() en mode asynchrone.
La solution en mode synchrone nécessiterait l'utilisation d'une thread, et donc j'opterais plutôt pour le mode asynchrone.