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