Windows2003-3790/inetcore/outlookexpress/mailnews/shell/smapimem.h
2020-09-30 16:53:55 +02:00

63 lines
1.9 KiB
C

#ifndef _SMAPIMEM_H_
#define _SMAPIMEM_H_
// Buffer link overhead.
// Blocks of memory obtained with MAPIAllocateMore are linked to a
// block obtained with MAPIAllocateBuffer, so that the whole chain
// may be freed with one call to MAPIFreeBuffer.
typedef struct _BufInternal * LPBufInternal;
typedef struct _BufInternal
{
ULONG ulAllocFlags;
LPBufInternal pLink;
} BufInternal;
// Values for ulAllocFlags. This dword contains two kinds of
// information:
// = In the high-order word, flags telling whether or not
// the block is the head of an allocation chain, and whether
// the block contains additional debugging information.
// = In the low-order word, an enum telling which heap
// it was allocated from.
#define ALLOC_WITH_ALLOC ((ULONG) 0x10000000)
#define ALLOC_WITH_ALLOC_MORE ((ULONG) 0x20000000)
#define FLAGSMASK ((ULONG) 0xFFFF0000)
#define GetFlags(_fl) ((ULONG) (_fl) & FLAGSMASK)
// Conversion macros
#define INT_SIZE(a) ((a) + sizeof(BufInternal))
#define LPBufExtFromLPBufInt(PBUFINT) \
((LPVOID)(((LPBYTE)PBUFINT) + sizeof(BufInternal)))
#define LPBufIntFromLPBufExt(PBUFEXT) \
((LPBufInternal)(((LPBYTE)PBUFEXT) - sizeof(BufInternal)))
#ifdef DEBUG
#define TellBadBlock(_p, _s) \
{ DOUT("MAPIAlloc: memory block [%#08lx] %s", _p, _s); \
AssertSz(0, "Bad memory block"); }
#define TellBadBlockInt(_p, _s) \
{ DOUT("MAPIAlloc: memory block [%#08lx] %s", LPBufExtFromLPBufInt(_p), _s); \
AssertSz(0, "Bad memory block"); }
BOOL FValidAllocChain(LPBufInternal lpBuf);
#else
#define TellBadBlock(_p, _s)
#define TellBadBlockInt(_p, _s)
#endif // DEBUG
SCODE SMAPIAllocateBuffer(ULONG ulSize, LPVOID * lppv);
SCODE SMAPIAllocateMore(ULONG ulSize, LPVOID lpv, LPVOID * lppv);
#endif // _SMAPIMEM_H_