|
|
//--------------------------------------------------------------------------
// Structs.h
//--------------------------------------------------------------------------
#ifndef __STRUCTS_H
#define __STRUCTS_H
//--------------------------------------------------------------------------
// OBJECTDB_SIGNATURE
//--------------------------------------------------------------------------
#define OBJECTDB_SIGNATURE 0xfe12adcf
#define BTREE_ORDER 40
#define BTREE_MIN_CAP 20
//--------------------------------------------------------------------------
// OBJECTDB_VERSION_V5B1
//--------------------------------------------------------------------------
#define OBJECTDB_VERSION_PRE_V5 2
#define OBJECTDB_VERSION_V5 5
#define ACACHE_VERSION_PRE_V5 9
#define FLDCACHE_VERSION_PRE_V5 2
#define UIDCACHE_VERSION_PRE_V5 4
//--------------------------------------------------------------------------
// ALLOCATEPAGE
//--------------------------------------------------------------------------
typedef struct tagALLOCATEPAGE { DWORD faPage; DWORD cbPage; DWORD cbUsed; } ALLOCATEPAGE, *LPALLOCATEPAGE;
//--------------------------------------------------------------------------
// TABLEHEADERV5B1
//--------------------------------------------------------------------------
typedef struct tagTABLEHEADERV5B1 { DWORD dwSignature; // 4
WORD wMinorVersion; // 6
WORD wMajorVersion; // 8
DWORD faRootChain; // 12
DWORD faFreeRecordBlock; // 16
DWORD faFirstRecord; // 20
DWORD faLastRecord; // 24
DWORD cRecords; // 28
DWORD cbAllocated; // 32
DWORD cbFreed; // 34
DWORD dwReserved1; // 38
DWORD dwReserved2; // 42
DWORD cbUserData; // 46
DWORD cDeletes; // 50
DWORD cInserts; // 54
LONG cActiveThreads; // 58
DWORD dwReserved3; // 62
DWORD cbStreams; // 66
DWORD faFreeStreamBlock; // 70
DWORD faFreeChainBlock; // 74
DWORD faNextAllocate; // 78
DWORD dwNextId; // 82
ALLOCATEPAGE AllocateRecord; // 94
ALLOCATEPAGE AllocateChain; // 106
ALLOCATEPAGE AllocateStream; // 118
BYTE fCorrupt; // 119
BYTE fCorruptCheck; // 120
BYTE rgReserved[190]; // 310
} TABLEHEADERV5B1, *LPTABLEHEADERV5B1;
//--------------------------------------------------------------------------
// TABLEHEADERV5
//--------------------------------------------------------------------------
typedef struct tagTABLEHEADERV5 { DWORD dwSignature; // 4
CLSID clsidExtension; // 20
DWORD dwMinorVersion; // 24
DWORD dwMajorVersion; // 28
DWORD cbUserData; // 32
DWORD rgfaIndex[32]; // 160
DWORD faFirstRecord; // 164
DWORD faLastRecord; // 168
ALLOCATEPAGE AllocateRecord; // 180
ALLOCATEPAGE AllocateChain; // 192
ALLOCATEPAGE AllocateStream; // 204
DWORD faFreeRecordBlock; // 208
DWORD faFreeStreamBlock; // 212
DWORD faFreeChainBlock; // 216
DWORD faNextAllocate; // 220
DWORD cbAllocated; // 224
DWORD cbFreed; // 228
DWORD cbStreams; // 232
DWORD cRecords; // 236
DWORD dwNextId; // 240
DWORD fCorrupt; // 244
DWORD fCorruptCheck; // 248
DWORD cActiveThreads; // 252
BYTE rgReserved[58]; // 310
} TABLEHEADERV5, *LPTABLEHEADERV5;
//--------------------------------------------------------------------------
// CHAINNODEV5B1
//--------------------------------------------------------------------------
typedef struct tagCHAINNODEV5B1 { DWORD faRecord; DWORD cbRecord; DWORD faRightChain; } CHAINNODEV5B1, *LPCHAINNODEV5B1;
//--------------------------------------------------------------------------
// CHAINBLOCKV5B1
//--------------------------------------------------------------------------
typedef struct tagCHAINBLOCKV5B1 { DWORD faStart; LONG cNodes; DWORD faLeftChain; CHAINNODEV5B1 rgNode[BTREE_ORDER + 1]; } CHAINBLOCKV5B1, *LPCHAINBLOCKV5B1;
#define CB_CHAIN_BLOCKV5B1 (sizeof(CHAINBLOCKV5B1) - sizeof(CHAINNODEV5B1))
//--------------------------------------------------------------------------
// CHAINNODEV5 - 492 bytes
//--------------------------------------------------------------------------
typedef struct tagCHAINNODEV5 { DWORD faRecord; DWORD faRightChain; DWORD cRightNodes; /* $V2$ */ } CHAINNODEV5, *LPCHAINNODEV5;
//--------------------------------------------------------------------------
// CHAINBLOCKV5 - 20 Bytes
//--------------------------------------------------------------------------
typedef struct tagCHAINBLOCKV5 { DWORD faStart; DWORD faLeftChain; DWORD faParent; /* $V2$ */ BYTE iParent; /* $V2$ */ BYTE cNodes; WORD wReserved; /* $V2$ */ DWORD cLeftNodes; /* $V2$ */ CHAINNODEV5 rgNode[BTREE_ORDER + 1]; } CHAINBLOCKV5, *LPCHAINBLOCKV5;
#define CB_CHAIN_BLOCKV5 (sizeof(CHAINBLOCKV5))
//--------------------------------------------------------------------------
// RECORDBLOCKV5B1
//--------------------------------------------------------------------------
typedef struct tagRECORDBLOCKV5B1 { DWORD faRecord; DWORD cbRecord; DWORD faNext; DWORD faPrevious; } RECORDBLOCKV5B1, *LPRECORDBLOCKV5B1;
//--------------------------------------------------------------------------
// RECORDBLOCKV5
//--------------------------------------------------------------------------
typedef struct tagRECORDBLOCKV5 { DWORD faRecord; DWORD cbRecord; DWORD dwVersion; /* $V2$ */ WORD wFlags; /* $V2$ */ WORD cColumns; /* $V2$ */ WORD wFormat; /* $V2$ */ WORD wReserved; /* $V2$ */ DWORD faNext; DWORD faPrevious; } RECORDBLOCKV5, *LPRECORDBLOCKV5;
//--------------------------------------------------------------------------
// STREAMBLOCK
//--------------------------------------------------------------------------
typedef struct tagSTREAMBLOCK { DWORD faThis; DWORD cbBlock; DWORD cbData; DWORD faNext; } STREAMBLOCK, *LPSTREAMBLOCK;
// --------------------------------------------------------------------------------
// Old Storage Migration Version and Signatures
// --------------------------------------------------------------------------------
#define MSGFILE_VER 0x00010003 // 1.0003
#define MSGFILE_MAGIC 0x36464d4a
#define CACHEFILE_VER 0x00010004 // 1.0004
#define CACHEFILE_MAGIC 0x39464d4a
#define MAIL_BLOB_VER 0x00010010 // 1.8 Opie Likes to change this a lot !!!
#define MSGHDR_MAGIC 0x7f007f00 // as bytes "0x00, 0x7f, 0x00, 0x7f"
#define MSG_HEADER_VERSISON ((WORD)1)
// --------------------------------------------------------------------------------
// MBXFILEHEADER
// --------------------------------------------------------------------------------
#pragma pack(4)
typedef struct tagMBXFILEHEADER { DWORD dwMagic; DWORD ver; DWORD cMsg; DWORD msgidLast; DWORD cbValid; DWORD dwFlags; DWORD dwReserved[15]; } MBXFILEHEADER, *LPMBXFILEHEADER; #pragma pack()
// --------------------------------------------------------------------------------
// MBXMESSAGEHEADER
// --------------------------------------------------------------------------------
#pragma pack(4)
typedef struct tagMBXMESSAGEHEADER { DWORD dwMagic; DWORD msgid; DWORD dwMsgSize; DWORD dwBodySize; } MBXMESSAGEHEADER, *LPMBXMESSAGEHEADER; #pragma pack()
// --------------------------------------------------------------------------------
// IDXFILEHEADER
// --------------------------------------------------------------------------------
#pragma pack(4)
typedef struct tagIDXFILEHEADER { DWORD dwMagic; DWORD ver; DWORD cMsg; DWORD cbValid; DWORD dwFlags; DWORD verBlob; DWORD dwReserved[14]; } IDXFILEHEADER, *LPIDXFILEHEADER; #pragma pack()
// --------------------------------------------------------------------------------
// IDXMESSAGEHEADER
// --------------------------------------------------------------------------------
#pragma pack(4)
typedef struct tagIDXMESSAGEHEADER { DWORD dwState; DWORD dwLanguage; DWORD msgid; DWORD dwHdrOffset; DWORD dwSize; DWORD dwOffset; DWORD dwMsgSize; DWORD dwHdrSize; BYTE rgbHdr[4]; } IDXMESSAGEHEADER, *LPIDXMESSAGEHEADER; #pragma pack()
// --------------------------------------------------------------------------------
// FOLDERUSERDATAV4
// --------------------------------------------------------------------------------
typedef struct tagFOLDERUSERDATAV4 { DWORD cbCachedArticles; DWORD cCachedArticles; FILETIME ftOldestArticle; DWORD dwFlags; DWORD dwNextArticleNumber; TCHAR szServer[256]; TCHAR szGroup[256]; DWORD dwUIDValidity; BYTE rgReserved[1020]; } FOLDERUSERDATAV4, *LPFOLDERUSERDATAV4;
// --------------------------------------------------------------------------------
// FLDINFO
// --------------------------------------------------------------------------------
#pragma pack(1)
typedef struct tagFLDINFO { DWORD idFolder; CHAR szFolder[259]; CHAR szFile[260]; DWORD idParent; DWORD idChild; DWORD idSibling; DWORD tySpecial; DWORD cChildren; DWORD cMessages; DWORD cUnread; DWORD cbTotal; DWORD cbUsed; BYTE bHierarchy; DWORD dwImapFlags; BYTE bListStamp; BYTE bReserved[3]; DWORD_PTR idNewFolderId; } FLDINFO, *LPFLDINFO; #pragma pack()
// --------------------------------------------------------------------------------
// IDXMESSAGEHEADER
// --------------------------------------------------------------------------------
#define GROUPLISTVERSION 0x3
#pragma pack(1)
typedef struct tagGRPLISTHEADER { DWORD dwVersion; CHAR szDate[14]; DWORD cGroups; } GRPLISTHEADER, *LPGRPLISTHEADER; #pragma pack()
// --------------------------------------------------------------------------------
// Sublist Structures
// --------------------------------------------------------------------------------
#define SUBFILE_VERSION5 0xFFEAEA05
#define SUBFILE_VERSION4 0xFFEAEA04
#define SUBFILE_VERSION3 0xFFEAEA03
#define SUBFILE_VERSION2 0xFFEAEA02
typedef struct tagSUBLISTHEADER { DWORD dwVersion; DWORD cSubscribed; } SUBLISTHEADER, *LPSUBLISTHEADER;
#define GSF_SUBSCRIBED 0x00000001
#define GSF_MARKDOWNLOAD 0x00000002 // We use this to persist the groups which have been marked for download
#define GSF_DOWNLOADHEADERS 0x00000004
#define GSF_DOWNLOADNEW 0x00000008
#define GSF_DOWNLOADALL 0x00000010
#define GSF_GROUPTYPEKNOWN 0x00000020
#define GSF_MODERATED 0x00000040
#define GSF_BLOCKED 0x00000080
#define GSF_NOPOSTING 0x00000100
typedef struct tagGROUPSTATUS5 { DWORD dwFlags; // subscription status, posting, etc.
DWORD dwReserved; // reserved for future use
ULONG ulServerHigh; // highest numbered article on server
ULONG ulServerLow; // lowest numbered article on server
ULONG ulServerCount; // count of articles on server
ULONG ulClientHigh; // highest numbered article known to client
ULONG ulClientLow; // lowest numbered article known to client
ULONG ulClientCount; // count of articles known to client
ULONG ulClientUnread; // count of unread articles known to client
ULONG cbName; // length of group name string (including \0)
ULONG cbReadRange; // length of read range data
ULONG cbKnownRange; // length of known range data
ULONG cbMarkedRange; // length of marked range data
ULONG cbRequestedRange; // length of range of data req from server
DWORD dwCacheFileIndex; // cache file number
} GROUPSTATUS5, * PGROUPSTATUS5;
typedef struct tagGROUPSTATUS4 { DWORD dwFlags; // subscription status, posting, etc.
DWORD dwReserved; // reserved for future use
ULONG ulServerHigh; // highest numbered article on server
ULONG ulServerLow; // lowest numbered article on server
ULONG ulServerCount; // count of articles on server
ULONG ulClientHigh; // highest numbered article known to client
ULONG ulClientLow; // lowest numbered article known to client
ULONG ulClientCount; // count of articles known to client
ULONG ulClientUnread; // count of unread articles known to client
ULONG cbName; // length of group name string (including \0)
ULONG cbReadRange; // length of read range data
ULONG cbKnownRange; // length of known range data
ULONG cbMarkedRange; // length of marked range data
ULONG cbRequestedRange; // length of range of data req from server
} GROUPSTATUS4, * PGROUPSTATUS4;
typedef struct tagGROUPSTATUS3 { DWORD dwFlags; // subscription status, posting, etc.
DWORD dwReserved; // reserved for future use
ULONG ulServerHigh; // highest numbered article on server
ULONG ulServerLow; // lowest numbered article on server
ULONG ulServerCount; // count of articles on server
ULONG ulClientHigh; // highest numbered article known to client
ULONG ulClientLow; // lowest numbered article known to client
ULONG ulClientCount; // count of articles known to client
ULONG ulClientUnread; // count of unread articles known to client
ULONG cbName; // length of group name string (including \0)
ULONG cbReadRange; // length of read range data
ULONG cbKnownRange; // length of known range data
ULONG cbMarkedRange; // length of marked range data
} GROUPSTATUS3, * PGROUPSTATUS3;
typedef struct tagGROUPSTATUS2 { BOOL fSubscribed; // subscription status
BOOL fPosting; // posting allowed?
ULONG ulServerHigh; // highest numbered article on server
ULONG ulServerLow; // lowest numbered article on server
ULONG ulServerCount; // count of articles on server
ULONG ulClientHigh; // highest numbered article known to client
ULONG ulClientLow; // lowest numbered article known to client
ULONG ulClientCount; // count of articles known to client
ULONG ulClientUnread; // count of unread articles known to client
ULONG cbName; // length of group name string (including \0)
ULONG cbReadRange; // length of read range data
ULONG cbKnownRange; // length of known range data
} GROUPSTATUS2, * PGROUPSTATUS2;
#endif // __STRUCTS_H
|