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