X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;f=include%2Fwimlib%2Fheader.h;h=2fe76d4cad8c05eff420fb77c95a59a59f586e8b;hb=3ffb2cde078ae8f62d542ab89166e1059c13d758;hp=0702b45bfa9b9c30af662ee0e074cc46033b510e;hpb=a20f70497fdc89f8c5cdda791f14178819ed25cb;p=wimlib diff --git a/include/wimlib/header.h b/include/wimlib/header.h index 0702b45b..2fe76d4c 100644 --- a/include/wimlib/header.h +++ b/include/wimlib/header.h @@ -3,27 +3,131 @@ #include "wimlib/resource.h" #include "wimlib/types.h" +#include "wimlib/endianness.h" +/* Length of "Globally Unique ID" field in WIM header. */ #define WIM_GID_LEN 16 -/* Length of the WIM header on disk. */ +/* Length of the WIM header on disk. */ #define WIM_HEADER_DISK_SIZE 208 -/* Compressed resources in the WIM are divided into separated compressed chunks - * of this size. */ -#define WIM_CHUNK_SIZE 32768 +/* Version of the WIM file. There is an older version (used for prerelease + * versions of Windows Vista), but wimlib doesn't support it. The differences + * between the versions are undocumented. */ +#define WIM_VERSION_DEFAULT 0x10d00 + +/* Version number used for a different WIM format, which as of Windows 8 can be + * created by passing 0x20000000 in dwFlagsAndAttributes to WIMGAPI's + * WIMCreateFile() and specifying either NONE, XPRESS, or LZMS compression. + * This format is currently undocumented by Microsoft and is seemingly + * incompatible with their own ImageX and Dism programs; however, it seems to be + * used for Windows 8 updates. The format appears to feature a new flag (0x10) + * in resource entries, which I've named WIM_RESHDR_FLAG_CONCAT. */ +#define WIM_VERSION_STREAM_CONCAT 0xe00 + +/* WIM magic characters, translated to a single 64-bit little endian number. */ +#define WIM_MAGIC \ + cpu_to_le64(((u64)'M' << 0) | \ + ((u64)'S' << 8) | \ + ((u64)'W' << 16) | \ + ((u64)'I' << 24) | \ + ((u64)'M' << 32) | \ + ((u64)'\0' << 40) | \ + ((u64)'\0' << 48) | \ + ((u64)'\0' << 54)) + +/* wimlib pipable WIM magic characters, translated to a single 64-bit little + * endian number. */ +#define PWM_MAGIC \ + cpu_to_le64(((u64)'W' << 0) | \ + ((u64)'L' << 8) | \ + ((u64)'P' << 16) | \ + ((u64)'W' << 24) | \ + ((u64)'M' << 32) | \ + ((u64)'\0' << 40) | \ + ((u64)'\0' << 48) | \ + ((u64)'\0' << 54)) + +/* On-disk format of the WIM header. */ +struct wim_header_disk { + + /* Magic characters "MSWIM\0\0\0" */ + le64 magic; + + /* Size of the WIM header, in bytes; WIM_HEADER_DISK_SIZE expected + * (currently the only supported value). */ + u32 hdr_size; + + /* Version of the WIM file + * TODO */ + u32 wim_version; + + /* Flags for the WIM file (WIM_HDR_FLAG_*) */ + u32 wim_flags; + + /* Chunk size for compressed resources in the WIM, or 0 if the WIM is + * uncompressed. */ + u32 chunk_size; + + /* Globally unique identifier for the WIM file. Basically a bunch of + * random bytes. */ + u8 guid[WIM_GID_LEN]; + + /* Number of this WIM part in the split WIM file, indexed from 1, or 1 + * if the WIM is not split. */ + u16 part_number; + + /* Total number of parts of the split WIM file, or 1 if the WIM is not + * split. */ + u16 total_parts; + + /* Number of images in the WIM. */ + u32 image_count; + + /* Location and size of the WIM's lookup table. */ + struct wim_reshdr_disk lookup_table_reshdr; + + /* Location and size of the WIM's XML data. */ + struct wim_reshdr_disk xml_data_reshdr; + + /* Location and size of metadata resource for the bootable image of the + * WIM, or all zeroes if no image is bootable. */ + struct wim_reshdr_disk boot_metadata_reshdr; + + /* 1-based index of the bootable image of the WIM, or 0 if no image is + * bootable. */ + u32 boot_idx; + + /* Location and size of the WIM's integrity table, or all zeroes if the + * WIM has no integrity table. + * + * Note the integrity_table_reshdr here is 4-byte aligned even though + * it would ordinarily be 8-byte aligned--- hence, the _packed_attribute + * on the `struct wim_header_disk' is essential. */ + struct wim_reshdr_disk integrity_table_reshdr; + + /* Unused bytes. */ + u8 unused[60]; +} _packed_attribute; -/* Version of the WIM file. There is an older version, but we don't support it - * yet. The differences between the versions are undocumented. */ -#define WIM_VERSION 0x10d00 /* Header at the very beginning of the WIM file. This is the in-memory * representation and does not include all fields; see `struct wim_header_disk' - * for the on-disk structure. */ + * for the on-disk structure. */ struct wim_header { + + /* Magic characters: either WIM_MAGIC or PWM_MAGIC. */ + le64 magic; + + /* Version of the WIM file */ + u32 wim_version; + /* Bitwise OR of one or more of the WIM_HDR_FLAG_* defined below. */ u32 flags; + /* Compressed resource chunk size */ + u32 chunk_size; + /* A unique identifier for the WIM file. */ u8 guid[WIM_GID_LEN]; @@ -37,15 +141,15 @@ struct wim_header { u32 image_count; /* Location, size, and flags of the lookup table of the WIM. */ - struct resource_entry lookup_table_res_entry; + struct wim_reshdr lookup_table_reshdr; /* Location, size, and flags for the XML data of the WIM. */ - struct resource_entry xml_res_entry; + struct wim_reshdr xml_data_reshdr; /* Location, size, and flags for the boot metadata. This means the * metadata resource for the image specified by boot_idx below. Should * be zeroed out if boot_idx is 0. */ - struct resource_entry boot_metadata_res_entry; + struct wim_reshdr boot_metadata_reshdr; /* The index of the bootable image in the WIM file. If 0, there are no * bootable images available. */ @@ -53,7 +157,7 @@ struct wim_header { /* The location of the optional integrity table used to verify the * integrity WIM. Zeroed out if there is no integrity table.*/ - struct resource_entry integrity; + struct wim_reshdr integrity_table_reshdr; }; /* Flags for the `flags' field of the struct wim_header: */ @@ -94,11 +198,19 @@ struct wim_header { #define WIM_HDR_FLAG_COMPRESS_RESERVED 0x00010000 /* Resources within the WIM are compressed using "XPRESS" compression, which is - * a LZ77-based compression algorithm. */ + * a LZ77-based compression algorithm. */ #define WIM_HDR_FLAG_COMPRESS_XPRESS 0x00020000 /* Resources within the WIM are compressed using "LZX" compression. This is also * a LZ77-based algorithm. */ #define WIM_HDR_FLAG_COMPRESS_LZX 0x00040000 +/* Starting in Windows 8, WIMGAPI can create WIMs using LZMS compression, and + * this flag is set on such WIMs. However, an additional undocumented flag + * needs to be provided to WIMCreateFile() to create such WIMs, and the version + * number in the header of the resulting WIMs is different (3584). None of this + * is actually documented, and wimlib does not yet support this compression + * format. */ +#define WIM_HDR_FLAG_COMPRESS_LZMS 0x00080000 + #endif /* _WIMLIB_HEADER_H */