VrpHandleIoctlInitializeJobForVreg
NTSTATUS __stdcall VrpHandleIoctlInitializeJobForVreg(
VOID *Data,
UINT64 DataLength,
INT64 RequestorMode,
_GUID *ActivityId,
VOID *Object,
UINT64 *NumberOfBytes){
int v6;
_UNICODE_STRING *v7;
_ADAPTER_OBJECT *RootKeyObjectForSilo;
_EJOB *v9;
NTSTATUS JobSilo;
_VRP_JOB_CONTEXT *v11;
wchar_t *v12;
_SIZE_T v13;
wchar_t *v14;
int v15;
_UNICODE_STRING *v16;
UINT8 IsThreadInSilo;
void *v18;
_UNICODE_STRING *v19;
_UNICODE_STRING v20;
VOID **PoolWithTag;
_SIZE_T ParseContext;
VOID *ParseContexta;
UINT64 ObjectBodySize;
wchar_t *ObjectBodySizea;
POBJECT_HANDLE_INFORMATION HandleInformation;
_SIZE_T HandleInformationa;
UINT64 v29;
wchar_t *v30;
_SIZE_T v31;
INT64 v32;
_EJOB *Silo;
__int64 a2[2];
char v36;
INT8 AccessMode;
_UNICODE_STRING *NamespaceNode;
AccessMode = RequestorMode;
NumberOfBytes = 0i64;
v6 = 0;
Object = 0i64;
v7 = 0i64;
Silo = 0i64;
RootKeyObjectForSilo = 0i64;
NamespaceNode = 0i64;
v9 = 0i64;
if( (unsigned int)DataLength < 8 )
return -1073741811;
LODWORD(v29) = 0;
LODWORD(HandleInformation) = 0;
LODWORD(ObjectBodySize) = 96;
JobSilo = ObCreateObject(
0,
*(&stru_140CF2E80 + 597),
0i64,
1,
0i64,
ObjectBodySize,
(UINT64)HandleInformation,
v29,
&Object);
if( JobSilo < 0 )
{
v11 = (_VRP_JOB_CONTEXT *)Object;
goto LABEL_24;
}
v11 = (_VRP_JOB_CONTEXT *)Object;
memset(Object, 0i64, 0x60u);
*((_QWORD *)v11 + 2) = 0i64;
JobSilo = VrpInitializeNamespaceNodeList(v11);
if( JobSilo < 0 )
goto LABEL_24;
JobSilo = VrpIncrementSiloCount();
if( JobSilo < 0 )
goto LABEL_24;
v11[22] = 1;
VrpLockJobContextExclusive(
(PWCHAR)v11,
v12,
v13,
v14,
ParseContext,
ObjectBodySizea,
HandleInformationa,
v30,
v31,
v32,
(PWCHAR)Silo);
v36 = 1;
v15 = VrpCreateNamespaceNode(
(UINT64 *)v11,
&CmRegistryContainersName,
0i64,
(const VOID **)&CmRegistryContainersName,
0,
-1,
(__int64)&NamespaceNode);
v16 = NamespaceNode;
JobSilo = v15;
if( v15 < 0 )
goto LABEL_19;
JobSilo = VrpAddNamespaceNodeToList(v11, NamespaceNode);
if( JobSilo < 0 )
goto LABEL_19;
NamespaceNode = 0i64;
VrpUnlockJobContextExclusive((INT64)v11);
v36 = 0;
LODWORD(ParseContexta) = 1381395779;
JobSilo = ObReferenceObjectByHandleWithTag(
*(VOID **)Data,
6ui64,
(_OBJECT_TYPE *)PsJobType,
AccessMode,
(UINT64)ParseContexta,
(VOID **)&NumberOfBytes,
0i64);
if( JobSilo < 0 )
goto LABEL_24;
JobSilo = PsGetJobSilo((_EJOB *)NumberOfBytes, &Silo);
if( JobSilo < 0 )
goto LABEL_24;
v9 = Silo;
IsThreadInSilo = PsIsThreadInSilo((_ETHREAD *)KeGetCurrentThread(), Silo);
v11 = (_VRP_JOB_CONTEXT *)Object;
if( IsThreadInSilo )
{
JobSilo = -1073741811;
}
else
{
v18 = Object;
*(_OWORD *)Object = *(_OWORD *)((char *)v9 + 1240);
LODWORD(v19) = VrpAllocateKeyContext(v18);
v7 = v19;
if( v19 )
{
v20 = *(_UNICODE_STRING *)((char *)v9 + 1240);
v6 = 1;
v19[2].Length = 1;
*v19 = v20;
PoolWithTag = ExAllocatePoolWithTag(1ui64, CmRegistryRootName.Length, 1734693462i64);
v7[1].Buffer = (wchar_t *)PoolWithTag;
if( PoolWithTag )
{
v7[1].Length = 0;
v7[1].MaximumLength = CmRegistryRootName.Length;
RtlUnicodeStringCopy(v7 + 1, &CmRegistryRootName);
a2[0] = 0i64;
JobSilo = CmpGetOrCreateContextForSiloNoRef(v9, (UINT64 *)a2);
if( JobSilo >= 0 )
{
JobSilo = CmpStartSiloRegistryNamespace(a2[0]);
if( JobSilo >= 0 )
JobSilo = 0;
}
if( JobSilo < 0 )
goto LABEL_24;
JobSilo = PsInsertSiloContext(v9, (unsigned int)VrpSiloContextSlot, v11);
if( JobSilo < 0 )
goto LABEL_24;
RootKeyObjectForSilo = (_ADAPTER_OBJECT *)CmGetRootKeyObjectForSilo(v9);
JobSilo = CmSetCallbackObjectContext(RootKeyObjectForSilo, &VrpCallbackCookie, v7, 0i64);
if( JobSilo < 0 )
{
LABEL_37:
PsRemoveSiloContext(v9, (unsigned int)VrpSiloContextSlot, 0i64);
goto LABEL_24;
}
PsMakeSiloContextPermanent(v9, (unsigned int)VrpSiloContextSlot);
JobSilo = 0;
v16 = NamespaceNode;
LABEL_19:
if( v16 )
VrpDestroyNamespaceNode((UINT64 *)v11, (__int64)v16);
if( v36 )
VrpUnlockJobContextExclusive((INT64)v11);
v7 = 0i64;
if( JobSilo >= 0 || !v6 )
goto LABEL_24;
goto LABEL_37;
}
}
JobSilo = -1073741670;
}
LABEL_24:
if( v11 )
VrpDereferenceJobContext(v11);
if( RootKeyObjectForSilo )
HalPutDmaAdapter(RootKeyObjectForSilo);
if( v7 )
VrpFreeKeyContext(v7);
if( NumberOfBytes )
ObfDereferenceObjectWithTag(NumberOfBytes, 0x52566D43ui64);
return JobSilo;
}Referenced by:
VrpIoctlDeviceDispatch