VrpHandleIoctlCreateNamespaceNode
NTSTATUS __stdcall VrpHandleIoctlCreateNamespaceNode(PVOID Data, UINT64 DataLength, INT8 RequestorMode){
unsigned int v3;
UINT64 *v5;
int v6;
INT64 v7;
int v8;
int v9;
unsigned int v10;
unsigned int v11;
NTSTATUS JobSilo;
int v13;
unsigned __int64 v14;
int v15;
WCHAR *v16;
SIZE_T v17;
WCHAR *v18;
int v19;
SIZE_T Tag;
INT64 Taga;
WCHAR *v23;
INT64 v24;
CHAR **v25;
WCHAR *v26;
PWCHAR FullPath;
UINT64 v28;
VOID *v29[2];
UNICODE_STRING v30;
_EJOB *Silo;
INT64 v32;
PVOID Object;
Object = 0i64;
FullPath = 0i64;
v3 = DataLength;
v32 = 0i64;
Silo = 0i64;
v5 = 0i64;
v6 = 0;
v7 = 0i64;
v30 = 0i64;
*(_OWORD *)v29 = 0i64;
if( (unsigned int)DataLength < 0x18 )
return -1073741811;
v8 = *((unsigned __int16 *)Data + 4);
if( (v8 & 1) != 0 || (v9 = *((unsigned __int16 *)Data + 5), (v9 & 1) != 0) )
{
JobSilo = -1073741811;
goto LABEL_25;
}
if( !(_WORD)v8 )
return -1073741811;
if( !(_WORD)v9 )
return -1073741811;
v10 = v8 + 20;
v11 = v10 + v9;
if( v10 > v11 || v3 < v11 )
return -1073741811;
JobSilo = ObReferenceObjectByHandleWithTag(
*(HANDLE *)Data,
6u,
(POBJECT_TYPE)PsJobType,
RequestorMode,
0x52566D43u,
&Object,
0i64);
if( JobSilo < 0 )
goto LABEL_19;
v13 = *((_DWORD *)Data + 3);
v30.Buffer = (wchar_t *)((char *)Data + 20);
v14 = *((unsigned __int16 *)Data + 4);
v30.MaximumLength = v14;
v30.Length = v14;
v29[1] = (char *)Data + 2 * (v14 >> 1) + 20;
LOWORD(v14) = *((_WORD *)Data + 5);
v15 = *((_DWORD *)Data + 4);
WORD1(v29[0]) = v14;
LOWORD(v29[0]) = v14;
if( (v13 & 7) == v13 )
{
JobSilo = PsGetJobSilo((_EJOB *)Object, &Silo);
if( JobSilo < 0 )
goto LABEL_19;
if( !PsIsThreadInSilo((__int64)KeGetCurrentThread(), (__int64)Silo) )
{
v28 = 0i64;
VRegEnabledInJob(&v28);
JobSilo = PsGetPermanentSiloContext(Silo, (unsigned int)VrpSiloContextSlot, (PVOID *)&FullPath);
if( JobSilo < 0 )
goto LABEL_19;
v5 = (UINT64 *)FullPath;
VrpLockJobContextExclusive(
FullPath,
v16,
v17,
v18,
Tag,
v23,
(SIZE_T)v25,
v26,
(SIZE_T)FullPath,
v28,
(PWCHAR)v29[0]);
LODWORD(v24) = v15;
LODWORD(Taga) = v13;
v6 = 1;
v19 = VrpCreateNamespaceNode((INT64)v5, &v30, (VOID *)v28, (const VOID **)v29, Taga, v24, (CHAR **)&v32);
v7 = v32;
JobSilo = v19;
if( v19 >= 0 )
{
JobSilo = VrpAddNamespaceNodeToList(v5, (UNICODE_STRING *)v32);
if( JobSilo >= 0 )
{
JobSilo = VrpCreateNamespaceNodePlaceholderKey(v7);
if( JobSilo >= 0 )
{
JobSilo = 0;
LABEL_18:
VrpUnlockJobContextExclusive((INT64)v5);
goto LABEL_19;
}
}
}
LABEL_25:
if( v7 )
VrpDestroyNamespaceNode(v5, v7);
if( !v6 )
goto LABEL_19;
goto LABEL_18;
}
}
JobSilo = -1073741811;
LABEL_19:
if( Object )
ObfDereferenceObjectWithTag(Object, 0x52566D43ui64);
return JobSilo;
}Referenced by:
VrpIoctlDeviceDispatch