//================================================================================ // Copyright (C) 1997 Microsoft Corporation // Author: RameshV // Description: implements the basic structures for options, including class id // ThreadSafe: no // Locks: none // Please read stdinfo.txt for programming style. //================================================================================ #include #include #include #include #include #include //BeginExport(typedef) 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; // Reservations? } M_RANGE, *PM_RANGE, *LPM_RANGE; //EndExport(typedef) //BeginExport(inline) 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); } //EndExport(inline) //BeginExport(inline) 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); } //EndExport(inline) //BeginExport(inline) PM_OPTCLASS _inline MemRangeGetOptions( IN PM_RANGE Range ) { AssertRet(Range, NULL); return &Range->Options; } //EndExport(inline) //BeginExport(enum) enum /* anonymous */ { X_LESSTHAN_Y, Y_LESSTHAN_X, X_IN_Y, Y_IN_X, X_LESSTHAN_Y_OVERLAP, Y_LESSTHAN_X_OVERLAP }; //EndExport(enum) //BeginExport(inline) 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; } //EndExport(inline) //BeginExport(function) 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? ) //EndExport(function) { DWORD Error; AssertRet(Range && nAddresses > 0, ERROR_INVALID_PARAMETER); Error = MemBitAddOrDelBits( Range->BitMask, nAddresses, fExtend, fEnd ); if( ERROR_SUCCESS != Error ) return Error; if( fExtend ) { if( fEnd ) Range->End += nAddresses; else Range->Start -= nAddresses; } else { if( fEnd ) Range->End -= nAddresses; else Range->Start += nAddresses; } return ERROR_SUCCESS; } //BeginExport(inline) 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 ); } //================================================================================ // end of file //================================================================================