SshpSendSessionData

VOID __stdcall SshpSendSessionData(){
  _EX_PUSH_LOCK *i; 
  ULONG_PTR v1; 
  _EX_PUSH_LOCK *j; 
  __int64 v3; 
  PKSPIN_LOCK bf_0; 
  __int64 ***v5; 
  _QWORD *v6; 
  __int64 v7; 
  _EX_PUSH_LOCK *v8; 
  unsigned int k; 
  __int64 v10; 
  __int64 v11; 
  VOID *v12; 
  __int64 *v13; 
  __int64 v14; 
  _EX_PUSH_LOCK *v15; 
  __int64 v16; 
  __int64 **v17; 
  __int64 *v18; 
  __int64 **v19; 
  UINT64 TagToFree[52]; 

  memset(TagToFree, 0i64, 0x198u);
  v19 = &v18;
  v18 = (__int64 *)&v18;
  ExAcquirePushLockExclusiveEx(&SshpLibraryListLock, 0i64);
  SSHSupportQueryInterruptTime();
  for( i = (_EX_PUSH_LOCK *)SshpLibraryList; i != (_EX_PUSH_LOCK *)&SshpLibraryList; i = (_EX_PUSH_LOCK *)i->_bf_0 )
  {
    v1 = (_DWORD)i + 16;
    ExAcquirePushLockExclusiveEx(i + 2, 0i64);
    LODWORD(TagToFree[0]) = i[3]._bf_0;
    for( j = (_EX_PUSH_LOCK *)i[5]._bf_0; j != &i[5]; j = (_EX_PUSH_LOCK *)j->_bf_0 )
    {
      v3 = (__int64)j;
      SshpWriteBlocker((PKSPIN_LOCK)j[13]._bf_0);
      if( (unsigned __int8)SshpQueryBlockerPendingDelete((PKSPIN_LOCK)j[13]._bf_0) )
      {
        bf_0 = (PKSPIN_LOCK)j->_bf_0;
        v5 = (__int64 ***)&j[1];
        j = (_EX_PUSH_LOCK *)j[1]._bf_0;
        if( *(_QWORD *)(*(_QWORD *)v3 + 8i64) != v3
          || j->_bf_0 != v3
          || (j->_bf_0 = (__int64)bf_0, bf_0[1] = (unsigned __int64)j, v6 = v19, *v19 != (__int64 *)&v18) )
        {
LABEL_34:
          __fastfail(3u);
        }
        *v5 = v19;
        *(_QWORD *)v3 = &v18;
        *v6 = v3;
        v19 = (__int64 **)v3;
      }
    }
    v7 = SshpSessionGuid - *(_QWORD *)&CmFcpWnfTypeId.TypeId[4].Data1;
    if( (_QWORD)SshpSessionGuid == *(_QWORD *)&CmFcpWnfTypeId.TypeId[4].Data1 )
      v7 = *((_QWORD *)&SshpSessionGuid + 1) - *(_QWORD *)CmFcpWnfTypeId.TypeId[4].Data4;
    if( !v7 )
    {
      v8 = (_EX_PUSH_LOCK *)i[7]._bf_0;
      if( v8 != &i[7] )
      {
        do
        {
          for( k = 0; k < LODWORD(v8[5]._bf_0); ++k )
          {
            v10 = (__int64)&v8[4 * k + 6];
            if( LODWORD(TagToFree[2]) >= 0x10 )
              SshpFlushBlockerDataCache(TagToFree);
            v11 = 3i64 * LODWORD(TagToFree[2]);
            TagToFree[v11 + 3] = v10;
            *(_OWORD *)&TagToFree[v11 + 4] = 0i64;
            if( (*(int(__fastcall **)(_QWORD))(v10 + 24))(*(_QWORD *)(v10 + 16)) < 0 )
            {
              v12 = (VOID *)TagToFree[v11 + 5];
              if( v12 )
                CmpFreeTransientPoolWithTag(v12, LODWORD(TagToFree[0]));
            }
            else
            {
              ++LODWORD(TagToFree[2]);
            }
          }
          v8 = (_EX_PUSH_LOCK *)v8->_bf_0;
        }
        while( v8 != &i[7] );
        v1 = (_DWORD)i + 16;
      }
      SshpFlushBlockerDataCache(TagToFree);
    }
    SSHSupportReleasePushLockExclusive(v1);
  }
  SSHSupportReleasePushLockExclusive((ULONG_PTR)&SshpLibraryListLock);
  while( 1 )
  {
    v13 = v18;
    if( v18 == (__int64 *)&v18 )
      break;
    if( (__int64 **)v18[1] != &v18 )
      goto LABEL_34;
    v14 = *v18;
    if( *(__int64 **)(*v18 + 8) != v18 )
      goto LABEL_34;
    v18 = (__int64 *)*v18;
    *(_QWORD *)(v14 + 8) = &v18;
    v15 = (_EX_PUSH_LOCK *)((char *)&SshpBlockerCollections + 32 * *((int *)v13 + 10));
    ExAcquirePushLockExclusiveEx(v15, 0i64);
    v16 = v13[2];
    if( *(__int64 **)(v16 + 8) != v13 + 2 )
      goto LABEL_34;
    v17 = (__int64 **)v13[3];
    if( *v17 != v13 + 2 )
      goto LABEL_34;
    *v17 = (__int64 *)v16;
    *(_QWORD *)(v16 + 8) = v17;
    SSHSupportReleasePushLockExclusive((ULONG_PTR)v15);
    SshpDereferenceBlocker((_QWORD *)v13[13]);
  }
}

Referenced by:

SshpWnfCallback