RtlpFcNotifyFeatureUsageTarget
NTSTATUS __stdcall RtlpFcNotifyFeatureUsageTarget(INT64 a1){
_WNF_STATE_NAME *v1;
VOID **Buffer;
int updated;
UINT64 v5;
int v6;
__int64 v7;
UINT64 *BufferSize;
UINT64 CheckStamp;
UINT64 MatchingChangeStamp;
_WNF_STATE_NAME StateName;
StateName = *v1;
Buffer = ExAllocatePoolWithTag(1ui64, 0x1000ui64, 1852793670i64);
if( !Buffer )
return -1073741801;
do
{
MatchingChangeStamp = 4096i64;
updated = ZwQueryWnfStateData(
&StateName,
0i64,
0i64,
(UINT64 *)((char *)&MatchingChangeStamp + 4),
Buffer,
&MatchingChangeStamp);
if( updated >= 0 )
{
v5 = (unsigned int)MatchingChangeStamp;
v6 = 0;
if( (MatchingChangeStamp & 7) != 0 )
v5 = 0i64;
LODWORD(MatchingChangeStamp) = v5;
v7 = (unsigned int)v5 >> 3;
if( (_DWORD)v7 )
{
while( LODWORD(Buffer[v6]) != *(_DWORD *)a1 || WORD2(Buffer[v6]) != *(_WORD *)(a1 + 4) )
{
if( ++v6 >= (unsigned int)v7 )
goto LABEL_10;
}
}
else
{
LABEL_10:
if( (unsigned __int64)(unsigned int)v5 + 8 <= 0x1000 )
{
v5 = (unsigned int)(v5 + 8);
LODWORD(Buffer[v7]) = *(_DWORD *)a1;
WORD2(Buffer[v7]) = *(_WORD *)(a1 + 4);
LODWORD(MatchingChangeStamp) = v5;
}
}
LODWORD(CheckStamp) = 1;
LODWORD(BufferSize) = HIDWORD(MatchingChangeStamp);
updated = ZwUpdateWnfStateData(&StateName, Buffer, v5, 0i64, 0i64, (UINT64)BufferSize, CheckStamp);
}
}
while( updated == -1073741823 );
ExFreePoolWithTag(Buffer, 0);
return updated;
}Referenced by:
RtlpFcSendFeatureUsageNotifications