VrpHandleIoctlUnloadDifferencingHiveForHost
INT64 __stdcall VrpHandleIoctlUnloadDifferencingHiveForHost(
PVOID Data,
UINT64 DataLength,
INT8 RequestorMode,
GUID *ActivityId){
_QWORD *v6;
unsigned int v7;
int v8;
unsigned int v9;
__int64 v10;
__int64 *v11;
__int64 v12;
NTSTATUS v13;
UNICODE_STRING String1;
UNICODE_STRING String2;
*(_DWORD *)(&String2.MaximumLength + 1) = 0;
v6 = 0i64;
String1 = 0i64;
if( (unsigned int)DataLength < 8 )
return(unsigned int)-1073741811;
v8 = *((unsigned __int16 *)Data + 2);
if( (v8 & 1) != 0 )
return(unsigned int)-1073741811;
if( !(_WORD)v8 )
return(unsigned int)-1073741811;
if( *(_DWORD *)Data )
return(unsigned int)-1073741811;
v9 = v8 + 6;
if( v9 < 6 || (unsigned int)DataLength < v9 )
{
return(unsigned int)-1073741811;
}
else if( SeSinglePrivilegeCheck(*(_QWORD *)&SeBackupPrivilege, RequestorMode)
&& SeSinglePrivilegeCheck(*(_QWORD *)&SeRestorePrivilege, RequestorMode) )
{
String1.Buffer = (wchar_t *)((char *)Data + 6);
String1.MaximumLength = *((_WORD *)Data + 2);
String1.Length = String1.MaximumLength;
ExAcquirePushLockExclusiveEx((UINT64)&VrpHostLoadedHivesLock, 0i64);
v10 = VrpHostLoadedHives;
v11 = &VrpHostLoadedHives;
if( VrpHostLoadedHives )
{
while( 1 )
{
v12 = *(_QWORD *)v10;
String2.Buffer = (wchar_t *)(v10 + 10);
String2.Length = *(_WORD *)(v10 + 8);
String2.MaximumLength = String2.Length;
if( RtlEqualUnicodeString(&String1, &String2, 1u) )
break;
v11 = (__int64 *)v10;
v10 = v12;
if( !v12 )
goto LABEL_16;
}
*v11 = v12;
v6 = (_QWORD *)v10;
*(_QWORD *)v10 = 0i64;
}
LABEL_16:
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)&VrpHostLoadedHivesLock, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)&VrpHostLoadedHivesLock);
KeAbPostRelease(&VrpHostLoadedHivesLock);
if( v6 )
{
v13 = VrpUnloadDifferencingHive(&String1);
if( v13 == -1073741772 )
v13 = 0;
v7 = v13;
if( v13 >= 0 )
{
ExFreePoolWithTag(v6, 0);
v6 = 0i64;
v7 = 0;
}
if( v6 )
{
ExAcquirePushLockExclusiveEx((UINT64)&VrpHostLoadedHivesLock, 0i64);
*v6 = VrpHostLoadedHives;
VrpHostLoadedHives = (__int64)v6;
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)&VrpHostLoadedHivesLock, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)&VrpHostLoadedHivesLock);
KeAbPostRelease(&VrpHostLoadedHivesLock);
}
}
else
{
return(unsigned int)-1073741772;
}
}
else
{
return(unsigned int)-1073741727;
}
return v7;
}Referenced by:
VrpIoctlDeviceDispatch