SetFilePointer sans FILE_FLAG_NO_BUFFERING

Considérez ce programme:

#include  #include  int main(int argc, char** argv) { if (argc != 2) return 1; HANDLE j = CreateFile("\\\\.\\F:", FILE_GENERIC_READ, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_SYSTEM, NULL); int k = SetFilePointer(j, atoi(argv[1]), NULL, FILE_BEGIN); printf("%d\n", k); } 

J’obtiens ces résultats:

 > a 512 512 > a 513 -1 > a 1024 1024 

Je ne peux donc déplacer le pointeur de fichier que par multiples de la taille du secteur de volume. C’est le comportement attendu avec l’indicateur FILE_FLAG_NO_BUFFERING . Cependant, je n’utilise pas ce drapeau, alors pourquoi ai-je ces résultats?

Vous avez ouvert l’ access direct à un volume de lecteur au lieu d’un fichier. Les lectures / écritures d’un volume doivent correspondre à des multiples pairs de la taille du secteur, quelle que soit la mise en mémoire tampon. Vous ne pouvez pas lire / écrire des secteurs partiels.

De la documentation pour CreateFile:

Un volume contient un ou plusieurs systèmes de fichiers montés. Les descripteurs de volume peuvent être ouverts en tant que non mis en cache à la discrétion du système de fichiers particulier, même lorsque l’option non en cache n’est pas spécifiée dans CreateFile. Vous devez supposer que tous les systèmes de fichiers Microsoft ouvrent des poignées de volume non mises en cache. Les ressortingctions sur les E / S non mises en cache pour les fichiers s’appliquent également aux volumes.