HalpDeviceEquals

NTSTATUS __stdcall HalpDeviceEquals(DEBUG_DEVICE_DESCRIPTOR *Device1, DEBUG_DEVICE_DESCRIPTOR *Device2){
  void **v2; 
  __int64 v3; 
  int v5; 
  KD_NAMESPACE_ENUM NameSpace; 
  char v7; 
  unsigned __int8 BaseClass; 
  char v9; 
  unsigned __int8 SubClass; 
  unsigned int Slot; 
  __int16 v12; 
  unsigned __int16 PortType; 
  __int16 v14; 
  unsigned __int16 PortSubtype; 
  unsigned int NameSpacePathLength; 
  char v17; 
  unsigned __int16 v18; 
  __int16 v19; 
  void *retaddr; 
  v2 = &retaddr;
  v3 = KdDebugDevice;
  v5 = *(_DWORD *)(KdDebugDevice + 220);
  NameSpace = Device2->NameSpace;
  if( v5 != 2 )
  {
    if( NameSpace != KdNameSpaceAny && v5 != NameSpace )
    {
      LOBYTE(v2) = 0;
      return(int)v2;
    }
    NameSpace = *(_DWORD *)(KdDebugDevice + 220);
  }
  if( (NameSpace & 0xFFFFFFFD) == 0 )
  {
    v7 = *(_BYTE *)(KdDebugDevice + 14);
    BaseClass = Device2->BaseClass;
    if( v7 == BaseClass || (v7 == -1 || BaseClass == 0xFF ? (LODWORD(v2) = 1) : (LODWORD(v2) = 0), (_DWORD)v2) )
    {
      v9 = *(_BYTE *)(KdDebugDevice + 15);
      SubClass = Device2->SubClass;
      if( v9 == SubClass || (v9 == -1 || SubClass == 0xFF ? (LODWORD(v2) = 1) : (LODWORD(v2) = 0), (_DWORD)v2) )
      {
        if( *(_DWORD *)KdDebugDevice == Device2->Bus
          || (*(_DWORD *)KdDebugDevice == -1 || Device2->Bus == -1 ? (LODWORD(v2) = 1) : (LODWORD(v2) = 0), (_DWORD)v2) )
        {
          LODWORD(v2) = *(_DWORD *)(KdDebugDevice + 4);
          Slot = Device2->Slot;
          if( (_DWORD)v2 == Slot || (_DWORD)v2 == -1 || Slot == -1 )
            goto LABEL_54;
        }
      }
    }
  }
  if( v5 == 1 || NameSpace == KdNameSpaceAny )
  {
    v12 = *(_WORD *)(KdDebugDevice + 204);
    PortType = Device2->PortType;
    if( v12 == PortType || (v12 == -1 || PortType == 0xFFFF ? (LODWORD(v2) = 1) : (LODWORD(v2) = 0), (_DWORD)v2) )
    {
      v14 = *(_WORD *)(KdDebugDevice + 206);
      PortSubtype = Device2->PortSubtype;
      if( v14 == PortSubtype
        || (v14 == -1 || PortSubtype == 0xFFFF ? (LODWORD(v2) = 1) : (LODWORD(v2) = 0), (_DWORD)v2) )
      {
        LODWORD(v2) = *(_DWORD *)(KdDebugDevice + 232);
        if( (_DWORD)v2 == -1 )
          goto LABEL_54;
        NameSpacePathLength = Device2->NameSpacePathLength;
        if( NameSpacePathLength == -1 )
          goto LABEL_54;
        if( (_DWORD)v2 == NameSpacePathLength )
        {
          LODWORD(v2) = wcsncmp(*(const WCHAR **)(KdDebugDevice + 224), Device2->NameSpacePath, (unsigned int)v2);
          if( !(_DWORD)v2 )
            goto LABEL_54;
        }
      }
    }
  }
  v17 = 0;
  if( NameSpace != KdNameSpaceNone )
    goto LABEL_55;
  LODWORD(v2) = Device2->NameSpace;
  if( *(_DWORD *)(v3 + 220) != (_DWORD)v2 )
    goto LABEL_55;
  if( ((LODWORD(v2) = *(unsigned __int16 *)(v3 + 204), v18 = Device2->PortType, (_WORD)v2 == v18)
     || (_WORD)v2 == 0xFFFF
     || v18 == 0xFFFF)
    && ((v19 = *(_WORD *)(v3 + 206), LODWORD(v2) = Device2->PortSubtype, v19 == (_WORD)v2)
     || v19 == -1
     || (_WORD)v2 == 0xFFFF) )
  {
LABEL_54:
    v17 = 1;
  }
  else
  {
    v17 = 0;
  }
LABEL_55:
  LOBYTE(v2) = v17;
  return(int)v2;
}

Referenced by:

HalpKdEnumerateDebuggingDevices