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