PfTFreeBufferList

VOID __stdcall PfTFreeBufferList(_PFP_BUFFER_MANAGER *BufferMgr){
  __int32 bf_0; 
  _PFP_BUFFER_MANAGER *v2; 
  _PFP_BUFFER_MANAGER **v3; 
  unsigned __int32 v5; 
  _PFP_BUFFER_MANAGER **v6; 
  _PFP_BUFFER_MANAGER **v7; 

  bf_0 = BufferMgr->_bf_0;
  v2 = BufferMgr + 1;
  v3 = *(_PFP_BUFFER_MANAGER ***)&BufferMgr[1].FreeBufferThreshold;
  v5 = (unsigned __int32)BufferMgr->_bf_0 >> 4;
  v6 = *(_PFP_BUFFER_MANAGER ***)&BufferMgr[1]._bf_0;
  if( v6 != v3 )
  {
    do
    {
      if( *v3 != v2 || (v7 = (_PFP_BUFFER_MANAGER **)v3[1], *v7 != (_PFP_BUFFER_MANAGER *)v3) )
        __fastfail(3u);
      *(_QWORD *)&v2->FreeBufferThreshold = v7;
      *v7 = v2;
      if( (BufferMgr->_bf_0 & 0xF) != 0 )
      {
        memset(v3, 0i64, v5);
        v3[1] = (_PFP_BUFFER_MANAGER *)v3;
        *v3 = (_PFP_BUFFER_MANAGER *)v3;
        *((_DWORD *)v3 + 8) = 2048;
      }
      else
      {
        PfTLbInitialize(v3, v5, 1);
      }
      *v3 = *(_PFP_BUFFER_MANAGER **)BufferMgr->ActiveBufferListHead;
      ++BufferMgr->FreeBufferCount;
      *(_QWORD *)BufferMgr->ActiveBufferListHead = v3;
      v6 = *(_PFP_BUFFER_MANAGER ***)&v2->_bf_0;
      v3 = *(_PFP_BUFFER_MANAGER ***)&v2->FreeBufferThreshold;
    }
    while( *(_PFP_BUFFER_MANAGER ***)&v2->_bf_0 != v3 );
    bf_0 = BufferMgr->_bf_0;
  }
  if( (bf_0 & 0xF) == 0 )
    PfTLbInitialize(v6, v5, 1);
}

Referenced by:

PfTCreateTraceDump