這裡的 heap 管理不是指 console 的 new、malloc 等方式,而是用 win32 api 方式管理;相關的 API 非常多,資料都是從 MSDN 找下來的,有興趣到 MSDN 看更多。

1. 建立 heap

HANDLE WINAPI HeapCreate(
  __in  DWORD flOptions, // 如下說明
  __in  SIZE_T dwInitialSize, //  heap 大小
  __in  SIZE_T dwMaximumSize // heap 最大值
);

flOptions

HEAP_CREATE_ENABLE_EXECUTE 分配記憶體允許用於程式碼執行
HEAP_GENERATE_EXCEPTION 若失敗產生異常,不返回 NULL
HEAP_NO_SERIALIZE 不進行連續存取

2. 取得 heap

HANDLE WINAPI GetProcessHeap(void);

DWORD WINAPI GetProcessHeaps(
  __in   DWORD NumberOfHeaps, //  ProcessHeaps 能存 handle 之個數
  __out  PHANDLE ProcessHeaps  // 儲存 process 中所有 heap
);

傳回 heap 個數,若傳回0代表失敗。

3. 指定 heap 分配記憶體

LPVOID WINAPI HeapAlloc(
  __in  HANDLE hHeap, // 從此 heap 進行分配
  __in  DWORD dwFlags,
  __in  SIZE_T dwBytes // 欲分配 heap 大小
);


dwFlags

HEAP_GENERATE_EXCEPTIONS : 分配錯誤丟出異常
HEAP_NO_SERIALIZE: 不使用連續存取
HEAP_ZERO_MEMORY: 將分配記憶體內容清為0

失敗傳回 NULL,成功傳回 LPVOID 資料。

4. 指定 heap 重新分配記憶體

LPVOID WINAPI HeapReAlloc(
  __in  HANDLE hHeap, // 從此 heap 重新分配
  __in  DWORD dwFlags, // 與上述同
  __in  LPVOID lpMem, // 原 heap 位置
  __in  SIZE_T dwBytes // 重新調整後大小
);


失敗傳回 NULL,成功傳回 LPVOID 資料。

5. heap 釋放

 BOOL WINAPI HeapFree(
  __in  HANDLE hHeap, // 欲釋放之 heap handle
  __in  DWORD dwFlags,  // 設置參數,MSDN 上只提供 HEAP_NO_SERIALIZE
  __in  LPVOID lpMem // 要釋放之 pointer
);

HeapFree 是拿來釋放 HeapAlloc 和 HeapReAlloc 配出來的 heap

BOOL WINAPI HeapDestroy(
  __in  HANDLE hHeap // 要釋放的 head handle
);

HeapDestroy 是釋放 HeapCreate 所建立的 heap 

6. 取得 help 大小

SIZE_T WINAPI HeapSize(
  __in  HANDLE hHeap, // heap handle
  __in  DWORD dwFlags, // 通常設 HEAP_NO_SERIALIZE,見下述
  __in  LPCVOID lpMem // pointer
);

dwFlags

HEAP_GENERATE_EXCEPTIONS : 分配錯誤丟出異常
HEAP_NO_SERIALIZE: 不使用連續存取
HEAP_ZERO_MEMORY: 將分配記憶體內容清為0

7. struct SYSTEM_INFO 

typedef struct _SYSTEM_INFO {
  union {
    DWORD  dwOemId; // 已不用
    struct {
      WORD wProcessorArchitecture; //  CPU 系統結構, 下詳述
      WORD wReserved; // 保留
    } ;
  } ;
  DWORD     dwPageSize; // 分頁大小
  LPVOID    lpMinimumApplicationAddress; // 程式可取得之最小記憶體位置
  LPVOID    lpMaximumApplicationAddress; // 程式可取得之最大記憶體位置
  DWORD_PTR dwActiveProcessorMask; // CPU之代碼 (第幾顆處理器)
  DWORD     dwNumberOfProcessors; // CPU數量
  DWORD     dwProcessorType; // 目前應沒在用
  DWORD     dwAllocationGranularity; // 略
  WORD      wProcessorLevel;// 略
  WORD      wProcessorRevision;// 略
} SYSTEM_INFO; 

 wProcessorArchitecture

PROCESSSOR_ARCHITECTURE_INTEL
PROCESSSOR_ARCHITECTURE_MIPS
PROCESSSOR_ARCHITECTURE_ALHPA
PROCESSSOR_ARCHITECTURE_UNKNOW

 

edisonx 發表在 痞客邦 PIXNET 留言(0) 人氣()