AlpcpAllocateFromBitmap
UINT64 __stdcall AlpcpAllocateFromBitmap(UINT64 *Start, UINT64 *Limit, UINT64 Size){
unsigned int v3;
int v4;
UINT64 v7;
UINT64 *v8;
unsigned int v9;
unsigned int i;
signed __int32 *v11;
int v12;
int v13;
signed __int32 v14;
signed __int32 v15;
unsigned int v17;
int v18;
signed __int32 v19;
signed __int32 v20;
signed __int32 v21;
unsigned int v22;
v3 = 0;
v4 = Size;
v7 = 0xFFFFFFFFi64;
v8 = Start;
if( Start != Limit )
{
while( 2 )
{
v9 = *(_DWORD *)v8;
for( i = 0; i < 0x20; ++i )
{
if( (v9 & 1) != 0 )
{
v7 = 0xFFFFFFFFi64;
v3 = 0;
}
else
{
if( (_DWORD)v7 == -1 )
v7 = i + 32 * (unsigned int)(((char *)v8 - (char *)Start) >> 2);
if( ++v3 == v4 )
{
v11 = (signed __int32 *)Start + ((unsigned __int64)(unsigned int)v7 >> 5);
v12 = v7 & 0x1F;
if( (v7 & 0x1F) != 0 )
{
v17 = v3;
if( v3 >= 32 - v12 )
v17 = 32 - v12;
v18 = ((1 << v17) - 1) << v12;
_m_prefetchw(v11);
v19 = *v11;
while( (v19 & v18) == 0 )
{
v20 = v19;
v19 = _InterlockedCompareExchange(v11, v18 | v19, v19);
if( v20 == v19 )
{
v3 -= v17;
LABEL_23:
++v11;
goto LABEL_10;
}
}
}
else
{
LABEL_10:
if( v3 >= 0x20 )
{
_m_prefetchw(v11);
v21 = *v11;
while( !v21 )
{
v21 = _InterlockedCompareExchange(v11, -1, 0);
if( !v21 )
{
v3 -= 32;
goto LABEL_23;
}
}
}
else
{
if( !v3 )
return(unsigned int)v7;
v13 = (1 << v3) - 1;
_m_prefetchw(v11);
v14 = *v11;
while( (v14 & v13) == 0 )
{
v15 = v14;
v14 = _InterlockedCompareExchange(v11, v13 | v14, v14);
if( v15 == v14 )
return(unsigned int)v7;
}
}
v22 = v4 - v3;
if( v22 )
AlpcpFreeBitmap(Start, (UINT64)v11, v7, v22);
}
return 4294967294i64;
}
}
v9 >>= 1;
}
v8 = (UINT64 *)((char *)v8 + 4);
if( v8 != Limit )
continue;
break;
}
}
return 0xFFFFFFFFi64;
}Referenced by:
AlpcpAllocateCompletionBuffer