SeCaptureSecurityQos

NTSTATUS __stdcall SeCaptureSecurityQos(
        _OBJECT_ATTRIBUTES *ObjectAttributes,
        INT8 RequestorMode,
        UINT8 *SecurityQosPresent,
        _SECURITY_QUALITY_OF_SERVICE *CapturedSecurityQos){
  _SECURITY_QUALITY_OF_SERVICE *v4; 
  NTSTATUS result; 
  _SECURITY_QUALITY_OF_SERVICE *SecurityQualityOfService; 

  *SecurityQosPresent = 0;
  if( RequestorMode )
  {
    if( ObjectAttributes )
    {
      if( ((unsigned __int8)ObjectAttributes & 3) == 0 )
      {
        SecurityQualityOfService = (_SECURITY_QUALITY_OF_SERVICE *)ObjectAttributes->SecurityQualityOfService;
        if( !SecurityQualityOfService )
          goto LABEL_6;
        if( ((unsigned __int8)SecurityQualityOfService & 3) == 0 )
        {
          if( SecurityQualityOfService->Length != 12 )
            return -1073741811;
          *SecurityQosPresent = 1;
          *CapturedSecurityQos = *SecurityQualityOfService;
          CapturedSecurityQos->Length = 12;
          goto LABEL_6;
        }
      }
      ExRaiseDatatypeMisalignment();
    }
  }
  else if( ObjectAttributes && ObjectAttributes->SecurityQualityOfService )
  {
    *SecurityQosPresent = 1;
    v4 = (_SECURITY_QUALITY_OF_SERVICE *)ObjectAttributes->SecurityQualityOfService;
    if( v4->Length != 12 )
      return -1073741811;
    *CapturedSecurityQos = *v4;
  }
LABEL_6:
  if( !*SecurityQosPresent )
    return 0;
  result = SeValidateSecurityQos(CapturedSecurityQos);
  if( result >= 0 )
    return 0;
  return result;
}

Referenced by:

NtCreateTokenEx
NtDuplicateToken