VrpHandleIoctlGetVirtualRootKey
NTSTATUS __stdcall VrpHandleIoctlGetVirtualRootKey(){
unsigned int v0;
__int64 v1;
CHAR v2;
CHAR v3;
__int64 v4;
int JobSilo;
INT64 v6;
_EJOB *v7;
INT64 v8;
_EJOB *v9;
unsigned int v10;
VOID *v11;
UINT64 Tag;
INT64 Taga;
INT64 v15;
INT64 v16;
INT64 v17;
_EJOB *Job;
_EJOB *Silo;
_OBJECT_ATTRIBUTES ObjectAttributes;
VOID *KeyHandle;
_QWORD *v22;
_DWORD *v23;
Silo = 0i64;
Job = 0i64;
v3 = v2;
KeyHandle = 0i64;
v4 = v1;
memset(&ObjectAttributes, 0, sizeof(ObjectAttributes));
if( v0 < 0x10 || *(_DWORD *)(v1 + 8) > 2u )
return -1073741811;
LODWORD(Tag) = 1381395779;
JobSilo = ObpReferenceObjectByHandleWithTag(
*(VOID **)v1,
4ui64,
(_OBJECT_TYPE *)PsJobType,
v2,
Tag,
(VOID **)&Job,
0i64,
0i64);
if( JobSilo >= 0 )
{
JobSilo = PsGetJobSilo(Job, &Silo);
if( JobSilo >= 0 )
{
if( PsIsThreadInSilo((_ETHREAD *)KeGetCurrentThread(), Silo) )
{
JobSilo = -1073741811;
}
else
{
LODWORD(v7) = PsAttachSiloToCurrentThread(v6);
ObjectAttributes.RootDirectory = 0i64;
v9 = v7;
ObjectAttributes.Length = 48;
v10 = 1088;
if( v3 != 1 )
v10 = 576;
ObjectAttributes.Attributes = v10;
ObjectAttributes.ObjectName = (_UNICODE_STRING *)&VrpRootKeyPaths[8 * *(int *)(v4 + 8)];
*(_OWORD *)&ObjectAttributes.SecurityDescriptor = 0i64;
JobSilo = ZwOpenKey(&KeyHandle, 0x80000000ui64, &ObjectAttributes, v8, Taga, v15, v16, v17);
if( JobSilo >= 0 )
{
v11 = KeyHandle;
KeyHandle = 0i64;
JobSilo = 0;
*v23 = 8;
*v22 = v11;
}
PsDetachSiloFromCurrentThread(v9);
}
}
}
if( Job )
ObfDereferenceObjectWithTag(Job, 0x52566D43ui64);
return JobSilo;
}Referenced by:
VrpIoctlDeviceDispatch