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.