RtlExtractBitMapEx
char __fastcall RtlExtractBitMapEx(_QWORD *a1, __int64 a2, unsigned __int64 a3, unsigned __int64 a4){
unsigned __int64 v4;
unsigned __int64 v7;
unsigned __int64 v9;
unsigned __int64 v10;
unsigned __int64 v11;
unsigned __int64 v12;
__int64 v13;
unsigned __int64 *v14;
unsigned __int64 v15;
__int64 *v16;
__int64 v17;
unsigned __int64 v18;
unsigned __int64 v19;
unsigned __int64 v20;
__int64 v21;
__int64 v22;
v4 = *(_QWORD *)a2;
v7 = *a1 - a3;
if( a4 > v7 )
a4 = *a1 - a3;
if( a4 <= v4 )
v4 = a4;
if( v4 )
{
v9 = a3 >> 3;
if( (a3 & 7) != 0 )
{
v7 = a1[1];
v14 = *(unsigned __int64 **)(a2 + 8);
v15 = a3 & 0x3F;
v16 = (__int64 *)(v7 + 8 * (a3 >> 6));
v17 = 1i64 << v15;
if( v4 >= 0x40 )
{
v18 = v4 >> 6;
v4 += -64i64 * (v4 >> 6);
do
{
v19 = ~(v17 - 1) & *v16++;
v20 = v19 >> v15;
*v14 = v20;
v7 = v20 | (((v17 - 1) & *v16) << (64 - (unsigned __int8)v15));
*v14++ = v7;
--v18;
}
while( v18 );
}
if( v4 )
{
v21 = *v16;
v22 = *v14 & ~((1i64 << v4) - 1);
if( v4 > 64 - v15 )
{
v7 = (v21 & (unsigned __int64)~(v17 - 1)) >> v15;
*v14 = v7 | ((v16[1] & ((1i64 << ((unsigned __int8)v4 + (unsigned __int8)v15 - 64)) - 1)) << (64 - (unsigned __int8)v15)) | v22;
}
else
{
v7 = v22 | ((v21 & (unsigned __int64)(((1i64 << v4) - 1) << v15)) >> v15);
*v14 = v7;
}
}
}
else
{
v10 = v4;
v11 = v4 & 7;
v12 = v10 >> 3;
if( v12 )
LOBYTE(v7) = (unsigned __int8)memmove(*(VOID **)(a2 + 8), (const VOID *)(v9 + a1[1]), v12);
if( v11 )
{
v13 = *(_QWORD *)(a2 + 8);
LOBYTE(v7) = *(_BYTE *)(v9 + a1[1] + v12) & ((1 << v11) - 1) | *(_BYTE *)(v12 + v13) & ~((1 << v11) - 1);
*(_BYTE *)(v12 + v13) = v7;
}
}
}
return v7;
}Referenced by:
RtlShiftLeftBitMapEx