wok annotate syslinux/stuff/iso2exe/win32.c @ rev 24941

memtest: add binutils 2.37 support
author Pascal Bellard <pascal.bellard@slitaz.org>
date Sat Apr 16 12:43:33 2022 +0000 (2022-04-16)
parents 7744355508b9
children
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 }