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