| Index: chrome/utility/safe_browsing/mac/udif.h
|
| diff --git a/chrome/utility/safe_browsing/mac/udif.h b/chrome/utility/safe_browsing/mac/udif.h
|
| index fbb17c9280743e2611deba7d9955657f8e175413..571affc002315f9dc1f429557a7c8827768c1732 100644
|
| --- a/chrome/utility/safe_browsing/mac/udif.h
|
| +++ b/chrome/utility/safe_browsing/mac/udif.h
|
| @@ -23,6 +23,61 @@ namespace dmg {
|
| class ReadStream;
|
| class UDIFBlock;
|
|
|
| +#pragma pack(push, 1)
|
| +
|
| +// The following structures come from the analysis provided by Jonathan Levin
|
| +// at <http://newosxbook.com/DMG.html>.
|
| +//
|
| +// Note that all fields are stored in big endian.
|
| +
|
| +struct UDIFChecksum {
|
| + uint32_t type;
|
| + uint32_t size;
|
| + uint32_t data[32];
|
| +};
|
| +
|
| +// The trailer structure for a UDIF file.
|
| +struct UDIFResourceFile {
|
| + static const uint32_t kSignature = 'koly';
|
| + static const uint32_t kVersion = 4;
|
| +
|
| + uint32_t signature;
|
| + uint32_t version;
|
| + uint32_t header_size; // Size of this structure.
|
| + uint32_t flags;
|
| + uint64_t running_data_fork_offset;
|
| + uint64_t data_fork_offset;
|
| + uint64_t data_fork_length;
|
| + uint64_t rsrc_fork_offset;
|
| + uint64_t rsrc_fork_length;
|
| + uint32_t segment_number;
|
| + uint32_t segment_count;
|
| + uuid_t segment_id;
|
| +
|
| + UDIFChecksum data_checksum;
|
| +
|
| + uint64_t plist_offset; // Offset and length of the blkx plist.
|
| + uint64_t plist_length;
|
| +
|
| + uint8_t reserved1[64];
|
| +
|
| + uint64_t code_signature_offset;
|
| + uint64_t code_signature_length;
|
| +
|
| + uint8_t reserved2[40];
|
| +
|
| + UDIFChecksum master_checksum;
|
| +
|
| + uint32_t image_variant;
|
| + uint64_t sector_count;
|
| +
|
| + uint32_t reserved3;
|
| + uint32_t reserved4;
|
| + uint32_t reserved5;
|
| +};
|
| +
|
| +#pragma pack(pop)
|
| +
|
| // UDIFParser parses a Universal Disk Image Format file, allowing access to the
|
| // name, types, and data of the partitions held within the file. There is no
|
| // canonical documentation for UDIF, and not all disk images use UDIF (though
|
| @@ -47,6 +102,11 @@ class UDIFParser {
|
| explicit UDIFParser(ReadStream* stream);
|
| ~UDIFParser();
|
|
|
| + // Parses the trailer structure. Only actually parses data from the file the
|
| + // first time it is called -- after that just returns the previous result when
|
| + // parsing was attempted.
|
| + bool ParseTrailer();
|
| +
|
| // Parses the UDIF file. This method must be called before any other method.
|
| // If this returns false, it is not legal to call any other methods.
|
| bool Parse();
|
| @@ -71,7 +131,7 @@ class UDIFParser {
|
| std::unique_ptr<ReadStream> GetPartitionReadStream(size_t part_number);
|
|
|
| private:
|
| - // Parses the blkx plist trailer structure.
|
| + // Parses the blkx plist structure.
|
| bool ParseBlkx();
|
|
|
| ReadStream* const stream_; // The stream backing the UDIF image. Weak.
|
| @@ -79,6 +139,8 @@ class UDIFParser {
|
| // All blocks in the UDIF image.
|
| std::vector<std::unique_ptr<const UDIFBlock>> blocks_;
|
| uint16_t block_size_; // The image's block size, in bytes.
|
| + UDIFResourceFile trailer_;
|
| + bool trailer_successfully_parsed_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(UDIFParser);
|
| };
|
|
|