/* There are several sources we might use: * - /ProgramData/Microsoft/Windows Live/WLive48x48.png * - w-brand.png (in a very long directory name) * - /Windows/System32/slui.exe --type=14 group icon #2 */ static char * icon_windows_8 (guestfs_h *g, struct inspect_fs *fs, size_t *size_r) { char *filename_case = NULL; char *filename_downloaded = NULL; char *ret; filename_case = guestfs___case_sensitive_path_silently (g, "/ProgramData/Microsoft/Windows Live/WLive48x48.png"); if (filename_case == NULL) goto not_found; filename_downloaded = guestfs___download_to_tmp (g, fs, filename_case, "wlive48x48.png", 8192); if (filename_downloaded == NULL) goto not_found; if (read_whole_file (g, filename_downloaded, &ret, size_r) == -1) goto error; free (filename_case); free (filename_downloaded); return ret; error: free (filename_case); free (filename_downloaded); return NULL; not_found: free (filename_case); free (filename_downloaded); return NOT_FOUND; }
/* There are several sources we might use: * - /ProgramData/Microsoft/Windows Live/WLive48x48.png * - w-brand.png (in a very long directory name) * - /Windows/System32/slui.exe --type=14 group icon #2 */ static char * icon_windows_8 (guestfs_h *g, struct inspect_fs *fs, size_t *size_r) { CLEANUP_FREE char *filename_case = NULL; CLEANUP_FREE char *filename_downloaded = NULL; int r; char *ret; filename_case = guestfs___case_sensitive_path_silently (g, "/ProgramData/Microsoft/Windows Live/WLive48x48.png"); if (filename_case == NULL) return NOT_FOUND; /* Not an error since a parent dir might not exist. */ guestfs_push_error_handler (g, NULL, NULL); r = guestfs_is_file (g, filename_case); guestfs_pop_error_handler (g); if (r == -1) return NULL; if (r == 0) return NOT_FOUND; filename_downloaded = guestfs___download_to_tmp (g, fs, filename_case, "wlive48x48.png", 8192); if (filename_downloaded == NULL) return NOT_FOUND; if (read_whole_file (g, filename_downloaded, &ret, size_r) == -1) return NULL; return ret; }
int guestfs___is_dir_nocase (guestfs_h *g, const char *path) { CLEANUP_FREE char *p = NULL; int r; p = guestfs___case_sensitive_path_silently (g, path); if (!p) return 0; r = guestfs_is_dir (g, p); return r > 0; }
/* Return /etc/favicon.png (or \etc\favicon.png) if it exists and if * it has a reasonable size and format. */ static char * icon_favicon (guestfs_h *g, struct inspect_fs *fs, size_t *size_r) { char *ret; char *filename = safe_strdup (g, "/etc/favicon.png"); if (fs->type == OS_TYPE_WINDOWS) { char *f = guestfs___case_sensitive_path_silently (g, filename); if (f) { free (filename); filename = f; } } ret = get_png (g, fs, filename, size_r, 0); free (filename); return ret; }
static char * icon_windows_7 (guestfs_h *g, struct inspect_fs *fs, size_t *size_r) { char *filename = NULL; char *filename_case = NULL; char *filename_downloaded = NULL; char *pngfile = NULL; char *ret; struct command *cmd; int r; /* Download %systemroot%\explorer.exe */ filename = safe_asprintf (g, "%s/explorer.exe", fs->windows_systemroot); filename_case = guestfs___case_sensitive_path_silently (g, filename); if (filename_case == NULL) goto not_found; filename_downloaded = guestfs___download_to_tmp (g, fs, filename_case, "explorer.exe", MAX_WINDOWS_EXPLORER_SIZE); if (filename_downloaded == NULL) goto not_found; pngfile = safe_asprintf (g, "%s/windows-7-icon.png", g->tmpdir); cmd = guestfs___new_command (g); guestfs___cmd_add_string_unquoted (cmd, WRESTOOL " -x --type=2 --name=6801 "); guestfs___cmd_add_string_quoted (cmd, filename_downloaded); guestfs___cmd_add_string_unquoted (cmd, " | " BMPTOPNM " | " PAMCUT " -bottom 54 | " PNMTOPNG " > "); guestfs___cmd_add_string_quoted (cmd, pngfile); r = guestfs___cmd_run (cmd); guestfs___cmd_close (cmd); if (r == -1) goto error; if (!WIFEXITED (r) || WEXITSTATUS (r) != 0) goto not_found; if (read_whole_file (g, pngfile, &ret, size_r) == -1) goto error; free (filename); free (filename_case); free (filename_downloaded); free (pngfile); return ret; error: free (filename); free (filename_case); free (filename_downloaded); free (pngfile); return NULL; not_found: free (filename); free (filename_case); free (filename_downloaded); free (pngfile); return NOT_FOUND; }
char * guestfs___get_windows_systemroot (guestfs_h *g) { /* Check a predefined list of common windows system root locations */ static const char *systemroots[] = { "/windows", "/winnt", "/win32", "/win", NULL }; for (size_t i = 0; i < sizeof systemroots / sizeof systemroots[0]; ++i) { char *systemroot = guestfs___case_sensitive_path_silently (g, systemroots[i]); if (!systemroot) continue; if (is_systemroot (g, systemroot)) { debug (g, "windows %%SYSTEMROOT%% = %s", systemroot); return systemroot; } else { free (systemroot); } } /* If the fs contains boot.ini, check it for non-standard * systemroot locations */ CLEANUP_FREE char *boot_ini_path = guestfs___case_sensitive_path_silently (g, "/boot.ini"); if (boot_ini_path && guestfs_is_file (g, boot_ini_path) > 0) { CLEANUP_FREE_STRING_LIST char **boot_ini = guestfs_read_lines (g, boot_ini_path); if (!boot_ini) { debug (g, "error reading %s", boot_ini_path); return NULL; } int found_os = 0; for (char **i = boot_ini; *i != NULL; i++) { CLEANUP_FREE char *controller_type = NULL; CLEANUP_FREE char *controller = NULL; CLEANUP_FREE char *disk = NULL; CLEANUP_FREE char *rdisk = NULL; CLEANUP_FREE char *partition = NULL; CLEANUP_FREE char *path = NULL; char *line = *i; if (!found_os) { if (match (g, line, re_boot_ini_os_header)) { found_os = 1; continue; } } /* See http://support.microsoft.com/kb/102873 for a discussion * of what this line means */ if (match6 (g, line, re_boot_ini_os, &controller_type, &controller, &disk, &rdisk, &partition, &path)) { /* The Windows system root may be on any disk. However, there * are currently (at least) 2 practical problems preventing us * from locating it on another disk: * * 1. We don't have enough metadata about the disks we were * given to know if what controller they were on and what * index they had. * * 2. The way inspection of filesystems currently works, we * can't mark another filesystem, which we may have already * inspected, to be inspected for a specific Windows system * root. * * Solving 1 properly would require a new API at a minimum. We * might be able to fudge something practical without this, * though, e.g. by looking at the <partition>th partition of * every disk for the specific windows root. * * Solving 2 would probably require a significant refactoring * of the way filesystems are inspected. We should probably do * this some time. * * For the moment, we ignore all partition information and * assume the system root is on the current partition. In * practice, this will normally be correct. */ /* Swap backslashes for forward slashes in the system root * path */ for (char *j = path; *j != '\0'; j++) { if (*j == '\\') *j = '/'; } char *systemroot = guestfs___case_sensitive_path_silently (g, path); if (systemroot && is_systemroot (g, systemroot)) { debug (g, "windows %%SYSTEMROOT%% = %s", systemroot); return systemroot; } else { free (systemroot); } } } } return NULL; /* not found */ }