RtlCopyBitMapEx
VOID __stdcall RtlCopyBitMapEx(_RTL_BITMAP_EX *Source, _RTL_BITMAP_EX *Destination, UINT64 TargetBit){
UINT64 SizeOfBitMap;
unsigned __int64 *Buffer;
unsigned __int64 *v7;
unsigned __int64 *v8;
UINT64 v9;
UINT64 v10;
UINT64 v11;
UINT64 v12;
_BYTE *v13;
UINT64 v14;
unsigned __int64 *v15;
__int64 v16;
UINT64 v17;
unsigned __int64 v18;
unsigned __int64 v19;
char v20;
__int64 v21;
SizeOfBitMap = Destination->SizeOfBitMap - TargetBit;
if( Source->SizeOfBitMap <= SizeOfBitMap )
SizeOfBitMap = Source->SizeOfBitMap;
if( SizeOfBitMap )
{
Buffer = Destination->Buffer;
v7 = Source->Buffer;
v8 = &Buffer[TargetBit >> 6];
if( v7 <= v8 && v8 <= &v7[(SizeOfBitMap - 1) >> 6] )
{
RtlpCopyBitMapTailToHeadEx((INT64)Source, (INT64)Destination, TargetBit, SizeOfBitMap);
}
else
{
v9 = TargetBit >> 3;
if( (TargetBit & 7) != 0 )
{
v14 = TargetBit & 0x3F;
v15 = &Buffer[TargetBit >> 6];
if( SizeOfBitMap >= 0x40 )
{
v16 = *v15;
v17 = SizeOfBitMap >> 6;
SizeOfBitMap += -64i64 * (SizeOfBitMap >> 6);
do
{
*v15++ = ((((1i64 << (64 - (unsigned __int8)v14)) - 1) & *v7) << v14) | v16 & ((1i64 << v14) - 1);
v18 = ~((1i64 << (64 - (unsigned __int8)v14)) - 1) & *v7++;
v16 = (v18 >> (64 - (unsigned __int8)v14)) | *v15 & ~((1i64 << v14) - 1);
*v15 = v16;
--v17;
}
while( v17 );
}
if( SizeOfBitMap )
{
v19 = *v7;
v20 = 64 - v14;
v21 = *v15;
if( SizeOfBitMap > 64 - v14 )
{
*v15 = v21 & ((1i64 << v14) - 1) | ((v19 & ((1i64 << v20) - 1)) << v14);
v15[1] = ((*v7 & (((1i64 << ((unsigned __int8)SizeOfBitMap + (unsigned __int8)v14 - 64)) - 1) << v20)) >> v20) | v15[1] & ~((1i64 << ((unsigned __int8)SizeOfBitMap + (unsigned __int8)v14 - 64)) - 1);
}
else
{
*v15 = ((v19 & ((1i64 << SizeOfBitMap) - 1)) << v14) | v21 & ~(((1i64 << SizeOfBitMap) - 1) << v14);
}
}
}
else
{
v10 = SizeOfBitMap;
v11 = SizeOfBitMap & 7;
v12 = v10 >> 3;
if( v12 )
memmove((char *)Buffer + v9, Source->Buffer, v12);
if( v11 )
{
v13 = (char *)Destination->Buffer + v9 + v12;
*v13 &= ~((1 << v11) - 1);
*v13 |= (unsigned __int8)((1 << v11) - 1) & *((_BYTE *)Source->Buffer + v12);
}
}
}
}
}Referenced by:
MiResizeAweBitMap
MiSelectRelocationStartHint