Appel de VirtualProtect sur un fichier mappé

J’utilise les fonctions CreateFileMapping et MapViewOfFile pour mapper un fichier en mémoire. Après un certain temps, j’appelle VirtualProtect pour changer sa protection contre la lecture seule pour lire et écrire. Cet appel échoue et GetLastError donne ERROR_INVALID_PARAMETER.

Voici une version simplifiée de mon code qui illustre le problème.

#include  #include  #include  int main() { HANDLE fd, md; char *addr; DWORD old; BOOL ok; fd = CreateFile("filename", GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); md = CreateFileMapping(fd, NULL, PAGE_READWRITE, 0, 100, NULL); addr = MapViewOfFile(md, FILE_MAP_READ, 0, 0, 100); ok = VirtualProtect(addr, 100, PAGE_READWRITE, &old); if (!ok) { // we fall into this if block DWORD err = GetLastError(); // this outputs "error protecting: 87" printf("error protecting: %u\n", err); return 1; } UnmapViewOfFile(addr); CloseHandle(md); CloseHandle(fd); return 0; } 

Que fais-je mal ici? Est-ce que je n’ai pas le droit d’appeler VirtualProtect sur une région contenant un fichier mappé?

Commencez par créer la vue avec FILE_MAP_READ | FILE_MAP_WRITE et protéger avec PAGE_READONLY. Maintenant, vous n’avez aucun problème à le faire plus tard avec PAGE_READWRITE:

 addr = MapViewOfFile(md, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 100); ok = VirtualProtect(addr, 100, PAGE_READONLY, &old); //... ok = VirtualProtect(addr, 100, PAGE_READWRITE, &old); 

Qu’est-ce qui se passe dans votre code est que VirtualProtectEx (appelé par votre VirtualProtect ) échoue avec l’erreur STATUS_SECTION_PROTECTION (0xC000004E) – “Une vue d’une section spécifie une protection incompatible avec la protection de la vue initiale” et cela semble être ce que vous en effet en créant une vue en coupe avec une protection plus ressortingctive (FILE_MAP_READ).

Ce sujet ne semble pas être documenté avec suffisamment de détails, alors je pense que vous feriez mieux de simplement suivre les suggestions de Hans.

Selon http://msdn.microsoft.com/en-us/library/aa366556(v=vs.85).aspx, cela devrait être légal. Selon la documentation VirtualProtect, les nouveaux indicateurs doivent être compatibles avec les indicateurs “VirtualAlloc” – si ce transfert vers les indicateurs “MapViewOfFile”, je pense que vous pouvez resserrer mais pas desserrer la protection. Essayez de mapper readwrite et de changer la protection en lecture seule.