1 /* 2 3 Copyright (C) 2010 Alex Andreotti <alex.andreotti@gmail.com> 4 5 This file is part of chmc. 6 7 chmc is free software: you can redistribute it and/or modify 8 it under the terms of the GNU General Public License as published by 9 the Free Software Foundation, either version 3 of the License, or 10 (at your option) any later version. 11 12 chmc is distributed in the hope that it will be useful, 13 but WITHOUT ANY WARRANTY; without even the implied warranty of 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 GNU General Public License for more details. 16 17 You should have received a copy of the GNU General Public License 18 along with chmc. If not, see <http://www.gnu.org/licenses/>. 19 20 NOTE this file is mainly based on chm_lib.c from chmLib by Jed Wing 21 http://www.jedrea.com/chmlib/ 22 23 */ 24 #ifndef CHMC_CHM_H 25 #define CHMC_CHM_H 26 27 /* 28 * architecture specific defines 29 * 30 * Note: as soon as C99 is more widespread, the below defines should 31 * probably just use the C99 sized-int types. 32 * 33 * The following settings will probably work for many platforms. The sizes 34 * don't have to be exactly correct, but the types must accommodate at least as 35 * many bits as they specify. 36 */ 37 38 /* i386, 32-bit/64-bit, Windows */ 39 #ifdef _MSC_VER 40 typedef unsigned char UChar; 41 typedef __int16 Int16; 42 typedef unsigned __int16 UInt16; 43 typedef __int32 Int32; 44 typedef unsigned __int32 UInt32; 45 typedef __int64 Int64; 46 typedef unsigned __int64 UInt64; 47 48 /* I386, 32-bit, non-Windows */ 49 /* Sparc */ 50 /* MIPS */ 51 /* PPC */ 52 #elif __i386__ || __sun || __sgi || __ppc__ 53 typedef unsigned char UChar; 54 typedef short Int16; 55 typedef unsigned short UInt16; 56 typedef long Int32; 57 typedef unsigned long UInt32; 58 typedef long long Int64; 59 typedef unsigned long long UInt64; 60 61 /* x86-64 */ 62 /* Note that these may be appropriate for other 64-bit machines. */ 63 #elif __x86_64__ || __ia64__ 64 typedef unsigned char UChar; 65 typedef short Int16; 66 typedef unsigned short UInt16; 67 typedef int Int32; 68 typedef unsigned int UInt32; 69 typedef long Int64; 70 typedef unsigned long UInt64; 71 72 #else 73 74 /* yielding an error is preferable to yielding incorrect behavior */ 75 #error "Please define the sized types for your platform" 76 #endif 77 78 /* GCC */ 79 #ifdef __GNUC__ 80 #define memcmp __builtin_memcmp 81 #define memset __builtin_memset 82 #define memcpy __builtin_memcpy 83 #define strlen __builtin_strlen 84 #endif 85 86 #define _CHMC_ITSF_V3_LEN (0x60) 87 struct chmcItsfHeader { 88 char signature[4]; /* 0 (ITSF) */ 89 Int32 version; /* 4 */ 90 Int32 header_len; /* 8 */ 91 Int32 unknown_000c; /* c */ 92 UInt32 last_modified; /* 10 */ 93 UInt32 lang_id; /* 14 */ 94 UChar dir_uuid[16]; /* 18 */ 95 UChar stream_uuid[16]; /* 28 */ 96 UInt64 sect0_offset; /* 38 */ 97 UInt64 sect0_len; /* 40 */ 98 UInt64 dir_offset; /* 48 */ 99 UInt64 dir_len; /* 50 */ 100 UInt64 data_offset; /* 58 (Not present before V3) */ 101 }; /* __attribute__ ((aligned (1))); */ 102 103 #define _CHMC_SECT0_LEN (0x18) 104 struct chmcSect0 { 105 Int32 unknown_0000; /* 0 */ 106 Int32 unknown_0004; /* 4 */ 107 UInt64 file_len; /* 8 */ 108 Int32 unknown_0010; /* 10 */ 109 Int32 unknown_0014; /* 14 */ 110 }; 111 112 #define CHM_IDX_INTVL 2 113 114 /* structure of ITSP headers */ 115 #define _CHMC_ITSP_V1_LEN (0x54) 116 struct chmcItspHeader { 117 char signature[4]; /* 0 (ITSP) */ 118 Int32 version; /* 4 */ 119 Int32 header_len; /* 8 */ 120 Int32 unknown_000c; /* c */ 121 UInt32 block_len; /* 10 */ 122 Int32 blockidx_intvl; /* 14 */ 123 Int32 index_depth; /* 18 */ 124 Int32 index_root; /* 1c */ 125 Int32 index_head; /* 20 */ 126 Int32 index_last; /* 24 */ 127 Int32 unknown_0028; /* 28 */ 128 UInt32 num_blocks; /* 2c */ 129 UInt32 lang_id; /* 30 */ 130 UChar system_uuid[16]; /* 34 */ 131 UInt32 header_len2; /* 44 */ 132 UChar unknown_0048[12]; /* 48 */ 133 }; /* __attribute__ ((aligned (1))); */ 134 135 /* structure of PMGL headers */ 136 #define _CHMC_PMGL_LEN (0x14) 137 struct chmcPmglHeader 138 { 139 char signature[4]; /* 0 (PMGL) */ 140 UInt32 free_space; /* 4 */ 141 UInt32 unknown_0008; /* 8 */ 142 Int32 block_prev; /* c */ 143 Int32 block_next; /* 10 */ 144 }; /* __attribute__ ((aligned (1))); */ 145 146 #define _CHMC_PMGI_LEN (0x08) 147 struct chmcPmgiHeader { 148 char signature[4]; /* 0 (PMGI) */ 149 UInt32 free_space; /* 4 */ 150 }; /* __attribute__ ((aligned (1))); */ 151 152 /* structure of LZXC reset table */ 153 #define _CHMC_LZXC_RESETTABLE_V1_LEN (0x28) 154 struct chmcLzxcResetTable { 155 UInt32 version; 156 UInt32 block_count; 157 UInt32 entry_size; 158 UInt32 table_offset; 159 UInt64 uncompressed_len; 160 UInt64 compressed_len; 161 UInt64 block_len; 162 }; /* __attribute__ ((aligned (1))); */ 163 164 /* structure of LZXC control data block */ 165 #define _CHMC_LZXC_MIN_LEN (0x18) 166 #define _CHMC_LZXC_V2_LEN (0x1c) 167 struct chmcLzxcControlData { 168 UInt32 size; /* 0 */ 169 char signature[4]; /* 4 (LZXC) */ 170 UInt32 version; /* 8 */ 171 UInt32 resetInterval; /* c */ 172 UInt32 windowSize; /* 10 */ 173 UInt32 windowsPerReset; /* 14 */ 174 UInt32 unknown_18; /* 18 */ 175 }; 176 177 #endif /* CHMC_CHM_H */ 178