RtlIpv6StringToAddressExW

NTSTATUS __stdcall RtlIpv6StringToAddressExW(WCHAR *AddressString, in6_addr *Address, UINT64 *ScopeId, UINT16 *Port){
  WCHAR v7; 
  WCHAR *v8; 
  unsigned __int16 v9; 
  unsigned int v10; 
  bool v11; 
  NTSTATUS result; 
  WCHAR *v13; 
  wint_t v14; 
  unsigned __int16 v15; 
  WCHAR *v16; 
  __int16 v17; 
  __int16 v18; 
  bool v19; 
  __int16 v20; 
  wint_t v21; 
  WCHAR *v22; 

  v22 = 0i64;
  if( !AddressString || !Address || !ScopeId || !Port )
    return -1073741811;
  v7 = *AddressString;
  v8 = AddressString + 1;
  v9 = 0;
  if( v7 != 91 )
    v8 = AddressString;
  v10 = 0;
  v11 = v7 == 91;
  if( RtlIpv6StringToAddressW(v8, &v22, Address) < 0 )
    return -1073741811;
  v13 = v22;
  if( *v22 == 37 )
  {
    v13 = v22 + 1;
    v14 = v22[1];
    if( v14 >= 0x80u || !iswctype(v14, 4u) )
      return -1073741811;
    while( v14 && v14 != 93 )
    {
      if( v14 >= 0x80u || !iswctype(v14, 4u) || v14 + 2 * (5 * (unsigned __int64)v10 - 24) > 0xFFFFFFFF )
        return -1073741811;
      ++v13;
      v10 = v14 + 2 * (5 * v10 - 24);
      v14 = *v13;
    }
  }
  if( *v13 == 93 )
  {
    if( v7 != 91 )
      return -1073741811;
    ++v13;
    v11 = 0;
    if( *v13 == 58 )
    {
      ++v13;
      v15 = 10;
      if( *v13 == 48 )
      {
        v16 = v13 + 1;
        v15 = 8;
        v17 = v13[1] - 88;
        ++v13;
        if( (v17 & 0xFFDF) == 0 )
        {
          v15 = 16;
          v13 = v16 + 1;
        }
      }
      while( 1 )
      {
        v21 = *v13;
        if( !*v13 )
          break;
        if( v21 < 0x80u && iswctype(v21, 4u) && v21 - 48 < v15 )
        {
          if( v21 + v15 * (unsigned int)v9 - 48 > 0xFFFF )
            return -1073741811;
          v18 = v9 * v15 - 48;
        }
        else
        {
          if( v15 != 16
            || v21 >= 0x80u
            || !iswctype(v21, 0x80u)
            || v21 + 16 * v9 - (iswctype(v21, 2u) != 0 ? 97 : 65) + 10 > 0xFFFFu )
          {
            return -1073741811;
          }
          v18 = 16 * v9;
          v19 = iswctype(v21, 2u) == 0;
          v20 = 97;
          if( v19 )
            v20 = 65;
          v21 = v21 - v20 + 10;
        }
        v9 = v21 + v18;
        ++v13;
      }
    }
  }
  if( *v13 || v11 )
    return -1073741811;
  *Port = __ROR2__(v9, 8);
  result = 0;
  *(_DWORD *)ScopeId = v10;
  return result;
}

Referenced by:

No references.