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