From: Eric Biggers Date: Sat, 30 May 2015 20:48:08 +0000 (-0500) Subject: Add GUID helper functions X-Git-Tag: v1.8.2~112 X-Git-Url: https://wimlib.net/git/?p=wimlib;a=commitdiff_plain;h=3df2989aaef4c627f4fea630859ae9f72e9c307e Add GUID helper functions --- diff --git a/Makefile.am b/Makefile.am index cd67fb28..0169882c 100644 --- a/Makefile.am +++ b/Makefile.am @@ -115,6 +115,7 @@ libwim_la_SOURCES = \ include/wimlib/error.h \ include/wimlib/file_io.h \ include/wimlib/glob.h \ + include/wimlib/guid.h \ include/wimlib/hc_matchfinder.h \ include/wimlib/header.h \ include/wimlib/inode.h \ diff --git a/include/wimlib/guid.h b/include/wimlib/guid.h new file mode 100644 index 00000000..be9a10f7 --- /dev/null +++ b/include/wimlib/guid.h @@ -0,0 +1,40 @@ +/* + * guid.h + * + * Utility functions for handling 16-byte globally unique identifiers (GUIDs). + */ + +#ifndef _WIMLIB_GUID_H +#define _WIMLIB_GUID_H + +#include + +#include "wimlib/util.h" + +#define GUID_SIZE 16 + +static inline void +copy_guid(u8 dest[GUID_SIZE], const u8 src[GUID_SIZE]) +{ + memcpy(dest, src, GUID_SIZE); +} + +static inline int +cmp_guids(const u8 guid1[GUID_SIZE], const u8 guid2[GUID_SIZE]) +{ + return memcmp(guid1, guid2, GUID_SIZE); +} + +static inline bool +guids_equal(const u8 guid1[GUID_SIZE], const u8 guid2[GUID_SIZE]) +{ + return !cmp_guids(guid1, guid2); +} + +static inline void +generate_guid(u8 guid[GUID_SIZE]) +{ + return randomize_byte_array(guid, GUID_SIZE); +} + +#endif /* _WIMLIB_GUID_H */ diff --git a/include/wimlib/header.h b/include/wimlib/header.h index e696ce51..894bd225 100644 --- a/include/wimlib/header.h +++ b/include/wimlib/header.h @@ -3,12 +3,10 @@ #include +#include "wimlib/guid.h" #include "wimlib/resource.h" #include "wimlib/types.h" -/* Length of "Globally Unique ID" field in WIM header. */ -#define WIM_GUID_LEN 16 - /* Length of the WIM header on disk. wimlib currently requires that the header * be exactly this size. */ #define WIM_HEADER_DISK_SIZE 208 @@ -72,7 +70,7 @@ struct wim_header_disk { /* +0x18: Globally unique identifier for the WIM file. Basically a * bunch of random bytes. */ - u8 guid[WIM_GUID_LEN]; + u8 guid[GUID_SIZE]; /* +0x28: Number of this WIM part in the split WIM file, indexed from 1, * or 1 if the WIM is not split. */ @@ -123,7 +121,7 @@ struct wim_header { u32 wim_version; u32 flags; u32 chunk_size; - u8 guid[WIM_GUID_LEN]; + u8 guid[GUID_SIZE]; u16 part_number; u16 total_parts; u32 image_count; diff --git a/include/wimlib/wimboot.h b/include/wimlib/wimboot.h index 7dcd85d3..10857d5b 100644 --- a/include/wimlib/wimboot.h +++ b/include/wimlib/wimboot.h @@ -10,7 +10,7 @@ struct blob_descriptor; extern int wimboot_alloc_data_source_id(const wchar_t *wim_path, - const u8 guid[WIM_GUID_LEN], int image, + const u8 guid[GUID_SIZE], int image, const wchar_t *target, u64 *data_source_id_ret, bool *wof_running_ret); diff --git a/src/blob_table.c b/src/blob_table.c index d2ece47b..3e9f9b42 100644 --- a/src/blob_table.c +++ b/src/blob_table.c @@ -406,7 +406,7 @@ cmp_blobs_by_sequential_order(const void *p1, const void *p2) /* Different (possibly split) WIMs? */ if (wim1 != wim2) { - v = memcmp(wim1->hdr.guid, wim2->hdr.guid, WIM_GUID_LEN); + v = cmp_guids(wim1->hdr.guid, wim2->hdr.guid); if (v) return v; } diff --git a/src/extract.c b/src/extract.c index 0aa63f4b..533e8483 100644 --- a/src/extract.c +++ b/src/extract.c @@ -201,7 +201,7 @@ read_blobs_from_pipe(struct apply_ctx *ctx, struct wim_resource_descriptor rdesc; struct blob_descriptor *blob; - memcpy(ctx->progress.extract.guid, ctx->wim->hdr.guid, WIM_GUID_LEN); + copy_guid(ctx->progress.extract.guid, ctx->wim->hdr.guid); ctx->progress.extract.part_number = ctx->wim->hdr.part_number; ctx->progress.extract.total_parts = ctx->wim->hdr.total_parts; ret = extract_progress(ctx, WIMLIB_PROGRESS_MSG_EXTRACT_SPWM_PART_BEGIN); @@ -218,10 +218,10 @@ read_blobs_from_pipe(struct apply_ctx *ctx, if (part_number == ctx->progress.extract.part_number && total_parts == ctx->progress.extract.total_parts && - !memcmp(pwm_hdr.guid, ctx->progress.extract.guid, WIM_GUID_LEN)) + guids_equal(pwm_hdr.guid, ctx->progress.extract.guid)) continue; - memcpy(ctx->progress.extract.guid, pwm_hdr.guid, WIM_GUID_LEN); + copy_guid(ctx->progress.extract.guid, pwm_hdr.guid); ctx->progress.extract.part_number = part_number; ctx->progress.extract.total_parts = total_parts; ret = extract_progress(ctx, WIMLIB_PROGRESS_MSG_EXTRACT_SPWM_PART_BEGIN); diff --git a/src/header.c b/src/header.c index 0e16e6ca..37ba6ed2 100644 --- a/src/header.c +++ b/src/header.c @@ -121,7 +121,7 @@ read_wim_header(WIMStruct *wim, struct wim_header *hdr) hdr->flags = le32_to_cpu(disk_hdr.wim_flags); hdr->chunk_size = le32_to_cpu(disk_hdr.chunk_size); - memcpy(hdr->guid, disk_hdr.guid, WIM_GUID_LEN); + copy_guid(hdr->guid, disk_hdr.guid); hdr->part_number = le16_to_cpu(disk_hdr.part_number); hdr->total_parts = le16_to_cpu(disk_hdr.total_parts); @@ -175,7 +175,7 @@ write_wim_header(const struct wim_header *hdr, struct filedes *out_fd, disk_hdr.wim_version = cpu_to_le32(hdr->wim_version); disk_hdr.wim_flags = cpu_to_le32(hdr->flags); disk_hdr.chunk_size = cpu_to_le32(hdr->chunk_size); - memcpy(disk_hdr.guid, hdr->guid, WIM_GUID_LEN); + copy_guid(disk_hdr.guid, hdr->guid); disk_hdr.part_number = cpu_to_le16(hdr->part_number); disk_hdr.total_parts = cpu_to_le16(hdr->total_parts); disk_hdr.image_count = cpu_to_le32(hdr->image_count); @@ -249,7 +249,7 @@ wimlib_print_header(const WIMStruct *wim) tprintf(T("Chunk Size = %u\n"), hdr->chunk_size); tfputs (T("GUID = "), stdout); - print_byte_field(hdr->guid, WIM_GUID_LEN, stdout); + print_byte_field(hdr->guid, GUID_SIZE, stdout); tputchar(T('\n')); tprintf(T("Part Number = %hu\n"), hdr->part_number); tprintf(T("Total Parts = %hu\n"), hdr->total_parts); diff --git a/src/join.c b/src/join.c index 7999b683..cca44214 100644 --- a/src/join.c +++ b/src/join.c @@ -110,7 +110,7 @@ verify_swm_set(WIMStruct *wim, WIMStruct **additional_swms, "chunk size"); return WIMLIB_ERR_SPLIT_INVALID; } - if (memcmp(guid, swm->hdr.guid, WIM_GUID_LEN) != 0) { + if (!guids_equal(guid, swm->hdr.guid)) { ERROR("The split WIMs do not all have the same " "GUID"); return WIMLIB_ERR_SPLIT_INVALID; diff --git a/src/split.c b/src/split.c index 88f9b2bd..3f4a7d0a 100644 --- a/src/split.c +++ b/src/split.c @@ -69,7 +69,7 @@ write_split_wim(WIMStruct *orig_wim, const tchar *swm_name, union wimlib_progress_info progress; unsigned part_number; int ret; - u8 guid[WIMLIB_GUID_LEN]; + u8 guid[GUID_SIZE]; swm_name_len = tstrlen(swm_name); swm_name_buf = alloca((swm_name_len + 20) * sizeof(tchar)); @@ -91,7 +91,7 @@ write_split_wim(WIMStruct *orig_wim, const tchar *swm_name, progress.split.total_bytes += swm_info->parts[part_number - 1].size; progress.split.total_parts = swm_info->num_parts; - randomize_byte_array(guid, WIMLIB_GUID_LEN); + generate_guid(guid); for (part_number = 1; part_number <= swm_info->num_parts; part_number++) { int part_write_flags; diff --git a/src/wim.c b/src/wim.c index ff43ba59..df867890 100644 --- a/src/wim.c +++ b/src/wim.c @@ -187,7 +187,7 @@ wimlib_create_new_wim(enum wimlib_compression_type ctype, WIMStruct **wim_ret) wim->hdr.wim_version = WIM_VERSION_DEFAULT; wim->hdr.flags = 0; wim->hdr.chunk_size = 0; - randomize_byte_array(wim->hdr.guid, WIMLIB_GUID_LEN); + generate_guid(wim->hdr.guid); wim->hdr.part_number = 1; wim->hdr.total_parts = 1; wim->hdr.image_count = 0; @@ -448,7 +448,7 @@ WIMLIBAPI int wimlib_get_wim_info(WIMStruct *wim, struct wimlib_wim_info *info) { memset(info, 0, sizeof(struct wimlib_wim_info)); - memcpy(info->guid, wim->hdr.guid, WIMLIB_GUID_LEN); + copy_guid(info->guid, wim->hdr.guid); info->image_count = wim->hdr.image_count; info->boot_index = wim->hdr.boot_idx; info->wim_version = wim->hdr.wim_version; @@ -494,7 +494,7 @@ wimlib_set_wim_info(WIMStruct *wim, const struct wimlib_wim_info *info, int whic } if (which & WIMLIB_CHANGE_GUID) - memcpy(wim->hdr.guid, info->guid, WIM_GUID_LEN); + copy_guid(wim->hdr.guid, info->guid); if (which & WIMLIB_CHANGE_BOOT_INDEX) wim->hdr.boot_idx = info->boot_index; diff --git a/src/wimboot.c b/src/wimboot.c index 351c8e67..5e5ae7bc 100644 --- a/src/wimboot.c +++ b/src/wimboot.c @@ -346,7 +346,7 @@ static u8 * fill_in_wimoverlay_dat(u8 *buf, const struct WimOverlay_dat_header *old_hdr, const wchar_t *wim_path, - const u8 wim_guid[WIM_GUID_LEN], + const u8 wim_guid[GUID_SIZE], int image, u64 new_data_source_id, const PARTITION_INFORMATION_EX *part_info, @@ -394,8 +394,8 @@ fill_in_wimoverlay_dat(u8 *buf, new_entry_1->entry_2_length = new_entry_2_size; new_entry_1->wim_type = WIM_BOOT_NOT_OS_WIM; new_entry_1->wim_index = image; - BUILD_BUG_ON(sizeof(new_entry_1->guid) != WIM_GUID_LEN); - memcpy(new_entry_1->guid, wim_guid, WIM_GUID_LEN); + BUILD_BUG_ON(sizeof(new_entry_1->guid) != GUID_SIZE); + copy_guid(new_entry_1->guid, wim_guid); p += sizeof(struct WimOverlay_dat_entry_1); @@ -491,7 +491,7 @@ fill_in_wimoverlay_dat(u8 *buf, static int prepare_wimoverlay_dat(const struct WimOverlay_dat_header *old_hdr, const wchar_t *wim_path, - const u8 wim_guid[WIM_GUID_LEN], + const u8 wim_guid[GUID_SIZE], int image, void **new_contents_ret, u32 *new_contents_size_ret, @@ -790,7 +790,7 @@ out_free_contents: */ static int update_wimoverlay_manually(const wchar_t *drive, const wchar_t *wim_path, - const u8 wim_guid[WIM_GUID_LEN], + const u8 wim_guid[GUID_SIZE], int image, u64 *data_source_id_ret) { wchar_t path_main[] = L"A:\\System Volume Information\\WimOverlay.dat"; @@ -926,7 +926,7 @@ try_to_attach_wof(const wchar_t *drive) */ int wimboot_alloc_data_source_id(const wchar_t *wim_path, - const u8 wim_guid[WIM_GUID_LEN], + const u8 wim_guid[GUID_SIZE], int image, const wchar_t *target, u64 *data_source_id_ret, bool *wof_running_ret) { diff --git a/src/write.c b/src/write.c index 5bd8db91..4d5e7165 100644 --- a/src/write.c +++ b/src/write.c @@ -2751,9 +2751,9 @@ write_wim_part(WIMStruct *wim, if (write_flags & WIMLIB_WRITE_FLAG_RETAIN_GUID) guid = wim->hdr.guid; if (guid) - memcpy(wim->out_hdr.guid, guid, WIMLIB_GUID_LEN); + copy_guid(wim->out_hdr.guid, guid); else - randomize_byte_array(wim->out_hdr.guid, WIMLIB_GUID_LEN); + generate_guid(wim->out_hdr.guid); /* Set the part number and total parts. */ wim->out_hdr.part_number = part_number;