CmpGetToken

VOID __fastcall CmpGetToken(const CHAR **a1, UINT64 a2, INT64 a3){
  UINT8 *i; 
  int v7; 
  INT8 *v8; 
  UINT8 *v9; 
  UINT8 *v10; 
  __int64 v11; 
  __int64 v12; 
  VOID **PoolWithTag; 
  VOID **v14; 
  char v15; 
  UINT8 *v16; 
  UINT8 *v17; 
  __int64 v18; 
  int v19; 

  *(_QWORD *)(a3 + 8) = 0i64;
  *(_BYTE *)(a3 + 16) = 0;
  while( 1 )
  {
    for( i = (UINT8 *)*a1; (unsigned __int64)i < a2 && *i != 10 && isspace(*i); ++i )
      ;
    if( (unsigned __int64)i >= a2 )
      break;
    if( *i == 59 || *i == 35 )
    {
      do
      {
        if( *i == 10 )
          break;
        ++i;
      }
      while( (unsigned __int64)i < a2 );
    }
    if( (unsigned __int64)i >= a2 )
      break;
    v7 = (char)*i;
    if( *i == 26 )
      break;
    switch( v7 )
    {
      case 10:
        *(_DWORD *)a3 = 1;
        break;
      case 34:
        v17 = ++i;
        while( (unsigned __int64)i < a2 )
        {
          strchr((UINT8 *)&byte_140A97E4E, *i);
          if( v18 )
            break;
          ++i;
        }
        if( (unsigned __int64)i < a2 && *i == 34 )
        {
          *i = 0;
          v19 = 4;
          ++i;
          *(_QWORD *)(a3 + 8) = v17;
        }
        else
        {
          v19 = 7;
        }
        *(_DWORD *)a3 = v19;
        goto LABEL_29;
      case 44:
        *(_DWORD *)a3 = 6;
        break;
      case 61:
        *(_DWORD *)a3 = 5;
        break;
      case 91:
        *(_DWORD *)a3 = 2;
        break;
      case 92:
        v16 = ++i;
        if( (unsigned __int64)i < a2 )
        {
          do
          {
            if( *v16 == 10 )
              break;
            if( !isspace(*v16) )
              break;
            ++v16;
          }
          while( (unsigned __int64)v16 < a2 );
        }
        if( *v16 == 59 || *v16 == 35 )
        {
          v16 = ++i;
          if( (unsigned __int64)i < a2 )
          {
            do
            {
              if( *v16 == 10 )
                break;
              ++v16;
            }
            while( (unsigned __int64)v16 < a2 );
          }
        }
        if( (unsigned __int64)v16 < a2 )
        {
          if( *v16 == 10 )
          {
            i = v16 + 1;
            v15 = 0;
            goto LABEL_30;
          }
LABEL_19:
          v8 = (INT8 *)i;
          v9 = i;
          if( (unsigned __int64)i < a2 )
          {
            v10 = i;
            do
            {
              v9 = v10;
              strchr((UINT8 *)&StringTerminators, *i);
              if( v11 )
                break;
              i = v10 + 1;
              v10 = i;
              v9 = i;
            }
            while( (unsigned __int64)i < a2 );
            if( v9 != (UINT8 *)v8 )
            {
              v12 = (unsigned int)((_DWORD)i - (_DWORD)v8);
              if( (int)v12 + 1 >= (unsigned int)v12
                && (PoolWithTag = ExAllocatePoolWithTag(1ui64, (unsigned int)(v12 + 1), 1768967491i64),
                    (v14 = PoolWithTag) != 0i64) )
              {
                strncpy_s((INT8 *)PoolWithTag, (unsigned int)(v12 + 1), v8, (unsigned int)v12);
                *((_BYTE *)v14 + v12) = 0;
                *(_DWORD *)a3 = 4;
                *(_QWORD *)(a3 + 8) = v14;
                *(_BYTE *)(a3 + 16) = 1;
              }
              else
              {
                *(_DWORD *)a3 = 8;
              }
              goto LABEL_29;
            }
          }
          i = v9 + 1;
        }
        *(_DWORD *)a3 = 7;
        goto LABEL_29;
      case 93:
        *(_DWORD *)a3 = 3;
        break;
      default:
        goto LABEL_19;
    }
    ++i;
LABEL_29:
    v15 = 1;
LABEL_30:
    *a1 = (const CHAR *)i;
    if( v15 )
      return;
  }
  *(_DWORD *)a3 = 0;
  *(_QWORD *)(a3 + 8) = 0i64;
  *a1 = (const CHAR *)i;
}

Referenced by:

CmpParseInfBuffer