NtSetSecurityObject
NTSTATUS __stdcall NtSetSecurityObject(PVOID Handle, UINT64 SecurityInformation, PVOID SecurityDescriptor){
unsigned int v4;
int v5;
int v6;
ACCESS_MASK v7;
INT8 v8;
HANDLE v9;
int SecurityDescriptorInfo;
NTSTATUS v11;
struct _DMA_ADAPTER *v12;
PVOID v13;
unsigned int v14;
PVOID NewSecurityDescriptor;
PVOID OldSecurityDescriptorScope;
PVOID v17;
int v19;
int SaclSecurityDescriptor;
char v21;
UINT64 v22;
VOID *OldSecurityDescriptorAudit;
VOID *OldSecurityDescriptorAttribute;
char SaclDefaulted[4];
ACCESS_MASK DesiredAccess;
PVOID SecurityDescriptora;
PVOID v28;
PVOID OutputSecurityDescriptor;
PVOID Object;
PVOID P;
PVOID v32;
struct _OBJECT_HANDLE_INFORMATION OldSecurityDescriptorDaclOwner;
__int64 v34;
PACL Sacl;
unsigned int SaclPresent;
INT8 RequestorMode;
OutputSecurityDescriptor = 0i64;
v4 = SecurityInformation;
DesiredAccess = 0;
OldSecurityDescriptorDaclOwner = 0i64;
v28 = 0i64;
SecurityDescriptora = 0i64;
P = 0i64;
v32 = 0i64;
if( !SecurityDescriptor )
return -1073741819;
v5 = SecurityInformation & 0x80;
v6 = v4 & 0x100;
if( (v4 & 0x10000) != 0 )
{
v19 = v4 | 0x1FF;
v4 = v4 & 0xFFFFFE00 | 0x17F;
if( v5 )
v4 = v19;
if( !v6 )
v4 &= ~0x100u;
}
SeSetSecurityAccessMask(v4, (UINT64 *)&DesiredAccess);
v7 = DesiredAccess;
Object = 0i64;
v8 = *((_BYTE *)KeGetCurrentThread() + 562);
RequestorMode = v8;
SecurityDescriptorInfo = ObReferenceObjectByHandle(
v9,
DesiredAccess,
0i64,
v8,
&Object,
&OldSecurityDescriptorDaclOwner);
if( SecurityDescriptorInfo < 0 )
return SecurityDescriptorInfo;
v11 = SeCaptureSecurityDescriptor(SecurityDescriptor, v8, PagedPool, 1u, &OutputSecurityDescriptor);
v12 = (struct _DMA_ADAPTER *)Object;
SecurityDescriptorInfo = v11;
if( v11 < 0 )
{
LABEL_32:
HalPutDmaAdapter(v12);
return SecurityDescriptorInfo;
}
v13 = OutputSecurityDescriptor;
v14 = v4 & 0xFFFFFE07;
if( (v4 & 0x10000) == 0 || (*((_WORD *)OutputSecurityDescriptor + 1) & 0x10) != 0 )
v14 = v4;
if( ((v14 & 1) == 0 || *((_DWORD *)OutputSecurityDescriptor + 1))
&& ((v14 & 2) == 0 || *((_DWORD *)OutputSecurityDescriptor + 2)) )
{
if( (OldSecurityDescriptorDaclOwner.HandleAttributes & 4) == 0 )
v7 &= 0xFFF3FFFF;
if( !v7 )
goto LABEL_12;
SecurityDescriptorInfo = ObpAllocateAndQuerySecurityDescriptorInfo(Object, 8ui64, 0i64);
if( SecurityDescriptorInfo < 0 )
{
OldSecurityDescriptorScope = v28;
NewSecurityDescriptor = SecurityDescriptora;
LABEL_27:
if( NewSecurityDescriptor )
ExFreePoolWithTag(NewSecurityDescriptor, 0);
if( OldSecurityDescriptorScope )
ExFreePoolWithTag(OldSecurityDescriptorScope, 0);
SeReleaseSecurityDescriptor(v13, RequestorMode, 1u);
goto LABEL_32;
}
if( (v7 & 0xFEFFFFFF) != 0 )
{
NewSecurityDescriptor = SecurityDescriptora;
LOBYTE(SaclPresent) = 0;
SaclSecurityDescriptor = RtlGetSaclSecurityDescriptor(
SecurityDescriptora,
(UINT8 *)&SaclPresent,
&Sacl,
(UINT8 *)SaclDefaulted);
SecurityDescriptorInfo = SaclSecurityDescriptor;
v21 = SaclPresent;
if( !(_BYTE)SaclPresent )
{
v34 = 0i64;
v21 = (unsigned int)SepRmGlobalSaclFind(
&v34,
0i64,
(const UNICODE_STRING *)(ObTypeIndexTable[(unsigned __int8)(ObHeaderCookie ^ LOBYTE(v12[-2].DmaOperations) ^ ((unsigned __int16)((_WORD)v12 - 48) >> 8))]
+ 16),
1) != -1073741772;
}
if( SecurityDescriptorInfo < 0 )
{
LABEL_63:
OldSecurityDescriptorScope = v28;
goto LABEL_27;
}
if( v21 )
{
v22 = ((v7 & 0x80000) != 0 ? v14 & 0x13 : 0) | 4;
if( (v7 & 0x40000) == 0 )
v22 = (v7 & 0x80000) != 0 ? v14 & 0x13 : 0;
SecurityDescriptorInfo = ObpAllocateAndQuerySecurityDescriptorInfo(v12, v22, 0i64);
}
else
{
v7 &= 0xFFF3FFFF;
}
}
else
{
LABEL_12:
NewSecurityDescriptor = SecurityDescriptora;
}
if( SecurityDescriptorInfo >= 0 )
{
if( (v14 & 0x40) != 0
&& ((POBJECT_TYPE *)ObTypeIndexTable[(unsigned __int8)ObHeaderCookie ^ LOBYTE(v12[-2].DmaOperations) ^ (unsigned __int64)(unsigned __int8)((unsigned __int16)((_WORD)v12 - 48) >> 8)] != IoFileObjectType
|| (HIDWORD(v12->DmaOperations->FreeAdapterChannel) & 0x10) == 0) )
{
SecurityDescriptorInfo = ObpAllocateAndQuerySecurityDescriptorInfo(v12, 0x40ui64, 0i64);
}
OldSecurityDescriptorScope = v28;
if( SecurityDescriptorInfo < 0 )
goto LABEL_21;
SaclPresent = v14 & 0x20;
if( (v14 & 0x20) != 0
&& ((POBJECT_TYPE *)ObTypeIndexTable[(unsigned __int8)ObHeaderCookie ^ LOBYTE(v12[-2].DmaOperations) ^ (unsigned __int64)(unsigned __int8)((unsigned __int16)((_WORD)v12 - 48) >> 8)] != IoFileObjectType
|| (HIDWORD(v12->DmaOperations->FreeAdapterChannel) & 0x10) == 0) )
{
SecurityDescriptorInfo = ObpAllocateAndQuerySecurityDescriptorInfo(v12, 0x20ui64, 0i64);
}
if( SecurityDescriptorInfo >= 0
&& (SecurityDescriptorInfo = ObSetSecurityObjectByPointer(v12, v14, v13), SecurityDescriptorInfo >= 0)
&& (v7 || SaclPresent) )
{
v17 = P;
LODWORD(OldSecurityDescriptorAttribute) = v14;
LODWORD(OldSecurityDescriptorAudit) = v7;
SeSecurityDescriptorChangedAuditAlarm(
0i64,
(UNICODE_STRING *)v12,
(VOID *)(ObTypeIndexTable[(unsigned __int8)ObHeaderCookie ^ LOBYTE(v12[-2].DmaOperations) ^ (unsigned __int64)(unsigned __int8)((unsigned __int16)((_WORD)v12 - 48) >> 8)]
+ 16),
0i64,
(UINT64)Handle,
0i64,
OldSecurityDescriptorAudit,
OldSecurityDescriptorAttribute,
OldSecurityDescriptorScope,
NewSecurityDescriptor);
}
else
{
LABEL_21:
v17 = P;
}
if( v32 )
ExFreePoolWithTag(v32, 0);
if( v17 )
ExFreePoolWithTag(v17, 0);
v13 = OutputSecurityDescriptor;
goto LABEL_27;
}
goto LABEL_63;
}
SeReleaseSecurityDescriptor(OutputSecurityDescriptor, v8, 1u);
HalPutDmaAdapter((PADAPTER_OBJECT)Object);
return -1073741703;
}Referenced by:
RtlpSysVolCheckOwnerAndSecurity
RtlpSysVolTakeOwnership