PopPluginQuerySocSubsystemMetadata

NTSTATUS __fastcall PopPluginQuerySocSubsystemMetadata(
        POP_FX_PLUGIN *Plugin,
        UINT64 SubsystemNameHash,
        PEP_QUERY_SOC_SUBSYSTEM_METADATA *Query){
  unsigned int v3; 
  __int64 v5; 
  __int64 v6; 
  UINT8 v7; 
  __int64 v8; 
  VOID **PoolWithTag; 
  VOID **v10; 
  VOID **v11; 
  VOID **v12; 
  PEP_QUERY_SOC_SUBSYSTEM_METADATA *v13; 
  VOID **v14; 
  _OWORD *v15; 
  const _UNICODE_STRING *v16; 
  __int64 v17; 
  _UNICODE_STRING **v18; 
  WCHAR **v19; 
  __int128 v21; 
  UINT64 HashValue; 
  int v23; 
  unsigned int v24; 

  v23 = SubsystemNameHash;
  HashValue = (UINT64)Plugin;
  v3 = Query[7];
  v5 = *(_QWORD *)&PopFxProcessorPlugin;
  LODWORD(HashValue) = 0;
  v6 = 16i64 * v3;
  v24 = v3;
  v7 = 0;
  v8 = v3;
  PoolWithTag = ExAllocatePoolWithTag(1ui64, v6, 1297630800i64);
  v10 = PoolWithTag;
  if( PoolWithTag )
  {
    memset(PoolWithTag, 0i64, v6);
    v11 = ExAllocatePoolWithTag(1ui64, v6, 1297630800i64);
    v12 = v11;
    if( v11 )
    {
      memset(v11, 0i64, v6);
      v21 = *(_OWORD *)*((_QWORD *)Query + 2);
      if( v3 )
      {
        v13 = Query + 8;
        v14 = v12;
        do
        {
          *(_OWORD *)((char *)v14 + (char *)v10 - (char *)v12) = *(_OWORD *)*(_QWORD *)v13;
          v15 = *(_OWORD **)v13;
          v13 += 2;
          *(_OWORD *)v14 = v15[1];
          v14 += 2;
          --v8;
        }
        while( v8 );
      }
      v7 = (*(__int64(__fastcall **)(__int64, PEP_QUERY_SOC_SUBSYSTEM_METADATA *))(v5 + 96))(40i64, Query);
      if( !v7 )
        PopFxBugCheck(0x605u, 0x28u, PopFxProcessorPlugin, 0);
      v16 = (const _UNICODE_STRING *)*((_QWORD *)Query + 2);
      RtlHashUnicodeString(v16, 0, 0i64, &HashValue);
      if( *(_DWORD *)&v16->Length != (_DWORD)v21
        || v16->Buffer != (wchar_t *)*((_QWORD *)&v21 + 1)
        || (_DWORD)HashValue != v23 )
      {
        PopFxBugCheck(0x705u, v5, 0x28u, 0x534E616Du);
      }
      v17 = 0i64;
      if( v3 )
      {
        v18 = (_UNICODE_STRING **)(Query + 8);
        v19 = (WCHAR **)(v10 + 1);
        do
        {
          if( !PopFxValidateReturnedUnicodeString(*v18, *v19, *((unsigned __int16 *)v19 - 3)) )
            PopFxBugCheck(0x706u, 0x28u, 0x4B657920u, *(_QWORD *)&Query[2 * v17 + 8] + 8);
          v7 = PopFxValidateReturnedUnicodeString(
                 *v18 + 1,
                 *(WCHAR **)((char *)v19 + (char *)v12 - (char *)v10),
                 *(unsigned __int16 *)((char *)v19 + (char *)v12 - (char *)v10 - 6));
          if( !v7 )
            PopFxBugCheck(0x706u, 0x28u, 0x56616C75u, *(_QWORD *)&Query[2 * v17 + 8] + 24);
          v17 = (unsigned int)(v17 + 1);
          ++v18;
          v19 += 2;
        }
        while( (unsigned int)v17 < v24 );
      }
    }
    LODWORD(PoolWithTag) = (unsigned int)ExFreePoolWithTag(v10, 0x4D584650u);
    if( v12 )
      LODWORD(PoolWithTag) = (unsigned int)ExFreePoolWithTag(v12, 0x4D584650u);
  }
  LOBYTE(PoolWithTag) = v7;
  return(int)PoolWithTag;
}

Referenced by:

PopFxLogSocSubsystemMetadata