Im Code von CreateFileW wird vor dem Aufruf von NtCreateFile der "
Access" Parameter mit 0x00100080 ge-OR-t. Das wäre also NtCreateFile(
Access or (SYNCHRONIZE or FILE_READ_ATTRIBUTES), ...).
...
0 hat also die gleiche Bedeutung wie "SYNCHRONIZE or FILE_READ_ATTRIBUTES".
Das war jetzt erstmal eine Kopfnuss, diese Bitmasken zu sortieren und gedanklich für OR übereinander zu stellen. Aber tatsächlich geht CreateFile mit 0 oder FILE_READ_ATTRIBUTES durch, auch wenn die Datei durch eine vorherige Öffnung mit
GENERIC_READ or GENERIC_WRITE, 0,
komplett blockiert ist. Im Gegenzug kann man den Parameter
dwShareMode auf 0 setzen, da er bei FILE_READ_ATTRIBUTES ignoriert wird, also
hFind := CreateFile(PChar(Dateiname), FILE_READ_ATTRIBUTES, 0, nil,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
Mir erscheint dann ein
FILE_READ_ATTRIBUTES
anschaulicher, da hast du recht.
Mir fällt übrigens noch ein, dass ich einen Leer-Aufruf von
GetFileInformationByHandle auch nach
CreateHardLinkW benutze, da laut Doku dann die Dateiinformationen aktualisiert werden.