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