CmpDoSort
UINT8 __fastcall CmpDoSort(_LIST_ENTRY *DriverListHead, _UNICODE_STRING *OrderList){
unsigned __int16 *v3;
__int16 v4;
wchar_t *v5;
_LIST_ENTRY *v6;
wchar_t *i;
_LIST_ENTRY *Blink;
_LIST_ENTRY *v9;
_LIST_ENTRY *v10;
_LIST_ENTRY **p_Blink;
_LIST_ENTRY *Flink;
_LIST_ENTRY *v13;
UNICODE_STRING String1;
_LIST_ENTRY **v16;
String1 = 0i64;
if( !CmpSortByTag(DriverListHead) )
return 0;
v4 = 0;
v5 = (wchar_t *)*((_QWORD *)v3 + 1);
v6 = DriverListHead;
for( i = &v5[((unsigned __int64)*v3 >> 1) - 1]; i > v5; --i )
{
do
{
if( !*i )
v4 = (__int16)i;
--i;
}
while( i != v5 && *(i - 1) );
Blink = DriverListHead->Blink;
String1.Buffer = i;
String1.Length = v4 - (_WORD)i;
String1.MaximumLength = v4 - (_WORD)i;
while( Blink != v6 )
{
v9 = Blink;
if( Blink == DriverListHead )
break;
v10 = Blink;
p_Blink = &Blink->Blink;
Blink = Blink->Blink;
v16 = p_Blink;
if( v10[7].Flink && RtlEqualUnicodeString(&String1, (UNICODE_STRING *)&v10[6].Blink, 1u) )
{
Flink = v10->Flink;
if( v10->Flink->Blink != v10
|| Blink->Flink != v10
|| (Blink->Flink = Flink,
Flink->Blink = Blink,
v13 = DriverListHead->Flink,
DriverListHead->Flink->Blink != DriverListHead) )
{
__fastfail(3u);
}
v10->Flink = v13;
if( v6 != DriverListHead )
v9 = v6;
v6 = v9;
*v16 = DriverListHead;
v13->Blink = v10;
DriverListHead->Flink = v10;
}
}
}
return 1;
}Referenced by:
CmpSortDriverList