Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 8 additions & 3 deletions src/app_win/headless.c
Original file line number Diff line number Diff line change
Expand Up @@ -266,12 +266,17 @@ static int append_vm_json(char *out, int cap, int pos, VmInstance *v)
static int build_host_info(char *buf, int cap)
{
SYSTEM_INFO si; MEMORYSTATUSEX ms; ULARGE_INTEGER freeB;
wchar_t pd[MAX_PATH];
wchar_t pd[MAX_PATH], vm_dir[MAX_PATH];
int i, count, vmCores = 0, vmRamMb = 0, vmHddGb = 0;
GetSystemInfo(&si);
ms.dwLength = sizeof(ms); GlobalMemoryStatusEx(&ms);
if (!GetEnvironmentVariableW(L"ProgramData", pd, MAX_PATH)) wcscpy_s(pd, MAX_PATH, L"C:\\");
freeB.QuadPart = 0; GetDiskFreeSpaceExW(pd, &freeB, NULL, NULL);
/* Free space on the volume backing %ProgramData%\AppSandbox (follows a
junction when VM storage was redirected); fall back to the root. */
if (!GetEnvironmentVariableW(L"ProgramData", pd, MAX_PATH)) wcscpy_s(pd, MAX_PATH, L"C:\\ProgramData");
swprintf_s(vm_dir, MAX_PATH, L"%s\\AppSandbox", pd);
freeB.QuadPart = 0;
if (!GetDiskFreeSpaceExW(vm_dir, &freeB, NULL, NULL))
GetDiskFreeSpaceExW(pd, &freeB, NULL, NULL);
count = asb_vm_count();
for (i = 0; i < count; i++) {
VmInstance *v = asb_vm_instance(asb_vm_get(i));
Expand Down
11 changes: 9 additions & 2 deletions src/app_win/ui.c
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ static void build_host_info_json(JsonBuilder *jb)
MEMORYSTATUSEX ms;
DWORD host_cores, host_ram_mb;
DWORD vm_cores = 0, vm_ram_mb = 0, vm_hdd_gb = 0;
wchar_t base_dir[MAX_PATH];
wchar_t base_dir[MAX_PATH], vm_dir[MAX_PATH];
ULARGE_INTEGER free_bytes;
DWORD free_gb = 0;
int i, count = asb_vm_count();
Expand All @@ -148,9 +148,16 @@ static void build_host_info_json(JsonBuilder *jb)
if (v) vm_hdd_gb += v->hdd_gb;
}

/* Report free space on the volume that actually backs the VM data
directory (%ProgramData%\AppSandbox), not the %ProgramData% root.
Querying the leaf directory lets GetDiskFreeSpaceEx follow a junction /
mount point when the user has redirected VM storage to another drive.
Fall back to the root when the directory does not exist yet. */
if (!GetEnvironmentVariableW(L"ProgramData", base_dir, MAX_PATH))
wcscpy_s(base_dir, MAX_PATH, L"C:\\ProgramData");
if (GetDiskFreeSpaceExW(base_dir, &free_bytes, NULL, NULL))
swprintf_s(vm_dir, MAX_PATH, L"%s\\AppSandbox", base_dir);
if (GetDiskFreeSpaceExW(vm_dir, &free_bytes, NULL, NULL) ||
GetDiskFreeSpaceExW(base_dir, &free_bytes, NULL, NULL))
free_gb = (DWORD)(free_bytes.QuadPart / (1024ULL * 1024 * 1024));

jb_int(jb, L"hostCores", (int)host_cores);
Expand Down