Try to allow different alignments and BSS. Untested.
[wincetools.git] / virtual-query.c
1 #include <stdio.h>
2 #include <windows.h>
3
4 void
5 dump_mbi_header ()
6 {
7   printf ("alc-base   alc-prot address    size       state    protect  type     \n");
8
9
10
11 void
12 dump_protect_flags (DWORD flags)
13 {
14   DWORD pr = flags & (PAGE_EXECUTE_READ | PAGE_EXECUTE_READWRITE
15                       | PAGE_EXECUTE_WRITECOPY | PAGE_READONLY
16                       | PAGE_READWRITE | PAGE_WRITECOPY);
17   DWORD pw = flags & (PAGE_EXECUTE_READWRITE | PAGE_EXECUTE_WRITECOPY
18                       | PAGE_READWRITE | PAGE_WRITECOPY);
19   DWORD pc = flags & (PAGE_EXECUTE_WRITECOPY | PAGE_WRITECOPY);
20   DWORD px = flags & (PAGE_EXECUTE | PAGE_EXECUTE_READ
21                       | PAGE_EXECUTE_READWRITE | PAGE_EXECUTE_WRITECOPY);
22   
23   printf ("%c%c%c %c%c%c  ",
24           pr ? 'r' : '-', pc ? 'c' : (pw ? 'w' : '-'), px ? 'x' : '-',
25           (flags & PAGE_GUARD) ? 'g' : '-',
26           (flags & PAGE_NOCACHE) ? 'n' : '-',
27 #ifdef PAGE_PHYSICAL
28           (flags & PAGE_PHYSICAL) ? 'p' : 
29 #endif
30           '-');
31 }
32
33
34 void
35 dump_state (DWORD state)
36 {
37   switch (state)
38     {
39     case MEM_COMMIT:
40       printf ("commit   ");
41       return;
42     case MEM_FREE:
43       printf ("free     ");
44       return;
45     case MEM_RESERVE:
46       printf ("reserve  ");
47       return;
48     default:
49       printf ("unknown  ");
50     }
51 }
52
53
54 void
55 dump_type (DWORD mtype)
56 {
57   switch (mtype)
58     {
59     case MEM_IMAGE:
60       printf ("image    ");
61       return;
62     case MEM_MAPPED:
63       printf ("mapped   ");
64       return;
65     case MEM_PRIVATE:
66       printf ("private  ");
67       return;
68     default:
69       printf ("unknown  ");
70     }
71 }
72
73
74 void
75 dump_mbi (PMEMORY_BASIC_INFORMATION mbi)
76 {
77   printf ("0x%08x ", mbi->AllocationBase);
78   dump_protect_flags (mbi->AllocationProtect);
79   printf ("0x%08x ", mbi->BaseAddress);
80   printf ("0x%08x ", mbi->RegionSize);
81   dump_state (mbi->State);
82   dump_protect_flags (mbi->Protect);
83   dump_type (mbi->Type);
84   printf ("\n");
85 }
86
87
88 int
89 main (int argc, char* argv[])
90 {
91   MEMORY_BASIC_INFORMATION mbi;
92   SYSTEM_INFO si;
93   void *addr;
94   int skipping = 0;
95
96   memset (&si, '\0', sizeof (si));
97   GetSystemInfo (&si);
98   dump_mbi_header ();
99
100   addr = 0;
101   do
102     {
103       DWORD res;
104       void *new_addr;
105
106       memset (&mbi, '\0', sizeof (mbi));
107       res = VirtualQuery (addr, &mbi, sizeof (mbi));
108       if (res == 0)
109         {
110           if (!skipping)
111             printf ("Skipping over %p...\n", addr);
112           skipping = 1;
113           new_addr = addr + si.dwPageSize;
114           if (new_addr < addr)
115             break;
116           addr = new_addr; 
117          continue;
118         }
119       if (res != sizeof (mbi))
120         {
121           printf ("Unexpected return size: %i (expected %i)\n",
122                   res, sizeof (mbi));
123         }
124       skipping = 0;
125       dump_mbi (&mbi);
126       /* Check for overflow.  */
127       new_addr = addr + mbi.RegionSize;
128       if (new_addr < addr)
129         break;
130       addr = new_addr;
131     }
132   while (1);
133
134   /* Give ssh time to flush buffers.  */
135   fflush (stdout);
136   Sleep (300);
137   return 0;
138 }