www.pudn.com > He4Hook215b6.rar > KMemoryManager.h


#ifndef __MEMORY_MANAGER_H 
 #define __MEMORY_MANAGER_H 
// 
// Данный код можно использовать на IRQL <= DISPATCH_LEVEL, 
// если __KHEAP_LOCK_MUTEX не определен, иначе IRQL == PASSIVE_LEVEL 
// 
 
//#define __KHEAP_WIN32 
#ifndef __KHEAP_WIN32 
// #define __KHEAP_LOCK_MUTEX 
#endif //__KHEAP_WIN32 
 
#ifndef __KHEAP_WIN32 
extern "C" 
{ 
 #include "ntddk.h" 
} 
 
 #include "stdio.h" 
#else 
 #include  
 #include  
#endif //!__KHEAP_WIN32 
 
// 
// Для KernelMode убрать 
// 
#ifdef __KHEAP_WIN32 
 #define MmIsAddressValid(Array) (!(Array==NULL)) 
 #define KSPIN_LOCK               CRITICAL_SECTION* 
 #define KIRQL                    DWORD 
 #define ULONG                    DWORD 
 #define BOOLEAN                  BOOL 
#endif //__KHEAP_WIN32 
// 
// 
// 
 
#define BLOCK_STATE_FREE          0x00000000 
#define BLOCK_STATE_IN_USE        0x00000001 
#define BLOCK_STATE_KHEAP         0x80000000 // блок является описателем кучи 
 
#pragma pack(push) 
#pragma pack(1) 
typedef struct tag_MEMORY_BLOCK 
{ 
  struct tag_MEMORY_BLOCK*  m_pNextBlock; // Следующий выделенный в куче блок  
  struct tag_MEMORY_BLOCK*  m_pBaseBlock; // Описатель кучи или предидущий блок (для BLOCK_STATE_KHEAP) 
  ULONG       m_dwStates; 
  ULONG       m_dwSize;                   // размер блока m_pArray 
  #ifndef __KHEAP_LOCK_MUTEX 
  KSPIN_LOCK  m_Lock;                     // используется при BLOCK_STATE_KHEAP 
  //KIRQL       m_OldIrql;                // т.к. KIRQL = UCHAR, то для выравнивания на 
  ULONG       m_OldIrql_Align;            // 8-ми байтовую границу сделаем его ULONG (используется при BLOCK_STATE_KHEAP) 
  #else 
  PKMUTEX     m_Lock; 
  ULONG       m_Align;                    // выравнивание на 8 байт. 
  #endif //__KHEAP_LOCK_MUTEX 
  CHAR        m_pArray[1]; 
} MEMORY_BLOCK, *PMEMORY_BLOCK; 
#pragma pack(pop) 
 
#define SIZEOF_MEMORY_BLOCK      (sizeof(MEMORY_BLOCK)) 
#define SIZEOF_MEMORY_BLOCK_REAL (SIZEOF_MEMORY_BLOCK-sizeof(CHAR)) 
 
typedef PMEMORY_BLOCK KHEAP; 
 
KHEAP    KHeapCreate(ULONG dwSize); 
BOOLEAN  KHeapDestroy(KHEAP hKHeap); 
 
BOOLEAN  CreateDefaultHeap(ULONG dwSize); 
VOID     DestroyDefaultHeap(VOID); 
 
PVOID    AllocatePoolFromKHeap(KHEAP hKHeap, ULONG dwSize); 
VOID     FreePoolToKHeap(KHEAP hKHeap, PVOID pArray); 
PVOID    _AllocatePoolFromKHeap(KHEAP hKHeap, ULONG dwSize); // Optimize for min(fragmentation_heap) 
ULONG    KHeapGetSizeSystemMemory(KHEAP hKHeap); 
ULONG    KHeapGetSizeUsageMemory(KHEAP hKHeap); 
KHEAP    KGetDefaultHeap(VOID); 
#endif //__MEMORY_MANAGER_H