|
|
//========================================================================
// Copyright (C) 1997 Microsoft Corporation
//========================================================================
#ifndef _MM_RANGE_H_
#define _MM_RANGE_H_
typedef struct _M_RANGE { DWORD Start; DWORD End; DWORD Mask; DWORD State; ULONG BootpAllocated; ULONG MaxBootpAllowed; DWORD DirtyOps; // how many unsaved ops done?
M_OPTCLASS Options; PM_BITMASK BitMask; ULONG UniqId; // Reservations?
} M_RANGE, *PM_RANGE, *LPM_RANGE;
DWORD _inline MemRangeInit( IN OUT PM_RANGE Range, IN DWORD Start, IN DWORD End, IN DWORD Mask, IN DWORD State, IN ULONG BootpAllocated, IN ULONG MaxBootpAllowed ) { DWORD Error;
AssertRet(Range, ERROR_INVALID_PARAMETER); if( Start > End || (Start & Mask) != (End & Mask) ) return ERROR_INVALID_PARAMETER;
Range->Start = Start; Range->End = End; Range->Mask = Mask; Range->State = State; Range->DirtyOps = 0; Range->BootpAllocated = BootpAllocated; Range->MaxBootpAllowed = MaxBootpAllowed;
Error = MemBitInit(&Range->BitMask, End - Start + 1); if( ERROR_SUCCESS != Error ) return Error;
return MemOptClassInit(&Range->Options); } // MemRangeInit()
DWORD _inline MemRangeCleanup( IN OUT PM_RANGE Range ) { DWORD Error; AssertRet(Range, ERROR_INVALID_PARAMETER);
Error = MemBitCleanup(Range->BitMask); if( ERROR_SUCCESS != Error ) return Error;
return MemOptClassCleanup(&Range->Options); }
PM_OPTCLASS _inline MemRangeGetOptions( IN PM_RANGE Range ) { AssertRet(Range, NULL);
return &Range->Options; }
enum /* anonymous */ { X_LESSTHAN_Y, Y_LESSTHAN_X, X_IN_Y, Y_IN_X, X_LESSTHAN_Y_OVERLAP, Y_LESSTHAN_X_OVERLAP };
DWORD _inline MemRangeCompare( IN DWORD StartX, IN DWORD EndX, IN DWORD StartY, IN DWORD EndY ) { if( EndX < StartY ) return X_LESSTHAN_Y; if( EndY < StartX ) return Y_LESSTHAN_X;
if( StartX < StartY ) { if( EndX < EndY ) return X_LESSTHAN_Y_OVERLAP; return Y_IN_X; }
if( StartX == StartY ) { if( EndX <= EndY ) return X_IN_Y; if( EndY <= EndX ) return Y_IN_X; } if( EndX <= EndY ) return X_IN_Y; return Y_LESSTHAN_X_OVERLAP; } // MemRangeCompare()
DWORD MemRangeExtendOrContract( IN OUT PM_RANGE Range, IN DWORD nAddresses, // to contract by or expand by
IN BOOL fExtend, // is this extend or contract?
IN BOOL fEnd // to expand/contract at End or ar Start?
) ;
DWORD _inline MemRangeConvertToClusters( IN PM_RANGE Range, OUT LPBYTE *InUseClusters, OUT DWORD *InUseClustersSize, OUT LPBYTE *UsedClusters, OUT DWORD *UsedClustersSize ) { AssertRet(Range && InUseClusters && InUseClustersSize, ERROR_INVALID_PARAMETER); AssertRet(UsedClusters && UsedClustersSize, ERROR_INVALID_PARAMETER);
return MemBitConvertToCluster( Range->BitMask, Range->Start, InUseClusters, InUseClustersSize, UsedClusters, UsedClustersSize ); } // MemRangeConvertToClusters()
#endif // _MM_RANGE_H_
|