CmpParseInfBuffer

VOID **__fastcall CmpParseInfBuffer(UINT8 *a1, unsigned int a2, int *a3){
  __int64 v3; 
  void *v5; 
  CHAR v6; 
  VOID **result; 
  VOID **v8; 
  unsigned int v9; 
  UINT8 *v10; 
  char v11; 
  char v12; 
  int v13; 
  CHAR v14; 
  INT8 *P; 
  CHAR *v16; 
  UINT8 *v17; 
  INT64 a2a[2]; 
  CHAR a3a[8]; 
  int v21; 

  v3 = a2;
  *(_QWORD *)a3a = 0i64;
  v5 = 0i64;
  v6 = 0;
  *(_OWORD *)a2a = 0i64;
  result = ExAllocatePoolWithTag(1ui64, 0x30ui64, 1768967491i64);
  v8 = result;
  if( !result )
    return result;
  v9 = 1;
  *result = 0i64;
  result[1] = 0i64;
  result[2] = 0i64;
  result[3] = 0i64;
  *((_DWORD *)result + 8) = 0;
  result[5] = 0i64;
  v10 = &a1[v3];
  v16 = (CHAR *)a1;
  v11 = 0;
  v17 = v10;
  v12 = 0;
  P = 0i64;
  v21 = 1;
  do
  {
    CmpGetToken((const CHAR **)&v16, (UINT64)v10, (INT64)a2a);
    if( v9 <= 6 )
    {
      if( v9 != 6 )
      {
        switch( v9 )
        {
          case 1u:
            v13 = a2a[0];
            if( LODWORD(a2a[0]) )
            {
              if( LODWORD(a2a[0]) != 1 )
              {
                if( LODWORD(a2a[0]) != 2 )
                  goto LABEL_58;
                v9 = 2;
              }
              goto LABEL_24;
            }
            goto LABEL_57;
          case 2u:
            v13 = a2a[0];
            if( LODWORD(a2a[0]) != 3 )
            {
              if( LODWORD(a2a[0]) != 4 )
                goto LABEL_58;
              v9 = 3;
              v6 = a3a[0];
              P = (INT8 *)a2a[1];
              goto LABEL_24;
            }
            a3a[0] = 0;
            a2a[1] = (INT64)&EmptyValue;
            v6 = 0;
            break;
          case 3u:
            v13 = a2a[0];
            if( LODWORD(a2a[0]) != 3 )
              goto LABEL_58;
            break;
          case 4u:
            v13 = a2a[0];
            if( LODWORD(a2a[0]) )
            {
              if( LODWORD(a2a[0]) != 1 )
              {
                v11 = 1;
                v12 = 1;
                goto LABEL_61;
              }
              if( !CmpAppendSection((INT64)v8, P, v6) )
                goto LABEL_58;
              v9 = 5;
            }
            else
            {
              if( !CmpAppendSection((INT64)v8, P, v6) )
                goto LABEL_58;
              v11 = 1;
            }
            P = 0i64;
            goto LABEL_24;
          default:
            v13 = a2a[0];
            if( LODWORD(a2a[0]) )
            {
              if( LODWORD(a2a[0]) != 1 )
              {
                if( LODWORD(a2a[0]) == 2 )
                {
                  v9 = 2;
                }
                else
                {
                  if( LODWORD(a2a[0]) != 4 )
                  {
                    v11 = v9 - 4;
                    v12 = v9 - 4;
                    goto LABEL_61;
                  }
                  v5 = (void *)a2a[1];
                  v9 = 6;
                  v6 = a3a[0];
                }
              }
              goto LABEL_24;
            }
            goto LABEL_57;
        }
        v9 = 4;
        goto LABEL_24;
      }
      v13 = a2a[0];
      if( LODWORD(a2a[0]) )
      {
        switch( LODWORD(a2a[0]) )
        {
          case 1:
            if( CmpAppendLine(v8, 0i64, 0) && CmpAppendValue((INT64)v8, (INT64)v5, v6) )
            {
              v5 = 0i64;
              goto LABEL_41;
            }
            break;
          case 5:
            if( !CmpAppendLine(v8, (INT64)v5, v6) )
              goto LABEL_58;
            v5 = 0i64;
            v9 = 8;
            goto LABEL_24;
          case 6:
            if( CmpAppendLine(v8, 0i64, 0) && CmpAppendValue((INT64)v8, (INT64)v5, v6) )
            {
              v5 = 0i64;
              v9 = 7;
              goto LABEL_24;
            }
            break;
          default:
            goto LABEL_58;
        }
      }
      else if( CmpAppendLine(v8, 0i64, 0) && CmpAppendValue((INT64)v8, (INT64)v5, v6) )
      {
        v5 = 0i64;
        goto LABEL_57;
      }
    }
    else
    {
      if( v9 != 7 )
      {
        if( v9 != 8 )
        {
          v13 = a2a[0];
          if( LODWORD(a2a[0]) )
          {
            if( LODWORD(a2a[0]) != 1 )
            {
              if( LODWORD(a2a[0]) != 6 )
                goto LABEL_58;
              v9 = 7;
              goto LABEL_24;
            }
            goto LABEL_41;
          }
          goto LABEL_57;
        }
        v13 = a2a[0];
        if( LODWORD(a2a[0]) )
        {
          if( LODWORD(a2a[0]) != 1 )
          {
            if( LODWORD(a2a[0]) != 4 )
              goto LABEL_58;
            v14 = 0;
            goto LABEL_22;
          }
          a3a[0] = 0;
          a2a[1] = (INT64)&EmptyValue;
          v6 = 0;
          if( !CmpAppendValue((INT64)v8, (INT64)&EmptyValue, 0) )
          {
            v12 = 1;
            v11 = 1;
            goto LABEL_61;
          }
LABEL_41:
          v9 = 5;
          goto LABEL_24;
        }
        a3a[0] = 0;
        a2a[1] = (INT64)&EmptyValue;
        v6 = 0;
        if( !CmpAppendValue((INT64)v8, (INT64)&EmptyValue, 0) )
          v12 = 1;
LABEL_57:
        v11 = 1;
        goto LABEL_24;
      }
      v13 = a2a[0];
      if( LODWORD(a2a[0]) == 4 )
      {
        v14 = a3a[0];
LABEL_22:
        if( !CmpAppendValue((INT64)v8, a2a[1], v14) )
          goto LABEL_58;
        v9 = 9;
        goto LABEL_24;
      }
      if( LODWORD(a2a[0]) != 6 )
      {
LABEL_58:
        v11 = 1;
        v12 = 1;
        goto LABEL_61;
      }
      a3a[0] = 0;
      a2a[1] = (INT64)&EmptyValue;
      v6 = 0;
      if( CmpAppendValue((INT64)v8, (INT64)&EmptyValue, 0) )
        goto LABEL_24;
    }
    v11 = 1;
    v12 = 1;
LABEL_24:
    if( !v12 )
    {
      if( v13 == 1 )
        ++v21;
      goto LABEL_27;
    }
LABEL_61:
    *a3 = v21;
    if( P && v6 )
      ExFreePoolWithTag(P, 0);
    if( v5 && v6 )
      ExFreePoolWithTag(v5, 0);
    ExFreePoolWithTag(v8, 0);
    v8 = 0i64;
LABEL_27:
    v10 = v17;
  }
  while( !v11 );
  if( v8 )
    v8[1] = 0i64;
  return v8;
}

Referenced by:

EmpParseInfDatabase