2009-04-20 5 views
2

Salutations,Est-il possible de déterminer quel type de mémoire les segments renvoyés par VirtualQuery() sont?

Je suis capable de marcher sur une carte mémoire de processus en utilisant la logique comme ceci:

MEMORY_BASIC_INFORMATION mbi; 
    void *lpAddress=(void*)0; 
    while (VirtualQuery(lpAddress,&mbi,sizeof(mbi))) { 
     fprintf(fptr,"Mem    base:%-10x start:%-10x Size:%-10x Type:%-10x State:%-10x\n", 
      mbi.AllocationBase, 
      mbi.BaseAddress, 
      mbi.RegionSize, 
      mbi.Type,mbi.State); 
     lpAddress=(void *)((unsigned int)mbi.BaseAddress + (unsigned int)mbi.RegionSize); 
    } 

je voudrais savoir si un segment donné est utilisé pour l'allocation statique, pile et/ou tas et/ou autre?

Y at-il un moyen de déterminer cela?

Répondre

0

Je suis curieux, que comptez-vous faire avec cette information?

Il existe une extension, adresse, qui peut vous fournir cette information, si vous n'avez pas besoin de code pour le faire. Scripting le débogueur sera probablement beaucoup plus fiable pour obtenir cette information.

VirtualQuery ne peut pas vous renvoyer cette information, car il n'a aucune idée de la raison pour laquelle le code du mode utilisateur a demandé la mémoire. Vous devez l'utiliser avec d'autres sources d'informations pour obtenir cette information, et il peut encore y avoir quelques cas d'erreur. D'abord, vous devriez filtrer seulement par la mémoire de MEM_PRIVATE. . . Les allocations de tas, de pile et statiques (à condition qu'elles aient été modifiées) doivent se situer dans cette plage.

Les allocations statiques (globales, etc.) doivent être à une adresse avec un module chargé. Vous pouvez utiliser PSAPI pour déterminer si l'adresse se trouve dans un module chargé, par exemple, en appelant EnumProcessModules puis GetModuleInformation.

Les valeurs de pile, vous pouvez utiliser l'API toolhelp pour déterminer si l'emplacement de mémoire est dans une pile. CreateToolhelp32Snapshot avec TH32CS_SNAPSHOT pour obtenir des threads dans le processus cible, puis GetThreadContext et vérifiez si le pointeur de pile résultant est dans le segment. Je ne connais pas un bon moyen de marcher des tas de l'extérieur du processus. Toolhelp capture une liste de tas, mais ne vous donne pas un bon ensemble de limites pour la mémoire de tas. À partir de ce processus, vous pouvez utiliser GetProcessHeaps pour parcourir la liste des segments, puis appeler HeapValidate pour dtermie si l'emplacement de la mémoire se trouve dans le tas.

+0

Utilisation de ces informations dans le cadre d'un gestionnaire de mémoire personnalisé pour une application. – bdbaddog

+0

La page de pile/région de mémoire semble être MEM_IMAGE et pas MEM_PRIVATE? – bdbaddog

+0

Les piles sont définitivement privées. Comment obtenez-vous l'adresse de la pile que vous vérifiez? – Michael

Questions connexes