IopIssueSystemEnvironmentRequest
INT64 __stdcall IopIssueSystemEnvironmentRequest(
UINT64 IoControlCode,
UINT8 InternalDeviceIoControl,
FILE_OBJECT *FileObject,
DEVICE_OBJECT *DeviceObject,
PVOID InputBuffer,
UINT64 InputBufferLength,
PVOID OutputBuffer,
UINT64 OutputBufferLength,
UINT64 *Information){
ULONG v11;
PIRP v13;
BOOL v14;
NTSTATUS v16;
unsigned int Status;
struct _IO_STATUS_BLOCK IoStatusBlock;
__int64 Parameter[2];
__int64 v20;
struct _KEVENT Event;
v20 = 0i64;
v11 = IoControlCode;
memset(&Event, 0, sizeof(Event));
IoStatusBlock = 0i64;
KeInitializeEvent(&Event, NotificationEvent, 0);
v13 = IoBuildDeviceIoControlRequest(
v11,
DeviceObject,
InputBuffer,
InputBufferLength,
OutputBuffer,
OutputBufferLength,
InternalDeviceIoControl,
&Event,
&IoStatusBlock);
if( !v13 )
return 3221225626i64;
if( FileObject )
*(_QWORD *)(*((_QWORD *)v13 + 23) - 24i64) = FileObject;
Parameter[1] = (__int64)v13;
LOBYTE(v14) = 1;
Parameter[0] = (__int64)DeviceObject;
v16 = KeExpandKernelStackAndCalloutEx(IopIssueSystemEnvironmentCallout, Parameter, 0x11800ui64, v14, 0i64);
Status = v16;
if( v16 < 0 )
{
if( v16 == -1073741789 )
{
Status = -1073741801;
if( Information )
*(_DWORD *)Information = 0;
}
}
else
{
Status = v20;
if( (_DWORD)v20 == 259 )
{
KeWaitForSingleObject(&Event, Executive, 0, 0, 0i64);
Status = IoStatusBlock.Status;
}
if( Information )
*(_DWORD *)Information = IoStatusBlock.Information;
}
return Status;
}Referenced by:
IopEnumerateEnvironmentVariablesSysEnv
IopGetEnvironmentVariableSysEnv
IopIssueTrEERequest
IopQueryEnvironmentVariableInfoSysEnv
IopSetEnvironmentVariableSysEnv