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