SeCaptureSecurityDescriptor
NTSTATUS __stdcall SeCaptureSecurityDescriptor(
VOID *InputSecurityDescriptor,
INT8 RequestorMode,
POOL_TYPE PoolType,
UINT8 ForceCapture,
VOID **OutputSecurityDescriptor,
INT64 a6,
INT64 a7){
unsigned int v8;
unsigned int v9;
unsigned __int64 v10;
unsigned __int64 v11;
char v12;
char *v13;
char *v14;
unsigned __int16 *v15;
unsigned __int16 *v16;
unsigned __int64 v17;
size_t v18;
size_t v19;
unsigned int v20;
unsigned int v21;
unsigned int v22;
__int16 v23;
unsigned __int64 v24;
__int64 v25;
unsigned __int64 v26;
unsigned int v27;
unsigned __int64 v28;
unsigned __int64 v29;
unsigned __int64 v30;
int v31;
UINT64 v32;
VOID **PoolWithTag;
VOID **v34;
_ACL *v35;
INT8 v36;
VOID *v37;
VOID *v38;
char v39;
int v40;
int v41;
unsigned __int64 v43;
__int64 v44;
VOID *v45;
VOID *v46;
char v47;
int v48;
int v49;
size_t Size;
unsigned int v51;
int v52;
int v53;
size_t v54;
size_t v55;
char v56;
VOID *v57;
VOID *v58;
__int128 v59;
char *v60;
unsigned __int16 *v61;
unsigned __int16 *Src;
unsigned int v63;
unsigned int v64;
unsigned int v65;
__int128 v66;
__int16 v67;
DWORD1(v59) = 0;
v8 = 0;
LOBYTE(v52) = 0;
v56 = 0;
Size = 0;
v51 = 0;
LOBYTE(v53) = 0;
v49 = 0;
if( !InputSecurityDescriptor )
{
*OutputSecurityDescriptor = 0i64;
return 0;
}
if( RequestorMode )
{
if( ((unsigned __int8)InputSecurityDescriptor & 3) != 0 )
ExRaiseDatatypeMisalignment();
v66 = *(_OWORD *)InputSecurityDescriptor;
v9 = *((_DWORD *)InputSecurityDescriptor + 4);
v10 = *(_QWORD *)InputSecurityDescriptor;
if( (WORD1(*(_OWORD *)InputSecurityDescriptor) & 0x8000u) == 0
&& ((unsigned __int8)InputSecurityDescriptor & 7) != 0 )
{
ExRaiseDatatypeMisalignment();
}
LOBYTE(v52) = 0;
Size = 0;
LOBYTE(v53) = 0;
v49 = 0;
}
else
{
if( !ForceCapture )
{
*OutputSecurityDescriptor = InputSecurityDescriptor;
return 0;
}
v66 = *(_OWORD *)InputSecurityDescriptor;
v9 = *((_DWORD *)InputSecurityDescriptor + 4);
v10 = *(_QWORD *)InputSecurityDescriptor;
}
if( (_BYTE)v66 != 1 )
return -1073741736;
LOBYTE(v59) = 1;
BYTE1(v59) = BYTE1(v10);
v11 = v10 >> 16;
v12 = BYTE2(v10);
WORD1(v59) = WORD1(v10) & 0x7FFF;
if( (v10 & 0x80000000) != 0 )
{
v17 = HIDWORD(v10);
if( (_DWORD)v17 )
v13 = (char *)InputSecurityDescriptor + v17;
else
v13 = 0i64;
}
else
{
v13 = (char *)*((_QWORD *)InputSecurityDescriptor + 1);
}
v57 = v13;
*((_QWORD *)&v59 + 1) = v13;
if( (v11 & 0x8000u) == 0i64 )
{
v14 = (char *)*((_QWORD *)InputSecurityDescriptor + 2);
goto LABEL_16;
}
if( DWORD2(v66) )
{
v14 = (char *)InputSecurityDescriptor + DWORD2(v66);
LABEL_16:
v58 = v14;
goto LABEL_17;
}
v14 = 0i64;
v58 = 0i64;
LABEL_17:
v60 = v14;
if( (v11 & 0x10) != 0 )
{
if( (v11 & 0x8000u) == 0i64 )
{
v15 = (unsigned __int16 *)*((_QWORD *)InputSecurityDescriptor + 3);
}
else if( HIDWORD(v66) )
{
v15 = (unsigned __int16 *)((char *)InputSecurityDescriptor + HIDWORD(*((_QWORD *)&v66 + 1)));
}
else
{
v15 = 0i64;
}
}
else
{
v15 = 0i64;
}
v61 = v15;
if( (v11 & 4) != 0 )
{
if( (v11 & 0x8000u) == 0i64 )
{
v16 = (unsigned __int16 *)*((_QWORD *)InputSecurityDescriptor + 4);
}
else if( v9 )
{
v16 = (unsigned __int16 *)((char *)InputSecurityDescriptor + v9);
}
else
{
v16 = 0i64;
}
}
else
{
v16 = 0i64;
}
Src = v16;
v18 = 0;
v54 = 0;
v19 = 0;
v55 = 0;
v63 = 0;
v20 = 0;
v64 = 0;
v21 = 0;
v22 = 0;
v65 = 0;
v67 = v12 & 0x10;
if( (v12 & 0x10) != 0 && v15 )
{
if( RequestorMode )
{
v43 = (unsigned __int64)(v15 + 1);
if( v43 >= 0x7FFFFFFF0000i64 )
v43 = 0x7FFFFFFF0000i64;
v44 = *(unsigned __int16 *)v43;
v18 = *(unsigned __int16 *)v43;
v54 = v18;
if( *(_WORD *)v43 )
{
if( ((unsigned __int8)v61 & 3) != 0 )
ExRaiseDatatypeMisalignment();
v15 = v61;
if( (unsigned __int64)v61 + v44 > 0x7FFFFFFF0000i64 || (unsigned __int16 *)((char *)v61 + v44) < v61 )
MEMORY[0x7FFFFFFF0000] = 0;
}
else
{
v15 = v61;
}
v58 = v14;
v57 = v13;
v12 = BYTE2(v59);
v19 = 0;
LOBYTE(v52) = 0;
Size = 0;
LOBYTE(v53) = 0;
v49 = 0;
}
else
{
v18 = v15[1];
v54 = v18;
}
v8 = (v18 + 3) & 0xFFFFFFFC;
v63 = v8;
if( v8 - 8 > 0xFFF7 )
return -1073741705;
}
else
{
v15 = 0i64;
v61 = 0i64;
}
v23 = v12 & 4;
if( v23 && v16 )
{
if( RequestorMode )
{
v24 = (unsigned __int64)(v16 + 1);
if( v24 >= 0x7FFFFFFF0000i64 )
v24 = 0x7FFFFFFF0000i64;
v25 = *(unsigned __int16 *)v24;
v19 = *(unsigned __int16 *)v24;
v55 = v19;
if( *(_WORD *)v24 )
{
if( ((unsigned __int8)Src & 3) != 0 )
ExRaiseDatatypeMisalignment();
v16 = Src;
if( (unsigned __int64)Src + v25 > 0x7FFFFFFF0000i64 || (unsigned __int16 *)((char *)Src + v25) < Src )
MEMORY[0x7FFFFFFF0000] = 0;
}
else
{
v16 = Src;
}
v15 = v61;
v58 = v14;
v57 = v13;
v18 = v54;
LOBYTE(v52) = 0;
Size = 0;
LOBYTE(v53) = 0;
v49 = 0;
}
else
{
v19 = v16[1];
v55 = v19;
}
v20 = (v19 + 3) & 0xFFFFFFFC;
v64 = v20;
if( v20 - 8 > 0xFFF7 )
return -1073741705;
}
else
{
v16 = 0i64;
Src = 0i64;
}
if( v13 )
{
if( RequestorMode )
{
v26 = (unsigned __int64)(v13 + 1);
if( v26 >= 0x7FFFFFFF0000i64 )
v26 = 0x7FFFFFFF0000i64;
v52 = *(unsigned __int8 *)v26;
v56 = *(_BYTE *)v26;
v27 = 4 * v52 + 8;
Size = v27;
v51 = v27;
if( 4 * v52 == -8 )
{
v57 = (VOID *)*((_QWORD *)&v59 + 1);
}
else
{
if( (BYTE8(v59) & 3) != 0 )
ExRaiseDatatypeMisalignment();
v57 = (VOID *)*((_QWORD *)&v59 + 1);
v28 = *((_QWORD *)&v59 + 1) + v27;
if( v28 > 0x7FFFFFFF0000i64 || v28 < *((_QWORD *)&v59 + 1) )
MEMORY[0x7FFFFFFF0000] = 0;
}
v16 = Src;
v15 = v61;
v14 = v60;
v58 = v60;
v18 = v54;
v19 = v55;
LOBYTE(v53) = 0;
v49 = 0;
}
else
{
v48 = (unsigned __int8)v13[1];
LOBYTE(v52) = v48;
v56 = v48;
v27 = 4 * v48 + 8;
v51 = v27;
Size = v27;
}
v22 = (v27 + 3) & 0xFFFFFFFC;
v65 = v22;
}
if( v14 )
{
if( RequestorMode )
{
v29 = (unsigned __int64)(v14 + 1);
if( v29 >= 0x7FFFFFFF0000i64 )
v29 = 0x7FFFFFFF0000i64;
v53 = *(unsigned __int8 *)v29;
v49 = 4 * v53 + 8;
if( 4 * v53 == -8 )
{
v58 = v60;
}
else
{
if( ((unsigned __int8)v60 & 3) != 0 )
ExRaiseDatatypeMisalignment();
v58 = v60;
v30 = (unsigned __int64)&v60[4 * v53 + 8];
if( v30 > 0x7FFFFFFF0000i64 || v30 < (unsigned __int64)v60 )
MEMORY[0x7FFFFFFF0000] = 0;
}
v16 = Src;
v15 = v61;
v57 = (VOID *)*((_QWORD *)&v59 + 1);
v18 = v54;
v19 = v55;
LOBYTE(v52) = v56;
Size = v51;
v31 = 4 * v53 + 8;
}
else
{
LOBYTE(v53) = v14[1];
v31 = 4 * (unsigned __int8)v53 + 8;
v49 = v31;
}
v21 = (v31 + 3) & 0xFFFFFFFC;
}
v32 = v8 + 20 + v20 + v21 + v22;
PoolWithTag = ExAllocatePoolWithTag((unsigned int)PoolType, v32, 1666409811i64);
v34 = PoolWithTag;
if( !PoolWithTag )
return -1073741670;
memset(PoolWithTag, 0i64, v32);
*(_OWORD *)v34 = v59;
*((_DWORD *)v34 + 4) = (_DWORD)v60;
v35 = (_ACL *)((char *)v34 + 20);
*((_WORD *)v34 + 1) |= 0x8000u;
if( !v67 || !v15 )
{
*((_DWORD *)v34 + 3) = 0;
v36 = RequestorMode;
goto LABEL_80;
}
memmove((char *)v34 + 20, v15, v18);
v36 = RequestorMode;
if( !RequestorMode
|| v18 >= 8 && v18 == *((unsigned __int16 *)v34 + 11) && (RtlValidAcl((_ACL *)((char *)v34 + 20), v45, v46), v47) )
{
*((_DWORD *)v34 + 3) = 20;
*((_WORD *)v34 + 11) = v63;
v35 = (_ACL *)((char *)v35 + v63);
LABEL_80:
if( !v23 || !v16 )
{
*((_DWORD *)v34 + 4) = 0;
LABEL_87:
if( v57 )
{
memmove(v35, v57, Size);
v35->Sbz1 = v52;
if( v36
&& ((unsigned __int64)v35 <= 0x7FFFFFFF0000i64 || (unsigned __int8)v52 > 0xFu || (v35->AclRevision & 0xF) != 1) )
{
goto LABEL_131;
}
v40 = (_DWORD)v35 - (_DWORD)v34;
v35 = (_ACL *)((char *)v35 + v65);
}
else
{
v40 = 0;
}
*((_DWORD *)v34 + 1) = v40;
if( !v58 )
{
v41 = 0;
goto LABEL_99;
}
memmove(v35, v58, v49);
v35->Sbz1 = v53;
if( !v36
|| (unsigned __int64)v35 > 0x7FFFFFFF0000i64 && (unsigned __int8)v53 <= 0xFu && (v35->AclRevision & 0xF) == 1 )
{
v41 = (_DWORD)v35 - (_DWORD)v34;
LABEL_99:
*((_DWORD *)v34 + 2) = v41;
*OutputSecurityDescriptor = v34;
return 0;
}
LABEL_131:
ExFreePoolWithTag(v34, 0);
return -1073741704;
}
memmove(v35, v16, v19);
if( !v36 || v19 >= 8 && v19 == v35->AclSize && (RtlValidAcl(v35, v37, v38), v39) )
{
*((_DWORD *)v34 + 4) = (_DWORD)v35 - (_DWORD)v34;
v35->AclSize = v64;
v35 = (_ACL *)((char *)v35 + v64);
goto LABEL_87;
}
}
ExFreePoolWithTag(v34, 0);
return -1073741705;
}Referenced by:
AlpcpConnectPort
CmpCopySaclToVirtualKey
IopQuerySecureDeviceClassState
NtCreateWnfStateName
NtOpenObjectAuditAlarm
NtSetSecurityObject
ObpCaptureObjectCreateInformation
PipGetRegistrySecurityWithFallback
SeAccessCheckByTypeWithAdminlessChecks
SeTokenDefaultDaclChangedAuditAlarm
SepAccessCheckAndAuditAlarmWithAdminlessChecks