ホームに戻る
 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);
}

inserted by FC2 system