xref: /reactos/sdk/tools/hhpcomp/chmc/chm.h (revision 8a978a17)
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