IopGetEnvironmentVariableSysEnv

NTSTATUS __stdcall IopGetEnvironmentVariableSysEnv(
        _FILE_OBJECT *FileObject,
        _DEVICE_OBJECT *DeviceObject,
        WCHAR *VariableName,
        _GUID *VendorGuid,
        VOID *Value,
        UINT64 *ValueLength,
        UINT64 *Attributes){
  __int64 v9; 
  size_t v11; 
  unsigned int v12; 
  VOID **Pool_5; 
  VOID **v14; 
  NTSTATUS v15; 
  _GUID v16; 
  __int64 v17; 
  void *v18; 
  VOID **v19; 
  NTSTATUS v20; 
  size_t v21; 
  int v22; 
  INT64 v24; 

  v9 = -1i64;
  do
    ++v9;
  while( VariableName[v9] );
  v11 = 2 * v9 + 2;
  v12 = 2 * v9 + 22;
  Pool_5 = IopVerifierExAllocatePool_5((__int64)FileObject, v12);
  v14 = Pool_5;
  if( Pool_5 )
  {
    memmove((char *)Pool_5 + 20, VariableName, v11);
    v16 = *VendorGuid;
    *((_DWORD *)v14 + 4) = v11;
    *(_GUID *)v14 = v16;
    v19 = IopVerifierExAllocatePool_5(v17, (unsigned int)(*(_DWORD *)ValueLength + 8));
    if( !v19 )
    {
      v15 = -1073741670;
LABEL_17:
      ExFreePoolWithTag(v14, 0);
      return v15;
    }
    LOBYTE(v18) = 1;
    LODWORD(v24) = v12;
    v20 = IopIssueSystemEnvironmentRequest(0x520004u, v18, 0, DeviceObject, (ULONG)v14, v24);
    v15 = v20;
    if( v20 < 0 )
    {
      if( v20 != -1073741789 )
      {
LABEL_16:
        ExFreePoolWithTag(v19, 0);
        goto LABEL_17;
      }
      v22 = -8;
    }
    else
    {
      if( Attributes )
        *(_DWORD *)Attributes = *(_DWORD *)v19;
      v21 = *(_DWORD *)ValueLength;
      if( *(_DWORD *)ValueLength >= *((_DWORD *)v19 + 1) )
        v21 = *((_DWORD *)v19 + 1);
      memmove(Value, v19 + 1, v21);
      v22 = *((_DWORD *)v19 + 1);
    }
    *(_DWORD *)ValueLength = v22;
    goto LABEL_16;
  }
  return -1073741670;
}

Referenced by:

No references.