SshpSendSessionData
VOID __fastcall SshpSendSessionData(){
PVOID *i;
void *v1;
PKSPIN_LOCK j;
__int64 v3;
PKSPIN_LOCK v4;
__int64 ***v5;
_QWORD *v6;
__int64 v7;
PVOID *v8;
unsigned int k;
__int64 v10;
__int64 v11;
PVOID v12;
__int64 *v13;
__int64 v14;
ULONG_PTR *v15;
__int64 v16;
__int64 **v17;
__int64 *v18;
__int64 **v19;
INT64 result[2];
__int64 v21;
char v22[16];
PVOID P[47];
memset((INT64)result, 0i64);
v19 = &v18;
v18 = (__int64 *)&v18;
ExAcquirePushLockExclusiveEx((UINT64)&SshpLibraryListLock, 0i64);
SSHSupportQueryInterruptTime();
for( i = (PVOID *)SshpLibraryList; i != &SshpLibraryList; i = (PVOID *)*i )
{
v1 = i + 2;
ExAcquirePushLockExclusiveEx((UINT64)(i + 2), 0i64);
LODWORD(result[0]) = *((_DWORD *)i + 6);
for( j = (PKSPIN_LOCK)i[5]; j != (PKSPIN_LOCK)(i + 5); j = (PKSPIN_LOCK)*j )
{
v3 = (__int64)j;
SshpWriteBlocker((PKSPIN_LOCK)j[13]);
if( (unsigned __int8)SshpQueryBlockerPendingDelete((PKSPIN_LOCK)j[13]) )
{
v4 = (PKSPIN_LOCK)*j;
v5 = (__int64 ***)(j + 1);
j = (PKSPIN_LOCK)j[1];
if( *(_QWORD *)(*(_QWORD *)v3 + 8i64) != v3
|| *j != v3
|| (*j = (KSPIN_LOCK)v4, v4[1] = (KSPIN_LOCK)j, v6 = v19, *v19 != (__int64 *)&v18) )
{
LABEL_34:
__fastfail(3u);
}
*v5 = v19;
*(_QWORD *)v3 = &v18;
*v6 = v3;
v19 = (__int64 **)v3;
}
}
v7 = SshpSessionGuid - *(_QWORD *)&GUID_SPM_LOW_POWER_CS.Data1;
if( (_QWORD)SshpSessionGuid == *(_QWORD *)&GUID_SPM_LOW_POWER_CS.Data1 )
v7 = *((_QWORD *)&SshpSessionGuid + 1) - *(_QWORD *)GUID_SPM_LOW_POWER_CS.Data4;
if( !v7 )
{
v8 = (PVOID *)i[7];
if( v8 != i + 7 )
{
do
{
for( k = 0; k < *((_DWORD *)v8 + 10); ++k )
{
v10 = (__int64)&v8[4 * k + 6];
if( (unsigned int)v21 >= 0x10 )
SshpFlushBlockerDataCache((UINT64 *)result);
v11 = 3i64 * (unsigned int)v21;
*(_QWORD *)&v22[8 * v11] = v10;
*(_OWORD *)&v22[8 * v11 + 8] = 0i64;
if( (*(int(__fastcall **)(_QWORD))(v10 + 24))(*(_QWORD *)(v10 + 16)) < 0 )
{
v12 = P[v11];
if( v12 )
CmpFreeTransientPoolWithTag(v12, LODWORD(result[0]));
}
else
{
LODWORD(v21) = v21 + 1;
}
}
v8 = (PVOID *)*v8;
}
while( v8 != i + 7 );
v1 = i + 2;
}
SshpFlushBlockerDataCache((UINT64 *)result);
}
SSHSupportReleasePushLockExclusive(v1);
}
SSHSupportReleasePushLockExclusive(&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 = &SshpBlockerCollections + 4 * *((int *)v13 + 10);
ExAcquirePushLockExclusiveEx((UINT64)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(v15);
SshpDereferenceBlocker((_QWORD *)v13[13]);
}
}Referenced by:
SshpWnfCallback