ExpWnfReadStateData
NTSTATUS __stdcall ExpWnfReadStateData(
_WNF_NAME_INSTANCE *NameInstance,
UINT64 *ChangeStamp,
VOID *Data,
UINT64 DataSize,
UINT64 *BytesCopied){
size_t v5;
_WNF_LOCK *p_StateDataLock;
_BYTE *v10;
_WNF_STATE_DATA *StateData;
size_t v12;
NTSTATUS v14;
v5 = DataSize;
v14 = 0;
p_StateDataLock = &NameInstance->StateDataLock;
v10 = KeAbPreAcquire(&NameInstance->StateDataLock, 0i64, 0i64);
if( _InterlockedCompareExchange64(&p_StateDataLock->PushLock._bf_0, 17i64, 0i64) )
ExfAcquirePushLockSharedEx(&p_StateDataLock->PushLock, v10, p_StateDataLock);
if( v10 )
v10[26] |= 1u;
StateData = NameInstance->StateData;
if( !StateData )
{
*(_DWORD *)ChangeStamp = 0;
goto LABEL_11;
}
if( StateData == (_WNF_STATE_DATA *)1 )
{
*(_DWORD *)ChangeStamp = NameInstance->CurrentChangeStamp;
LABEL_11:
*(_DWORD *)BytesCopied = 0;
goto LABEL_13;
}
*(_DWORD *)ChangeStamp = StateData->ChangeStamp;
*(_DWORD *)BytesCopied = StateData->DataSize;
v12 = StateData->DataSize;
if( v5 < v12 )
{
v14 = -1073741789;
}
else
{
memmove(Data, &StateData[1], v12);
v14 = 0;
}
LABEL_13:
if( _InterlockedCompareExchange64(&p_StateDataLock->PushLock._bf_0, 0i64, 17i64) != 17 )
ExfReleasePushLockShared(&p_StateDataLock->PushLock);
KeAbPostRelease(p_StateDataLock);
return v14;
}Referenced by:
ExQueryWnfStateData
ExpWnfDeliverThreadNotifications
NtQueryWnfStateData