SeOpenObjectForDeleteAuditAlarmWithTransaction
VOID __stdcall SeOpenObjectForDeleteAuditAlarmWithTransaction(
_UNICODE_STRING *ObjectTypeName,
PVOID Object,
_UNICODE_STRING *AbsoluteObjectName,
PVOID SecurityDescriptor,
_ACCESS_STATE *AccessState,
UINT8 ObjectCreated,
UINT8 AccessGranted,
CHAR AccessMode,
_GUID *TransactionId,
UINT8 *GenerateOnClose){
_UNICODE_STRING *v11;
PVOID v12;
UINT8 v13;
UINT8 v14;
PVOID v15;
UNICODE_STRING *v16;
UNICODE_STRING *v17;
SECURITY_SUBJECT_CONTEXT *v18;
int TypeString;
unsigned int v20;
__int16 v21;
struct _ACL *v22;
struct _ACL *v23;
__int64 v24;
__int64 v25;
UINT8 v26;
__int16 v27;
_ACL *v28;
__int64 v29;
PRIVILEGE_SET *v30;
UINT16 *v31;
_GUID *v32;
_GUID *v33;
void *v34;
VOID *PoolWithTag;
UNICODE_STRING *v36;
void *v37;
VOID *v38;
UNICODE_STRING *v39;
BOOL GenerateAudit;
__int64 v41;
UINT64 GrantedAccess;
UINT8 v43;
UINT8 v44;
UINT8 GenerateAlarm[3];
UINT16 FlatSubCategoryId[2];
INT64 AuditStatus;
_PRIVILEGE_SET **v48;
PVOID v49;
PACCESS_TOKEN Token;
PVOID P;
v11 = ObjectTypeName;
v12 = Object;
v13 = 0;
v44 = 0;
v14 = 0;
GenerateAlarm[0] = 0;
v15 = 0i64;
P = 0i64;
v16 = 0i64;
v49 = 0i64;
v17 = 0i64;
LODWORD(AuditStatus) = 0;
FlatSubCategoryId[0] = 999;
if( AccessMode )
{
v18 = (SECURITY_SUBJECT_CONTEXT *)((char *)AccessState + 32);
v48 = (_PRIVILEGE_SET **)*((_QWORD *)AccessState + 9);
Token = (PACCESS_TOKEN)*((_QWORD *)AccessState + 4);
if( !Token )
Token = (PACCESS_TOKEN)*((_QWORD *)AccessState + 6);
if( ObjectTypeName && ObjectTypeName->Length )
{
v17 = ObjectTypeName;
}
else if( v12 )
{
TypeString = SepQueryTypeString(v12, (UNICODE_STRING **)&v49);
v15 = v49;
LODWORD(AuditStatus) = TypeString;
if( TypeString < 0 )
goto LABEL_66;
v11 = ObjectTypeName;
v18 = (SECURITY_SUBJECT_CONTEXT *)((char *)AccessState + 32);
v12 = Object;
if( v49 )
v17 = (UNICODE_STRING *)v49;
}
if( !SecurityDescriptor )
goto LABEL_34;
LOBYTE(GenerateAudit) = 1;
if( !SepAdtAuditObjectAccessWithContext(
v12,
v11,
AccessGranted,
AccessGranted == 0,
v18,
GenerateAudit,
FlatSubCategoryId) )
goto LABEL_34;
v20 = *((_DWORD *)AccessState + 4) | *((_DWORD *)AccessState + 5);
v21 = *((_WORD *)SecurityDescriptor + 1);
if( (v21 & 0x10) != 0 )
{
if( v21 >= 0 )
{
v22 = (struct _ACL *)*((_QWORD *)SecurityDescriptor + 3);
}
else
{
v24 = *((unsigned int *)SecurityDescriptor + 3);
if( (_DWORD)v24 )
v22 = (struct _ACL *)((char *)SecurityDescriptor + v24);
else
v22 = 0i64;
}
if( v21 >= 0 )
{
v23 = (struct _ACL *)*((_QWORD *)SecurityDescriptor + 3);
goto LABEL_25;
}
v25 = *((unsigned int *)SecurityDescriptor + 3);
if( (_DWORD)v25 )
{
v23 = (struct _ACL *)((char *)SecurityDescriptor + v25);
goto LABEL_25;
}
}
else
{
v22 = 0i64;
}
v23 = 0i64;
LABEL_25:
v26 = AccessGranted;
SeExamineSacl(v23, v22, Token, v20, AccessGranted, &v44, GenerateAlarm);
v27 = *((_WORD *)SecurityDescriptor + 1);
if( (v27 & 0x10) == 0 )
goto LABEL_26;
if( v27 >= 0 )
{
v28 = (_ACL *)*((_QWORD *)SecurityDescriptor + 3);
goto LABEL_31;
}
v29 = *((unsigned int *)SecurityDescriptor + 3);
if( (_DWORD)v29 )
v28 = (_ACL *)((char *)SecurityDescriptor + v29);
else
LABEL_26:
v28 = 0i64;
LABEL_31:
SeExamineGlobalSacl(ObjectTypeName, v28, Token, v20, AccessGranted, &v44, GenerateAlarm);
v13 = v44;
if( v44 )
{
*GenerateOnClose = 1;
LABEL_42:
*((_BYTE *)AccessState + 9) = 1;
if( AbsoluteObjectName && AbsoluteObjectName->Length )
{
v16 = AbsoluteObjectName;
goto LABEL_49;
}
if( !Object )
{
LABEL_49:
if( v26 )
{
v33 = (_GUID *)v48;
LODWORD(GrantedAccess) = *((_DWORD *)AccessState + 5);
SepAdtOpenObjectForDeleteAuditAlarm(
FlatSubCategoryId[0],
(_UNICODE_STRING *)v18,
(VOID **)AbsoluteObjectName,
v17,
v16,
*((_TOKEN **)AccessState + 4),
*((_TOKEN **)AccessState + 6),
v41,
GrantedAccess,
*v48,
v43,
*((VOID **)AccessState + 7),
TransactionId);
if( v16 )
{
v34 = (void *)*((_QWORD *)AccessState + 17);
if( v34 )
{
ExFreePoolWithTag(v34, 0);
*((_WORD *)AccessState + 64) = 0;
*((_WORD *)AccessState + 65) = 0;
}
PoolWithTag = ExAllocatePoolWithTag(PagedPool, v16->MaximumLength, 0x20206553ui64);
*((_QWORD *)AccessState + 17) = PoolWithTag;
if( PoolWithTag )
{
*((_WORD *)AccessState + 65) = v16->MaximumLength;
RtlCopyUnicodeString((UNICODE_STRING *)AccessState + 8, v16, v36);
}
v33 = (_GUID *)v48;
}
if( v17 )
{
v37 = (void *)*((_QWORD *)AccessState + 19);
if( v37 )
{
ExFreePoolWithTag(v37, 0);
*((_WORD *)AccessState + 72) = 0;
*((_WORD *)AccessState + 73) = 0;
}
v38 = ExAllocatePoolWithTag(PagedPool, v17->MaximumLength, 0x20206553ui64);
*((_QWORD *)AccessState + 19) = v38;
if( v38 )
{
*((_WORD *)AccessState + 73) = v17->MaximumLength;
RtlCopyUnicodeString((UNICODE_STRING *)AccessState + 9, v17, v39);
}
}
if( TransactionId )
v33[2] = *TransactionId;
}
else
{
v32 = TransactionId;
if( !TransactionId )
v32 = (_GUID *)(v48 + 4);
SepAdtOpenObjectAuditAlarm(
FlatSubCategoryId[0],
(__int64)&SeSubsystemName,
0i64,
&v17->Length,
(__int64)v16,
SecurityDescriptor,
*((_QWORD *)AccessState + 4),
*((_QWORD *)AccessState + 6),
*((_DWORD *)AccessState + 6),
*((_DWORD *)AccessState + 5),
(__int64)*v48,
0,
*((_QWORD *)AccessState + 7),
2,
0i64,
0,
0i64,
(__int64)v32,
(__int64)AccessState);
}
goto LABEL_66;
}
LODWORD(AuditStatus) = SepQueryNameString(Object, (_OBJECT_NAME_INFORMATION **)&P);
if( (int)AuditStatus >= 0 )
{
if( P )
v16 = (UNICODE_STRING *)P;
goto LABEL_49;
}
LABEL_66:
if( P )
ExFreePoolWithTag(P, 0);
if( v15 )
ExFreePoolWithTag(v15, 0);
LABEL_70:
if( (int)AuditStatus < 0 )
SepAuditFailed((unsigned int)AuditStatus);
return;
}
v14 = GenerateAlarm[0];
LABEL_34:
if( AccessGranted )
{
v30 = *v48;
if( *v48 )
{
if( v30->PrivilegeCount )
{
v31 = FlatSubCategoryId;
LOBYTE(v31) = AccessGranted;
if( (unsigned __int8)SepAdtAuditPrivilegeUseWithContext(
v30,
(INT64)v31,
0i64,
(SECURITY_SUBJECT_CONTEXT *)AccessState + 1,
FlatSubCategoryId) )
{
v13 = 1;
*((_BYTE *)AccessState + 124) = 1;
}
}
}
}
if( !v13 && !v14 )
goto LABEL_70;
v26 = AccessGranted;
goto LABEL_42;
}
}Referenced by:
SeOpenObjectForDeleteAuditAlarm