2016-09-12 2 views
-1

Je ne parviens pas à écrire dans un bloc de mémoire virtuelle bien qu'il soit marqué comme PAGE_READWRITE. Ceci est l'exception levée lors de l'exécution:C++ Impossible d'écrire dans la mémoire virtuelle bien qu'elle soit marquée comme étant en lecture et écriture

Exception thrown at 0x722E4AE9 (vcruntime140d.dll) in ConsoleApplication.exe: 0xC0000005: Access violation writing location 0x00000000. 

Voici le code:

#include <iostream> 
#include <windows.h> 

int main() { 
    char* memblock; 

    memblock = new char[8] { 0, 1, 2, 3, 4, 5, 6, 7 }; 

    LPVOID virtual_memory_area = VirtualAlloc(NULL, 8, MEM_PHYSICAL, PAGE_READWRITE); 
    memcpy(virtual_memory_area, memblock, 8); 
} 
+4

La documentation indique que lorsqu'une erreur se produit, VirtualAlloc renvoie null et définit une erreur. Peut-être que celui-ci vous y aide. – Hayt

+1

Tenez compte de ce que dit Hayt. Je doute sincèrement que l'emplacement 0x00000000 soit en lecture-écriture sur votre système. –

Répondre

3

Le paramètre flAllocationType de VirtualAlloc doit avoir l'un des MEM_COMMIT, MEM_RESERVE, MEM_RESET ou MEM_RESET_UNDO. Le MEM_PHYSICAL est un indicateur facultatif pour flAllocationType.

Vous avez seulement MEM_PHYSICAL, d'où VirtualAlloc échoue.

1

Si vous regardez l'erreur, vous essayez d'écrire à un pointeur NULL donc l'exception. La raison en est que VirtualAlloc a échoué et a renvoyé null.