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