/* ** memmon.h ** ** Structures, equates, and function prototypes to ** access the Memmon VxD. */ /* ** Information per VxD */ typedef struct { unsigned vi_size; unsigned vi_vhandle; /* VxDLdr's handle */ unsigned short vi_flags; unsigned short vi_cobj; /* Number of objects */ char vi_name[8]; /* Not NULL-terminated */ } VxDInfo; #define VXD_INITALIZED 0x0001 #define VXD_DYNAMIC 0x8000 /* ** Information per VxD object */ typedef struct { unsigned voi_linearaddr; unsigned voi_size; /* In bytes */ unsigned voi_objtype; } VxDObjInfo; /* ** VxD Object Types, copied directly from VMM.H */ #define RCODE_OBJ -1 #define LCODE_OBJ 0x01 #define LDATA_OBJ 0x02 #define PCODE_OBJ 0x03 #define PDATA_OBJ 0x04 #define SCODE_OBJ 0x05 #define SDATA_OBJ 0x06 #define CODE16_OBJ 0x07 #define LMSG_OBJ 0x08 #define PMSG_OBJ 0x09 #define DBOC_OBJ 0x0B #define DBOD_OBJ 0x0C #define ICODE_OBJ 0x11 #define IDATA_OBJ 0x12 #define ICODE16_OBJ 0x13 #define IMSG_OBJ 0x14 /* ** Load information for a VxD */ typedef struct { unsigned vli_size; VxDObjInfo vli_objinfo[1]; } VxDLoadInfo; /* ** Information for each context */ typedef struct { unsigned ciContext; /* Context ID */ unsigned ciProcessID; /* Win32 process ID */ unsigned ciBlockCount; unsigned ciHandle; /* Memmon's handle */ unsigned short ciFlags; unsigned short ciNumContexts; } ContextInfo; #define CONTEXT_NEW 0x0001 /* Never sampled before */ #define CONTEXT_CHANGE 0x0002 /* context list has changed */ /* ** Information for each block in a context */ typedef struct { unsigned brLinAddr; unsigned brPages; unsigned brFlags; /* PageAllocate flags */ unsigned brEIP; /* Caller's EIP */ } BlockRecord; /* ** Page lock information */ typedef struct { unsigned liProcessID; unsigned liAddr; unsigned char * liBuffer; } LockInfo; /* ** The following structure is used internally to for GetPageInfo and ** ClearAccessed. See memmon.c for usage. */ typedef struct { unsigned uAddr; unsigned uNumPages; unsigned uProcessID; unsigned uCurrentProcessID; unsigned uOperation; char * pBuffer; } PAGEINFO; #define PAGES_CLEAR 0 #define PAGES_QUERY 1 /* ** Structure filled in by GetSysInfo */ typedef struct { unsigned infoSize; unsigned infoMinCacheSize; unsigned infoMaxCacheSize; unsigned infoCurCacheSize; } SYSINFO, *PSYSINFO; /* ** Structure used to describe block names */ typedef struct { char bnName[32]; unsigned bnAddress; unsigned bnNext; } BLOCKNAME, *PBLOCKNAME; /* ** DeviceIoCtrl functions. See memmon.c / psapi.c for usage. */ #define MEMMON_DIOC_FindFirstVxD 0x80 #define MEMMON_DIOC_FindNextVxD 0x81 #define MEMMON_DIOC_GetVxDLoadInfo 0x82 #define MEMMON_DIOC_GetFirstContext 0x83 #define MEMMON_DIOC_GetNextContext 0x84 #define MEMMON_DIOC_GetContextInfo 0x85 #define MEMMON_DIOC_SetBuffer 0x86 #define MEMMON_DIOC_FreeBuffer 0x87 #define MEMMON_DIOC_PageInfo 0x88 #define MEMMON_DIOC_WatchProcess 0x89 #define MEMMON_DIOC_GetChanges 0x8A #define MEMMON_DIOC_QueryWS 0x8B #define MEMMON_DIOC_EmptyWS 0x8C #define MEMMON_DIOC_GetHeapSize 0x8D #define MEMMON_DIOC_GetHeapList 0x8E #define MEMMON_DIOC_GetSysInfo 0x8F #define MEMMON_DIOC_AddName 0x90 #define MEMMON_DIOC_RemoveName 0x91 #define MEMMON_DIOC_GetFirstName 0x92 #define MEMMON_DIOC_GetNextName 0x93 /* ** Flags returned in GetBlockInfo and PageInfo calls */ #define MEMMON_Present 0x01 #define MEMMON_Committed 0x02 #define MEMMON_Accessed 0x04 #define MEMMON_Writeable 0x08 #define MEMMON_Phys 0x10 #define MEMMON_Lock 0x20 /* ** Flags used for heap analysis */ #define MEMMON_HEAPLOCK 0x00000000 #define MEMMON_HEAPSWAP 0x00000200 #define MEMMON_HP_FREE 0x00000001 #define MEMMON_HP_VALID 0x00000002 #define MEMMON_HP_FLAGS 0x00000003 #define MEMMON_HP_ADDRESS 0xFFFFFFFC /* ** Function prototypes (memmon.c) */ int OpenMemmon( void ); void CloseMemmon( void ); int FindFirstVxD( VxDInfo * info ); int FindNextVxD( VxDInfo * info ); int GetVxDLoadInfo( VxDLoadInfo * info, int handle, int size ); int GetFirstContext( ContextInfo * context, BOOL bIgnoreStatus ); int GetNextContext( ContextInfo * context, BOOL bIgnoreStatus ); int GetContextInfo( int context, BlockRecord * info, int numblocks ); int GetLockInfo( unsigned uAddr, unsigned uProcessID, char * pBuffer ); void * SetBuffer( int pages ); int FreeBuffer( void ); int GetPageInfo( unsigned, unsigned, unsigned, char * ); int ClearAccessed( unsigned, unsigned, unsigned ); void GetHeapSizeEstimate( unsigned *, unsigned * ); int GetHeapList( unsigned *, unsigned, unsigned ); int GetSysInfo( PSYSINFO ); int AddName( unsigned uAddress, char * pszName ); int RemoveName( unsigned uAddress ); int GetFirstName( ContextInfo * pContext, PBLOCKNAME pBlock ); int GetNextName( PBLOCKNAME pBlock );