CmFcManagerUpdateFeatureUsageSubscriptions

INT64 __fastcall CmFcManagerUpdateFeatureUsageSubscriptions(INT64 a1, INT64 *rdx0, UINT64 r8_0){
  UINT64 v3; 
  _ETHREAD *CurrentThread; 
  INT64 v6; 
  INT64 v7; 
  INT64 v8; 
  _DWORD *v9; 
  __int64 v10; 
  NTSTATUS updated; 
  __int64 v12; 
  int v13; 
  INT64 v14; 
  struct _DMA_ADAPTER *v15; 
  INT64 v16; 
  INT64 v17; 
  PVOID *v18; 
  INT64 a3; 
  __int64 a4; 
  PADAPTER_OBJECT DmaAdapter; 
  __int64 v23; 
  INT64 v24; 
  UINT64 a6; 
  UINT64 v26; 
  __int64 v27; 
  INT64 result; 
  char v29; 
  INT64 a2; 
  UINT64 *a5; 
  UINT64 v32[2]; 
  struct _EVENT_DATA_DESCRIPTOR v33; 
  __int64 *v34; 
  int v35; 
  int v36; 
  v3 = (unsigned int)r8_0;
  v24 = 0i64;
  a3 = 0i64;
  DmaAdapter = 0i64;
  v23 = 0i64;
  memset((INT64)&result, 0i64);
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --*((_WORD *)CurrentThread + 242);
  ExAcquirePushLockExclusiveEx((UINT64)&stru_140C47E90, 0i64);
  RtlpFcBufferManagerReferenceBuffers((INT64)&qword_140C47EF0, (INT64)&v24, &a3);
  v7 = a3;
  v8 = v24 + 1;
  a6 = 0i64;
  if( v24 == -1 )
    v8 = 1i64;
  v26 = v3;
  v9 = *(_DWORD **)(a3 + 56);
  v10 = v8;
  a4 = v8;
  a2 = v8;
  updated = RtlpFcUpdateUsageTriggers(v9, v6, rdx0, (unsigned int)v3, 0i64, &a6);
  v12 = 3i64;
  v13 = updated;
  if( updated < 0 )
  {
    if( updated != -2147483643
      || (v13 = CmFcpManagerCreateSection((_LARGE_INTEGER)a6, v8, *(INT64 *)&CmFcSystemManager, &a4), v13 < 0)
      || (v13 = CmFcpMapSection(&a4, &a2), v13 < 0)
      || (v13 = RtlpFcUpdateUsageTriggers(*(_DWORD **)(v7 + 56), v14, rdx0, v26, a5, v32), v13 < 0) )
    {
LABEL_13:
      if( (_InterlockedExchangeAdd64((volatile signed __int64 *)&stru_140C47E90, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
        ExfTryToWakePushLock((volatile INT64 *)&stru_140C47E90);
      KeAbPostRelease(&stru_140C47E90);
      if( a3 )
        RtlpFcBufferManagerDereferenceBuffers(&qword_140C47EF0, a3);
      goto LABEL_23;
    }
    if( (int)RtlpFcValidateFeatureUsageSubscriptionBuffer(a5, v32[0]) < 0 )
    {
      if( (unsigned int)dword_140C01988 > 5 && tlgKeywordOn((__int64)&dword_140C01988, 0x400000000001i64) )
      {
        v36 = 0;
        v34 = &v27;
        v27 = 0x1000000i64;
        v35 = 8;
        tlgWriteTransfer_EtwWriteTransfer(
          (__int64)&dword_140C01988,
          (unsigned __int8 *)&unk_140022DD8,
          0i64,
          0i64,
          3u,
          &v33);
      }
      v13 = -1073741595;
      goto LABEL_13;
    }
    v10 = a4;
  }
  RtlpFcBufferManagerDereferenceBuffers(&qword_140C47EF0, v7);
  ExAcquirePushLockExclusiveEx((UINT64)&RunOnce, 0i64);
  v15 = (struct _DMA_ADAPTER *)qword_140C47EE0;
  qword_140C47EE0 = (__int64)DmaAdapter;
  DmaAdapter = v15;
  qword_140C47EE8 = v23;
  qword_140C47ED8 = v10;
  RtlpFcBufferManagerUpdateBuffers(&qword_140C47EF0, v8, (INT64)&result);
  RtlpFcWriteHighLowHigh((INT64)&qword_140C47E98, v8);
  RtlpFcWriteHighLowHigh(0xFFFFF78000000710ui64, v16);
  if( (_InterlockedExchangeAdd64((volatile signed __int64 *)&RunOnce, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
    ExfTryToWakePushLock((volatile INT64 *)&RunOnce);
  KeAbPostRelease(&RunOnce);
  if( (_InterlockedExchangeAdd64((volatile signed __int64 *)&stru_140C47E90, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
    ExfTryToWakePushLock((volatile INT64 *)&stru_140C47E90);
  KeAbPostRelease(&stru_140C47E90);
  CmFcpManagerPublishChangeNotifications(v17, v8);
  v13 = 0;
LABEL_23:
  v18 = (PVOID *)&v29;
  do
  {
    if( *v18 )
      MmUnmapViewInSystemSpace(*v18);
    v18 += 3;
    --v12;
  }
  while( v12 );
  if( DmaAdapter )
    HalPutDmaAdapter(DmaAdapter);
  KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
  return(unsigned int)v13;
}

Referenced by:

CmUpdateFeatureUsageSubscription