xref: /reactos/sdk/tools/hhpcomp/chmc/chm.h (revision bbabe248)
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 /* ARM (32-bit) */
53 #elif __i386__ || __sun || __sgi || __ppc__ || __arm__
54 typedef unsigned char           UChar;
55 typedef short                   Int16;
56 typedef unsigned short          UInt16;
57 typedef long                    Int32;
58 typedef unsigned long           UInt32;
59 typedef long long               Int64;
60 typedef unsigned long long      UInt64;
61 
62 /* x86-64        */
63 /* IA-64         */
64 /* ARM64/AArch64 */
65 /* Note that these may be appropriate for other 64-bit machines. */
66 #elif __x86_64__ || __ia64__ || __aarch64__
67 typedef unsigned char           UChar;
68 typedef short                   Int16;
69 typedef unsigned short          UInt16;
70 typedef int                     Int32;
71 typedef unsigned int            UInt32;
72 typedef long                    Int64;
73 typedef unsigned long           UInt64;
74 
75 #else
76 
77 /* yielding an error is preferable to yielding incorrect behavior */
78 #error "Please define the sized types for your platform"
79 #endif
80 
81 /* GCC */
82 #ifdef __GNUC__
83 #define memcmp __builtin_memcmp
84 #define memset __builtin_memset
85 #define memcpy __builtin_memcpy
86 #define strlen __builtin_strlen
87 #endif
88 
89 #define _CHMC_ITSF_V3_LEN (0x60)
90 struct chmcItsfHeader {
91 	char        signature[4];           /*  0 (ITSF) */
92 	Int32       version;                /*  4 */
93 	Int32       header_len;             /*  8 */
94 	Int32       unknown_000c;           /*  c */
95 	UInt32      last_modified;          /* 10 */
96 	UInt32      lang_id;                /* 14 */
97 	UChar       dir_uuid[16];           /* 18 */
98 	UChar       stream_uuid[16];        /* 28 */
99 	UInt64      sect0_offset;           /* 38 */
100 	UInt64      sect0_len;              /* 40 */
101 	UInt64      dir_offset;             /* 48 */
102 	UInt64      dir_len;                /* 50 */
103 	UInt64      data_offset;            /* 58 (Not present before V3) */
104 }; /* __attribute__ ((aligned (1))); */
105 
106 #define _CHMC_SECT0_LEN (0x18)
107 struct chmcSect0 {
108 	Int32       unknown_0000;  /*  0 */
109 	Int32       unknown_0004;  /*  4 */
110 	UInt64      file_len;      /*  8 */
111 	Int32       unknown_0010;  /* 10 */
112 	Int32       unknown_0014;  /* 14 */
113 };
114 
115 #define CHM_IDX_INTVL 2
116 
117 /* structure of ITSP headers */
118 #define _CHMC_ITSP_V1_LEN (0x54)
119 struct chmcItspHeader {
120 	char        signature[4];           /*  0 (ITSP) */
121 	Int32       version;                /*  4 */
122 	Int32       header_len;             /*  8 */
123 	Int32       unknown_000c;           /*  c */
124 	UInt32      block_len;              /* 10 */
125 	Int32       blockidx_intvl;         /* 14 */
126 	Int32       index_depth;            /* 18 */
127 	Int32       index_root;             /* 1c */
128 	Int32       index_head;             /* 20 */
129 	Int32       index_last;             /* 24 */
130 	Int32       unknown_0028;           /* 28 */
131 	UInt32      num_blocks;             /* 2c */
132 	UInt32      lang_id;                /* 30 */
133 	UChar       system_uuid[16];        /* 34 */
134 	UInt32      header_len2;            /* 44 */
135 	UChar       unknown_0048[12];       /* 48 */
136 }; /* __attribute__ ((aligned (1))); */
137 
138 /* structure of PMGL headers */
139 #define _CHMC_PMGL_LEN (0x14)
140 struct chmcPmglHeader
141 {
142 	char        signature[4];           /*  0 (PMGL) */
143 	UInt32      free_space;             /*  4 */
144 	UInt32      unknown_0008;           /*  8 */
145 	Int32       block_prev;             /*  c */
146 	Int32       block_next;             /* 10 */
147 }; /* __attribute__ ((aligned (1))); */
148 
149 #define _CHMC_PMGI_LEN (0x08)
150 struct chmcPmgiHeader {
151 	char        signature[4];           /*  0 (PMGI) */
152 	UInt32      free_space;             /*  4 */
153 }; /* __attribute__ ((aligned (1))); */
154 
155 /* structure of LZXC reset table */
156 #define _CHMC_LZXC_RESETTABLE_V1_LEN (0x28)
157 struct chmcLzxcResetTable {
158 	UInt32      version;
159 	UInt32      block_count;
160 	UInt32      entry_size;
161 	UInt32      table_offset;
162 	UInt64      uncompressed_len;
163 	UInt64      compressed_len;
164 	UInt64      block_len;
165 }; /* __attribute__ ((aligned (1))); */
166 
167 /* structure of LZXC control data block */
168 #define _CHMC_LZXC_MIN_LEN (0x18)
169 #define _CHMC_LZXC_V2_LEN (0x1c)
170 struct chmcLzxcControlData {
171 	UInt32      size;                   /*  0        */
172 	char        signature[4];           /*  4 (LZXC) */
173 	UInt32      version;                /*  8        */
174 	UInt32      resetInterval;          /*  c        */
175 	UInt32      windowSize;             /* 10        */
176 	UInt32      windowsPerReset;        /* 14        */
177 	UInt32      unknown_18;             /* 18        */
178 };
179 
180 #endif /* CHMC_CHM_H */
181