IopCreateSecurityCheck
VOID __fastcall IopCreateSecurityCheck(
_DEVICE_OBJECT *DeviceObject,
_DEVICE_OBJECT *AuditDeviceObject,
_ACCESS_STATE *AccessState,
UINT64 DesiredAccess,
_PRIVILEGE_SET *Privileges,
UINT64 *GrantedAccess,
_UNICODE_STRING *CompleteName,
_UNICODE_STRING *NameString,
_ETHREAD *CurrentThread,
UINT8 ApplyAccess){
int v10;
int v11;
unsigned int Characteristics;
_ETHREAD *v16;
_UNICODE_STRING *v17;
UINT8 v18;
_KPROCESSOR_MODE AccessMode;
int AccessStatus;
char v21;
AccessStatus = 0;
v10 = 0;
v11 = DesiredAccess;
if( (_DWORD)Privileges != 1 )
{
Characteristics = DeviceObject->Characteristics;
if( (Characteristics & 0x40001) != 0 || IopRequireDeviceAccessCheck && (Characteristics & 0x100000) != 0 )
v10 = 2;
}
v16 = (_ETHREAD *)ApplyAccess;
--*(_WORD *)(ApplyAccess + 484i64);
ExAcquireResourceSharedLite((UINT64)&stru_140C452E0 + 1408, 1);
SeLockSubjectContext((PSECURITY_SUBJECT_CONTEXT)AccessState + 1);
v17 = CompleteName;
LOBYTE(AccessMode) = 1;
v18 = (unsigned __int8)SeAccessCheck(
DeviceObject->SecurityDescriptor,
(PSECURITY_SUBJECT_CONTEXT)AccessState + 1,
1u,
v11 | (unsigned int)v10,
0,
(PPRIVILEGE_SET *)&GrantedAccess,
(PGENERIC_MAPPING)((char *)IoFileObjectType + 76),
AccessMode,
(PACCESS_MASK)&CompleteName->Length,
&AccessStatus);
if( GrantedAccess )
{
SeAppendPrivileges(AccessState, (PRIVILEGE_SET *)GrantedAccess);
ExFreePoolWithTag(GrantedAccess, 0);
}
if( v10 && (v10 & v11) == 0 )
*(_DWORD *)&v17->Length &= ~v10;
if( v21 && v18 )
{
*((_DWORD *)AccessState + 5) |= *(_DWORD *)&v17->Length;
*((_DWORD *)AccessState + 4) &= ~(*(_DWORD *)&v17->Length | 0x2000000);
}
if( AuditDeviceObject )
SeOpenObjectAuditAlarm(
(_UNICODE_STRING *)CurrentThread,
AuditDeviceObject,
NameString,
DeviceObject->SecurityDescriptor,
AccessState,
0,
v18,
1,
(UINT8 *)AccessState + 10);
SeUnlockSubjectContext((PSECURITY_SUBJECT_CONTEXT)AccessState + 1);
ExReleaseResourceLite((PERESOURCE)((char *)&stru_140C452E0 + 1408));
KeLeaveCriticalRegionThread(&v16->Tcb);
}Referenced by:
IopParseDevice