windows-nt/Source/XPSP1/NT/base/boot/inc/blrange.h

179 lines
4.1 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*++
Copyright (c) 1991 Microsoft Corporation
Module Name:
blrange.h
Abstract:
This module declares ranges, rangelists and their methods. These
can be used to keep track of cached ranges of a disk for instance.
Author:
Cenk Ergan (cenke) 11-Jan-2000
Revision History:
--*/
#ifndef _BLRANGE_H
#define _BLRANGE_H
#include "bldr.h"
//
// Define range & range list data structures.
//
//
// NOTE: BLCRANGE's Start is inclusive and End is exclusive. E.g.
// 200-400 contains 200th but does not contain 400th byte, apple,
// meter etc. This allows a single subtraction to determine the
// number of elements in the range.
//
//
// NOTE: BLCRANGE's Start should be less than or equal to its End.
//
//
// Representing ranges with start and end instead of start and length
// seems to simplify the code and remove a lot of addition and
// subtractions. We could maybe use a ULONG Length, which would save 4
// bytes per range, but lists make it hard to have thousands of ranges
// and even if you had 10 thousand ranges, you'd save only 40KB, which
// seemed to be insignificant to the cons above when I began changing
// the code to have Length instead of End. With both Start and End
// ULONGLONG more data can be represented by ranges, e.g. 64bit
// offsets [memory or disk] where 4GB Length may not be enough.
//
typedef struct _BLCRANGE
{
ULONGLONG Start;
ULONGLONG End;
} BLCRANGE, *PBLCRANGE;
typedef struct _BLCRANGE_ENTRY
{
LIST_ENTRY Link;
BLCRANGE Range;
PVOID UserData; // UserData field is not used by range functions.
LIST_ENTRY UserLink; // UserLink field is not used by range functions.
} BLCRANGE_ENTRY, *PBLCRANGE_ENTRY;
//
// Define range entry merging routine type. This routine should
// perform the necessary operations to merge the user controlled /
// maintained Data field of the pSrcEntry to pDestEntry's Data
// field. It should not manipulate any other BLCRANGE_ENTRT fields. It
// should return FALSE if there was an error and it could not merge
// the two Data fields, TRUE otherwise. If it returns FALSE, it should
// undo its modifications to pDestEntry and pSrcEntry.
//
typedef
BOOLEAN
(*PBLCRANGE_MERGE_ROUTINE) (
PBLCRANGE_ENTRY pDestEntry,
PBLCRANGE_ENTRY pSrcEntry
);
//
// Define range entry free'ing routine type. This routine should free
// all the resources & memory allocated for a range entry.
//
typedef
VOID
(*PBLCRANGE_FREE_ROUTINE) (
PBLCRANGE_ENTRY pRangeEntry
);
//
// BLCRANGE_LIST maintains a sorted list of non-overlapping range
// entries off its Head field.
//
typedef struct _BLCRANGE_LIST
{
LIST_ENTRY Head;
ULONG NumEntries;
PBLCRANGE_MERGE_ROUTINE MergeRoutine;
PBLCRANGE_FREE_ROUTINE FreeRoutine;
} BLCRANGE_LIST, *PBLCRANGE_LIST;
//
// Useful macros. Be mindful of expression reevaluation as with
// all macros.
//
#define BLRGMIN(a,b) (((a) <= (b)) ? (a) : (b))
#define BLRGMAX(a,b) (((a) >= (b)) ? (a) : (b))
//
// Range function prototypes. See ntos\boot\lib\blrange.c for comments
// and implementation.
//
VOID
BlRangeListInitialize (
PBLCRANGE_LIST pRangeList,
OPTIONAL PBLCRANGE_MERGE_ROUTINE pMergeRoutine,
OPTIONAL PBLCRANGE_FREE_ROUTINE pFreeRoutine
);
BOOLEAN
BlRangeListAddRange (
PBLCRANGE_LIST pRangeList,
PBLCRANGE_ENTRY pRangeEntry
);
BOOLEAN
BlRangeListFindOverlaps (
PBLCRANGE_LIST pRangeList,
PBLCRANGE pRange,
PBLCRANGE_ENTRY *pOverlapsBuffer,
ULONG OverlapsBufferSize,
OUT ULONG *pNumOverlaps
);
BOOLEAN
BlRangeListFindDistinctRanges (
PBLCRANGE_LIST pRangeList,
PBLCRANGE pRange,
PBLCRANGE pDistinctRanges,
ULONG BufferSize,
OUT ULONG *pNumRanges
);
VOID
BlRangeListRemoveRange (
PBLCRANGE_LIST pRangeList,
PBLCRANGE pRange
);
VOID
BlRangeListRemoveAllRanges (
PBLCRANGE_LIST pRangeList
);
BOOLEAN
BlRangeListMergeRangeEntries (
PBLCRANGE_LIST pRangeList,
PBLCRANGE_ENTRY pDestEntry,
PBLCRANGE_ENTRY pSrcEntry
);
BOOLEAN
BlRangeEntryMerge (
PBLCRANGE_ENTRY pDestEntry,
PBLCRANGE_ENTRY pSrcEntry,
OPTIONAL PBLCRANGE_MERGE_ROUTINE pMergeRoutine
);
#endif // _BLRANGE_H