CmFcManagerUpdateFeatureUsageSubscriptions

__int64 __fastcall CmFcManagerUpdateFeatureUsageSubscriptions(__int64 a1, int *a2, unsigned int a3){
  unsigned __int64 v3; 
  _ETHREAD *CurrentThread; 
  __int64 v6; 
  INT64 v7; 
  __int64 v8; 
  _DWORD *v9; 
  __int64 v10; 
  int v11; 
  __int64 v12; 
  int v13; 
  __int64 v14; 
  int v15; 
  int v16; 
  _ADAPTER_OBJECT *v17; 
  INT64 v18; 
  UINT64 v19; 
  VOID **v20; 
  INT64 v22; 
  __int64 v23; 
  PADAPTER_OBJECT DmaAdapter; 
  __int64 v25; 
  __int64 v26; 
  _LARGE_INTEGER v27; 
  unsigned __int64 v28; 
  __int64 v29; 
  __int64 v30[10]; 
  _EVENT_DATA_DESCRIPTOR v31; 
  __int64 *v32; 
  int v33; 
  int v34; 

  v3 = a3;
  v26 = 0i64;
  v22 = 0i64;
  DmaAdapter = 0i64;
  v25 = 0i64;
  memset(v30, 0i64, 0x48u);
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --CurrentThread->Tcb.KernelApcDisable;
  ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)&CmpDummyThreadEvent + 138, 0i64);
  RtlpFcBufferManagerReferenceBuffers((__int64)&CmpDummyThreadEvent + 1200, (__int64)&v26, &v22);
  v7 = v22;
  v8 = v26 + 1;
  v27.QuadPart = 0i64;
  if( v26 == -1 )
    v8 = 1i64;
  v28 = v3;
  v9 = *(_DWORD **)(v22 + 56);
  v10 = v8;
  v23 = v8;
  v30[6] = v8;
  RtlpFcUpdateUsageTriggers(v9, v6, a2, (unsigned int)v3, 0i64, (unsigned __int64 *)&v27.QuadPart);
  v12 = 3i64;
  v13 = v11;
  if( v11 < 0 )
  {
    if( v11 != -2147483643
      || (v13 = CmFcpManagerCreateSection(v27, v8, *(&CmpDummyThreadEvent + 136), &v23), v13 < 0)
      || (CmFcpMapSection(&v23, &v30[6]), v13 = v15, v15 < 0)
      || (RtlpFcUpdateUsageTriggers(*(_DWORD **)(v7 + 56), v14, a2, v28, (_DWORD *)v30[7], (unsigned __int64 *)&v30[8]),
          v13 = v16,
          v16 < 0) )
    {
LABEL_13:
      if( (_InterlockedExchangeAdd64((_QWORD *)&CmpDummyThreadEvent + 138, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
        ExfTryToWakePushLock((_EX_PUSH_LOCK *)&CmpDummyThreadEvent + 138);
      KeAbPostRelease((char *)&CmpDummyThreadEvent + 1104);
      if( v22 )
        RtlpFcBufferManagerDereferenceBuffers((INT64 *)&CmpDummyThreadEvent + 150, v22);
      goto LABEL_23;
    }
    if( RtlpFcValidateFeatureUsageSubscriptionBuffer((UINT64 *)v30[7], v30[8]) < 0 )
    {
      if( *(&stru_140C00F40 + 658) > 5u && tlgKeywordOn((__int64)&stru_140C00F40 + 2632, 0x400000000001i64) )
      {
        v34 = 0;
        v32 = &v29;
        v29 = 0x1000000i64;
        v33 = 8;
        tlgWriteTransfer_EtwWriteTransfer(
          (__int64)&stru_140C00F40 + 2632,
          (unsigned __int8 *)&unk_140022DD8,
          0i64,
          0i64,
          3u,
          &v31);
      }
      v13 = -1073741595;
      goto LABEL_13;
    }
    v10 = v23;
  }
  RtlpFcBufferManagerDereferenceBuffers((INT64 *)&CmpDummyThreadEvent + 150, v7);
  ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)&CmpDummyThreadEvent + 137, 0i64);
  v17 = (_ADAPTER_OBJECT *)*(&CmpDummyThreadEvent + 148);
  *(&CmpDummyThreadEvent + 148) = DmaAdapter;
  DmaAdapter = v17;
  *(&CmpDummyThreadEvent + 149) = v25;
  *(&CmpDummyThreadEvent + 147) = v10;
  RtlpFcBufferManagerUpdateBuffers((_EX_PUSH_LOCK *)&CmpDummyThreadEvent + 150, v8, (__int64)v30);
  RtlpFcWriteHighLowHigh((INT64)&CmpDummyThreadEvent + 1112, v8);
  RtlpFcWriteHighLowHigh(0xFFFFF78000000710ui64, v18);
  if( (_InterlockedExchangeAdd64((_QWORD *)&CmpDummyThreadEvent + 137, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
    ExfTryToWakePushLock((_EX_PUSH_LOCK *)&CmpDummyThreadEvent + 137);
  KeAbPostRelease((char *)&CmpDummyThreadEvent + 1096);
  if( (_InterlockedExchangeAdd64((_QWORD *)&CmpDummyThreadEvent + 138, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
    ExfTryToWakePushLock((_EX_PUSH_LOCK *)&CmpDummyThreadEvent + 138);
  KeAbPostRelease((char *)&CmpDummyThreadEvent + 1104);
  CmFcpManagerPublishChangeNotifications(v19, v8);
  v13 = 0;
LABEL_23:
  v20 = (VOID **)&v30[1];
  do
  {
    if( *v20 )
      MmUnmapViewInSystemSpace(*v20);
    v20 += 3;
    --v12;
  }
  while( v12 );
  if( DmaAdapter )
    HalPutDmaAdapter(DmaAdapter);
  KeLeaveCriticalRegionThread(KeGetCurrentThread());
  return(unsigned int)v13;
}

Referenced by:

CmUpdateFeatureUsageSubscription