RtlReplaceSidInSd
NTSTATUS __stdcall RtlReplaceSidInSd(VOID *SecurityDescriptor, VOID *OldSid, VOID *NewSid, UINT64 *NumChanges){
VOID *v4;
unsigned __int8 *v8;
size_t v9;
NTSTATUS result;
int v11;
int v12;
int v13;
char *v14;
int v15;
int v16;
int v17;
char *v18;
__int64 v19;
unsigned __int8 *v20;
__int64 v21;
int v22;
int v23;
int v24;
size_t v25;
VOID *v26;
__int64 v27;
unsigned __int8 *v28;
__int64 v29;
int v30;
int v31;
int v32;
size_t v33;
VOID *v34;
UINT8 OwnerDefaulted[4];
size_t v36;
PVOID Owner;
unsigned __int8 DaclPresent;
*(_DWORD *)NumChanges = 0;
v4 = SecurityDescriptor;
DaclPresent = 0;
LODWORD(v8) = RtlSubAuthorityCountSid((INT64)OldSid);
Owner = 0i64;
v9 = 4 * *v8;
v36 = v9;
result = RtlGetOwnerSecurityDescriptor(v4, &Owner, OwnerDefaulted);
if( result >= 0 )
{
if( Owner )
{
if( *(_BYTE *)Owner == *(_BYTE *)OldSid )
{
v11 = *((unsigned __int8 *)Owner + 1);
v12 = *((unsigned __int8 *)OldSid + 1);
if( (_BYTE)v11 == (_BYTE)v12 || v11 == v12 + 1 )
{
v13 = *(_DWORD *)((char *)Owner + 2) - *(_DWORD *)((char *)OldSid + 2);
if( !v13 )
v13 = *((unsigned __int16 *)Owner + 3) - *((unsigned __int16 *)OldSid + 3);
if( !v13 )
{
v14 = (char *)Owner + 8;
if( !memcmp((char *)Owner + 8, (char *)OldSid + 8, v9) )
{
memmove(v14, (char *)NewSid + 8, v9);
++*(_DWORD *)NumChanges;
}
}
}
}
}
Owner = 0i64;
result = RtlGetGroupSecurityDescriptor(v4, &Owner, OwnerDefaulted);
if( result >= 0 )
{
if( Owner )
{
if( *(_BYTE *)Owner == *(_BYTE *)OldSid )
{
v15 = *((unsigned __int8 *)Owner + 1);
v16 = *((unsigned __int8 *)OldSid + 1);
if( (_BYTE)v15 == (_BYTE)v16 || v15 == v16 + 1 )
{
v17 = *(_DWORD *)((char *)Owner + 2) - *(_DWORD *)((char *)OldSid + 2);
if( !v17 )
v17 = *((unsigned __int16 *)Owner + 3) - *((unsigned __int16 *)OldSid + 3);
if( !v17 )
{
v18 = (char *)Owner + 8;
if( !memcmp((char *)Owner + 8, (char *)OldSid + 8, v9) )
{
memmove(v18, (char *)NewSid + 8, v9);
++*(_DWORD *)NumChanges;
}
}
}
}
}
Owner = 0i64;
result = RtlGetDaclSecurityDescriptor(v4, &DaclPresent, (_ACL **)&Owner, OwnerDefaulted);
if( result >= 0 )
{
if( DaclPresent )
{
if( Owner )
{
v19 = *((unsigned __int16 *)Owner + 2);
v20 = (unsigned __int8 *)Owner + 8;
if( *((_WORD *)Owner + 2) )
{
while( *v20 > 3u )
{
if( *v20 == 4 )
{
v21 = (__int64)&v20[RtlLengthSid((INT64)(v20 + 12)) + 12];
goto LABEL_29;
}
LABEL_38:
v20 += *((unsigned __int16 *)v20 + 1);
if( !--v19 )
{
v4 = SecurityDescriptor;
goto LABEL_40;
}
}
v21 = (__int64)(v20 + 8);
LABEL_29:
if( *(_BYTE *)v21 == *(_BYTE *)OldSid )
{
v22 = *(unsigned __int8 *)(v21 + 1);
v23 = *((unsigned __int8 *)OldSid + 1);
if( (_BYTE)v22 == (_BYTE)v23 || v22 == v23 + 1 )
{
v24 = *(_DWORD *)(v21 + 2) - *(_DWORD *)((char *)OldSid + 2);
if( !v24 )
v24 = *(unsigned __int16 *)(v21 + 6) - *((unsigned __int16 *)OldSid + 3);
if( !v24 )
{
v25 = v9;
v26 = (VOID *)(v21 + 8);
if( !memcmp((const VOID *)(v21 + 8), (char *)OldSid + 8, v25) )
{
memmove(v26, (char *)NewSid + 8, v25);
++*(_DWORD *)NumChanges;
}
v9 = v36;
}
}
}
goto LABEL_38;
}
}
}
LABEL_40:
Owner = 0i64;
result = RtlGetSaclSecurityDescriptor(v4, &DaclPresent, (_ACL **)&Owner, OwnerDefaulted);
if( result >= 0 && DaclPresent && Owner )
{
v27 = *((unsigned __int16 *)Owner + 2);
v28 = (unsigned __int8 *)Owner + 8;
if( *((_WORD *)Owner + 2) )
{
while( *v28 > 3u )
{
if( *v28 == 4 )
{
v29 = (__int64)&v28[RtlLengthSid((INT64)(v28 + 12)) + 12];
goto LABEL_48;
}
LABEL_56:
v9 = v36;
v28 += *((unsigned __int16 *)v28 + 1);
if( !--v27 )
return 0;
}
v29 = (__int64)(v28 + 8);
LABEL_48:
if( *(_BYTE *)v29 == *(_BYTE *)OldSid )
{
v30 = *(unsigned __int8 *)(v29 + 1);
v31 = *((unsigned __int8 *)OldSid + 1);
if( (_BYTE)v30 == (_BYTE)v31 || v30 == v31 + 1 )
{
v32 = *(_DWORD *)(v29 + 2) - *(_DWORD *)((char *)OldSid + 2);
if( !v32 )
v32 = *(unsigned __int16 *)(v29 + 6) - *((unsigned __int16 *)OldSid + 3);
if( !v32 )
{
v33 = v9;
v34 = (VOID *)(v29 + 8);
if( !memcmp((const VOID *)(v29 + 8), (char *)OldSid + 8, v33) )
{
memmove(v34, (char *)NewSid + 8, v33);
++*(_DWORD *)NumChanges;
}
}
}
}
goto LABEL_56;
}
return 0;
}
}
}
}
return result;
}Referenced by:
No references.