PiAuCreateStandardSecurityObject
__int64 __fastcall PiAuCreateStandardSecurityObject(PSID *a1){
ACL *v2;
VOID *v3;
unsigned int v4;
PVOID *v5;
__int64 *v6;
int Acl;
__int64 v8;
__int64 v9;
_DWORD *v10;
__int64 v11;
__int64 v12;
UINT32 v13;
__int64 *v14;
__int64 v15;
struct _ACL *PoolWithTag;
unsigned int v17;
__int64 *v18;
ULONG v19;
VOID *v20;
__int64 *v21;
ULONG BufferLength[2];
_BYTE SecurityDescriptor[40];
__int64 v25;
__int64 result[22];
LOWORD(BufferLength[1]) = 1280;
BufferLength[0] = 0;
v25 = 0i64;
v2 = 0i64;
v3 = 0i64;
memset((INT64)result, 0i64);
v4 = 0;
memset(SecurityDescriptor, 0, sizeof(SecurityDescriptor));
v5 = (PVOID *)result;
v6 = PiAuSwDeviceCreateSidSubAuthorities;
do
{
Acl = PiAuAllocateAndInitializeSid(
(VOID **)&result[v4],
(SID_IDENTIFIER_AUTHORITY *)BufferLength,
*(unsigned int *)v6);
if( Acl < 0 )
goto LABEL_42;
v8 = *(_QWORD *)SecurityDescriptor;
v9 = 0i64;
if( *(_DWORD *)v6 )
{
v10 = *v5;
do
{
v10[v9 + 2] = *((_DWORD *)PiAuSwDeviceCreateSidSubAuthorities + v8 + v9 + 1);
v9 = (unsigned int)(v9 + 1);
}
while( (unsigned int)v9 < *(_DWORD *)v6 );
}
if( !RtlValidSid(*v5) )
{
Acl = -1073741595;
LABEL_42:
v11 = 21i64;
goto LABEL_30;
}
++v4;
v6 = (__int64 *)((char *)v6 + 28);
*(_QWORD *)SecurityDescriptor = v8 + 7;
++v5;
}
while( v4 < 0x15 );
v11 = 21i64;
v12 = 21i64;
v13 = 4
* (*((unsigned __int8 *)a1[6] + 1)
+ *((unsigned __int8 *)*a1 + 1)
+ *((unsigned __int8 *)a1[4] + 1)
+ *((unsigned __int8 *)a1[5] + 1)
+ *((unsigned __int8 *)a1[3] + 1)
+ *((unsigned __int8 *)a1[2] + 1))
+ 104;
v14 = result;
do
{
v15 = *v14++;
v13 += 4 * *(unsigned __int8 *)(v15 + 1) + 16;
--v12;
}
while( v12 );
PoolWithTag = (struct _ACL *)ExAllocatePoolWithTag(PagedPool, v13, 0x20207050ui64);
v2 = PoolWithTag;
if( PoolWithTag )
{
Acl = RtlCreateAcl(PoolWithTag, v13, 2u);
if( Acl >= 0 )
{
Acl = RtlAddAccessAllowedAceEx(v2, 2ui64, 0i64, 0x201E7ui64, a1[2]);
if( Acl >= 0 )
{
Acl = RtlAddAccessDeniedAceEx(v2, 2ui64, 0i64, 0xF01FFui64, a1[3]);
if( Acl >= 0 )
{
Acl = RtlAddAccessAllowedAceEx(v2, 2ui64, 0i64, 0xF01FFui64, *a1);
if( Acl >= 0 )
{
Acl = RtlAddAccessAllowedAceEx(v2, 2ui64, 0i64, 0x20125ui64, a1[4]);
if( Acl >= 0 )
{
Acl = RtlAddAccessAllowedAceEx(v2, 2ui64, 0i64, 0x40ui64, a1[5]);
if( Acl >= 0 )
{
Acl = RtlAddAccessAllowedAceEx(v2, 2ui64, 0i64, 0x40ui64, a1[6]);
if( Acl >= 0 )
{
v17 = 0;
v18 = result;
while( 1 )
{
Acl = RtlAddAccessAllowedAceEx(v2, 2ui64, 0i64, 0x80ui64, (VOID *)*v18);
if( Acl < 0 )
break;
++v17;
++v18;
if( v17 >= 0x15 )
{
Acl = RtlCreateSecurityDescriptor(&SecurityDescriptor[8], 1ui64);
if( Acl >= 0 )
{
Acl = RtlSetDaclSecurityDescriptor(&SecurityDescriptor[8], 1u, v2, 0);
if( Acl >= 0 )
{
Acl = RtlSetOwnerSecurityDescriptor(&SecurityDescriptor[8], *a1, 0);
if( Acl >= 0 )
{
Acl = RtlSetGroupSecurityDescriptor(&SecurityDescriptor[8], *a1, 0);
if( Acl >= 0 )
{
if( RtlValidSecurityDescriptor(&SecurityDescriptor[8])
&& (v19 = RtlLengthSecurityDescriptor(&SecurityDescriptor[8]),
BufferLength[0] = v19,
v19 >= 0x28) )
{
v20 = ExAllocatePoolWithTag(PagedPool, v19, 0x20207050ui64);
v3 = v20;
if( !v20 )
goto LABEL_39;
memset((INT64)v20, 0i64);
Acl = RtlAbsoluteToSelfRelativeSD(&SecurityDescriptor[8], v3, (UINT64 *)BufferLength);
if( Acl >= 0 )
{
PiAuSecurityObject = v3;
v3 = 0i64;
}
}
else
{
Acl = -1073741595;
}
}
}
}
}
break;
}
}
}
}
}
}
}
}
}
}
else
{
LABEL_39:
Acl = -1073741670;
}
LABEL_30:
v21 = result;
do
{
if( *v21 )
ExFreePoolWithTag((PVOID)*v21, 0);
++v21;
--v11;
}
while( v11 );
if( v2 )
ExFreePoolWithTag(v2, 0);
if( v3 )
ExFreePoolWithTag(v3, 0);
return(unsigned int)Acl;
}Referenced by:
PiAuCreateSecurityObjects