Cool, dass du dich auch gerade mit so etwas beschäftigst.
Nur um ein wenig zu helfen
Overlapped, habe da mal nachgelesen bei
MSDN, vergiss es, asynchroner Zugriff um 512 Byte zu lesen ist mehr als Überflüssig und Deine Structure ist falsch, es muss eine seperate Structure sein die vorher genull wird, über den Offset könnte man dann hin und her wandeln, aber bedenke was wir hier machen, wir greifen lesend auf die Festplatte zu, das bedeutet, Zugtriffe sollten/müßten so kurz und gering wie möglich sein da Festplatten die Angewohnheit haben immer mal was Schreiben zu wollen.
(File)Seek/(File)Position o.ä. werde ich benutzen um tiefere Blöcke auszulesen zu können, das solltest Du auch tun.