Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

146 lines
4.1 KiB

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