RtlIpv4StringToAddressW

NTSTATUS __stdcall RtlIpv4StringToAddressW(WCHAR *String, UINT8 Strict, WCHAR **Terminator, in_addr *Addr){
  unsigned int *v6; 
  int v7; 
  char v8; 
  unsigned int v9; 
  wint_t v10; 
  NTSTATUS result; 
  NTSTATUS v12; 
  unsigned int v13; 
  __int64 v14; 
  int v15; 
  int v16; 
  int v17; 
  int v18; 
  int v19; 
  int v20; 
  UINT8 v21; 
  unsigned int v23; 
  unsigned int v24; 
  unsigned int v25; 
  unsigned int v26; 

  v21 = Strict;
  v6 = &v23;
  while( 1 )
  {
    v7 = 10;
    v8 = 0;
    v9 = 0;
    if( *String == 48 )
    {
      if( *++String < 0x80u && (v12 = iswctype(*String, 4u), Strict = v21, v12) )
      {
        v7 = 8;
      }
      else if( ((*String - 88) & 0xFFDF) != 0 )
      {
        v8 = 1;
      }
      else
      {
        v7 = 16;
        ++String;
      }
    }
    if( Strict && v7 != 10 )
      goto LABEL_12;
    v10 = *String;
    if( *String )
    {
      do
      {
        if( v10 < 0x80u && iswctype(v10, 4u) && v10 - 48 < v7 )
        {
          v13 = v9 * v7 + v10 - 48;
        }
        else
        {
          if( v7 != 16 || v10 >= 0x80u || !iswctype(v10, 0x80u) )
          {
            Strict = v21;
            goto LABEL_10;
          }
          v13 = v10 + 16 * v9 - (iswctype(v10, 2u) != 0 ? 97 : 65) + 10;
        }
        if( v13 < v9 )
          goto LABEL_12;
        v8 = 1;
        ++String;
        v9 = v13;
        v10 = *String;
      }
      while( *String );
      Strict = v21;
    }
LABEL_10:
    if( *String != 46 )
      break;
    if( v6 < &v26 )
    {
      *v6 = v9;
      ++String;
      ++v6;
      if( v8 )
        continue;
    }
    goto LABEL_12;
  }
  if( !v8 )
    goto LABEL_12;
  *v6 = v9;
  v14 = ((char *)v6 - (char *)&v23 + 4) >> 2;
  if( Strict )
  {
    if( (_DWORD)v14 != 4 )
      goto LABEL_12;
  }
  v15 = v14 - 1;
  if( !v15 )
  {
    v20 = v23;
    goto LABEL_50;
  }
  v16 = v15 - 1;
  if( !v16 )
  {
    if( v23 <= 0xFF && v24 <= 0xFFFFFF )
    {
      v19 = v23 << 24;
      v18 = v24 & 0xFFFFFF;
      goto LABEL_48;
    }
    goto LABEL_12;
  }
  v17 = v16 - 1;
  if( !v17 )
  {
    if( v23 <= 0xFF && v24 <= 0xFF && v25 <= 0xFFFF )
    {
      v18 = (unsigned __int16)v25;
      v19 = ((v23 << 8) | (unsigned __int8)v24) << 16;
      goto LABEL_48;
    }
LABEL_12:
    result = -1073741811;
    *Terminator = String;
    return result;
  }
  if( v17 != 1 || v23 > 0xFF || v24 > 0xFF || v25 > 0xFF || v26 > 0xFF )
    goto LABEL_12;
  v18 = (unsigned __int8)v26;
  v19 = ((unsigned __int8)v25 | (((v23 << 8) | (unsigned __int8)v24) << 8)) << 8;
LABEL_48:
  v20 = v18 | v19;
LABEL_50:
  *Terminator = String;
  Addr->S_un.S_addr = _byteswap_ulong(v20);
  return 0;
}

Referenced by:

RtlIpv4StringToAddressExW