RtlCharToInteger
NTSTATUS __stdcall RtlCharToInteger(INT8 *String, UINT64 Base, UINT64 *Value){
unsigned int v4;
INT8 *v5;
INT8 v6;
INT8 *v7;
INT8 v8;
INT8 *v9;
int v10;
int v11;
unsigned int v12;
int v13;
INT8 *v15;
INT8 *v16;
v4 = Base;
v5 = String;
v6 = *String;
if( *String <= 32 )
{
while( 1 )
{
v15 = v5++;
if( !*v5 )
break;
v6 = *v5;
if( *v5 > 32 )
goto LABEL_2;
}
v7 = v15;
}
else
{
LABEL_2:
v7 = v5 + 1;
}
v8 = v6;
if( ((v6 - 43) & 0xFD) == 0 )
v8 = *v7++;
v9 = v7;
switch( (_DWORD)Base )
{
case 0:
v10 = 0;
v4 = 10;
if( v8 != 48 )
break;
v8 = *v7;
v16 = v7 + 1;
switch( v8 )
{
case 'x':
v10 = 4;
v4 = 16;
break;
case 'o':
v10 = 3;
v4 = 8;
break;
case 'b':
v10 = 1;
v4 = 2;
break;
default:
v16 = v9;
goto LABEL_39;
}
v8 = *v16;
LABEL_39:
v7 = v16 + 1;
break;
case 0x10:
v10 = 4;
break;
case 0xA:
v10 = 0;
break;
case 2:
v10 = 1;
break;
case 8:
v10 = 3;
break;
default:
return -1073741811;
}
v11 = 0;
while( v8 )
{
if( (unsigned __int8)(v8 - 48) > 9u )
{
if( (unsigned __int8)(v8 - 65) > 5u )
{
if( (unsigned __int8)(v8 - 97) > 5u )
break;
v12 = v8 - 87;
}
else
{
v12 = v8 - 55;
}
}
else
{
v12 = v8 - 48;
}
if( v12 >= v4 )
break;
if( v10 )
v11 = v12 | (v11 << v10);
else
v11 = v12 + v4 * v11;
v8 = *v7++;
}
v13 = -v11;
if( v6 != 45 )
v13 = v11;
*(_DWORD *)Value = v13;
return 0;
}Referenced by:
EmpParseTargetRuleStringIndexList
IopCheckDiskName