/*++ Copyright (c) Microsoft Corporation. All rights reserved. Module Name: rtinfo.h Abstract: Definitions of information block structuers used to exchange information in router API --*/ #ifndef __ROUTING_RTINFO_H__ #define __ROUTING_RTINFO_H__ #if _MSC_VER > 1000 #pragma once #endif ////////////////////////////////////////////////////////////////////////////// // // // Information is passed to and from the Router Managers using a set of // // RTR_TOC_ENTRY structures. These structures are encapsulated by an // // RTR_INFO_BLOCK_HEADER. // // The general structure of this is: // // // // --- |-----------------------| --- // // | | | | // // | | RTR_INFO_BLOCK_HEADER | | // // | | | | // // | | TocEntriesCount = N | | // // | |-----------------------| | // // | | TocEntry[0] | | // // | | | | // // | | Offset of | | // // |<------ Associated Data | | // // | | | | // // | |-----------------------| | // // | Z Z | // // | | | | // // | |-----------------------| | // // | | TocEntry[N-1] | | // // | | | | // // | | Offset of | | // // | | Associated Data ------->| // // | | | | // // --- |-----------------------| | // // | Data for TocEntry[0] | | // // |-----------------------| | // // Z Z | // // |-----------------------| --- // // | Data for TocEntry[N-1]| // // |-----------------------| // // // ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// // // // Each of the blocks of data must begin at a quadword aligned boundary. To // // get QUADWORD alignment, use the following macros. // // // // The block of data pointed to by an InfoBlock MUST be aligned. // // Use the alignment macro when writing the data portion into an infobase. // // This implies that for each ALIGN_POINTER operation done on a chunk // // of memory, the requested allocation must be ALIGN_SIZE greater // // than what is actually required (to be on the safe side) // // // ////////////////////////////////////////////////////////////////////////////// #define ALIGN_SIZE 0x00000008 #define ALIGN_SHIFT (ALIGN_SIZE - 0x00000001) // 0x00000007 #define ALIGN_MASK_POINTER (~(UINT_PTR)ALIGN_SHIFT) // 0xfffffff8 #define ALIGN_MASK_LENGTH (~ALIGN_SHIFT) // 0xfffffff8 #define ALIGN_MASK (~ALIGN_SHIFT) // 0xfffffff8 #define ALIGN_POINTER(ptr) { \ (ptr) = (PVOID)((DWORD_PTR)(ptr) + ALIGN_SHIFT); \ (ptr) = (PVOID)((DWORD_PTR)(ptr) & ALIGN_MASK_POINTER); \ } #define ALIGN_LENGTH(length) { \ (length) = (DWORD)((length) + ALIGN_SHIFT); \ (length) = (DWORD)((length) & ALIGN_MASK_LENGTH); \ } #define IS_ALIGNED(ptr) (((UINT_PTR)(ptr) & ALIGN_SHIFT) == 0x00000000) ////////////////////////////////////////////////////////////////////////////// // // // Table of Contents Entry // // // ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// // // // Each entry describes a structure type, location within the information // // block and number of entries of the same type. // // // ////////////////////////////////////////////////////////////////////////////// typedef struct _RTR_TOC_ENTRY { ULONG InfoType; // Info structure type ULONG InfoSize; // Size of the info structure ULONG Count; // How many info structures of this type ULONG Offset; // Offset of the first structure, from the start // of the info block header. }RTR_TOC_ENTRY, *PRTR_TOC_ENTRY; ////////////////////////////////////////////////////////////////////////////// // // // Info Block Header // // // ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// // // // All Router information blocks start with this header // // // ////////////////////////////////////////////////////////////////////////////// #define RTR_INFO_BLOCK_VERSION 1 typedef struct _RTR_INFO_BLOCK_HEADER { ULONG Version; // Version of the structure ULONG Size; // size of the whole block, including version ULONG TocEntriesCount;// Number of entries RTR_TOC_ENTRY TocEntry[1]; // Table of content followed by the actual // information blocks } RTR_INFO_BLOCK_HEADER, *PRTR_INFO_BLOCK_HEADER; // // PVOID // GetInfoFromTocEntry( // IN PRTR_INFO_BLOCK_HEADER pInfoHdr, // IN PRTR_TOC_ENTRY pToc // ) // #define GetInfoFromTocEntry(hdr,toc) \ (((toc)->Offset < (hdr)->Size) ? ((PVOID)(((PBYTE)(hdr)) + (toc)->Offset)) : NULL) #endif //__ROUTING_RTINFO_H__