ホームに戻る
11、(コードサンプル)メモリの状態の表示
#include <stdio.h>
#include <windows.h>
int printMem(char *filename)
{
FILE *fp;
unsigned char *p = (unsigned char *)0x0;
MEMORY_BASIC_INFORMATION mbi;
fp = fopen(filename, "w");
if(fp == NULL)return 0;
fprintf(fp, "this is %s.\n\n", filename);
while(1){
if(VirtualQuery(p, &mbi, sizeof(mbi))){
fprintf(fp, "0x%08lx:0x%08lx ", mbi.BaseAddress, mbi.RegionSize);
switch(mbi.Type){
case MEM_IMAGE:
fprintf(fp, "I ");
break;
case MEM_MAPPED:
fprintf(fp, "M ");
break;
case MEM_PRIVATE:
fprintf(fp, "P ");
break;
default:
fprintf(fp, " ");
break;
}
switch(mbi.State){
case MEM_COMMIT:
fprintf(fp, "C");
break;
case MEM_RESERVE:
fprintf(fp, "R");
break;
case MEM_FREE:
fprintf(fp, "F");
break;
default:
fprintf(fp, " ");
}
switch(mbi.Protect){
case PAGE_NOACCESS:
fprintf(fp, "---");
break;
case PAGE_READONLY:
fprintf(fp, "--r");
break;
case PAGE_READWRITE:
fprintf(fp, "-wr");
break;
case PAGE_WRITECOPY:
fprintf(fp, "-w-");
break;
case PAGE_EXECUTE:
fprintf(fp, "e--");
break;
case PAGE_EXECUTE_READ:
fprintf(fp, "e-r");
break;
case PAGE_EXECUTE_READWRITE:
fprintf(fp, "ewr");
break;
case PAGE_EXECUTE_WRITECOPY:
fprintf(fp, "ew-");
break;
default:
fprintf(fp, " ");
}
fprintf(fp, "\n");
p = (unsigned char *)mbi.BaseAddress + mbi.RegionSize;
if(p == 0)break;
}
else{
fprintf(fp, "0x%08lx:0x%08lx ", p , 0);
fprintf(fp, "End-\n");
break;
}
}
fclose(fp);
return 1;
}
#include <windows.h>
#define WINDOW_CLASS_NAME "WinClassName"
#define WINDOW_NAME "WinName"
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow)
{
MSG msg;
WNDCLASS wc;
HWND hWnd;
// Register Class
if(hPrevInst == NULL)
{
ZeroMemory(&wc, sizeof(wc));
wc.lpfnWndProc = (WNDPROC)WndProc;
wc.hInstance = hInst;
wc.hIcon = LoadIcon((HINSTANCE)NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor((HINSTANCE)NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)COLOR_BACKGROUND;
wc.lpszClassName = WINDOW_CLASS_NAME;
if(RegisterClass(&wc) == 0){
return 0;
}
}
// CreateWindow
hWnd = CreateWindow(WINDOW_CLASS_NAME, WINDOW_NAME, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
(HWND)NULL, (HMENU)NULL, hInst, (LPVOID)NULL);
if(hWnd == NULL){
return 0;
}
// ShowWindow, UpdateWindow
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
// Message Loop
while(GetMessage(&msg, (HWND)NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam){
switch(uMsg){
case WM_CREATE:
printMem("memory.txt");
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}