RtlSelfRelativeToAbsoluteSD2
NTSTATUS __stdcall RtlSelfRelativeToAbsoluteSD2(VOID *pSelfRelativeSecurityDescriptor, UINT64 *pBufferSize){
unsigned __int16 *v2;
__int16 v6;
char *v7;
char *v8;
char *v9;
_ACL *v10;
_ACL *v11;
unsigned int v12;
char *v13;
char *v14;
unsigned __int16 *p_AceCount;
UINT64 SaclSize;
VOID *Owner;
VOID *PrimaryGroup;
_ACL *Dacl;
_ACL *Sacl;
UINT64 OwnerSize;
UINT64 PrimaryGroupSize;
UINT64 DaclSize;
v2 = 0i64;
Owner = 0i64;
PrimaryGroup = 0i64;
Dacl = 0i64;
Sacl = 0i64;
LODWORD(DaclSize) = 0;
LODWORD(SaclSize) = 0;
LODWORD(OwnerSize) = 0;
LODWORD(PrimaryGroupSize) = 0;
if( !pSelfRelativeSecurityDescriptor )
return -1073741585;
if( !pBufferSize )
return -1073741584;
HIDWORD(SaclSize) = *(_DWORD *)pBufferSize;
if( HIDWORD(SaclSize) < 0x14 )
return -1073741811;
v6 = *((_WORD *)pSelfRelativeSecurityDescriptor + 1);
if( v6 >= 0 )
return -1073741593;
RtlpQuerySecurityDescriptor(
(_SECURITY_DESCRIPTOR *)pSelfRelativeSecurityDescriptor,
&Owner,
&OwnerSize,
&PrimaryGroup,
&PrimaryGroupSize,
&Dacl,
&DaclSize,
&Sacl,
&SaclSize);
v7 = (char *)Owner;
v8 = (char *)PrimaryGroup;
if( Owner <= PrimaryGroup )
v9 = (char *)PrimaryGroup + (unsigned int)PrimaryGroupSize;
else
v9 = (char *)Owner + (unsigned int)OwnerSize;
v10 = Dacl;
if( v9 <= (char *)Dacl )
v9 = (char *)Dacl + (unsigned int)DaclSize;
v11 = Sacl;
if( v9 <= (char *)Sacl )
v9 = (char *)Sacl + (unsigned int)SaclSize;
v12 = 40;
if( v9 )
v12 = (((_DWORD)v9 - (_DWORD)pSelfRelativeSecurityDescriptor - 13) & 0xFFFFFFF8) + 40;
if( v12 <= HIDWORD(SaclSize) )
{
if( v9 )
{
memmove((char *)pSelfRelativeSecurityDescriptor + 40, (char *)pSelfRelativeSecurityDescriptor + 20, v12 - 40);
v7 = (char *)Owner;
v6 = *((_WORD *)pSelfRelativeSecurityDescriptor + 1);
}
v13 = v7 + 20;
*((_WORD *)pSelfRelativeSecurityDescriptor + 1) = v6 & 0x7FFF;
if( !v7 )
v13 = 0i64;
*((_QWORD *)pSelfRelativeSecurityDescriptor + 1) = v13;
v14 = v8 + 20;
if( !v8 )
v14 = 0i64;
*((_QWORD *)pSelfRelativeSecurityDescriptor + 2) = v14;
p_AceCount = &v11[2].AceCount;
if( !v11 )
p_AceCount = 0i64;
*((_QWORD *)pSelfRelativeSecurityDescriptor + 3) = p_AceCount;
if( v10 )
v2 = &v10[2].AceCount;
*((_QWORD *)pSelfRelativeSecurityDescriptor + 4) = v2;
return 0;
}
else
{
*(_DWORD *)pBufferSize = v12;
return -1073741789;
}
}Referenced by:
RtlpSysVolCheckOwnerAndSecurity