IopEnumerateEnvironmentVariablesTrEE

NTSTATUS __stdcall IopEnumerateEnvironmentVariablesTrEE(
        _FILE_OBJECT *FileObject,
        _DEVICE_OBJECT *DeviceObject,
        UINT64 InformationClass,
        VOID *Buffer,
        UINT64 *BufferLength){
  int v5; 
  VOID **v7; 
  VOID **v8; 
  UINT64 *v9; 
  __int64 v10; 
  void *Pool_5; 
  UINT64 *v12; 
  int v13; 
  __int64 v14; 
  VOID **OutputBuffer; 
  __int64 v16; 
  _OWORD *v17; 
  UINT64 *v18; 
  char *v19; 
  NTSTATUS v20; 
  UINT64 *v21; 
  signed __int64 v22; 
  char v23; 
  NTSTATUS v24; 
  signed __int64 v25; 
  unsigned int v26; 
  __int64 v27; 
  VOID **v28; 
  UINT64 *v29; 
  UINT64 *v30; 
  VOID *v31; 
  UINT64 *v32; 
  int v33; 
  UINT64 *v34; 
  unsigned __int64 v35; 
  UINT64 InputBufferLength; 
  UINT64 OutputBufferLength; 
  UINT64 MinimumOutputSizeRequired; 
  UINT64 BytesWritten; 
  PVOID InputBuffer; 
  UINT64 *v41; 
  UINT64 v42; 
  unsigned __int64 v43; 
  char *v44; 
  int v47; 
  _DWORD *v49; 

  v47 = InformationClass;
  v5 = InformationClass;
  LODWORD(BytesWritten) = 0;
  if( (unsigned int)(InformationClass - 1) > 1 )
    return -1073741811;
  LODWORD(v42) = 0;
  v7 = 0i64;
  v8 = 0i64;
  v9 = 0i64;
  Pool_5 = IopVerifierExAllocatePool_5((__int64)FileObject, 0x214ui64);
  InputBuffer = Pool_5;
  if( Pool_5 )
  {
    OutputBuffer = IopVerifierExAllocatePool_5(v10, 0x220ui64);
    if( OutputBuffer
      && (v5 != 2
       || (v7 = IopVerifierExAllocatePool_5(v14, 0x214ui64)) != 0i64
       && (v42 = 288i64, (v8 = IopVerifierExAllocatePool_5(v16, 0x120ui64)) != 0i64)) )
    {
      v12 = BufferLength;
      v43 = (unsigned __int64)BufferLength + (unsigned int)*v49;
      *v49 = 0;
      memset(OutputBuffer, 0i64, 0x220u);
      v17 = InputBuffer;
      v18 = BufferLength;
      v41 = BufferLength;
      v19 = (char *)InputBuffer + 16;
      v44 = (char *)InputBuffer + 16;
      while( 1 )
      {
        *v17 = *(_OWORD *)(OutputBuffer + 1);
        memmove(v19, (char *)OutputBuffer + 28, *((_DWORD *)OutputBuffer + 6));
        *((_WORD *)v17 + ((unsigned __int64)*((unsigned int *)OutputBuffer + 6) >> 1) + 8) = 0;
        LODWORD(MinimumOutputSizeRequired) = 28;
        LODWORD(OutputBufferLength) = 544;
        LODWORD(InputBufferLength) = 532;
        v20 = IopIssueTrEERequest(
                1ui64,
                FileObject,
                DeviceObject,
                v17,
                InputBufferLength,
                OutputBuffer,
                OutputBufferLength,
                MinimumOutputSizeRequired,
                &BytesWritten);
        LODWORD(v21) = 0;
        v13 = v20;
        if( v20 < 0 )
          break;
        v22 = (signed __int64)*OutputBuffer;
        if( *OutputBuffer == (VOID *)0x800000000000000Ei64 )
        {
          v13 = 0;
          break;
        }
        if( v22 < 0 )
        {
          v13 = IopEfiStatusToNTSTATUS(v22);
          break;
        }
        if( Buffer )
        {
          v23 = ((__int64(__fastcall *)(VOID **, char *))Buffer)(OutputBuffer + 1, (char *)OutputBuffer + 28);
          v17 = InputBuffer;
          v19 = (char *)InputBuffer + 16;
          if( !v23 )
            continue;
        }
        if( v47 == 2 )
        {
          *(_OWORD *)v7 = *(_OWORD *)(OutputBuffer + 1);
          memmove(v7 + 2, (char *)OutputBuffer + 28, *((_DWORD *)OutputBuffer + 6));
          while( 1 )
          {
            LODWORD(MinimumOutputSizeRequired) = 24;
            LODWORD(OutputBufferLength) = v42;
            LODWORD(InputBufferLength) = 532;
            v24 = IopIssueTrEERequest(
                    0i64,
                    FileObject,
                    DeviceObject,
                    v7,
                    InputBufferLength,
                    v8,
                    OutputBufferLength,
                    MinimumOutputSizeRequired,
                    &BytesWritten);
            v21 = 0i64;
            v13 = v24;
            if( v24 < 0 )
              goto LABEL_42;
            v25 = (signed __int64)*v8;
            if( *v8 == (VOID *)0x8000000000000005i64 )
            {
              if( v12 )
              {
                v26 = *((_DWORD *)v8 + 4) + 32;
                v42 = v26;
                ExFreePoolWithTag(v8, 0);
                v28 = IopVerifierExAllocatePool_5(v27, v26);
                v21 = 0i64;
                v8 = v28;
                if( !v28 )
                {
                  v13 = -1073741670;
                  goto LABEL_42;
                }
                v13 = -1073741789;
              }
            }
            else if( v25 < 0 )
            {
              v13 = IopEfiStatusToNTSTATUS(v25);
LABEL_27:
              if( v13 < 0 )
                goto LABEL_42;
              v29 = v41;
              v30 = v21;
              v31 = (VOID *)(((unsigned __int64)v41 + *((unsigned int *)OutputBuffer + 6) + 39) & 0xFFFFFFFFFFFFFFF8ui64);
              v32 = (UINT64 *)(((unsigned __int64)v8[2] + (_QWORD)v31 + 7) & 0xFFFFFFFFFFFFFFF8ui64);
              if( (unsigned __int64)v32 <= v43 )
                v30 = v12;
              v12 = v30;
              if( v30 )
              {
                *((_OWORD *)v41 + 1) = *(_OWORD *)(OutputBuffer + 1);
                memmove(v29 + 4, (char *)OutputBuffer + 28, *((_DWORD *)OutputBuffer + 6));
                *((_DWORD *)v41 + 1) = (_DWORD)v31 - (_DWORD)v41;
                memmove(v31, v8 + 3, (size_t)v8[2]);
                v29 = v41;
                *((_DWORD *)v41 + 2) = *((_DWORD *)v8 + 4);
                *((_DWORD *)v29 + 3) = *((_DWORD *)v8 + 2);
                *(_DWORD *)v29 = (_DWORD)v32 - (_DWORD)v29;
              }
              v41 = v32;
              v33 = (_DWORD)v32 - (_DWORD)v29;
              v9 = v29;
              goto LABEL_38;
            }
            if( v13 != -1073741789 )
              goto LABEL_27;
          }
        }
        v34 = 0i64;
        v35 = ((unsigned __int64)v18 + *((unsigned int *)OutputBuffer + 6) + 27) & 0xFFFFFFFFFFFFFFF8ui64;
        if( v35 <= v43 )
          v34 = v12;
        v12 = v34;
        if( v34 )
        {
          *(_OWORD *)((char *)v18 + 4) = *(_OWORD *)(OutputBuffer + 1);
          memmove((char *)v18 + 20, (char *)OutputBuffer + 28, *((_DWORD *)OutputBuffer + 6));
          *(_DWORD *)v18 = v35 - (_DWORD)v18;
        }
        v9 = v18;
        v33 = v35 - (_DWORD)v18;
        v18 = (UINT64 *)v35;
LABEL_38:
        *v49 += v33;
        v17 = InputBuffer;
        v19 = v44;
      }
LABEL_42:
      Pool_5 = InputBuffer;
      if( v9 && v12 )
        *(_DWORD *)v9 = (_DWORD)v21;
    }
    else
    {
      v12 = BufferLength;
      v13 = -1073741670;
    }
    ExFreePoolWithTag(Pool_5, 0);
    LODWORD(v9) = 0;
    if( OutputBuffer )
      ExFreePoolWithTag(OutputBuffer, 0);
    if( v7 )
      ExFreePoolWithTag(v7, 0);
    if( v8 )
      ExFreePoolWithTag(v8, 0);
  }
  else
  {
    v12 = BufferLength;
    v13 = -1073741670;
  }
  if( !v12 && *v49 != (_DWORD)v9 )
    return -1073741789;
  return v13;
}

Referenced by:

No references.