SepValidateReferencedCachedHandles
INT64 __fastcall SepValidateReferencedCachedHandles(INT64 a1, CHAR **a2, UINT64 a3, HANDLE *a4){
unsigned int v4;
int v6;
int AppContainerSidType;
struct _DMA_ADAPTER *v9;
unsigned int v10;
CHAR *v11;
WCHAR v12;
int v13;
WCHAR v14;
UNICODE_STRING *v15;
NTSTATUS v16;
char *v17;
_OBJECT_TYPE *v18;
__int64 v19;
char *v20;
unsigned int v21;
WCHAR v23;
int v24;
WCHAR v25;
int v26;
WCHAR v27;
char v28;
int v29;
int v30;
unsigned int v31;
PVOID P;
PVOID Object[2];
HANDLE *v34;
struct _UNICODE_STRING UnicodeString;
struct _UNICODE_STRING DestinationString;
char v37[8];
struct _UNICODE_STRING v38;
char v39;
wchar_t pszDest[256];
wchar_t SourceString[256];
v4 = 0;
v34 = a4;
v31 = a3;
v6 = *(_DWORD *)a2;
v30 = 0;
v28 = 0;
AppContainerSidType = 0;
v29 = 0;
v9 = 0i64;
P = 0i64;
v10 = 0;
Object[0] = 0i64;
UnicodeString = 0i64;
if( v6 )
{
if( v6 != 1 )
goto LABEL_9;
Object[0] = a2 + 1;
RtlStringCchPrintfW(pszDest, 0x100ui64, (WCHAR *)L"\\Sessions\\%d");
AppContainerSidType = v26;
if( v26 < 0 )
goto LABEL_34;
RtlInitUnicodeString(&DestinationString, pszDest, v25);
v37[0] = 1;
v10 = 1;
if( *(_DWORD *)(a1 + 120) != (unsigned int)RtlGetCurrentServiceSessionId() )
goto LABEL_9;
RtlInitUnicodeString(&v38, L"\\BaseNamedObjects", v27);
v39 = 1;
}
else
{
AppContainerSidType = RtlGetAppContainerSidType(a2[1], &v29);
if( AppContainerSidType < 0 )
goto LABEL_34;
v11 = a2[1];
if( v29 == 2 )
{
AppContainerSidType = RtlConvertSidToUnicodeString(&UnicodeString, v11, 1u);
if( AppContainerSidType < 0 )
goto LABEL_34;
v28 = 1;
}
else
{
RtlSubAuthoritySid(a2[1], 0xBui64);
RtlSubAuthoritySid(v11, 0xAui64);
RtlSubAuthoritySid(v11, 9ui64);
RtlSubAuthoritySid(v11, 8ui64);
RtlStringCchPrintfW(SourceString, 0x100ui64, (WCHAR *)L"%u-%u-%u-%u");
v4 = 0;
AppContainerSidType = v24;
if( v24 < 0 )
goto LABEL_34;
RtlInitUnicodeString(&UnicodeString, SourceString, v23);
}
Object[0] = &UnicodeString;
RtlStringCchPrintfW(pszDest, 0x100ui64, (WCHAR *)L"\\Sessions\\%d");
AppContainerSidType = v13;
if( v13 < 0 )
goto LABEL_34;
RtlInitUnicodeString(&DestinationString, pszDest, v12);
v37[0] = 1;
RtlInitUnicodeString(&v38, L"\\Device\\NamedPipe", v14);
v39 = 0;
}
v10 = 2;
LABEL_9:
if( !v31 )
goto LABEL_34;
v15 = (UNICODE_STRING *)Object[0];
while( 1 )
{
if( v9 )
HalPutDmaAdapter(v9);
Object[0] = 0i64;
v16 = ObReferenceObjectByHandle(*v34, 0, 0i64, 0, Object, 0i64);
v9 = (struct _DMA_ADAPTER *)Object[0];
AppContainerSidType = v16;
if( v16 < 0 )
goto LABEL_33;
v17 = (char *)Object[0] - 48;
v18 = (_OBJECT_TYPE *)ObTypeIndexTable[(unsigned __int8)ObHeaderCookie ^ *((unsigned __int8 *)Object[0] - 24) ^ (unsigned __int64)(unsigned __int8)((unsigned __int16)(LOWORD(Object[0]) - 48) >> 8)];
if( v18 != ObpDirectoryObjectType
&& v18 != ObpSymbolicLinkObjectType
&& (v18 != (_OBJECT_TYPE *)IoFileObjectType || *(_DWORD *)(*((_QWORD *)Object[0] + 1) + 72i64) != 17) )
{
break;
}
if( P )
{
ExFreePoolWithTag(P, 0);
P = 0i64;
}
AppContainerSidType = SepQueryNameString(v9, (_OBJECT_NAME_INFORMATION **)&P);
if( AppContainerSidType < 0 )
goto LABEL_34;
if( !P )
break;
if( !*((_WORD *)P + 1) )
break;
*(_OWORD *)Object = *(_OWORD *)P;
if( !v10 )
break;
while( !(unsigned __int8)RtlPrefixUnicodeString((char *)&DestinationString + 24 * v4, (INT64 *)Object) )
{
if( ++v4 >= v10 )
goto LABEL_53;
}
v19 = 3i64 * v4;
v4 = 0;
if( v37[8 * v19] )
{
if( (v17[26] & 2) != 0 )
v20 = &v17[-*((unsigned __int8 *)ObpInfoMaskToOffset + (v17[26] & 3))];
else
v20 = 0i64;
if( !v20 || !*((_WORD *)v20 + 5) )
break;
*(_OWORD *)Object = *(_OWORD *)(v20 + 8);
if( !RtlEqualUnicodeString((UNICODE_STRING *)Object, v15, 1u) )
{
v21 = 0;
while( !RtlEqualUnicodeString(
(UNICODE_STRING *)Object,
(UNICODE_STRING *)&AllowedCachedObjectNames[2 * v21],
1u) )
{
if( ++v21 >= 5 )
goto LABEL_53;
}
}
}
LABEL_33:
++v34;
if( ++v30 >= v31 )
goto LABEL_34;
}
LABEL_53:
AppContainerSidType = -1073741811;
LABEL_34:
if( P )
ExFreePoolWithTag(P, 0);
if( v9 )
HalPutDmaAdapter(v9);
if( v28 )
RtlFreeAnsiString(&UnicodeString);
return(unsigned int)AppContainerSidType;
}Referenced by:
SepSetTokenCachedHandles