CmpDoAccessCheckOnKCB

INT64 __fastcall CmpDoAccessCheckOnKCB(
        _CM_KEY_CONTROL_BLOCK *KeyControlBlock,
        _CM_TRANS *CmTrans,
        UINT64 AccessMask,
        CHAR AccessMode,
        VOID *a5){
  UINT8 v8; 
  UINT64 v9; 
  UINT64 v10; 
  INT64 result; 
  PADAPTER_OBJECT v12; 
  _ETHREAD *CurrentThread; 
  _GENERIC_MAPPING *v14; 
  _KPROCESS *CurrentThreadProcess; 
  CM_KEY_BODY *v16; 
  UINT8 v17; 
  VOID *DesiredAccess; 
  UINT64 ObjectBodySize; 
  UINT64 PagedPoolCharge; 
  UINT64 NonPagedPoolCharge; 
  PADAPTER_OBJECT DmaAdapter; 
  _ACCESS_MASK v23; 
  NTSTATUS v24; 
  _SECURITY_SUBJECT_CONTEXT v25[5]; 
  _AUX_ACCESS_DATA AuxData; 

  v23 = AccessMask;
  memset(v25, 0i64, sizeof(v25));
  memset(&AuxData, 0i64, sizeof(AuxData));
  v8 = 0;
  LOBYTE(v9) = AccessMode;
  LOBYTE(v10) = AccessMode;
  LODWORD(NonPagedPoolCharge) = 0;
  LODWORD(PagedPoolCharge) = 0;
  LODWORD(ObjectBodySize) = 104;
  DmaAdapter = 0i64;
  LODWORD(result) = ObCreateObjectEx(
                      v10,
                      (_OBJECT_TYPE *)CmKeyObjectType,
                      0i64,
                      v9,
                      DesiredAccess,
                      ObjectBodySize,
                      PagedPoolCharge,
                      NonPagedPoolCharge,
                      (VOID **)&DmaAdapter,
                      0i64);
  if( (int)result >= 0 )
  {
    v12 = DmaAdapter;
    DmaAdapter->AdapterObject.ContiguousTranslationEnd.Buffer = 0i64;
    *(_QWORD *)&v12->AdapterObject.ContiguousTranslationEnd.Offset = 0i64;
    *(_DWORD *)&v12->AdapterObject.DmaHeader.Version = 1803104306;
    v12->AdapterObject.DmaHeader.DmaOperations = 0i64;
    LODWORD(v12->AdapterObject.ScatterTranslations) = 0;
    *(_QWORD *)&v12->AdapterObject.ScatterTranslationEnd.Offset = &v12->AdapterObject.ScatterTranslationEnd;
    v12->AdapterObject.ScatterTranslationEnd.Buffer = (_HALP_DMA_TRANSLATION_BUFFER *)&v12->AdapterObject.ScatterTranslationEnd;
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    v14 = (_GENERIC_MAPPING *)((char *)CmKeyObjectType + 76);
    CurrentThreadProcess = (_EPROCESS *)PsGetCurrentThreadProcess();
    v24 = SeCreateAccessStateEx(
            &CurrentThread->Tcb,
            &CurrentThreadProcess->Pcb,
            (_ACCESS_STATE *)v25,
            &AuxData,
            v23,
            v14);
    if( v24 >= 0 )
    {
      v16 = (CM_KEY_BODY *)DmaAdapter;
      v12->AdapterObject.DmaHeader.DmaOperations = (_DMA_OPERATIONS *)KeyControlBlock;
      v17 = CmpCheckKeyBodyAccess(v16, CmTrans, (ACCESS_STATE *)v25, AccessMode, (INT64 *)&v24);
      SepDeleteAccessState((_ACCESS_STATE *)v25);
      SeReleaseSubjectContext(&v25[1]);
      v12->AdapterObject.DmaHeader.DmaOperations = 0i64;
      v8 = v17;
    }
    HalPutDmaAdapter(DmaAdapter);
    LOBYTE(result) = v8;
  }
  else
  {
    LOBYTE(result) = 0;
  }
  return result;
}

Referenced by:

CmpVEExecuteCreateLogic