rev |
line source |
pascal@13974
|
1 #include <windows.h>
|
pascal@14261
|
2 #include <winnt.h>
|
pascal@24279
|
3 #include <winioctl.h>
|
pascal@24279
|
4 #include <commctrl.h>
|
pascal@14261
|
5 #include <sys/types.h>
|
pascal@14261
|
6 #include <sys/stat.h>
|
pascal@14261
|
7 #include <fcntl.h>
|
pascal@13972
|
8
|
pascal@24279
|
9 #define e_grave "\xE8"
|
pascal@24279
|
10 #define e_acute "\xE9"
|
pascal@24279
|
11 #define e_circ "\xEA"
|
pascal@24279
|
12 #define e_trema "\xEB"
|
pascal@24279
|
13 #define E_grave "\xC8"
|
pascal@24279
|
14 #define E_acute "\xC9"
|
pascal@24279
|
15 #define E_circ "\xCA"
|
pascal@24279
|
16 #define E_trema "\xCB"
|
pascal@24279
|
17 #define a_grave "\xE0"
|
pascal@24279
|
18 #define A_grave "\xC0"
|
pascal@24279
|
19 #define a_circ "\xE2"
|
pascal@24279
|
20 #define A_circ "\xC2"
|
pascal@24279
|
21 #define c_cedil "\xE7"
|
pascal@24279
|
22 #define C_cedil "\xC7"
|
pascal@24279
|
23 #define i_circ "\xEE"
|
pascal@24279
|
24 #define I_circ "\xCE"
|
pascal@24279
|
25 #define i_trema "\xEF"
|
pascal@24279
|
26 #define I_trema "\xCF"
|
pascal@24279
|
27 #define o_circ "\xF4"
|
pascal@24279
|
28 #define O_circ "\xD4"
|
pascal@24279
|
29 #define o_trema "\xF6"
|
pascal@24279
|
30 #define O_trema "\xD6"
|
pascal@24279
|
31 #define u_grave "\xF9"
|
pascal@24279
|
32 #define U_grave "\xD9"
|
pascal@24279
|
33 #define u_circ "\xFB"
|
pascal@24279
|
34 #define U_circ "\xDB"
|
pascal@24279
|
35 #define u_trema "\xFC"
|
pascal@24279
|
36 #define U_trema "\xDC"
|
pascal@24279
|
37
|
pascal@24279
|
38 static char *MsgSet[2][27] = {
|
pascal@24279
|
39 {
|
pascal@24279
|
40 #define LANG_EN 0
|
pascal@24279
|
41 #define MSG_BUILD_KEY 0
|
pascal@24279
|
42 "Build the SliTaz USB key...",
|
pascal@24279
|
43 #define MSG_EITHER_CREATE_KEY_OR_BOOT_FLOPPY 1
|
pascal@24279
|
44 "You can either:\n\n"
|
pascal@24279
|
45 "- create a SliTaz USB boot key or a boot memory card.\n"
|
pascal@24279
|
46 " (note that the Linux kernel will not be upgradable.\n"
|
pascal@24279
|
47 " The Slitaz utility 'tazusb' can be used later to create\n"
|
pascal@24279
|
48 " a true read/write USB key).\n\n"
|
pascal@24279
|
49 "- create a SliTaz bootstrap floppy for the ISO image\n"
|
pascal@24279
|
50 " on the hard disk.\n"
|
pascal@24279
|
51 "\nDo you want to create a boot key now ?",
|
pascal@24279
|
52 #define MSG_NOT_DOS_MODE 2
|
pascal@24279
|
53 "This program should run in DOS mode.\n"
|
pascal@24279
|
54 "It can create the file slitaz.pif and launch it,\n"
|
pascal@24279
|
55 "but you can reboot in DOS mode too and run it.\n"
|
pascal@24279
|
56 "\nDo you want to create the slitaz.pif file and execute it now ?",
|
pascal@24279
|
57 #define MSG_CRATE_PIF_NOW 3
|
pascal@24279
|
58 "Create slitaz.pif now ?",
|
pascal@24279
|
59 #define MSG_NOT_HYBRID 4
|
pascal@24279
|
60 "Not an isolinux hybrid ISO.\n"
|
pascal@24279
|
61 "This ISO image will not boot\n"
|
pascal@24279
|
62 "from the media that you create !",
|
pascal@24279
|
63 #define MSG_WILL_NOT_BOOT 5
|
pascal@24279
|
64 "Will not boot !",
|
pascal@24279
|
65 #define MSG_WANT_CREATE_BOOT_KEY 6
|
pascal@24279
|
66 "You can create a SliTaz USB boot key or\n"
|
pascal@24279
|
67 "a boot memory card.\n"
|
pascal@24279
|
68 "\nDo you want to create a boot key now ?",
|
pascal@24279
|
69 #define MSG_Q_CREATE_STICK 7
|
pascal@24279
|
70 "Create a boot stick ?",
|
pascal@24279
|
71 #define MSG_STEP_1 8
|
pascal@24279
|
72 "Step 1: unplug the USB stick.",
|
pascal@24279
|
73 #define MSG_DETECT_1 9
|
pascal@24279
|
74 "Drive detection 1/2",
|
pascal@24279
|
75 #define MSG_STEP_2 10
|
pascal@24279
|
76 "Step 2: plug the USB stick in, "
|
pascal@24279
|
77 "wait for Windows to mount it",
|
pascal@24279
|
78 #define MSG_DETECT_2 11
|
pascal@24279
|
79 "Drive detection 2/2",
|
pascal@24279
|
80 #define MSG_NOT_FOUND 12
|
pascal@24279
|
81 "No USB stick found.",
|
pascal@24279
|
82 #define MSG_SORRY 13
|
pascal@24279
|
83 "Sorry",
|
pascal@24279
|
84 #define MSG_HD0_UP_TO_DATE 14
|
pascal@24279
|
85 "(hd0) is up to date.",
|
pascal@24279
|
86 #define MSG_HD0_UP_TO_DATE_BUT 15
|
pascal@24279
|
87 "(hd0) is up to date but the partition table is not\n"
|
pascal@24279
|
88 "updated because I can't get the total USB stick size\n\n"
|
pascal@24279
|
89 "You can boot SliTaz with this stick and you can update\n"
|
pascal@24279
|
90 "the partition table with 'taziso' by selecting "
|
pascal@24279
|
91 "'usbbootkey' as root.",
|
pascal@24279
|
92 #define MSG_NO_REPART 16
|
pascal@24279
|
93 "Finished without repartitioning",
|
pascal@24279
|
94 #define MSG_KEEP_CUSTOM_CONF 17
|
pascal@24279
|
95 "Do you want to keep your custom configuration ?",
|
pascal@24279
|
96 #define MSG_KEEP_CONF 18
|
pascal@24279
|
97 "keep configuration ?",
|
pascal@24279
|
98 #define MSG_WANT_HOME 19
|
pascal@24279
|
99 "Do you want to create a persistent partition for /home ?",
|
pascal@24279
|
100 #define MSG_DO_HOME 20
|
pascal@24279
|
101 "Create a persistent /home ?",
|
pascal@24279
|
102 #define MSG_FINISHED 21
|
pascal@24279
|
103 "Finished",
|
pascal@24279
|
104 #define MSG_WANT_FLOPPY 22
|
pascal@24279
|
105 "Do you want to create a bootstrap floppy ?",
|
pascal@24279
|
106 #define MSG_DO_FLOPPY 23
|
pascal@24279
|
107 "Create a bootstrap floppy ?",
|
pascal@24279
|
108 #define MSG_INSERT_A_FLOPPY 24
|
pascal@24279
|
109 "Insert a floppy disk in drive now",
|
pascal@24279
|
110 #define MSG_INSERT_FLOPPY 25
|
pascal@24279
|
111 "Insert floppy",
|
pascal@24279
|
112 #define MSG_FLOPPY_DONE 26
|
pascal@24279
|
113 "The bootstrap floppy is up to date."
|
pascal@24279
|
114 },
|
pascal@24279
|
115 {
|
pascal@24279
|
116 #define LANG_FR 1
|
pascal@24279
|
117 // MSG_BUILD_KEY
|
pascal@24279
|
118 "Construit la cl" e_acute " USB SliTaz...",
|
pascal@24279
|
119 // MSG_EITHER_CREATE_KEY_OR BOOT_FLOPPY
|
pascal@24279
|
120 "Vous pouvez soit :\n\n"
|
pascal@24279
|
121 "- cr" e_acute "er une cl" e_acute " USB ou une carte m" e_acute "moire de d" e_acute "marrage.\n"
|
pascal@24279
|
122 " (notez que le noyau Linux ne pourra pas " e_circ "tre mis " a_grave " jour.\n"
|
pascal@24279
|
123 " L'outil SliTaz 'tazusb' pourra " e_circ "tre utilis" e_acute " ensuite pour cr" e_acute "er\n"
|
pascal@24279
|
124 " une v" e_acute "ritable cl" e_acute " USB read/write).\n\n"
|
pascal@24279
|
125 "- cr" e_acute "er une disquette de d" e_acute "marrage pour une image ISO\n"
|
pascal@24279
|
126 " plac" e_acute " sur le disque dur.\n"
|
pascal@24279
|
127 "\nVoulez vous cr" e_acute "er une disquette de d" e_acute "marrage maintenant ?",
|
pascal@24279
|
128 // MSG_NOT_DOS_MODE
|
pascal@24279
|
129 "Ce programme devrait " e_circ "tre lanc" e_acute " en mode DOS.\n"
|
pascal@24279
|
130 "Il peut cr" e_acute "er le fichier slitaz.pif et l'ex" e_acute "cuter,\n"
|
pascal@24279
|
131 "mais vous pouvez aussi red" e_acute "marrer en mode DOS et le lancer.\n"
|
pascal@24279
|
132 "\nVoulez cr" e_acute "er le fichier slitaz.pif et le lancer maintenant ?",
|
pascal@24279
|
133 // MSG_CRATE_PIF_NOW
|
pascal@24279
|
134 "Cr" e_acute "er slitaz.pif maintenant ?",
|
pascal@24279
|
135 // MSG_NOT_HYBRID
|
pascal@24279
|
136 "Ce n'est pas une image ISO hybride isolinux.\n"
|
pascal@24279
|
137 "Cette image ISO ne d" e_acute "marrera pas\n"
|
pascal@24279
|
138 "depuis le media o" u_grave " vous la cr" e_acute "er !",
|
pascal@24279
|
139 // MSG_WILL_NOT_BOOT
|
pascal@24279
|
140 "Ne d" e_acute "marrera pas !\n",
|
pascal@24279
|
141 // MSG_WANT_CREATE_BOOT_KEY
|
pascal@24279
|
142 "Vous pouvez cr" e_acute "er une cl" e_acute " USB / carte m" e_acute "moire de d" e_acute "marrage.\n"
|
pascal@24279
|
143 "\nVoulez vous cr" e_acute "er une cl" e_acute " de d" e_acute "marrage maintenant ?",
|
pascal@24279
|
144 // MSG_Q_CREATE_STICK
|
pascal@24279
|
145 "Cr" e_acute "er une cl" e_acute " de d" e_acute "marrage ?",
|
pascal@24279
|
146 // MSG_STEP_1
|
pascal@24279
|
147 "Etape 1 : d" e_acute "branchez la cl" e_acute " USB.",
|
pascal@24279
|
148 // MSG_DETECT_1
|
pascal@24279
|
149 "D" e_acute "tection du p" e_acute "riph" e_acute "rique 1/2",
|
pascal@24279
|
150 // MSG_STEP_2
|
pascal@24279
|
151 "Etape 2 : rebranchez la cl" e_acute " USB, "
|
pascal@24279
|
152 "et attendez que Windows la reconnaisse.",
|
pascal@24279
|
153 // MSG_DETECT_2
|
pascal@24279
|
154 "D" e_acute "tection du p" e_acute "riph" e_acute "rique 2/2",
|
pascal@24279
|
155 // MSG_NOT_FOUND
|
pascal@24279
|
156 "Aucune cl" e_acute " USB trouv" e_acute "e.",
|
pascal@24279
|
157 // MSG_SORRY
|
pascal@24279
|
158 "D" e_acute " sol" e_acute,
|
pascal@24279
|
159 // MSG_HD0_UP_TO_DATE
|
pascal@24279
|
160 "(hd0) a " e_acute "t" e_acute " mis " a_grave " jour.",
|
pascal@24279
|
161 // MSG_HD0_UP_TO_DATE_BUT
|
pascal@24279
|
162 "(hd0) a " e_acute "t" e_acute " mis " a_grave " jour mais la table de partition n'est pas\n"
|
pascal@24279
|
163 "modifi" e_acute "e car la taille totale de la cl" e_acute " USB n'a pu " e_circ "tre d" e_acute "tect" e_acute "e\n\n"
|
pascal@24279
|
164 "Vous pouvez d" e_acute "marrer avec cette cl" e_acute " puis vous pouvez mettre " a_grave " jour\n"
|
pascal@24279
|
165 "la table de partition avec 'taziso' en choisissant "
|
pascal@24279
|
166 "'usbbootkey' (si root).",
|
pascal@24279
|
167 // MSG_NO_REPART
|
pascal@24279
|
168 "Termin" e_acute " sans repartitionement",
|
pascal@24279
|
169 // MSG_KEEP_CUSTOM_CONF
|
pascal@24279
|
170 "Voulez vous conserver votre configuration personnelle ?",
|
pascal@24279
|
171 // MSG_KEEP_CONF
|
pascal@24279
|
172 "Garder votre configuration ?",
|
pascal@24279
|
173 // MSG_WANT_HOME
|
pascal@24279
|
174 "voulez vous cr" e_acute "er une partition persistante pour /home ?",
|
pascal@24279
|
175 // MSG_DO_HOME
|
pascal@24279
|
176 "Cr" e_acute "er un /home persistant ?",
|
pascal@24279
|
177 // MSG_FINISHED
|
pascal@24279
|
178 "Termin" e_acute,
|
pascal@24279
|
179 // MSG_WANT_FLOPPY
|
pascal@24279
|
180 "Voulez-vous cr" e_acute "er une disquette de d" e_acute "marrage ?",
|
pascal@24279
|
181 // MSG_DO_FLOPPY
|
pascal@24279
|
182 "Cr" e_acute "er une disquette de boot ?",
|
pascal@24279
|
183 // MSG_INSERT_A_FLOPPY
|
pascal@24279
|
184 "Veuillez ins" e_acute "rer une disquette maintenant",
|
pascal@24279
|
185 // MSG_INSERT_FLOPPY
|
pascal@24279
|
186 "Ins" e_acute "rer une disquette",
|
pascal@24279
|
187 // MSG_FLOPPY_DONE
|
pascal@24279
|
188 "La disquette de d" e_acute "marage est cr" e_acute e_acute "e."
|
pascal@24279
|
189 }
|
pascal@24279
|
190 };
|
pascal@24279
|
191 static char **Msg = MsgSet[LANG_EN];
|
pascal@24279
|
192
|
pascal@24279
|
193 #define BOOTSTRAP_SECTOR_COUNT_OFFSET 26
|
pascal@18787
|
194 #define BOOTSTRAP_SECTOR_COUNT_OFFSET 26
|
pascal@14261
|
195
|
pascal@14261
|
196 static int fullread(int fd, char *p, int n)
|
pascal@13972
|
197 {
|
pascal@14261
|
198 int i, j;
|
pascal@14261
|
199 for (i = 0; n > 0; i += j, n -= j) {
|
pascal@14261
|
200 j = read(fd, p + i, n);
|
pascal@14261
|
201 if (j <= 0) break;
|
pascal@14261
|
202 }
|
pascal@14261
|
203 return i;
|
pascal@14264
|
204 #define read fullread
|
pascal@13972
|
205 }
|
pascal@14261
|
206
|
pascal@14261
|
207 static int fullwrite(int fd, char *p, int n)
|
pascal@14261
|
208 {
|
pascal@14261
|
209 int i, j;
|
pascal@14261
|
210 for (i = 0; n > 0; i += j, n -= j) {
|
pascal@14261
|
211 j = write(fd, p + i, n);
|
pascal@14261
|
212 if (j <= 0) break;
|
pascal@14261
|
213 }
|
pascal@14261
|
214 return i;
|
pascal@14264
|
215 #define write fullwrite
|
pascal@14261
|
216 }
|
pascal@14261
|
217
|
pascal@21553
|
218 #pragma pack(push,1)
|
pascal@21553
|
219 struct PIF_section_header {
|
pascal@21553
|
220 char name[16];
|
pascal@21553
|
221 short next_header_offset;
|
pascal@21553
|
222 short data_offset;
|
pascal@21553
|
223 short data_length;
|
pascal@21553
|
224 };
|
pascal@21553
|
225
|
pascal@21553
|
226 struct PIF_basic_section {
|
pascal@21553
|
227 unsigned char unused;
|
pascal@21553
|
228 unsigned char checksum;
|
pascal@21553
|
229 char window_title[30];
|
pascal@21553
|
230 unsigned short max_mem;
|
pascal@21553
|
231 unsigned short min_mem;
|
pascal@21553
|
232 char program_filename[63];
|
pascal@21553
|
233 unsigned short bitmask;
|
pascal@21553
|
234 char working_directory[64];
|
pascal@21553
|
235 char parameters_string[64];
|
pascal@21553
|
236 unsigned char video_mode;
|
pascal@21553
|
237 unsigned char video_pages;
|
pascal@21553
|
238 unsigned char first_interrupt;
|
pascal@21553
|
239 unsigned char last_interrupt;
|
pascal@21553
|
240 unsigned char height_screen;
|
pascal@21553
|
241 unsigned char width_screen;
|
pascal@21553
|
242 unsigned char horizontal_pos;
|
pascal@21553
|
243 unsigned char vertical_pos;
|
pascal@21553
|
244 unsigned short last_text_page;
|
pascal@21553
|
245 char unused2[128];
|
pascal@21553
|
246 unsigned short bitmask2;
|
pascal@21553
|
247 };
|
pascal@21553
|
248
|
pascal@21553
|
249 struct PIF_section_win_386_3_0 {
|
pascal@21553
|
250 unsigned short max_mem;
|
pascal@21553
|
251 unsigned short min_mem;
|
pascal@21553
|
252 unsigned short active_priority;
|
pascal@21553
|
253 unsigned short background_priority;
|
pascal@21553
|
254 unsigned short max_ems;
|
pascal@21553
|
255 unsigned short required_ems;
|
pascal@21553
|
256 unsigned short max_xms;
|
pascal@21553
|
257 unsigned short required_xms;
|
pascal@21553
|
258 unsigned long bitmask;
|
pascal@21553
|
259 unsigned short bitmask2;
|
pascal@21553
|
260 unsigned short unknown;
|
pascal@21553
|
261 unsigned short shortcut_key_code;
|
pascal@21553
|
262 unsigned short shortcut_key_modifier;
|
pascal@21553
|
263 unsigned short shortcut_key_use;
|
pascal@21553
|
264 unsigned short shortcut_key_scan;
|
pascal@21553
|
265 unsigned short unknown2;
|
pascal@21553
|
266 unsigned short unknown3;
|
pascal@21553
|
267 unsigned long unknown4;
|
pascal@21553
|
268 char parameters_string[64];
|
pascal@21553
|
269 };
|
pascal@21553
|
270
|
pascal@21553
|
271 struct PIF_section_win_vmm_4_0 {
|
pascal@21553
|
272 char unknown[88];
|
pascal@21553
|
273 char iconfile[80];
|
pascal@21553
|
274 unsigned short icon_number;
|
pascal@21553
|
275 unsigned short bitmask;
|
pascal@21553
|
276 char unknown2[10];
|
pascal@21553
|
277 unsigned short priority;
|
pascal@21553
|
278 unsigned short bitmask2; // video
|
pascal@21553
|
279 char unknown3[8];
|
pascal@21553
|
280 unsigned short text_lines;
|
pascal@21553
|
281 unsigned short bitmask3; // Key modifiers
|
pascal@21553
|
282 unsigned short unknown4;
|
pascal@21553
|
283 unsigned short unknown5;
|
pascal@21553
|
284 unsigned short unknown6;
|
pascal@21553
|
285 unsigned short unknown7;
|
pascal@21553
|
286 unsigned short unknown8;
|
pascal@21553
|
287 unsigned short unknown9;
|
pascal@21553
|
288 unsigned short unknown10;
|
pascal@21553
|
289 unsigned short unknown11;
|
pascal@21553
|
290 unsigned short bitmask4; // Mouse
|
pascal@21553
|
291 char unknown12[6];
|
pascal@21553
|
292 unsigned short bitmask5; // Fonts
|
pascal@21553
|
293 unsigned short unknown13;
|
pascal@21553
|
294 unsigned short rasterfontHsize;
|
pascal@21553
|
295 unsigned short rasterfontVsize;
|
pascal@21553
|
296 unsigned short fontHsize;
|
pascal@21553
|
297 unsigned short fontVsize;
|
pascal@21553
|
298 char raster_name[32];
|
pascal@21553
|
299 char truetype_name[32];
|
pascal@21553
|
300 unsigned short unknown14;
|
pascal@21553
|
301 unsigned short bitmask6;
|
pascal@21553
|
302 unsigned short restore_settings;
|
pascal@21553
|
303 unsigned short Hsize;
|
pascal@21553
|
304 unsigned short Vsize;
|
pascal@21553
|
305 unsigned short HsizePixelsClient;
|
pascal@21553
|
306 unsigned short VsizePixelsClient;
|
pascal@21553
|
307 unsigned short HsizePixels;
|
pascal@21553
|
308 unsigned short VsizePixels;
|
pascal@21553
|
309 unsigned short unknown15;
|
pascal@21553
|
310 unsigned short bitmask7;
|
pascal@21553
|
311 unsigned short maximized;
|
pascal@21553
|
312 char unknown16[4];
|
pascal@21553
|
313 char window_geom[16];
|
pascal@21553
|
314 char bat_file_name[80];
|
pascal@21553
|
315 unsigned short env_size;
|
pascal@21553
|
316 unsigned short dpmi_size;
|
pascal@21553
|
317 unsigned short unknown17;
|
pascal@21553
|
318 };
|
pascal@21553
|
319
|
pascal@21553
|
320 static struct {
|
pascal@21553
|
321 struct PIF_basic_section s0;
|
pascal@21553
|
322 struct PIF_section_header h0;
|
pascal@21553
|
323 struct PIF_section_header h1;
|
pascal@21553
|
324 struct PIF_section_win_386_3_0 s1;
|
pascal@21553
|
325 struct PIF_section_header h2;
|
pascal@21553
|
326 struct PIF_section_win_vmm_4_0 s2;
|
pascal@21553
|
327 } PIF_content = {
|
pascal@21553
|
328 { 0, 0x78, "MS-DOS Prompt ", 640, 0, "" /*slitaz.exe*/,
|
pascal@21553
|
329 0x10, "", "", 0, 1, 0, 255, 25, 80, 0, 0, 7, "", 0 },
|
pascal@21553
|
330 { "MICROSOFT PIFEX", sizeof(struct PIF_basic_section)
|
pascal@21553
|
331 + sizeof(struct PIF_section_header), 0,
|
pascal@21553
|
332 sizeof(struct PIF_basic_section) },
|
pascal@21553
|
333 { "WINDOWS 386 3.0", sizeof(struct PIF_basic_section)
|
pascal@21553
|
334 + 2*sizeof(struct PIF_section_header)
|
pascal@21553
|
335 + sizeof(struct PIF_section_win_386_3_0),
|
pascal@21553
|
336 sizeof(struct PIF_basic_section)
|
pascal@21553
|
337 + 2*sizeof(struct PIF_section_header),
|
pascal@21553
|
338 sizeof(struct PIF_section_win_386_3_0) },
|
pascal@21553
|
339 { 640, 0, 100, 50, 65535, 0, 65535, 0, 0x10821002, 31, 0, 0, 0, 0, 0, 0,
|
pascal@21553
|
340 0, 0, "" },
|
pascal@21553
|
341 { "WINDOWS VMM 4.0", 65535, sizeof(struct PIF_basic_section)
|
pascal@21553
|
342 + 3*sizeof(struct PIF_section_header)
|
pascal@21553
|
343 + sizeof(struct PIF_section_win_386_3_0),
|
pascal@21553
|
344 sizeof(struct PIF_section_win_vmm_4_0) },
|
pascal@21553
|
345 { "", "PIFMGR.DLL", 0, 2, "", 50, 1, "", 0, 1, 0, 5, 25, 3, 0xC8,
|
pascal@21553
|
346 0x3E8, 2, 10, 1, "", 28, 0, 0, 0, 7, 12, "Terminal", "Courier New",
|
pascal@21553
|
347 0, 3, 0, 80, 25, 0x250, 0x140, 0, 0, 22, 0, 0, "", "", "", 0, 0, 1 }
|
pascal@21553
|
348 };
|
pascal@21553
|
349 #pragma pack(pop)
|
pascal@21553
|
350
|
pascal@24279
|
351 static void exec16bits(const char *isoFileName)
|
pascal@14261
|
352 {
|
pascal@21553
|
353 int fd;
|
pascal@21553
|
354 const char pifFileName[] = "slitaz.pif";
|
pascal@14261
|
355
|
pascal@21553
|
356 strcpy(PIF_content.s0.program_filename, isoFileName);
|
pascal@21569
|
357 fd = open(pifFileName, O_WRONLY|O_BINARY|O_CREAT|O_TRUNC,0555);
|
pascal@24279
|
358 write(fd,(void*)&PIF_content,sizeof(PIF_content));
|
pascal@21553
|
359 close(fd);
|
pascal@21553
|
360 WinExec(pifFileName, SW_MINIMIZE);
|
pascal@21553
|
361 exit(0);
|
pascal@14261
|
362 }
|
pascal@14261
|
363
|
pascal@14261
|
364 static int iswinnt(void)
|
pascal@14261
|
365 {
|
pascal@14261
|
366 OSVERSIONINFOA Version;
|
pascal@14261
|
367 Version.dwOSVersionInfoSize = sizeof(Version);
|
pascal@14261
|
368 return (GetVersionEx(&Version) &&
|
pascal@14261
|
369 Version.dwPlatformId != VER_PLATFORM_WIN32_WINDOWS); // not Win9x
|
pascal@14261
|
370 }
|
pascal@14261
|
371
|
pascal@19676
|
372 #define LONG(x) * (unsigned long *) (x)
|
pascal@24279
|
373 static int ishybrid(const char *isoFileName)
|
pascal@14261
|
374 {
|
pascal@14261
|
375 int fdiso;
|
pascal@14261
|
376 char buffer[2048];
|
pascal@14261
|
377 unsigned long magic = 0;
|
pascal@14261
|
378
|
pascal@14261
|
379 fdiso = open(isoFileName, O_RDONLY|O_BINARY);
|
pascal@14261
|
380 if (lseek(fdiso, 17 * 2048L, SEEK_SET) != -1 &&
|
pascal@14264
|
381 read(fdiso, buffer, 2048) == 2048 &&
|
pascal@14266
|
382 strncmp(buffer+7,"EL TORITO SPECIFICATION",23) == 0) {
|
pascal@19676
|
383 unsigned long lba = LONG(buffer + 71);
|
pascal@14261
|
384
|
pascal@14261
|
385 if (lseek(fdiso, lba * 2048L, SEEK_SET) != -1 &&
|
pascal@14264
|
386 read(fdiso, buffer, 2048) == 2048 &&
|
pascal@19676
|
387 LONG(buffer + 0) == 1 && LONG(buffer + 30) == 0x88AA55) {
|
pascal@19676
|
388 lba = LONG(buffer + 40);
|
pascal@14261
|
389 if (lseek(fdiso, lba * 2048L, SEEK_SET) != -1 &&
|
pascal@14264
|
390 read(fdiso, buffer, 2048) == 2048)
|
pascal@19676
|
391 magic = LONG(buffer + 64);
|
pascal@14261
|
392 }
|
pascal@14261
|
393 }
|
pascal@14261
|
394 close(fdiso);
|
pascal@14261
|
395 return (magic == 1886961915);
|
pascal@14261
|
396 }
|
pascal@14261
|
397
|
pascal@24279
|
398 static unsigned long crc32(void *buf, int cnt)
|
pascal@24279
|
399 {
|
pascal@24279
|
400 static unsigned long t[256] = {
|
pascal@24279
|
401 0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,
|
pascal@24279
|
402 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91,
|
pascal@24279
|
403 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE, 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,
|
pascal@24279
|
404 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5,
|
pascal@24279
|
405 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172, 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B,
|
pascal@24279
|
406 0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,
|
pascal@24279
|
407 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F,
|
pascal@24279
|
408 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D,
|
pascal@24279
|
409 0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A, 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,
|
pascal@24279
|
410 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01,
|
pascal@24279
|
411 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457,
|
pascal@24279
|
412 0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,
|
pascal@24279
|
413 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB,
|
pascal@24279
|
414 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0, 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9,
|
pascal@24279
|
415 0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086, 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,
|
pascal@24279
|
416 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD,
|
pascal@24279
|
417 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A, 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683,
|
pascal@24279
|
418 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8, 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,
|
pascal@24279
|
419 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7,
|
pascal@24279
|
420 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC, 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5,
|
pascal@24279
|
421 0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,
|
pascal@24279
|
422 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79,
|
pascal@24279
|
423 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F,
|
pascal@24279
|
424 0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,
|
pascal@24279
|
425 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713,
|
pascal@24279
|
426 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21,
|
pascal@24279
|
427 0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,
|
pascal@24279
|
428 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45,
|
pascal@24279
|
429 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2, 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB,
|
pascal@24279
|
430 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,
|
pascal@24279
|
431 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF,
|
pascal@24279
|
432 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94, 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D };
|
pascal@24279
|
433 unsigned long crc;
|
pascal@24279
|
434 unsigned char *p = buf;
|
pascal@24279
|
435 int i;
|
pascal@14268
|
436
|
pascal@24279
|
437 for (crc=0xFFFFFFFF, i=0; i < cnt; i++) {
|
pascal@24279
|
438 crc=((crc >> 8) ^ t[(crc ^ p[i]) & 255]);
|
pascal@24279
|
439 }
|
pascal@24279
|
440 return crc ^ 0xFFFFFFFF;
|
pascal@24279
|
441 }
|
pascal@24279
|
442
|
pascal@24279
|
443 static char buffer[2048];
|
pascal@24279
|
444
|
pascal@24279
|
445 static int getDrive(unsigned long mask)
|
pascal@24279
|
446 {
|
pascal@24279
|
447 int dev;
|
pascal@24279
|
448 if (mask == 0) {
|
pascal@24279
|
449 exit(1);
|
pascal@24279
|
450 }
|
pascal@24279
|
451 for (dev = 128; (mask & 1) == 0; dev++)
|
pascal@24279
|
452 mask >>= 1;
|
pascal@24279
|
453 return dev;
|
pascal@24279
|
454 }
|
pascal@24279
|
455
|
pascal@24279
|
456 static unsigned long end = 0;
|
pascal@24279
|
457 #define MODE_READ 0
|
pascal@24279
|
458 #define MODE_WRITE 1
|
pascal@24279
|
459 #define MODE_GET_SIZE 2
|
pascal@24279
|
460 static int rdwrsector(int mode, int drive, unsigned long startingsector, int bufsiz)
|
pascal@14261
|
461 {
|
pascal@14261
|
462 HANDLE hDevice;
|
pascal@14261
|
463 DWORD result;
|
pascal@14261
|
464 char devname[sizeof("\\\\.\\PhysicalDrive0")];
|
pascal@14261
|
465
|
pascal@14261
|
466 if (drive >= 128) {
|
pascal@14261
|
467 strcpy(devname, "\\\\.\\PhysicalDrive0");
|
pascal@14261
|
468 devname[17] += drive - 128;
|
pascal@14261
|
469 }
|
pascal@14261
|
470 else {
|
pascal@14261
|
471 strcpy(devname, "\\\\.\\A:");
|
pascal@14261
|
472 devname[4] += drive;
|
pascal@14261
|
473 }
|
pascal@19025
|
474 hDevice = CreateFile (devname, (mode == MODE_READ) ? GENERIC_READ : GENERIC_WRITE,
|
pascal@14261
|
475 FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
|
pascal@14261
|
476 if (hDevice == INVALID_HANDLE_VALUE)
|
pascal@14261
|
477 return -1;
|
pascal@24279
|
478
|
pascal@24279
|
479 SetFilePointer(hDevice, (startingsector*bufsiz), NULL, FILE_BEGIN);
|
pascal@14261
|
480 if (mode == MODE_READ) {
|
pascal@24279
|
481 if (!ReadFile(hDevice, buffer, bufsiz, &result, NULL))
|
pascal@24279
|
482 result = -1;
|
pascal@24279
|
483 }
|
pascal@24279
|
484 else if (mode == MODE_WRITE) {
|
pascal@24279
|
485 if (!WriteFile(hDevice, buffer, bufsiz, &result, NULL))
|
pascal@14261
|
486 result = -1;
|
pascal@14261
|
487 }
|
pascal@14261
|
488 else {
|
pascal@24279
|
489 GET_LENGTH_INFORMATION li;
|
pascal@24279
|
490 DWORD rsize;
|
pascal@24279
|
491
|
pascal@24279
|
492 result = -1;
|
pascal@24279
|
493 if (DeviceIoControl(hDevice, IOCTL_DISK_GET_LENGTH_INFO, NULL, 0, &li, sizeof(li),
|
pascal@24279
|
494 &rsize, NULL) != 0) {
|
pascal@24279
|
495 end = li.Length.QuadPart >> 9;
|
pascal@24279
|
496 result = 0;
|
pascal@24279
|
497 }
|
pascal@24279
|
498 else {
|
pascal@24279
|
499 long i, high;
|
pascal@24279
|
500 high = -1;
|
pascal@24279
|
501 i = GetFileSize(hDevice, &high);
|
pascal@24279
|
502 if (i == INVALID_FILE_SIZE) {
|
pascal@24279
|
503 high = -1;
|
pascal@24279
|
504 i = SetFilePointer(hDevice, 0, &high, FILE_END);
|
pascal@24279
|
505 }
|
pascal@24279
|
506 if (i != INVALID_SET_FILE_POINTER) {
|
pascal@24279
|
507 end = (high << 23)|(i >> 9);
|
pascal@24279
|
508 result = 0;
|
pascal@24279
|
509 }
|
pascal@24279
|
510 #if 0
|
pascal@24279
|
511 if (result == -1) {
|
pascal@24279
|
512 LARGE_INTEGER size;
|
pascal@24279
|
513 //if (GetFileSizeEx(hDevice, &size) != 0) {
|
pascal@24279
|
514 if ((*GetProcAddress(GetModuleHandle("kernel32.dll"),
|
pascal@24279
|
515 "GetFileSizeEx"))(hDevice, &size) != 0) {
|
pascal@24279
|
516 end = (size.QuadPart >> 9);
|
pascal@24279
|
517 result = 0;
|
pascal@24279
|
518 }
|
pascal@24279
|
519 }
|
pascal@24279
|
520 #endif
|
pascal@24279
|
521 #if 0
|
pascal@24279
|
522 if (result == -1) {
|
pascal@24279
|
523 for (end = 0x40000000, i = (end >> 1); i != 0; i >>= 1) {
|
pascal@24279
|
524 high = (end >> 23);
|
pascal@24279
|
525 if (SetFilePointer(hDevice, end << 9, &high, FILE_BEGIN) == INVALID_SET_FILE_POINTER ||
|
pascal@24279
|
526 !ReadFile(hDevice, buffer, 512, &result, NULL) || result != 512) end -= i;
|
pascal@24279
|
527 else end += i;
|
pascal@24279
|
528 }
|
pascal@24279
|
529 high = (end >> 23);
|
pascal@24279
|
530 if (SetFilePointer(hDevice, end << 9, &high, FILE_BEGIN)
|
pascal@24279
|
531 != INVALID_SET_FILE_POINTER) end++;
|
pascal@24279
|
532 if (end > startingsector) result = 0;
|
pascal@24279
|
533 }
|
pascal@24279
|
534 #endif
|
pascal@24279
|
535 }
|
pascal@24279
|
536
|
pascal@14261
|
537 }
|
pascal@14261
|
538 CloseHandle(hDevice);
|
pascal@14261
|
539 return result;
|
pascal@14261
|
540 }
|
pascal@14261
|
541
|
pascal@24279
|
542 static int rawrite(int dev, char *isoFileName)
|
pascal@14261
|
543 {
|
pascal@24279
|
544 int fdiso, s;
|
pascal@24279
|
545 float next;
|
pascal@24279
|
546 off_t size;
|
pascal@24279
|
547 HWND hwndPB;
|
pascal@14261
|
548
|
pascal@14261
|
549 fdiso = open(isoFileName, O_RDONLY|O_BINARY);
|
pascal@24279
|
550 size = lseek(fdiso,0,SEEK_END);
|
pascal@24279
|
551 lseek(fdiso,0,SEEK_SET);
|
pascal@24279
|
552 if (size != -1) { // https://docs.microsoft.com/en-us/windows/win32/controls/create-progress-bar-controls
|
pascal@24279
|
553 const left=100, right=100+400, bottom=80, scroll=50;
|
pascal@24279
|
554
|
pascal@24279
|
555 InitCommonControls(); // need -lcomctl32
|
pascal@24279
|
556 hwndPB = CreateWindowEx(0, PROGRESS_CLASS, Msg[MSG_BUILD_KEY],
|
pascal@24279
|
557 WS_VISIBLE | PBS_SMOOTH, left,
|
pascal@24279
|
558 bottom - scroll, right, scroll,
|
pascal@24279
|
559 NULL, (HMENU) 0, GetModuleHandle(0), NULL);
|
pascal@24279
|
560 if (hwndPB == NULL) size = -1;
|
pascal@24279
|
561 else SendMessage(hwndPB, PBM_SETRANGE, 0, MAKELPARAM(0, 0xFFFF));
|
pascal@24279
|
562 }
|
pascal@24279
|
563 for (s = 0, next = 0.0;; s++) {
|
pascal@24279
|
564 int n = read(fdiso, buffer, 2048);
|
pascal@14261
|
565 if (n <= 0) break;
|
pascal@24279
|
566 rdwrsector(MODE_WRITE, dev, s, 2048);
|
pascal@24279
|
567 if (size != -1) SendMessage(hwndPB, PBM_SETPOS, (WPARAM) floor((65536.0*2048.0*s)/size), 0 );
|
pascal@14261
|
568 }
|
pascal@14261
|
569 close(fdiso);
|
pascal@24279
|
570 if (size != -1) DestroyWindow(hwndPB);
|
pascal@14266
|
571 return dev;
|
pascal@14261
|
572 }
|
pascal@14261
|
573
|
pascal@14261
|
574 static unsigned long drives(void)
|
pascal@14261
|
575 {
|
pascal@14261
|
576 int i, mask, result;
|
pascal@14268
|
577
|
pascal@14261
|
578 for (i = result = 0, mask = 1; i < 8; i++, mask <<= 1) {
|
pascal@24279
|
579 if (rdwrsector(MODE_READ, getDrive(i+128), 0, 512) != -1)
|
pascal@14261
|
580 result |= mask;
|
pascal@14261
|
581 }
|
pascal@14261
|
582 return result;
|
pascal@14261
|
583 }
|
pascal@14261
|
584
|
pascal@24279
|
585 static int EndOfIso(int dev, unsigned long *endiso, unsigned long *endcustom)
|
pascal@24279
|
586 {
|
pascal@24279
|
587 if (rdwrsector(MODE_READ, dev, 16, 2048) == -1) return -1;
|
pascal@24279
|
588 *endiso = *endcustom = LONG(buffer+80);
|
pascal@24279
|
589 if (rdwrsector(MODE_GET_SIZE, dev, *endiso, 512) == -1) return -1;
|
pascal@24279
|
590 if (rdwrsector(MODE_READ, dev, *endiso, 2048) != -1 && !memcmp(buffer,"#!boot",6)) {
|
pascal@24279
|
591 char *s;
|
pascal@24279
|
592 *endcustom++;
|
pascal@24279
|
593 s = strstr(buffer, "\ninitrd:");
|
pascal@24279
|
594 if (s) {
|
pascal@24279
|
595 long n = strtol(s+8,&s,10);
|
pascal@24279
|
596 n += s - buffer;
|
pascal@24279
|
597 *endcustom += n/2048;
|
pascal@24279
|
598 }
|
pascal@24279
|
599 *endcustom += 511L; *endcustom &= ~511L;
|
pascal@24279
|
600 }
|
pascal@24279
|
601 return 0;
|
pascal@24279
|
602 }
|
pascal@24279
|
603
|
pascal@24279
|
604 static void AddPartition(int dev, char *label, unsigned long next)
|
pascal@24279
|
605 {
|
pascal@24279
|
606 int i;
|
pascal@24279
|
607 unsigned long crc;
|
pascal@24279
|
608
|
pascal@24279
|
609 // https://en.wikipedia.org/wiki/GUID_Partition_Table
|
pascal@24279
|
610 if (rdwrsector(MODE_READ, dev, 2, 512) == -1) return;
|
pascal@24279
|
611 if (buffer[128+56] == 0) {
|
pascal@24279
|
612 static char id[16] = { 0xA2, 0xA0, 0xD0, 0xEB,
|
pascal@24279
|
613 0xE5, 0xB9, 0x33, 0x44, 0x87, 0xC0,
|
pascal@24279
|
614 0x68, 0xB6, 0xB7, 0x26, 0x99, 0xC7 };
|
pascal@24279
|
615 memcpy(buffer + 128, id, 16);
|
pascal@24279
|
616 for (i = 0; i < 16; i += 2)
|
pascal@24279
|
617 * (unsigned short *) (buffer + 128+16 + i) = rand();
|
pascal@24279
|
618 for (i = 56; *label; i += 2)
|
pascal@24279
|
619 buffer[128+i] = *label++;
|
pascal@24279
|
620 LONG(buffer + 128+32) = next * 2048/512;
|
pascal@24279
|
621 LONG(buffer + 128+40) = end - 3;
|
pascal@24279
|
622 }
|
pascal@24279
|
623 rdwrsector(MODE_WRITE, dev, 2, 512);
|
pascal@24279
|
624 rdwrsector(MODE_WRITE, dev, end - 2, 512);
|
pascal@24279
|
625 crc = crc32(buffer, 512L);
|
pascal@24279
|
626 if (rdwrsector(MODE_READ, dev, 1, 512) == -1) return;
|
pascal@24279
|
627 LONG(buffer+88) = crc;
|
pascal@24279
|
628 LONG(buffer+24) = 1; // Current header
|
pascal@24279
|
629 LONG(buffer+28) = 0;
|
pascal@24279
|
630 LONG(buffer+32) = end - 1; // Backup header
|
pascal@24279
|
631 LONG(buffer+36) = 0;
|
pascal@24279
|
632 LONG(buffer+48) = end - 3; // Last usable sector
|
pascal@24279
|
633 LONG(buffer+52) = 0;
|
pascal@24279
|
634 LONG(buffer+16) = 0;
|
pascal@24279
|
635 crc = crc32(buffer, LONG(buffer + 0x0C));
|
pascal@24279
|
636 LONG(buffer+16) = crc;
|
pascal@24279
|
637 rdwrsector(MODE_WRITE, dev, 1, 512);
|
pascal@24279
|
638 LONG(buffer+24) = end - 1; // Current header
|
pascal@24279
|
639 LONG(buffer+28) = 0;
|
pascal@24279
|
640 LONG(buffer+32) = 1; // Backup header
|
pascal@24279
|
641 LONG(buffer+36) = 0;
|
pascal@24279
|
642 LONG(buffer+16) = 0;
|
pascal@24279
|
643 crc = crc32(buffer, LONG(buffer + 0x0C));
|
pascal@24279
|
644 LONG(buffer+16) = crc;
|
pascal@24279
|
645 rdwrsector(MODE_WRITE, dev, end - 1, 512);
|
pascal@24279
|
646 }
|
pascal@24279
|
647
|
pascal@14261
|
648 static void writefloppy(char *isoFileName)
|
pascal@14261
|
649 {
|
pascal@14261
|
650 int i, n, fd;
|
pascal@14261
|
651
|
pascal@14261
|
652 buffer[BOOTSTRAP_SECTOR_COUNT_OFFSET] = 0;
|
pascal@14261
|
653 fd = open(isoFileName, O_RDONLY|O_BINARY);
|
pascal@14261
|
654 if (fd != -1) {
|
pascal@24279
|
655 read(fd, buffer, 512);
|
pascal@14261
|
656 n = buffer[BOOTSTRAP_SECTOR_COUNT_OFFSET];
|
pascal@14261
|
657 if (n != 0 &&
|
pascal@14264
|
658 lseek(fd, * (unsigned short *) (buffer + 66) - (512 * n),
|
pascal@14261
|
659 SEEK_SET) != -1) {
|
pascal@14268
|
660 for (i = 0; i <= n; i++) {
|
pascal@14261
|
661 if (i == 1) strncpy(buffer, isoFileName, 512);
|
pascal@14268
|
662 else read(fd, buffer, 512);
|
pascal@24279
|
663 rdwrsector(MODE_WRITE, 0, i, 512);
|
pascal@14261
|
664 }
|
pascal@14261
|
665 }
|
pascal@14261
|
666 close(fd);
|
pascal@14261
|
667 }
|
pascal@14261
|
668 }
|
pascal@14261
|
669
|
pascal@14261
|
670 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
|
pascal@14261
|
671 LPSTR lpCmdLine, int nCmdShow)
|
pascal@14261
|
672 {
|
pascal@14261
|
673 char isoFileName[MAX_PATH];
|
pascal@14261
|
674 char header[32];
|
pascal@14261
|
675 int fd;
|
pascal@14261
|
676 int usbkeyicon = MB_ICONASTERISK;
|
pascal@24279
|
677 char *usbkeymsg;
|
pascal@14261
|
678
|
pascal@14261
|
679 GetModuleFileName(hInstance, isoFileName, MAX_PATH);
|
pascal@24279
|
680 if (iswinnt()) {
|
pascal@24279
|
681 LANGID lid = (*GetProcAddress(GetModuleHandle("kernel32.dll"), "GetSystemDefaultUILanguage"))();
|
pascal@24279
|
682 if ((lid & 0xff) == 0x0c) Msg = MsgSet[LANG_FR];
|
pascal@24279
|
683 }
|
pascal@24279
|
684 else {
|
pascal@24279
|
685 struct stat statbuf;
|
pascal@24279
|
686 if (stat("C:\\Mes Documents",&statbuf) != -1) Msg = MsgSet[LANG_FR];
|
pascal@24279
|
687 if (MessageBox(NULL, Msg[MSG_NOT_DOS_MODE], Msg[MSG_CRATE_PIF_NOW],
|
pascal@20804
|
688 MB_YESNO|MB_ICONQUESTION) == IDYES) {
|
pascal@20804
|
689 exec16bits(isoFileName);
|
pascal@20804
|
690 }
|
pascal@14261
|
691 exit(1);
|
pascal@14261
|
692 }
|
pascal@14261
|
693 if (!ishybrid(isoFileName)) {
|
pascal@24279
|
694 if (MessageBox(NULL, Msg[MSG_NOT_HYBRID], Msg[MSG_WILL_NOT_BOOT],
|
pascal@14261
|
695 MB_OKCANCEL|MB_ICONWARNING) == IDCANCEL)
|
pascal@14261
|
696 exit(0);
|
pascal@14261
|
697 }
|
pascal@14261
|
698 header[BOOTSTRAP_SECTOR_COUNT_OFFSET] = 0;
|
pascal@14261
|
699 fd = open(isoFileName, O_RDONLY|O_BINARY);
|
pascal@14261
|
700 if (fd != -1) {
|
pascal@14261
|
701 read(fd, header, sizeof(header));
|
pascal@14261
|
702 close(fd);
|
pascal@14261
|
703 }
|
pascal@24279
|
704 usbkeymsg = Msg[MSG_EITHER_CREATE_KEY_OR_BOOT_FLOPPY];
|
pascal@14261
|
705 if (header[BOOTSTRAP_SECTOR_COUNT_OFFSET] == 0) { // No floppy bootstrap available
|
pascal@14261
|
706 usbkeyicon = MB_ICONQUESTION;
|
pascal@24279
|
707 usbkeymsg = Msg[MSG_WANT_CREATE_BOOT_KEY];
|
pascal@14261
|
708 }
|
pascal@24279
|
709 if (MessageBox(NULL,usbkeymsg, Msg[MSG_Q_CREATE_STICK],
|
pascal@14261
|
710 MB_YESNO|usbkeyicon) == IDYES) {
|
pascal@14261
|
711 unsigned long base, new;
|
pascal@14261
|
712 int retry;
|
pascal@14261
|
713
|
pascal@24279
|
714 if (MessageBox(NULL, Msg[MSG_STEP_1], Msg[MSG_DETECT_1],
|
pascal@14261
|
715 MB_OKCANCEL|MB_ICONEXCLAMATION) == IDCANCEL)
|
pascal@14261
|
716 exit(0);
|
pascal@14261
|
717 base = drives();
|
pascal@24279
|
718 if (MessageBox(NULL, Msg[MSG_STEP_2], Msg[MSG_DETECT_2],
|
pascal@14261
|
719 MB_OKCANCEL|MB_ICONEXCLAMATION) == IDCANCEL)
|
pascal@14261
|
720 exit(0);
|
pascal@14261
|
721 retry = 0;
|
pascal@14261
|
722 do {
|
pascal@14261
|
723 Sleep(1000); // ms
|
pascal@14261
|
724 new = drives();
|
pascal@14261
|
725 } while (new == base && retry++ < 10);
|
pascal@14261
|
726 if (new == base) {
|
pascal@24279
|
727 MessageBox(NULL, Msg[MSG_NOT_FOUND], Msg[MSG_SORRY],
|
pascal@14261
|
728 MB_OK|MB_ICONERROR);
|
pascal@14261
|
729 }
|
pascal@14266
|
730 else {
|
pascal@24279
|
731 unsigned long endiso, endcustom;
|
pascal@24279
|
732 char *msg = Msg[MSG_HD0_UP_TO_DATE];
|
pascal@24279
|
733 int drive = getDrive(base ^ new);
|
pascal@24279
|
734 msg[3] += rawrite(drive, isoFileName) - 128;
|
pascal@24279
|
735 if (EndOfIso(drive, &endiso, &endcustom) == -1) {
|
pascal@24279
|
736 char *msg2 = Msg[MSG_HD0_UP_TO_DATE_BUT];
|
pascal@24279
|
737 msg2[3] = msg[3];
|
pascal@24279
|
738 MessageBox(NULL,msg2, Msg[MSG_NO_REPART] ,MB_OK|MB_ICONEXCLAMATION);
|
pascal@24279
|
739 }
|
pascal@24279
|
740 else {
|
pascal@24279
|
741 static char *labels[2] = { "Basic data partition", "SliTaz persistent /home" };
|
pascal@24279
|
742 if (endiso != endcustom && MessageBox(NULL, Msg[MSG_KEEP_CUSTOM_CONF],
|
pascal@24279
|
743 Msg[MSG_KEEP_CONF], MB_YESNO|MB_ICONQUESTION) == IDYES)
|
pascal@24279
|
744 endiso = endcustom;
|
pascal@24279
|
745 AddPartition(drive, labels[MessageBox(NULL, Msg[MSG_WANT_HOME],
|
pascal@24279
|
746 Msg[MSG_DO_HOME], MB_YESNO|MB_ICONQUESTION) == IDYES], endiso);
|
pascal@24279
|
747 MessageBox(NULL,msg, Msg[MSG_FINISHED], MB_OK);
|
pascal@24279
|
748 }
|
pascal@14266
|
749 }
|
pascal@14261
|
750 }
|
pascal@14266
|
751 else if (header[BOOTSTRAP_SECTOR_COUNT_OFFSET] != 0 &&
|
pascal@24279
|
752 MessageBox(NULL, Msg[MSG_WANT_FLOPPY], Msg[MSG_DO_FLOPPY],
|
pascal@14261
|
753 MB_YESNO|MB_ICONQUESTION) == IDYES &&
|
pascal@24279
|
754 MessageBox(NULL, Msg[MSG_INSERT_A_FLOPPY], Msg[MSG_INSERT_FLOPPY],
|
pascal@14261
|
755 MB_OKCANCEL|MB_ICONEXCLAMATION) != IDCANCEL) {
|
pascal@14261
|
756
|
pascal@24279
|
757 // Create a 9k bootstrap with vfat, exfat, ntfs, ext2 & usb drivers
|
pascal@14261
|
758 // to boot the ISO image on hard disk
|
pascal@14261
|
759 writefloppy(isoFileName);
|
pascal@24279
|
760 MessageBox(NULL, Msg[MSG_FLOPPY_DONE],
|
pascal@24279
|
761 Msg[MSG_FINISHED], MB_OK);
|
pascal@14261
|
762 }
|
pascal@14261
|
763 }
|