ReadProcessMemory échoue toujours avec GLE: 299
-
28-10-2019 - |
Question
Quelqu'un pourrait-il m'aider s'il vous plaît, je ne sais pas pourquoi la fonction ReadProcessMemory échoue et GetLastError= 299. Voici mon code, je ne vois pas que je fais quelque chose de mal.
if(ReadProcessMemory(hProcess, (void*)0, IDH_Buffer, sizeof(IMAGE_DOS_HEADER), 0) != true)
std::cout << "Failed to read from Process, GLE=" << GetLastError() << "\n";
IDH_Buffer a été attribué, hProcess est non NULL
Mon application s'exécute en tant qu'administrateur et l'application que j'essaie de lire est une application en mode utilisateur standard.
Pouvez-vous me conseiller. Merci
La solution
Citations de MSDN sur les codes d'erreur Win32 :
ERROR_PARTIAL_COPY
299 (0x12B)
Seule une partie d'une demande ReadProcessMemory ou WriteProcessMemory a été exécutée.
Je suppose que l'adresse que vous avez spécifiée contenait des données valides, mais quelque part entre cette adresse et (adresse + longueur de la copie), il n'y avait pas de mémoire mappée.
Voir wikipedia sur le tableau des pages ou mémoire virtuelle pour comprendre un peu plus comment un système d'exploitation établit un espace d'adressage. Dans ce langage, quelque part dans cette plage de mémoire, il y avait une entrée de table de page qui n'était pas valide.
En fait, en regardant votre code ... Il est évident que cela ne fonctionnera pas. Le paramètre BaseAddress
est zéro. Vous essayez de déréférencer un pointeur NULL dans l'espace d'adressage de l'autre processus. Si le processus cible lui-même essayait d'extraire cela, il planterait. :-) L'en-tête de l'EXE n'est pas mappé à l'adresse 0. Si vous essayez de lire à partir du fichier EXE lui-même, je suggérerais simplement d'appeler CreateFile
sur un chemin obtenu par GetModuleFileNameEx
.