MiExtendDynamicBitMap
NTSTATUS __stdcall MiExtendDynamicBitMap(
PHANDLE TmHandle,
_ACCESS_MASK DesiredAccess,
POBJECT_ATTRIBUTES ObjectAttributes,
PUNICODE_STRING LogFileName,
UINT32 CreateOptions,
UINT32 CommitStrength){
_MI_SYSTEM_VA_TYPE v6;
_RTL_BITMAP_EX *v7;
unsigned __int64 SizeOfBitMap;
_BYTE *v10;
__int64 v11;
UINT64 v12;
unsigned __int64 v13;
UINT64 v14;
char *v16;
_KLOCK_QUEUE_HANDLE LockHandle;
UINT64 NumberToClear;
_OBJECT_ATTRIBUTES *v19;
v19 = ObjectAttributes;
v6 = (int)LogFileName;
v7 = *(_RTL_BITMAP_EX **)&DesiredAccess;
memset(&LockHandle, 0, sizeof(LockHandle));
if( !CreateOptions )
{
KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)TmHandle + 8, &LockHandle);
ObjectAttributes = v19;
}
SizeOfBitMap = v7->SizeOfBitMap;
if( v7 != (_RTL_BITMAP_EX *)TmHandle && TmHandle[5] != (void *)SizeOfBitMap )
{
LABEL_17:
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
return 1;
}
v10 = TmHandle[2];
if( v6 == MiVaSystemPtes )
{
v10 -= (unsigned __int64)TmHandle[5];
}
else if( v6 == MiVaSystemPtesLarge )
{
v10 -= (unsigned __int64)*TmHandle;
}
if( SizeOfBitMap < (unsigned __int64)v10 )
{
if( v6 == MiVaSystemPtesLarge )
v11 = -4096i64;
else
v11 = SizeOfBitMap >> 3;
v12 = 0x8000i64;
if( ObjectAttributes )
v12 = (UINT64)ObjectAttributes;
NumberToClear = v12;
if( MiSplitBitmapPages(v6, (char *)v7->Buffer + v11, v12) == 1 )
{
v13 = v7->SizeOfBitMap;
v14 = (UINT64)&v10[-SizeOfBitMap];
if( NumberToClear + SizeOfBitMap <= (unsigned __int64)v10 )
v14 = NumberToClear;
v7->SizeOfBitMap = v13 + v14;
if( v6 == MiVaSystemPtesLarge )
{
v13 = 0i64;
v7->Buffer -= v14 >> 6;
v16 = (char *)TmHandle[5];
if( !v16 )
TmHandle[6] = (void *)(((unsigned __int64)TmHandle[1] >> 21) & 0x7FFF);
TmHandle[5] = &v16[v14];
}
RtlClearBitsEx(v7, v13, v14);
if( CreateOptions )
return 1;
goto LABEL_17;
}
}
if( !CreateOptions )
{
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
if( TmHandle == (PHANDLE)((char *)&stru_140C4DB30 + 968) )
MiReclaimSystemVa(1ui64);
}
return 0;
}Referenced by:
MiMarkSystemVaAllocated
MiObtainDynamicVa