IopCheckBackupRestorePrivilege
VOID __stdcall IopCheckBackupRestorePrivilege(
_ACCESS_STATE *AccessState,
UINT64 *CreateOptions,
CHAR PreviousMode,
UINT64 Disposition){
char v5;
int v6;
char v7;
int v10;
INT64 v11;
int v12;
struct _PRIVILEGE_SET RequiredPrivileges;
v5 = 0;
v6 = *((_DWORD *)AccessState + 3);
v7 = 0;
if( (v6 & 0x100) != 0 || (*(_DWORD *)CreateOptions & 0x4000) == 0 )
return;
v10 = *((_DWORD *)AccessState + 4);
*((_DWORD *)AccessState + 3) = v6 | 0x100;
if( (v10 & 0x2000000) != 0 )
v10 |= 0x11F01BFu;
if( (((_DWORD)Disposition - 1) & 0xFFFFFFF9) != 0 || (_DWORD)Disposition == 7 )
{
v7 = 1;
}
else
{
if( (v10 & 0x11200A9) == 0 )
goto LABEL_12;
RequiredPrivileges.Privilege[0].Luid = SeBackupPrivilege;
RequiredPrivileges.PrivilegeCount = 1;
RequiredPrivileges.Control = 1;
RequiredPrivileges.Privilege[0].Attributes = 0;
if( !PreviousMode )
{
LABEL_19:
v5 = 1;
SeAppendPrivileges(AccessState, &RequiredPrivileges);
*((_DWORD *)AccessState + 5) |= v10 & 0x11200A9;
v10 &= 0xFEEDFF56;
*((_DWORD *)AccessState + 4) &= 0xFEEDFF56;
*((_DWORD *)AccessState + 3) |= 2u;
goto LABEL_12;
}
v11 = *((_QWORD *)AccessState + 4);
if( !v11 )
{
v11 = *((_QWORD *)AccessState + 6);
goto LABEL_11;
}
if( *((int *)AccessState + 10) >= 2 )
{
LABEL_11:
if( !SepPrivilegeCheck(v11, (INT64)RequiredPrivileges.Privilege, 1ui64, 1, PreviousMode) )
goto LABEL_12;
goto LABEL_19;
}
}
LABEL_12:
v12 = v10 & 0x11F0116;
if( (v12 || v7)
&& (RequiredPrivileges.Privilege[0].Luid = SeRestorePrivilege,
RequiredPrivileges.PrivilegeCount = 1,
RequiredPrivileges.Control = 1,
RequiredPrivileges.Privilege[0].Attributes = 0,
SePrivilegeCheck(&RequiredPrivileges, (SECURITY_SUBJECT_CONTEXT *)AccessState + 1, PreviousMode)) )
{
SeAppendPrivileges(AccessState, &RequiredPrivileges);
*((_DWORD *)AccessState + 5) |= v12;
*((_DWORD *)AccessState + 4) &= 0xFEE0FEE9;
*((_DWORD *)AccessState + 3) |= 4u;
}
else if( !v5 )
{
*(_DWORD *)CreateOptions &= ~0x4000u;
}
}Referenced by:
IopParseDevice