VrpHandleIoctlInitializeJobForVreg
NTSTATUS __stdcall VrpHandleIoctlInitializeJobForVreg(PVOID Data, UINT64 DataLength, INT8 RequestorMode){
int v3;
UNICODE_STRING *v4;
struct _DMA_ADAPTER *RootKeyObjectForSilo;
_EJOB *v6;
NTSTATUS JobSilo;
_QWORD *v8;
WCHAR *v9;
SIZE_T v10;
WCHAR *v11;
int NamespaceNode;
INT64 v13;
bool IsThreadInSilo;
PVOID v15;
UNICODE_STRING *v16;
_GUID ContainerId;
wchar_t *PoolWithTag;
SIZE_T Tag;
INT64 Taga;
WCHAR *Object;
PVOID *Objecta;
POBJECT_HANDLE_INFORMATION HandleInformation;
WCHAR *v25;
SIZE_T v26;
INT64 v27;
_EJOB *Job;
UINT64 a2[2];
char v31;
INT64 v33;
PVOID SiloContext;
PVOID v35;
v35 = 0i64;
v3 = 0;
SiloContext = 0i64;
v4 = 0i64;
Job = 0i64;
RootKeyObjectForSilo = 0i64;
v33 = 0i64;
v6 = 0i64;
if( (unsigned int)DataLength < 8 )
return -1073741811;
JobSilo = ObCreateObject(0, (_DWORD *)VrpJobContextType, 0i64, 1, 0, 96, 0, 0, &SiloContext);
if( JobSilo < 0 )
{
v8 = SiloContext;
goto LABEL_24;
}
v8 = SiloContext;
memset((INT64)SiloContext, 0i64);
v8[2] = 0i64;
JobSilo = VrpInitializeNamespaceNodeList((INT64)v8);
if( JobSilo < 0 )
goto LABEL_24;
JobSilo = VrpIncrementSiloCount();
if( JobSilo < 0 )
goto LABEL_24;
*((_DWORD *)v8 + 22) = 1;
VrpLockJobContextExclusive(
(PWCHAR)v8,
v9,
v10,
v11,
Tag,
Object,
(SIZE_T)HandleInformation,
v25,
v26,
v27,
(PWCHAR)Job);
v31 = 1;
LODWORD(Objecta) = -1;
LODWORD(Taga) = 0;
NamespaceNode = VrpCreateNamespaceNode(
(INT64)v8,
&CmRegistryContainersName,
0i64,
(const VOID **)&CmRegistryContainersName,
Taga,
(INT64)Objecta,
(CHAR **)&v33);
v13 = v33;
JobSilo = NamespaceNode;
if( NamespaceNode < 0 )
goto LABEL_19;
JobSilo = VrpAddNamespaceNodeToList(v8, (UNICODE_STRING *)v33);
if( JobSilo < 0 )
goto LABEL_19;
v33 = 0i64;
VrpUnlockJobContextExclusive((INT64)v8);
v31 = 0;
JobSilo = ObReferenceObjectByHandleWithTag(
*(HANDLE *)Data,
6u,
(POBJECT_TYPE)PsJobType,
RequestorMode,
0x52566D43u,
&v35,
0i64);
if( JobSilo < 0 )
goto LABEL_24;
JobSilo = PsGetJobSilo((_EJOB *)v35, &Job);
if( JobSilo < 0 )
goto LABEL_24;
v6 = Job;
IsThreadInSilo = PsIsThreadInSilo((__int64)KeGetCurrentThread(), (__int64)Job);
v8 = SiloContext;
if( IsThreadInSilo )
{
JobSilo = -1073741811;
}
else
{
v15 = SiloContext;
*(_GUID *)SiloContext = v6->ContainerId;
LODWORD(v16) = VrpAllocateKeyContext(v15);
v4 = v16;
if( v16 )
{
ContainerId = v6->ContainerId;
v3 = 1;
v16[2].Length = 1;
*(_GUID *)v16 = ContainerId;
PoolWithTag = (wchar_t *)ExAllocatePoolWithTag(PagedPool, CmRegistryRootName.Length, 0x67655256ui64);
v4[1].Buffer = PoolWithTag;
if( PoolWithTag )
{
v4[1].Length = 0;
v4[1].MaximumLength = CmRegistryRootName.Length;
RtlUnicodeStringCopy(v4 + 1, &CmRegistryRootName);
a2[0] = 0i64;
JobSilo = CmpGetOrCreateContextForSiloNoRef(v6, a2);
if( JobSilo >= 0 )
{
JobSilo = CmpStartSiloRegistryNamespace(a2[0]);
if( JobSilo >= 0 )
JobSilo = 0;
}
if( JobSilo < 0 )
goto LABEL_24;
JobSilo = PsInsertSiloContext(v6, (unsigned int)VrpSiloContextSlot, v8);
if( JobSilo < 0 )
goto LABEL_24;
RootKeyObjectForSilo = (struct _DMA_ADAPTER *)CmGetRootKeyObjectForSilo((INT64)v6);
JobSilo = (unsigned int)CmSetCallbackObjectContext((_POOL_TYPE)RootKeyObjectForSilo, (UINT64)&VrpCallbackCookie);
if( JobSilo < 0 )
{
LABEL_37:
PsRemoveSiloContext(v6, (unsigned int)VrpSiloContextSlot, 0i64);
goto LABEL_24;
}
PsMakeSiloContextPermanent(v6, (unsigned int)VrpSiloContextSlot);
JobSilo = 0;
v13 = v33;
LABEL_19:
if( v13 )
VrpDestroyNamespaceNode(v8, v13);
if( v31 )
VrpUnlockJobContextExclusive((INT64)v8);
v4 = 0i64;
if( JobSilo >= 0 || !v3 )
goto LABEL_24;
goto LABEL_37;
}
}
JobSilo = -1073741670;
}
LABEL_24:
if( v8 )
VrpDereferenceJobContext(v8);
if( RootKeyObjectForSilo )
HalPutDmaAdapter(RootKeyObjectForSilo);
if( v4 )
VrpFreeKeyContext(v4);
if( v35 )
ObfDereferenceObjectWithTag(v35, 0x52566D43ui64);
return JobSilo;
}Referenced by:
VrpIoctlDeviceDispatch