VrpHandleIoctlCreateMultipleNamespaceNodes
INT64 __stdcall VrpHandleIoctlCreateMultipleNamespaceNodes(PVOID Data, UINT64 DataLength, INT8 RequestorMode){
unsigned int v3;
_QWORD *v5;
UINT64 *v6;
unsigned __int64 v7;
int v8;
int JobSilo;
unsigned __int64 v10;
UINT64 v11;
NTSTATUS PermanentSiloContext;
WCHAR *v13;
SIZE_T v14;
WCHAR *v15;
unsigned __int64 v16;
char *v17;
__int64 v18;
unsigned __int64 v19;
__int64 v20;
int v21;
_QWORD *PoolWithTag;
VOID *v23;
unsigned int v24;
_QWORD *i;
_QWORD *j;
INT64 v27;
SIZE_T Tag;
INT64 Taga;
WCHAR *Object;
PVOID *Objecta;
POBJECT_HANDLE_INFORMATION HandleInformation;
WCHAR *v34;
UINT64 v35;
CHAR *v36;
VOID *v37[2];
UNICODE_STRING v38;
unsigned int v39;
PWCHAR FullPath;
INT64 v41;
PVOID v42;
v39 = DataLength;
v3 = DataLength;
v42 = 0i64;
v5 = 0i64;
FullPath = 0i64;
v6 = 0i64;
v41 = 0i64;
v7 = 12i64;
v8 = 0;
if( (unsigned int)DataLength >= 0xC )
{
ObReferenceObjectByHandleWithTag(
*(HANDLE *)Data,
6u,
(POBJECT_TYPE)PsJobType,
RequestorMode,
0x52566D43u,
&v42,
0i64);
JobSilo = PsGetJobSilo((_EJOB *)v42, (_EJOB **)&v41);
if( JobSilo < 0 )
goto LABEL_34;
if( !PsIsThreadInSilo((__int64)KeGetCurrentThread(), v41) )
{
v35 = v11;
VRegEnabledInJob(&v35);
PermanentSiloContext = PsGetPermanentSiloContext(
(_EJOB *)v41,
(unsigned int)VrpSiloContextSlot,
(PVOID *)&FullPath);
v6 = (UINT64 *)FullPath;
JobSilo = PermanentSiloContext;
if( PermanentSiloContext < 0 )
goto LABEL_34;
VrpLockJobContextExclusive(
FullPath,
v13,
v14,
v15,
Tag,
Object,
(SIZE_T)HandleInformation,
v34,
v35,
(INT64)v36,
(PWCHAR)v37[0]);
v8 = 1;
LODWORD(FullPath) = 0;
if( *((_DWORD *)Data + 2) )
{
do
{
v16 = v7 + 12;
v36 = 0i64;
v17 = (char *)Data + v7;
v38 = 0i64;
*(_OWORD *)v37 = 0i64;
if( v7 > v7 + 12 )
goto LABEL_29;
if( v3 < v16 )
goto LABEL_29;
v18 = *((unsigned __int16 *)v17 + 2);
if( (v18 & 1) != 0 )
goto LABEL_29;
if( !(_WORD)v18 )
goto LABEL_29;
v19 = v18 + v16;
if( v16 > v18 + v16 )
goto LABEL_29;
v20 = *((unsigned __int16 *)v17 + 3);
if( (v20 & 1) != 0 )
goto LABEL_29;
if( !(_WORD)v20 )
goto LABEL_29;
v7 = v19 + v20;
if( v19 > v19 + v20 )
goto LABEL_29;
if( v3 < v7 )
goto LABEL_29;
v21 = *((_DWORD *)v17 + 2);
v38.Buffer = (wchar_t *)(v17 + 12);
v38.MaximumLength = v18;
v38.Length = v18;
WORD1(v37[0]) = v20;
LOWORD(v37[0]) = v20;
v37[1] = &v17[2 * ((unsigned __int64)(unsigned int)v18 >> 1) + 12];
LODWORD(v41) = *(_DWORD *)v17;
if( (v21 & 7) != v21 )
{
LABEL_29:
JobSilo = -1073741811;
goto LABEL_34;
}
PoolWithTag = ExAllocatePoolWithTag(PagedPool, 0x10ui64, 0x67655256ui64);
if( !PoolWithTag )
{
JobSilo = -1073741670;
goto LABEL_34;
}
v23 = (VOID *)v35;
*PoolWithTag = v5;
PoolWithTag[1] = 0i64;
v5 = PoolWithTag;
LODWORD(Objecta) = v41;
LODWORD(Taga) = v21;
JobSilo = VrpCreateNamespaceNode((INT64)v6, &v38, v23, (const VOID **)v37, Taga, (INT64)Objecta, &v36);
if( JobSilo < 0 )
goto LABEL_34;
v24 = (_DWORD)FullPath + 1;
v3 = v39;
v5[1] = v36;
LODWORD(FullPath) = v24;
}
while( v24 < *((_DWORD *)Data + 2) );
}
for( i = v5; i; i = (_QWORD *)*i )
{
JobSilo = VrpAddNamespaceNodeToList(v6, (UNICODE_STRING *)i[1]);
if( JobSilo < 0 )
goto LABEL_34;
}
for( j = v5; j; j = (_QWORD *)*j )
{
JobSilo = VrpCreateNamespaceNodePlaceholderKey(j[1]);
if( JobSilo < 0 )
goto LABEL_34;
}
JobSilo = 0;
goto LABEL_34;
}
v6 = (UINT64 *)FullPath;
JobSilo = -1073741811;
v10 = (unsigned int)v11;
}
else
{
JobSilo = -1073741811;
v10 = 0i64;
}
while( v10 )
{
if( JobSilo < 0 )
{
v27 = *(_QWORD *)(v10 + 8);
if( v27 )
VrpDestroyNamespaceNode(v6, v27);
}
ExFreePoolWithTag((PVOID)v10, 0x67655256u);
LABEL_34:
v10 = (unsigned __int64)v5;
if( v5 )
v5 = (_QWORD *)*v5;
}
if( v8 )
VrpUnlockJobContextExclusive((INT64)v6);
if( v42 )
ObfDereferenceObjectWithTag(v42, 0x52566D43ui64);
return(unsigned int)JobSilo;
}Referenced by:
VrpIoctlDeviceDispatch