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

using namespace std;

long long TaillePile(HANDLE hHeap);

#define SIZE_TO_ALLOC 5000

void pause()
{
  char c;
  cin >> c;
}

int main()
{
  int nbH=GetProcessHeaps(0,NULL); //On lit le nombre de tas utilisés par le programme.
  PHANDLE Heaps=new HANDLE[nbH];
  //On récupère leurs handles.
  if (nbH!=GetProcessHeaps(nbH,Heaps))                        //ça ne devrait pas arriver.
    exit(1);

  cout << "L'affichage se fait sous la forme :\nHandle du tas : memoire allouee sur le tas" << endl << endl;

  if(nbH!=GetProcessHeaps(0,NULL))
    exit(2);

  for (int i=0;i<nbH;i++)
    cout << Heaps[i] << " : " << TaillePile(Heaps[i]) << endl;

  cout << endl << "Allocation de " << SIZE_TO_ALLOC << " octets." << endl << endl;
  char* t=new char [SIZE_TO_ALLOC];

  if(nbH!=GetProcessHeaps(0,NULL))
    exit(3);

  for (int i=0;i<nbH;i++)
    cout << Heaps[i] << " : " << TaillePile(Heaps[i]) << endl;

  cout << endl << "liberation de la memoire precedemment allouee." << endl << endl;
  delete[] t;

  if(nbH!=GetProcessHeaps(0,NULL))
    exit(4);

  for (int i=0;i<nbH;i++)
    cout << Heaps[i] << " : " << TaillePile(Heaps[i]) << endl;

  pause();
  return 0;
}

//On calcule la taille du tas.
long long TaillePile(HANDLE hHeap)
{
  long long size=0;
  PROCESS_HEAP_ENTRY entry;
  entry.lpData=NULL;

  //on verrouille le tas pour éviter qu'il ne soit modifier pendant qu'on le parcourt.
  if(!HeapLock(hHeap))
    exit(5);
  
  //on énumère les enrengistrement dans le tas et on somme leurs tailles.
  while(HeapWalk(hHeap,&entry))
    size+=entry.cbData;

  //on relache le tas.
  if (!HeapUnlock(hHeap))
      exit(6);

  return size;
}
