Windows2003-3790/inetcore/outlookexpress/migrate/structs.h
2020-09-30 16:53:55 +02:00

389 lines
17 KiB
C

//--------------------------------------------------------------------------
// 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