IopCreateSecurityCheck

UINT8 __stdcall 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; 
  _DEVICE_OBJECT *v13; 
  int v15; 
  __int64 v16; 
  _UNICODE_STRING *v17; 
  UINT8 v18; 
  PACCESS_STATE AccessStatea; 
  INT64 AccessStatus; 
  char v22; 
  LODWORD(AccessStatus) = 0;
  v10 = 0;
  v11 = DesiredAccess;
  v13 = AuditDeviceObject;
  if( (_DWORD)Privileges != 1 )
  {
    v15 = *((_DWORD *)DeviceObject + 13);
    if( (v15 & 0x40001) != 0 || IopRequireDeviceAccessCheck && (v15 & 0x100000) != 0 )
      v10 = 2;
  }
  v16 = ApplyAccess;
  --*(_WORD *)(ApplyAccess + 484i64);
  LOBYTE(AuditDeviceObject) = 1;
  ExAcquireResourceSharedLite(&IopSecurityResource, (BOOL)AuditDeviceObject);
  SeLockSubjectContext((_SECURITY_SUBJECT_CONTEXT *)AccessState + 1);
  v17 = CompleteName;
  LODWORD(AccessStatea) = 0;
  v18 = SeAccessCheck(
          *((VOID **)DeviceObject + 34),
          (SECURITY_SUBJECT_CONTEXT *)AccessState + 1,
          1u,
          v11 | (unsigned int)v10,
          (UINT64)AccessStatea,
          (PRIVILEGE_SET **)&GrantedAccess,
          (GENERIC_MAPPING *)((char *)IoFileObjectType + 76),
          1,
          (UINT64 *)&CompleteName->Length,
          &AccessStatus);
  if( GrantedAccess )
  {
    SeAppendPrivileges(AccessState, (PPRIVILEGE_SET)GrantedAccess);
    ExFreePoolWithTag(GrantedAccess, 0);
  }
  if( v10 && (v10 & v11) == 0 )
    *(_DWORD *)&v17->Length &= ~v10;
  if( v22 && v18 )
  {
    *((_DWORD *)AccessState + 5) |= *(_DWORD *)&v17->Length;
    *((_DWORD *)AccessState + 4) &= ~(*(_DWORD *)&v17->Length | 0x2000000);
  }
  if( v13 )
    SeOpenObjectAuditAlarm(
      (UNICODE_STRING *)CurrentThread,
      v13,
      NameString,
      *((PVOID *)DeviceObject + 34),
      AccessState,
      0,
      v18,
      1,
      (UINT8 *)AccessState + 10);
  SeUnlockSubjectContext((SECURITY_SUBJECT_CONTEXT *)AccessState + 1);
  ExReleaseResourceLite(&IopSecurityResource);
  KeLeaveCriticalRegionThread(v16);
  return v18;
}

Referenced by:

IopParseDevice