[syslinux] fix support for recent Syslinux versions

* Detect Syslinux version from isolinux.bin (Closes #272)
* Download required Syslinux v5+ files where needed (Closes #165)
* Also fix an issue where using a Syslinux based ISO didn't switch to ISO mode
* Also alter DownloadFile and ExtractISOFile to return a size
This commit is contained in:
Pete Batard 2014-01-21 17:08:41 +00:00
parent 7e81ec2838
commit 299506056a
9 changed files with 352 additions and 162 deletions

View file

@ -6,6 +6,11 @@ the same changes.
Remember to also update the version number for your translation ('v x.y.z') Remember to also update the version number for your translation ('v x.y.z')
once you have matched all the changes that occurred for the en-US translation. once you have matched all the changes that occurred for the en-US translation.
o Version 1.0.8 (2014.01.21)
- MSG_234: 'v%d' is replaced with '%s' (change already applied to existing translations)
- *NEW* MSG_114 "This image uses Syslinux %s but this application only includes Syslinux %s
- *NEW* MSG_115 "Download required"
o Version 1.0.7 (2014.01.01) o Version 1.0.7 (2014.01.01)
- Added MSG_092 again - Added MSG_092 again
- Added English example for OK button in About box (IDOK) - Added English example for OK button in About box (IDOK)

View file

@ -286,7 +286,14 @@ t MSG_111 "Incompatible Cluster size"
t MSG_112 "Formatting a large UDF volumes can take a lot of time. At USB 2.0 speeds, the estimated formatting " t MSG_112 "Formatting a large UDF volumes can take a lot of time. At USB 2.0 speeds, the estimated formatting "
"duration is %d:%02d, during which the progress bar will appear frozen. Please be patient!" "duration is %d:%02d, during which the progress bar will appear frozen. Please be patient!"
t MSG_113 "Large UDF volume" t MSG_113 "Large UDF volume"
t MSG_114 "This image uses Syslinux %s but this application only includes Syslinux %s.\n\n"
"As new versions of Syslinux are not compatible with one another, and it is not possible to "
"include them all, Rufus needs to download two additional files ('ldlinux.sys' and 'ldlinux.bss'):\n"
"- Select 'Yes' to connect to the internet and download these files\n"
"- Select 'No' to cancel the operation\n\n"
"Note: The files will be downloaded in the current directory and once "
"they exist there, they will be reused automatically.\n"
t MSG_115 "Download required"
# Tootips # Tootips
# Partition Scheme and Target Type # Partition Scheme and Target Type
t MSG_150 "Usually the safest choice. If you have an UEFI computer and want to install " t MSG_150 "Usually the safest choice. If you have an UEFI computer and want to install "
@ -384,8 +391,8 @@ t MSG_230 "Copying DOS files..."
t MSG_231 "Copying ISO files..." t MSG_231 "Copying ISO files..."
t MSG_232 "Win7 EFI boot setup (this may take a while)..." t MSG_232 "Win7 EFI boot setup (this may take a while)..."
t MSG_233 "Finalizing, please wait..." t MSG_233 "Finalizing, please wait..."
# Takes the Syslinux version as parameter, eg. "Installing Syslinux v5..." # Takes a Syslinux version as parameter, eg. "Installing Syslinux v5.10..."
t MSG_234 "Installing Syslinux v%d..." t MSG_234 "Installing Syslinux %s..."
# Bad blocks status. eg: "Bad Blocks: PASS 1/2 - 12.34% (0/0/1 errors)" # Bad blocks status. eg: "Bad Blocks: PASS 1/2 - 12.34% (0/0/1 errors)"
t MSG_235 "Bad Blocks: PASS %d/%d - %0.2f%% (%d/%d/%d errors)" t MSG_235 "Bad Blocks: PASS %d/%d - %0.2f%% (%d/%d/%d errors)"
t MSG_236 "Bad Blocks: Testing with random pattern" t MSG_236 "Bad Blocks: Testing with random pattern"
@ -731,7 +738,7 @@ t MSG_231 "复制 ISO 文件..."
t MSG_232 "设置 Win7 EFI 启动,请耐心等待..." t MSG_232 "设置 Win7 EFI 启动,请耐心等待..."
t MSG_233 "完成中,请稍等候..." t MSG_233 "完成中,请稍等候..."
# Takes the Syslinux version as parameter. # Takes the Syslinux version as parameter.
t MSG_234 "安装 Syslinux v%d..." t MSG_234 "安装 Syslinux %s..."
# Bad blocks status. # Bad blocks status.
t MSG_235 "检查坏块:第 %d/%d 遍 - %0.2f%% (%d/%d/%d 错误)" t MSG_235 "检查坏块:第 %d/%d 遍 - %0.2f%% (%d/%d/%d 错误)"
t MSG_236 "检查坏块:测试中 - 随机模式" t MSG_236 "检查坏块:测试中 - 随机模式"
@ -1078,7 +1085,7 @@ t MSG_231 "複製 ISO 檔案..."
t MSG_232 "建置 Win7 EFI 開機架構 (可能要一段時間,請耐心等候)..." t MSG_232 "建置 Win7 EFI 開機架構 (可能要一段時間,請耐心等候)..."
t MSG_233 "收尾中,請稍候..." t MSG_233 "收尾中,請稍候..."
# Takes the Syslinux version as paramete. eg. "Installing Syslinux v5..." # Takes the Syslinux version as paramete. eg. "Installing Syslinux v5..."
t MSG_234 "Syslinux v%d 安裝中..." t MSG_234 "Syslinux %s 安裝中..."
# Bad blocks status. eg: "Bad Blocks: PASS 1/2 - 12.34% (0/0/1 errors)" # Bad blocks status. eg: "Bad Blocks: PASS 1/2 - 12.34% (0/0/1 errors)"
t MSG_235 "損毀磁區: 第 %d/%d 回 - %0.2f%% (%d/%d/%d 錯誤)" t MSG_235 "損毀磁區: 第 %d/%d 回 - %0.2f%% (%d/%d/%d 錯誤)"
t MSG_236 "損毀磁區: 掃描中 (隨機模式)" t MSG_236 "損毀磁區: 掃描中 (隨機模式)"
@ -1458,7 +1465,7 @@ t MSG_231 "ISO bestanden aan het kopiëren..."
t MSG_232 "Win7 EFI opstart setup (Dit kan een tijdje duren)..." t MSG_232 "Win7 EFI opstart setup (Dit kan een tijdje duren)..."
t MSG_233 "Finaliseren, een moment geduld a.u.b..." t MSG_233 "Finaliseren, een moment geduld a.u.b..."
# Takes the Syslinux version as paramete. eg. "Installing Syslinux v5..." # Takes the Syslinux version as paramete. eg. "Installing Syslinux v5..."
t MSG_234 "Bezig met installeren Syslinux v%d..." t MSG_234 "Bezig met installeren Syslinux %s..."
# Bad blocks status. eg: "Bad Blocks: PASS 1/2 - 12.34% (0/0/1 errors)" # Bad blocks status. eg: "Bad Blocks: PASS 1/2 - 12.34% (0/0/1 errors)"
t MSG_235 "Slechte Blokken: Ronde %d/%d - %0.2f%% (%d/%d/%d fouten)" t MSG_235 "Slechte Blokken: Ronde %d/%d - %0.2f%% (%d/%d/%d fouten)"
t MSG_236 "Slechte Blokken: Testen met willekeurig patroon" t MSG_236 "Slechte Blokken: Testen met willekeurig patroon"
@ -1698,7 +1705,7 @@ t MSG_102 "Votre plateforme ne peut pas extraire les fichiers depuis les archive
"est nécéssaire pour créer des médias USB démarrable avec EFI pour Windows 7/8 ou Windows Vista. Vous pouvez addresser " "est nécéssaire pour créer des médias USB démarrable avec EFI pour Windows 7/8 ou Windows Vista. Vous pouvez addresser "
"ce problème en téléchargeant une version récente de l'utilitaire 7-Zip.\nVoulez-vous visiter la page de téléchargements de 7-zip?" "ce problème en téléchargeant une version récente de l'utilitaire 7-Zip.\nVoulez-vous visiter la page de téléchargements de 7-zip?"
t MSG_103 "Télécharger %s?" t MSG_103 "Télécharger %s?"
t MSG_104 "Syslinux v5.0 ou plus récent requiert l'installtion d'un fichier '%s'.\n" t MSG_104 "Syslinux v5.0 ou plus récent requiert l'installation d'un fichier '%s'.\n"
"Puisque ce fichier fait plus de 100 Ko et est toujours présent sur les images ISO à base de Syslinux v5+, " "Puisque ce fichier fait plus de 100 Ko et est toujours présent sur les images ISO à base de Syslinux v5+, "
"il n'est pas inclus dans l'application.\n\nRufus peut télécharger ce fichier pour vous:\n" "il n'est pas inclus dans l'application.\n\nRufus peut télécharger ce fichier pour vous:\n"
"- Choisissez 'Oui' pour télécharger le fichier depuis Internet\n" "- Choisissez 'Oui' pour télécharger le fichier depuis Internet\n"
@ -1717,6 +1724,14 @@ t MSG_111 "Taille de clusters incompatible"
t MSG_112 "Le formattage d'un volume UDF de grande taille peut prendre beaucoup de temps. Aux vitesses USB 2.0, " t MSG_112 "Le formattage d'un volume UDF de grande taille peut prendre beaucoup de temps. Aux vitesses USB 2.0, "
"la durée de formattage estimée est %d:%02d, pendant laquelle la barre de progrès semblera gelée. Veuillez être patient !" "la durée de formattage estimée est %d:%02d, pendant laquelle la barre de progrès semblera gelée. Veuillez être patient !"
t MSG_113 "Volume UDF de grand taille" t MSG_113 "Volume UDF de grand taille"
t MSG_114 "Cette image utilise Syslinux %s mais l'application inclus seulement Syslinux %s.\n\n"
"Comme les nouvelles versions de Syslinux sont incompatibles, et il n'est pas possible toutes "
"les inclure, Rufus doit télécharger 2 fichiers supplémentaires ('ldlinux.sys' et 'ldlinux.bss'):\n"
"- Choisissez 'Oui' pour télécharger ces fichier depuis Internet\n"
"- Choisissez 'Non' pour annuler l'opération\n"
"Note: Ces fichier seront téléchargés dans le répertoire courrant et une fois qu'ils"
"existent à cet endroit, il seront réutilisés automatiquement."
t MSG_115 "Téléchargement nécessaire"
# Tootips # Tootips
t MSG_150 "Ce choix est le plus sûr. Mais si vous possédez un ordinateur à base de UEFI et voulez installer " t MSG_150 "Ce choix est le plus sûr. Mais si vous possédez un ordinateur à base de UEFI et voulez installer "
@ -1804,7 +1819,7 @@ t MSG_230 "Copie des fichiers DOS..."
t MSG_231 "Copie des fichiers ISO..." t MSG_231 "Copie des fichiers ISO..."
t MSG_232 "Ecriture boot Win7 EFI (peut prendre du temps)..." t MSG_232 "Ecriture boot Win7 EFI (peut prendre du temps)..."
t MSG_233 "Finalisation, veuillez patienter..." t MSG_233 "Finalisation, veuillez patienter..."
t MSG_234 "Installation de Syslinux v%d..." t MSG_234 "Installation de Syslinux %s..."
t MSG_235 "Défauts: PASSE %d/%d - %0.2f%% (%d/%d/%d erreurs)" t MSG_235 "Défauts: PASSE %d/%d - %0.2f%% (%d/%d/%d erreurs)"
t MSG_236 "Défauts: Test avec motif aléatoire" t MSG_236 "Défauts: Test avec motif aléatoire"
t MSG_237 "Défauts: Test avec motif 0x%02X" t MSG_237 "Défauts: Test avec motif 0x%02X"
@ -2173,7 +2188,7 @@ t MSG_231 "Kopiere ISO-Dateien..."
t MSG_232 "Win7 EFI Boot setup (kann etwas dauern)..." t MSG_232 "Win7 EFI Boot setup (kann etwas dauern)..."
t MSG_233 "Abschließen, bitte warten..." t MSG_233 "Abschließen, bitte warten..."
# Takes the Syslinux version as parameter, eg. "Installing Syslinux v5..." # Takes the Syslinux version as parameter, eg. "Installing Syslinux v5..."
t MSG_234 "Installiere Syslinux v%d..." t MSG_234 "Installiere Syslinux %s..."
# Bad blocks status. eg: "Bad Blocks: PASS 1/2 - 12.34% (0/0/1 errors)" # Bad blocks status. eg: "Bad Blocks: PASS 1/2 - 12.34% (0/0/1 errors)"
t MSG_235 "Fehlerhafte Blöcke: Durchlauf %d/%d - %0.2f%% (%d/%d/%d Fehler)" t MSG_235 "Fehlerhafte Blöcke: Durchlauf %d/%d - %0.2f%% (%d/%d/%d Fehler)"
t MSG_236 "Fehlerhafte Blöcke: Prüfe mit zufälligen Mustern" t MSG_236 "Fehlerhafte Blöcke: Prüfe mit zufälligen Mustern"
@ -2582,7 +2597,7 @@ t MSG_231 "Αντιγραφή αρχείων ISO..."
t MSG_232 "Ρυθμίσεις εκκίνησης Win7 EFI (η διαδικασία ίσως διαρκέσει αρκετά)..." t MSG_232 "Ρυθμίσεις εκκίνησης Win7 EFI (η διαδικασία ίσως διαρκέσει αρκετά)..."
t MSG_233 "Οριστικοποίηση, παρακαλώ περιμένετε..." t MSG_233 "Οριστικοποίηση, παρακαλώ περιμένετε..."
# Takes the Syslinux version as paramete. eg. "Installing Syslinux v5..." # Takes the Syslinux version as paramete. eg. "Installing Syslinux v5..."
t MSG_234 "Εγκατάσταση Syslinux v%d..." t MSG_234 "Εγκατάσταση Syslinux %s..."
# Bad blocks status. eg: "Bad Blocks: PASS 1/2 - 12.34% (0/0/1 errors)" # Bad blocks status. eg: "Bad Blocks: PASS 1/2 - 12.34% (0/0/1 errors)"
t MSG_235 "Κατεστραμμένοι τομείς: πέρασμα %d/%d - %0.2f%% (%d/%d/%d σφάλματα)" t MSG_235 "Κατεστραμμένοι τομείς: πέρασμα %d/%d - %0.2f%% (%d/%d/%d σφάλματα)"
t MSG_236 "Κατεστραμμένοι τομείς: Έλεγχος με τυχαίο διάταξη" t MSG_236 "Κατεστραμμένοι τομείς: Έλεγχος με τυχαίο διάταξη"
@ -2940,7 +2955,7 @@ t MSG_231 "ISO fájlok másolása..."
t MSG_232 "Win7 EFI boot telepítő (ez eltarthat egy kis ideig)..." t MSG_232 "Win7 EFI boot telepítő (ez eltarthat egy kis ideig)..."
t MSG_233 "Véglegesítés, kérlek, várj..." t MSG_233 "Véglegesítés, kérlek, várj..."
# Takes the Syslinux version as parameter, eg. "Installing Syslinux v5..." # Takes the Syslinux version as parameter, eg. "Installing Syslinux v5..."
t MSG_234 "Syslinux v%d telepítése..." t MSG_234 "Syslinux %s telepítése..."
# Bad blocks status. eg: "Bad Blocks: PASS 1/2 - 12.34% (0/0/1 errors)" # Bad blocks status. eg: "Bad Blocks: PASS 1/2 - 12.34% (0/0/1 errors)"
t MSG_235 "Hibás blokkok: Próbálkozás %d/%d - %0.2f%% (%d/%d/%d hiba)" t MSG_235 "Hibás blokkok: Próbálkozás %d/%d - %0.2f%% (%d/%d/%d hiba)"
t MSG_236 "Hibás blokkok: Véletlenszerű paraméterrel való tesztelés" t MSG_236 "Hibás blokkok: Véletlenszerű paraméterrel való tesztelés"
@ -3337,7 +3352,7 @@ t MSG_231 "Menyalin file ISO..."
t MSG_232 "Konfigurasi Win7 EFI boot (ini mungkin memakan waktu cukup lama)..." t MSG_232 "Konfigurasi Win7 EFI boot (ini mungkin memakan waktu cukup lama)..."
t MSG_233 "Menyelesaikan, harap tunggu..." t MSG_233 "Menyelesaikan, harap tunggu..."
# Takes the Syslinux version as parameter, eg. "Installing Syslinux v5..." # Takes the Syslinux version as parameter, eg. "Installing Syslinux v5..."
t MSG_234 "Memasang Syslinux v%d..." t MSG_234 "Memasang Syslinux %s..."
# Bad blocks status. eg: "Bad Blocks: PASS 1/2 - 12.34% (0/0/1 errors)" # Bad blocks status. eg: "Bad Blocks: PASS 1/2 - 12.34% (0/0/1 errors)"
t MSG_235 "Blok Buruk: LULUS %d/%d - %0.2f%% (%d/%d/%d kerusakan)" t MSG_235 "Blok Buruk: LULUS %d/%d - %0.2f%% (%d/%d/%d kerusakan)"
t MSG_236 "Blok Buruk: Pengujian dengan pola acak" t MSG_236 "Blok Buruk: Pengujian dengan pola acak"
@ -3699,7 +3714,7 @@ t MSG_230 "Copia file DOS..."
t MSG_231 "Copia file immagine ISO..." t MSG_231 "Copia file immagine ISO..."
t MSG_232 "Impostazione avvio EFI Windows 7 (potrebbe richiedere del tempo)..." t MSG_232 "Impostazione avvio EFI Windows 7 (potrebbe richiedere del tempo)..."
t MSG_233 "Finalizzazione..." t MSG_233 "Finalizzazione..."
t MSG_234 "Installazione Syslinux v. %d..." t MSG_234 "Installazione Syslinux %s..."
t MSG_235 "Blocchi danneggiati: pattern %d/%d - %0.2f%% (errori %d/%d/%d)" t MSG_235 "Blocchi danneggiati: pattern %d/%d - %0.2f%% (errori %d/%d/%d)"
t MSG_236 "Blocchi danneggiati: test con pattern casuali" t MSG_236 "Blocchi danneggiati: test con pattern casuali"
t MSG_237 "Blocchi danneggiati: testing con pattern 0x%02X" t MSG_237 "Blocchi danneggiati: testing con pattern 0x%02X"
@ -4070,7 +4085,7 @@ t MSG_231 "ISO 파일을 복사..."
t MSG_232 "WIN7 EFI 부팅 설정 (잠시만)..." t MSG_232 "WIN7 EFI 부팅 설정 (잠시만)..."
t MSG_233 "마무리 하는 중... 잠시만..." t MSG_233 "마무리 하는 중... 잠시만..."
# Takes the Syslinux version as parameter, eg. "Installing Syslinux v5..." # Takes the Syslinux version as parameter, eg. "Installing Syslinux v5..."
t MSG_234 "Syslinux v%d를 설치..." t MSG_234 "Syslinux %s를 설치..."
# Bad blocks status. eg: "Bad Blocks: PASS 1/2 - 12.34% (0/0/1 errors)" # Bad blocks status. eg: "Bad Blocks: PASS 1/2 - 12.34% (0/0/1 errors)"
t MSG_235 "배드 섹터: PASS %d/%d - %0.2f%% (%d/%d/%d errors)" t MSG_235 "배드 섹터: PASS %d/%d - %0.2f%% (%d/%d/%d errors)"
t MSG_236 "배드 섹터: 랜덤 패턴 테스트" t MSG_236 "배드 섹터: 랜덤 패턴 테스트"
@ -4468,7 +4483,7 @@ t MSG_231 "Kopijuojami ISO failai..."
t MSG_232 "Win7 EFI įkelties sąranka (gali užtrukti)..." t MSG_232 "Win7 EFI įkelties sąranka (gali užtrukti)..."
t MSG_233 "Baigiama, prašome palaukti..." t MSG_233 "Baigiama, prašome palaukti..."
# Takes the Syslinux version as parameter, eg. "Installing Syslinux v5..." # Takes the Syslinux version as parameter, eg. "Installing Syslinux v5..."
t MSG_234 "Įdiegiama Syslinux v%d..." t MSG_234 "Įdiegiama Syslinux %s..."
# Bad blocks status. eg: "Bad Blocks: PASS 1/2 - 12.34% (0/0/1 errors)" # Bad blocks status. eg: "Bad Blocks: PASS 1/2 - 12.34% (0/0/1 errors)"
t MSG_235 "Blogi blokai: BANDYMAS %d/%d - %0.2f%% (%d/%d/%d klaidos)" t MSG_235 "Blogi blokai: BANDYMAS %d/%d - %0.2f%% (%d/%d/%d klaidos)"
t MSG_236 "Blogi blokai: tikrinama su atsitiktiniu šablonu" t MSG_236 "Blogi blokai: tikrinama su atsitiktiniu šablonu"
@ -4870,7 +4885,7 @@ t MSG_231 "Menyalin fail ISO..."
t MSG_232 "Persediaan boot EFI Win7 (ini mungkin mengambil sedikit masa)..." t MSG_232 "Persediaan boot EFI Win7 (ini mungkin mengambil sedikit masa)..."
t MSG_233 "Memuktamadkan, sila tunggu..." t MSG_233 "Memuktamadkan, sila tunggu..."
# Takes the Syslinux version as parameter, eg. "Installing Syslinux v5..." # Takes the Syslinux version as parameter, eg. "Installing Syslinux v5..."
t MSG_234 "Memasang Syslinux v%d..." t MSG_234 "Memasang Syslinux %s..."
# Bad blocks status. eg: "Bad Blocks: PASS 1/2 - 12.34% (0/0/1 errors)" # Bad blocks status. eg: "Bad Blocks: PASS 1/2 - 12.34% (0/0/1 errors)"
t MSG_235 "Blok rosak: PASS %d/%d - %0.2f%% (%d/%d/%d errors)" t MSG_235 "Blok rosak: PASS %d/%d - %0.2f%% (%d/%d/%d errors)"
t MSG_236 "Blok rosak: menguji dengan corak rawak" t MSG_236 "Blok rosak: menguji dengan corak rawak"
@ -5270,7 +5285,7 @@ t MSG_231 "Kopiowanie plików ISO..."
t MSG_232 "Ustawianie bootowania Win7 EFI (to może chwilę potrwać)..." t MSG_232 "Ustawianie bootowania Win7 EFI (to może chwilę potrwać)..."
t MSG_233 "Finalizacja, proszę czekać..." t MSG_233 "Finalizacja, proszę czekać..."
# Takes the Syslinux version as paramete. eg. "Installing Syslinux v5..." # Takes the Syslinux version as paramete. eg. "Installing Syslinux v5..."
t MSG_234 "Instalowanie Syslinux v%d..." t MSG_234 "Instalowanie Syslinux %s..."
# Bad blocks status. eg: "Bad Blocks: PASS 1/2 - 12.34% (0/0/1 errors)" # Bad blocks status. eg: "Bad Blocks: PASS 1/2 - 12.34% (0/0/1 errors)"
t MSG_235 "Błędne Sektory: UKOŃCZONO %d/%d - %0.2f%% (%d/%d/%d błędów)" t MSG_235 "Błędne Sektory: UKOŃCZONO %d/%d - %0.2f%% (%d/%d/%d błędów)"
t MSG_236 "Błędne Sektory: Testowanie z losowym wzorem" t MSG_236 "Błędne Sektory: Testowanie z losowym wzorem"
@ -5679,7 +5694,7 @@ t MSG_231 "A copiar arquivos ISO..."
t MSG_232 "Configuração de arranque Win7 EFI (pode demorar um pouco)..." t MSG_232 "Configuração de arranque Win7 EFI (pode demorar um pouco)..."
t MSG_233 "A finalizar, por favor espere..." t MSG_233 "A finalizar, por favor espere..."
# Takes the Syslinux version as parameter, eg. "Installing Syslinux v5..." # Takes the Syslinux version as parameter, eg. "Installing Syslinux v5..."
t MSG_234 "A instalar Syslinux v%d..." t MSG_234 "A instalar Syslinux %s..."
# Bad blocks status. eg: "Bad Blocks: PASS 1/2 - 12.34% (0/0/1 errors)" # Bad blocks status. eg: "Bad Blocks: PASS 1/2 - 12.34% (0/0/1 errors)"
t MSG_235 "Blocos com erro: PASSO %d/%d - %0.2f%% (%d/%d/%d erros)" t MSG_235 "Blocos com erro: PASSO %d/%d - %0.2f%% (%d/%d/%d erros)"
t MSG_236 "Blocos com erro: A verificar com teste padrão" t MSG_236 "Blocos com erro: A verificar com teste padrão"
@ -6034,7 +6049,7 @@ t MSG_230 "Copierea fişierului DOS..."
t MSG_231 "Copierea fişierului imagine ISO..." t MSG_231 "Copierea fişierului imagine ISO..."
t MSG_232 "Setarea UEFI de boot Windows 7 (poate dura ceva timp)..." t MSG_232 "Setarea UEFI de boot Windows 7 (poate dura ceva timp)..."
t MSG_233 "Finalizarea..." t MSG_233 "Finalizarea..."
t MSG_234 "Instalarea Syslinux v. %d..." t MSG_234 "Instalarea Syslinux %s..."
t MSG_235 "Blocuri defecte: model %d/%d - %0.2f%% (erori %d/%d/%d)" t MSG_235 "Blocuri defecte: model %d/%d - %0.2f%% (erori %d/%d/%d)"
t MSG_236 "Blocuri defecte: testarea cu modele aleatoare" t MSG_236 "Blocuri defecte: testarea cu modele aleatoare"
t MSG_237 "Blocuri defecte: testarea cu model 0x%02X" t MSG_237 "Blocuri defecte: testarea cu model 0x%02X"
@ -6422,7 +6437,7 @@ t MSG_231 "Копирование ISO-файлов..."
t MSG_232 "Настройка Win7 EFI boot (Это может занять время)..." t MSG_232 "Настройка Win7 EFI boot (Это может занять время)..."
t MSG_233 "Завершение, пожалуйста, ждите..." t MSG_233 "Завершение, пожалуйста, ждите..."
# Takes the Syslinux version as paramete. eg. "Installing Syslinux v5..." # Takes the Syslinux version as paramete. eg. "Installing Syslinux v5..."
t MSG_234 "Установка Syslinux v%d..." t MSG_234 "Установка Syslinux %s..."
# Bad blocks status. eg: "Bad Blocks: PASS 1/2 - 12.34% (0/0/1 errors)" # Bad blocks status. eg: "Bad Blocks: PASS 1/2 - 12.34% (0/0/1 errors)"
t MSG_235 "Плохие блоки: Проход %d/%d - %0.2f%% (%d/%d/%d ошибок)" t MSG_235 "Плохие блоки: Проход %d/%d - %0.2f%% (%d/%d/%d ошибок)"
t MSG_236 "Плохие блоки: Тестирование случайным образом" t MSG_236 "Плохие блоки: Тестирование случайным образом"
@ -6808,7 +6823,7 @@ t MSG_231 "Kopiram ISO datoteke…"
t MSG_232 "Pripravljam pogon za zagon Windows 7 na EFI (to lahko traja)…" t MSG_232 "Pripravljam pogon za zagon Windows 7 na EFI (to lahko traja)…"
t MSG_233 "Zaključujem; prosim, počakajte…" t MSG_233 "Zaključujem; prosim, počakajte…"
# Takes the Syslinux version as parameter, eg. "Installing Syslinux v5…" # Takes the Syslinux version as parameter, eg. "Installing Syslinux v5…"
t MSG_234 "Nameščam Syslinux v%d…" t MSG_234 "Nameščam Syslinux %s…"
# Bad blocks status. eg: "Bad Blocks: PASS 1/2 - 12.34% (0/0/1 errors)" # Bad blocks status. eg: "Bad Blocks: PASS 1/2 - 12.34% (0/0/1 errors)"
t MSG_235 "Slabi bloki: prehod %d/%d - %0.2f%% (%d/%d/%d napak)" t MSG_235 "Slabi bloki: prehod %d/%d - %0.2f%% (%d/%d/%d napak)"
t MSG_236 "Slabi bloki: testiram z naključnim vzorcem" t MSG_236 "Slabi bloki: testiram z naključnim vzorcem"
@ -7210,7 +7225,7 @@ t MSG_231 "Copiando archivos ISO..."
t MSG_232 "Configuración de arranque Win7 EFI (puede tardar un rato)..." t MSG_232 "Configuración de arranque Win7 EFI (puede tardar un rato)..."
t MSG_233 "Finalización, por favor espere..." t MSG_233 "Finalización, por favor espere..."
# Takes the Syslinux version as parameter, eg. "Installing Syslinux v5..." # Takes the Syslinux version as parameter, eg. "Installing Syslinux v5..."
t MSG_234 "Instalando Syslinux v%d..." t MSG_234 "Instalando Syslinux %s..."
# Bad blocks status. eg: "Bad Blocks: PASS 1/2 - 12.34% (0/0/1 errors)" # Bad blocks status. eg: "Bad Blocks: PASS 1/2 - 12.34% (0/0/1 errors)"
t MSG_235 "Bloques dañados: PASO %d/%d - %0.2f%% (%d/%d/%d errores)" t MSG_235 "Bloques dañados: PASO %d/%d - %0.2f%% (%d/%d/%d errores)"
t MSG_236 "Bloques dañados: Probando con patrones aleatorios" t MSG_236 "Bloques dañados: Probando con patrones aleatorios"
@ -7605,7 +7620,7 @@ t MSG_231 "ISO Dosyaları Kopyalanıyor..."
t MSG_232 "Win7 EFI Açılış Kurulumu (Biraz zaman alabilir)..." t MSG_232 "Win7 EFI Açılış Kurulumu (Biraz zaman alabilir)..."
t MSG_233 "Bitiriliyor, Lütfen Bekleyin..." t MSG_233 "Bitiriliyor, Lütfen Bekleyin..."
# Takes the Syslinux version as parameter, eg. "Installing Syslinux v5..." # Takes the Syslinux version as parameter, eg. "Installing Syslinux v5..."
t MSG_234 "Syslinux v%d Yükleniyor..." t MSG_234 "Syslinux %s Yükleniyor..."
# Bad blocks status. eg: "Bad Blocks: PASS 1/2 - 12.34% (0/0/1 errors)" # Bad blocks status. eg: "Bad Blocks: PASS 1/2 - 12.34% (0/0/1 errors)"
t MSG_235 "Hatalı Bloklar: Geçiş %d/%d - %0.2f%% (%d/%d/%d hata)" t MSG_235 "Hatalı Bloklar: Geçiş %d/%d - %0.2f%% (%d/%d/%d hata)"
t MSG_236 "Hatalı Bloklar: Rasgele kalıpla deneniyor" t MSG_236 "Hatalı Bloklar: Rasgele kalıpla deneniyor"

105
src/iso.c
View file

@ -55,14 +55,16 @@ void cdio_destroy (CdIo_t* p_cdio) {}
RUFUS_ISO_REPORT iso_report; RUFUS_ISO_REPORT iso_report;
int64_t iso_blocking_status = -1; int64_t iso_blocking_status = -1;
BOOL enable_joliet = TRUE, enable_rockridge = TRUE; BOOL enable_joliet = TRUE, enable_rockridge = TRUE, has_ldlinux_c32;
#define ISO_BLOCKING(x) do {x; iso_blocking_status++; } while(0) #define ISO_BLOCKING(x) do {x; iso_blocking_status++; } while(0)
static const char* psz_extract_dir; static const char* psz_extract_dir;
static const char* bootmgr_efi_name = "bootmgr.efi"; static const char* bootmgr_efi_name = "bootmgr.efi";
static const char* ldlinux_name = "ldlinux.sys"; static const char* ldlinux_name = "ldlinux.sys";
static const char* syslinux_v5_file = "ldlinux.c32"; static const char* ldlinux_c32 = "ldlinux.c32";
static const char* efi_dirname = "/efi/boot"; static const char* efi_dirname = "/efi/boot";
static const char* isolinux_name[] = { "isolinux.cfg", "syslinux.cfg", "extlinux.conf"}; static const char* syslinux_cfg[] = { "isolinux.cfg", "syslinux.cfg", "extlinux.conf"};
static const char dot_isolinux_bin[] = ".\\isolinux.bin";
static const char* isolinux_bin = &dot_isolinux_bin[2];
static const char* pe_dirname[] = { "/i386", "/minint" }; static const char* pe_dirname[] = { "/i386", "/minint" };
static const char* pe_file[] = { "ntdetect.com", "setupldr.bin", "txtsetup.sif" }; static const char* pe_file[] = { "ntdetect.com", "setupldr.bin", "txtsetup.sif" };
static const char* reactos_name = "setupldr.sys"; // TODO: freeldr.sys doesn't seem to work static const char* reactos_name = "setupldr.sys"; // TODO: freeldr.sys doesn't seem to work
@ -72,7 +74,7 @@ static const int64_t old_c32_threshold[NB_OLD_C32] = OLD_C32_THRESHOLD;
static uint8_t i_joliet_level = 0; static uint8_t i_joliet_level = 0;
static uint64_t total_blocks, nb_blocks; static uint64_t total_blocks, nb_blocks;
static BOOL scan_only = FALSE; static BOOL scan_only = FALSE;
static StrArray config_path; static StrArray config_path, isolinux_path;
// TODO: Timestamp & permissions preservation // TODO: Timestamp & permissions preservation
@ -117,6 +119,7 @@ static void log_handler (cdio_log_level_t level, const char *message)
{ {
switch(level) { switch(level) {
case CDIO_LOG_DEBUG: case CDIO_LOG_DEBUG:
// TODO: use a registry key to enable libcdio debug?
return; return;
default: default:
uprintf("libcdio: %s\n", message); uprintf("libcdio: %s\n", message);
@ -134,14 +137,14 @@ static BOOL check_iso_props(const char* psz_dirname, BOOL* is_syslinux_cfg, BOOL
// Check for an isolinux/syslinux config file anywhere // Check for an isolinux/syslinux config file anywhere
*is_syslinux_cfg = FALSE; *is_syslinux_cfg = FALSE;
for (i=0; i<ARRAYSIZE(isolinux_name); i++) { for (i=0; i<ARRAYSIZE(syslinux_cfg); i++) {
if (safe_stricmp(psz_basename, isolinux_name[i]) == 0) if (safe_stricmp(psz_basename, syslinux_cfg[i]) == 0)
*is_syslinux_cfg = TRUE; *is_syslinux_cfg = TRUE;
} }
// Check for a syslinux v5.0 file anywhere // Check for a syslinux v5.0+ file anywhere
if (safe_stricmp(psz_basename, syslinux_v5_file) == 0) { if (safe_stricmp(psz_basename, ldlinux_c32) == 0) {
iso_report.has_syslinux_v5 = TRUE; has_ldlinux_c32 = TRUE;
} }
// Check for an old incompatible c32 file anywhere // Check for an old incompatible c32 file anywhere
@ -178,10 +181,14 @@ static BOOL check_iso_props(const char* psz_dirname, BOOL* is_syslinux_cfg, BOOL
iso_report.winpe |= (1<<i)<<(ARRAYSIZE(pe_dirname)*j); iso_report.winpe |= (1<<i)<<(ARRAYSIZE(pe_dirname)*j);
if (*is_syslinux_cfg) { if (*is_syslinux_cfg) {
iso_report.has_isolinux = TRUE;
// Maintain a list of all the isolinux/syslinux configs identified so far // Maintain a list of all the isolinux/syslinux configs identified so far
StrArrayAdd(&config_path, psz_fullpath); StrArrayAdd(&config_path, psz_fullpath);
} }
if (safe_stricmp(psz_basename, isolinux_bin) == 0) {
// Maintain a list of all the isolinux.bin files found
StrArrayAdd(&isolinux_path, psz_fullpath);
}
for (i=0; i<NB_OLD_C32; i++) { for (i=0; i<NB_OLD_C32; i++) {
if (is_old_c32[i]) if (is_old_c32[i])
iso_report.has_old_c32[i] = TRUE; iso_report.has_old_c32[i] = TRUE;
@ -465,18 +472,20 @@ out:
BOOL ExtractISO(const char* src_iso, const char* dest_dir, BOOL scan) BOOL ExtractISO(const char* src_iso, const char* dest_dir, BOOL scan)
{ {
size_t i; size_t i, k, size;
int j; int j;
uint16_t sl_version;
FILE* fd; FILE* fd;
BOOL r = FALSE; BOOL r = FALSE;
iso9660_t* p_iso = NULL; iso9660_t* p_iso = NULL;
udf_t* p_udf = NULL; udf_t* p_udf = NULL;
udf_dirent_t* p_udf_root; udf_dirent_t* p_udf_root;
LONG progress_style; LONG progress_style;
char* tmp; char *tmp, *buf;
char path[64]; char path[MAX_PATH];
const char* basedir[] = { "i386", "minint" }; const char* basedir[] = { "i386", "minint" };
const char* tmp_sif = ".\\txtsetup.sif~"; const char* tmp_sif = ".\\txtsetup.sif~";
const char ISOLINUX[] = { 'I', 'S', 'O', 'L', 'I', 'N', 'U', 'X', ' ' };
iso_extension_mask_t iso_extension_mask = ISO_EXTENSION_ALL; iso_extension_mask_t iso_extension_mask = ISO_EXTENSION_ALL;
if ((src_iso == NULL) || (dest_dir == NULL)) if ((src_iso == NULL) || (dest_dir == NULL))
@ -489,8 +498,10 @@ BOOL ExtractISO(const char* src_iso, const char* dest_dir, BOOL scan)
if (scan_only) { if (scan_only) {
total_blocks = 0; total_blocks = 0;
memset(&iso_report, 0, sizeof(iso_report)); memset(&iso_report, 0, sizeof(iso_report));
has_ldlinux_c32 = FALSE;
// String array of all isolinux/syslinux locations // String array of all isolinux/syslinux locations
StrArrayCreate(&config_path, 8); StrArrayCreate(&config_path, 8);
StrArrayCreate(&isolinux_path, 8);
// Change the Window title and static text // Change the Window title and static text
SetWindowTextU(hISOProgressDlg, lmprintf(MSG_202)); SetWindowTextU(hISOProgressDlg, lmprintf(MSG_202));
SetWindowTextU(hISOFileName, lmprintf(MSG_202)); SetWindowTextU(hISOFileName, lmprintf(MSG_202));
@ -566,14 +577,65 @@ out:
// We use the fact that UDF_BLOCKSIZE and ISO_BLOCKSIZE are the same here // We use the fact that UDF_BLOCKSIZE and ISO_BLOCKSIZE are the same here
iso_report.projected_size = total_blocks * ISO_BLOCKSIZE; iso_report.projected_size = total_blocks * ISO_BLOCKSIZE;
// We will link the existing isolinux.cfg from a syslinux.cfg we create // We will link the existing isolinux.cfg from a syslinux.cfg we create
// If multiple config file exist, choose the one with the shortest path // If multiple config files exist, choose the one with the shortest path
if (iso_report.has_isolinux) { // (so that a '/syslinux.cfg' is preferred over a '/isolinux/isolinux.cfg')
if (!IsStrArrayEmpty(config_path)) {
safe_strcpy(iso_report.cfg_path, sizeof(iso_report.cfg_path), config_path.Table[0]); safe_strcpy(iso_report.cfg_path, sizeof(iso_report.cfg_path), config_path.Table[0]);
for (i=1; i<config_path.Index; i++) { for (i=1; i<config_path.Index; i++) {
if (safe_strlen(iso_report.cfg_path) > safe_strlen(config_path.Table[i])) if (safe_strlen(iso_report.cfg_path) > safe_strlen(config_path.Table[i]))
safe_strcpy(iso_report.cfg_path, sizeof(iso_report.cfg_path), config_path.Table[i]); safe_strcpy(iso_report.cfg_path, sizeof(iso_report.cfg_path), config_path.Table[i]);
} }
uprintf("Will use %s for Syslinux\n", iso_report.cfg_path); uprintf("Will use %s for Syslinux\n", iso_report.cfg_path);
// Extract all of the isolinux.bin files we found to identify their versions
for (i=0; i<isolinux_path.Index; i++) {
size = (size_t)ExtractISOFile(src_iso, isolinux_path.Table[i], dot_isolinux_bin);
if (size == 0) {
uprintf("Could not access %s\n", isolinux_path.Table[i]);
} else {
buf = (char*)calloc(size, 1);
if (buf == NULL) break;
fd = fopen(dot_isolinux_bin, "rb");
if (fd == NULL) {
free(buf);
continue;
}
fread(buf, 1, size, fd);
fclose(fd);
for (k=0; k<size-16; k++) {
if (memcmp(&buf[k], ISOLINUX, sizeof(ISOLINUX)) == 0) {
k += sizeof(ISOLINUX);
sl_version = (((uint8_t)strtoul(&buf[k], &tmp, 10))<<8) + (uint8_t)strtoul(&tmp[1], NULL, 10);
if (iso_report.sl_version == 0) {
iso_report.sl_version = sl_version;
j = (int)i;
} else if (iso_report.sl_version != sl_version) {
uprintf("Found conflicting %s versions:\n '%s' (v%d.%02d) vs '%s' (v%d.%02d)\n", isolinux_bin,
isolinux_path.Table[j], SL_MAJOR(iso_report.sl_version), SL_MINOR(iso_report.sl_version),
isolinux_path.Table[i], SL_MAJOR(sl_version), SL_MINOR(sl_version));
}
break;
}
}
free(buf);
_unlink(dot_isolinux_bin);
}
}
if (iso_report.sl_version != 0) {
static_sprintf(iso_report.sl_version_str, "v%d.%02d",
SL_MAJOR(iso_report.sl_version), SL_MINOR(iso_report.sl_version));
uprintf("Detected Isolinux version: %s (from '%s')",
iso_report.sl_version_str, isolinux_path.Table[j]);
if ( (has_ldlinux_c32 && (SL_MAJOR(iso_report.sl_version) < 5))
|| (!has_ldlinux_c32 && (SL_MAJOR(iso_report.sl_version) >= 5)) )
uprintf("Warning: Conflict between Isolinux version and the presence of ldlinux.c32...\n");
} else {
// Couldn't find a version from isolinux.bin. Force set to the versions we embed
iso_report.sl_version = embedded_sl_version[has_ldlinux_c32?1:0];
static_sprintf(iso_report.sl_version_str, "v%d.%02d",
SL_MAJOR(iso_report.sl_version), SL_MINOR(iso_report.sl_version));
uprintf("Warning: Could not detect Isolinux version - Forcing to %s (embedded)",
iso_report.sl_version_str);
}
} }
if (IS_WINPE(iso_report.winpe)) { if (IS_WINPE(iso_report.winpe)) {
// In case we have a WinPE 1.x based iso, we extract and parse txtsetup.sif // In case we have a WinPE 1.x based iso, we extract and parse txtsetup.sif
@ -593,7 +655,8 @@ out:
safe_free(tmp); safe_free(tmp);
} }
StrArrayDestroy(&config_path); StrArrayDestroy(&config_path);
} else if (iso_report.has_isolinux) { StrArrayDestroy(&isolinux_path);
} else if (!IsStrArrayEmpty(config_path)) {
safe_sprintf(path, sizeof(path), "%s\\syslinux.cfg", dest_dir); safe_sprintf(path, sizeof(path), "%s\\syslinux.cfg", dest_dir);
// Create a /syslinux.cfg (if none exists) that points to the existing isolinux cfg // Create a /syslinux.cfg (if none exists) that points to the existing isolinux cfg
fd = fopen(path, "r"); fd = fopen(path, "r");
@ -626,14 +689,14 @@ out:
return (r == 0); return (r == 0);
} }
BOOL ExtractISOFile(const char* iso, const char* iso_file, const char* dest_file) int64_t ExtractISOFile(const char* iso, const char* iso_file, const char* dest_file)
{ {
size_t i; size_t i;
ssize_t read_size; ssize_t read_size;
int64_t file_length; int64_t file_length;
char buf[UDF_BLOCKSIZE]; char buf[UDF_BLOCKSIZE];
DWORD buf_size, wr_size; DWORD buf_size, wr_size;
BOOL s, r = FALSE; BOOL s, r = 0;
iso9660_t* p_iso = NULL; iso9660_t* p_iso = NULL;
udf_t* p_udf = NULL; udf_t* p_udf = NULL;
udf_dirent_t *p_udf_root = NULL, *p_udf_file = NULL; udf_dirent_t *p_udf_root = NULL, *p_udf_file = NULL;
@ -678,8 +741,8 @@ BOOL ExtractISOFile(const char* iso, const char* iso_file, const char* dest_file
goto out; goto out;
} }
file_length -= read_size; file_length -= read_size;
r += read_size;
} }
r = TRUE;
goto out; goto out;
try_iso: try_iso:
@ -710,8 +773,8 @@ try_iso:
goto out; goto out;
} }
file_length -= ISO_BLOCKSIZE; file_length -= ISO_BLOCKSIZE;
r += ISO_BLOCKSIZE;
} }
r = TRUE;
out: out:
safe_closehandle(file_handle); safe_closehandle(file_handle);
@ -726,5 +789,5 @@ out:
iso9660_close(p_iso); iso9660_close(p_iso);
if (p_udf != NULL) if (p_udf != NULL)
udf_close(p_udf); udf_close(p_udf);
return (r == 0); return r;
} }

View file

@ -1,7 +1,7 @@
/* /*
* Rufus: The Reliable USB Formatting Utility * Rufus: The Reliable USB Formatting Utility
* Networking functionality (web file download, check for update, etc.) * Networking functionality (web file download, check for update, etc.)
* Copyright © 2012-2013 Pete Batard <pete@akeo.ie> * Copyright © 2012-2014 Pete Batard <pete@akeo.ie>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@ -239,7 +239,7 @@ const char* WinInetErrorString(void)
* to the dialog in question, with WPARAM being set to nonzero for EXIT on success * to the dialog in question, with WPARAM being set to nonzero for EXIT on success
* and also attempt to indicate progress using an IDC_PROGRESS control * and also attempt to indicate progress using an IDC_PROGRESS control
*/ */
BOOL DownloadFile(const char* url, const char* file, HWND hProgressDialog) DWORD DownloadFile(const char* url, const char* file, HWND hProgressDialog)
{ {
HWND hProgressBar = NULL; HWND hProgressBar = NULL;
BOOL r = FALSE; BOOL r = FALSE;
@ -251,6 +251,7 @@ BOOL DownloadFile(const char* url, const char* file, HWND hProgressDialog)
HINTERNET hSession = NULL, hConnection = NULL, hRequest = NULL; HINTERNET hSession = NULL, hConnection = NULL, hRequest = NULL;
URL_COMPONENTSA UrlParts = {sizeof(URL_COMPONENTSA), NULL, 1, (INTERNET_SCHEME)0, URL_COMPONENTSA UrlParts = {sizeof(URL_COMPONENTSA), NULL, 1, (INTERNET_SCHEME)0,
hostname, sizeof(hostname), 0, NULL, 1, urlpath, sizeof(urlpath), NULL, 1}; hostname, sizeof(hostname), 0, NULL, 1, urlpath, sizeof(urlpath), NULL, 1};
size_t last_slash;
int i; int i;
if (hProgressDialog != NULL) { if (hProgressDialog != NULL) {
@ -264,8 +265,15 @@ BOOL DownloadFile(const char* url, const char* file, HWND hProgressDialog)
SendMessage(hProgressDialog, UM_ISO_INIT, 0, 0); SendMessage(hProgressDialog, UM_ISO_INIT, 0, 0);
} }
PrintStatus(0, FALSE, MSG_240, file); for (last_slash = safe_strlen(file); last_slash != 0; last_slash--) {
uprintf("Downloading %s from %s\n", file, url); if ((file[last_slash] == '/') || (file[last_slash] == '\\')) {
last_slash++;
break;
}
}
PrintStatus(0, FALSE, MSG_240, &file[last_slash]);
uprintf("Downloading '%s' from %s\n", &file[last_slash], url);
if (!InternetCrackUrlA(url, (DWORD)safe_strlen(url), 0, &UrlParts)) { if (!InternetCrackUrlA(url, (DWORD)safe_strlen(url), 0, &UrlParts)) {
uprintf("Unable to decode URL: %s\n", WinInetErrorString()); uprintf("Unable to decode URL: %s\n", WinInetErrorString());
@ -286,7 +294,7 @@ BOOL DownloadFile(const char* url, const char* file, HWND hProgressDialog)
_snprintf(agent, ARRAYSIZE(agent), APPLICATION_NAME "/%d.%d.%d.%d", rufus_version[0], rufus_version[1], rufus_version[2], rufus_version[3]); _snprintf(agent, ARRAYSIZE(agent), APPLICATION_NAME "/%d.%d.%d.%d", rufus_version[0], rufus_version[1], rufus_version[2], rufus_version[3]);
hSession = InternetOpenA(agent, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0); hSession = InternetOpenA(agent, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
if (hSession == NULL) { if (hSession == NULL) {
uprintf("Could not open internet session: %s\n", WinInetErrorString()); uprintf("Could not open Internet session: %s\n", WinInetErrorString());
goto out; goto out;
} }
@ -300,7 +308,7 @@ BOOL DownloadFile(const char* url, const char* file, HWND hProgressDialog)
INTERNET_FLAG_HYPERLINK|INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP|INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTPS|INTERNET_FLAG_NO_COOKIES| INTERNET_FLAG_HYPERLINK|INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP|INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTPS|INTERNET_FLAG_NO_COOKIES|
INTERNET_FLAG_NO_UI|INTERNET_FLAG_NO_CACHE_WRITE, (DWORD_PTR)NULL); INTERNET_FLAG_NO_UI|INTERNET_FLAG_NO_CACHE_WRITE, (DWORD_PTR)NULL);
if (hRequest == NULL) { if (hRequest == NULL) {
uprintf("Could not open url %s: %s\n", url, WinInetErrorString()); uprintf("Could not open URL %s: %s\n", url, WinInetErrorString());
goto out; goto out;
} }
@ -327,7 +335,7 @@ BOOL DownloadFile(const char* url, const char* file, HWND hProgressDialog)
fd = fopenU(file, "wb"); fd = fopenU(file, "wb");
if (fd == NULL) { if (fd == NULL) {
uprintf("Unable to create file '%s': %s\n", file, WinInetErrorString()); uprintf("Unable to create file '%s': %s\n", &file[last_slash], WinInetErrorString());
goto out; goto out;
} }
@ -343,7 +351,7 @@ BOOL DownloadFile(const char* url, const char* file, HWND hProgressDialog)
SendMessage(hProgressBar, PBM_SETPOS, (WPARAM)(MAX_PROGRESS*((1.0f*dwSize)/(1.0f*dwTotalSize))), 0); SendMessage(hProgressBar, PBM_SETPOS, (WPARAM)(MAX_PROGRESS*((1.0f*dwSize)/(1.0f*dwTotalSize))), 0);
PrintStatus(0, FALSE, MSG_241, (100.0f*dwSize)/(1.0f*dwTotalSize)); PrintStatus(0, FALSE, MSG_241, (100.0f*dwSize)/(1.0f*dwTotalSize));
if (fwrite(buf, 1, dwDownloaded, fd) != dwDownloaded) { if (fwrite(buf, 1, dwDownloaded, fd) != dwDownloaded) {
uprintf("Error writing file '%s': %s\n", file, WinInetErrorString()); uprintf("Error writing file '%s': %s\n", &file[last_slash], WinInetErrorString());
goto out; goto out;
} }
} }
@ -354,7 +362,7 @@ BOOL DownloadFile(const char* url, const char* file, HWND hProgressDialog)
goto out; goto out;
} else { } else {
r = TRUE; r = TRUE;
uprintf("Successfully downloaded '%s'\n", file); uprintf("Successfully downloaded '%s'\n", &file[last_slash]);
} }
out: out:
@ -372,7 +380,7 @@ out:
if (hConnection) InternetCloseHandle(hConnection); if (hConnection) InternetCloseHandle(hConnection);
if (hSession) InternetCloseHandle(hSession); if (hSession) InternetCloseHandle(hSession);
return r; return r?dwSize:0;
} }
/* Threaded download */ /* Threaded download */
@ -380,7 +388,7 @@ static const char *_url, *_file;
static HWND _hProgressDialog; static HWND _hProgressDialog;
static DWORD WINAPI _DownloadFileThread(LPVOID param) static DWORD WINAPI _DownloadFileThread(LPVOID param)
{ {
ExitThread(DownloadFile(_url, _file, _hProgressDialog)); ExitThread(DownloadFile(_url, _file, _hProgressDialog) != 0);
} }
HANDLE DownloadFileThreaded(const char* url, const char* file, HWND hProgressDialog) HANDLE DownloadFileThreaded(const char* url, const char* file, HWND hProgressDialog)

View file

@ -141,7 +141,8 @@ BOOL use_own_c32[NB_OLD_C32] = {FALSE, FALSE}, detect_fakes = TRUE, mbr_selected
BOOL iso_op_in_progress = FALSE, format_op_in_progress = FALSE; BOOL iso_op_in_progress = FALSE, format_op_in_progress = FALSE;
BOOL enable_HDDs = FALSE, advanced_mode = TRUE, force_update = FALSE; BOOL enable_HDDs = FALSE, advanced_mode = TRUE, force_update = FALSE;
int dialog_showing = 0; int dialog_showing = 0;
uint16_t rufus_version[4]; uint16_t rufus_version[4], embedded_sl_version[2];
char embedded_sl_version_str[2][12] = { "v?.??", "v?.??" };
RUFUS_UPDATE update = { {0,0,0,0}, {0,0}, NULL, NULL}; RUFUS_UPDATE update = { {0,0,0,0}, {0,0}, NULL, NULL};
extern char szStatusMessage[256]; extern char szStatusMessage[256];
@ -445,7 +446,7 @@ static void SetFSFromISO(void)
} }
// Syslinux and EFI have precedence over bootmgr (unless the user selected BIOS as target type) // Syslinux and EFI have precedence over bootmgr (unless the user selected BIOS as target type)
if ((iso_report.has_isolinux) || (IS_REACTOS(iso_report)) || ( (IS_EFI(iso_report)) && (bt == BT_UEFI))) { if ((HAS_SYSLINUX(iso_report)) || (IS_REACTOS(iso_report)) || ( (IS_EFI(iso_report)) && (bt == BT_UEFI))) {
if (fs_mask & (1<<FS_FAT32)) { if (fs_mask & (1<<FS_FAT32)) {
selected_fs = FS_FAT32; selected_fs = FS_FAT32;
} else if (fs_mask & (1<<FS_FAT16)) { } else if (fs_mask & (1<<FS_FAT16)) {
@ -531,7 +532,7 @@ static void SetTargetSystem(void)
if (SelectedDrive.PartitionType == PARTITION_STYLE_GPT) { if (SelectedDrive.PartitionType == PARTITION_STYLE_GPT) {
ts = 2; // GPT/UEFI ts = 2; // GPT/UEFI
} else if (SelectedDrive.has_protective_mbr || SelectedDrive.has_mbr_uefi_marker || (IS_EFI(iso_report) && } else if (SelectedDrive.has_protective_mbr || SelectedDrive.has_mbr_uefi_marker || (IS_EFI(iso_report) &&
(!iso_report.has_isolinux) && (!iso_report.has_bootmgr) && (!IS_WINPE(iso_report.winpe))) ) { (!HAS_SYSLINUX(iso_report)) && (!iso_report.has_bootmgr) && (!IS_WINPE(iso_report.winpe))) ) {
ts = 1; // MBR/UEFI ts = 1; // MBR/UEFI
} else { } else {
ts = 0; // MBR/BIOS|UEFI ts = 0; // MBR/BIOS|UEFI
@ -1171,6 +1172,7 @@ DWORD WINAPI ISOScanThread(LPVOID param)
FILE* fd; FILE* fd;
const char* old_c32_name[NB_OLD_C32] = OLD_C32_NAMES; const char* old_c32_name[NB_OLD_C32] = OLD_C32_NAMES;
const char* new_c32_url[NB_OLD_C32] = NEW_C32_URL; const char* new_c32_url[NB_OLD_C32] = NEW_C32_URL;
char isolinux_str[16] = "No";
if (iso_path == NULL) if (iso_path == NULL)
goto out; goto out;
@ -1185,41 +1187,45 @@ DWORD WINAPI ISOScanThread(LPVOID param)
safe_free(iso_path); safe_free(iso_path);
goto out; goto out;
} }
if (HAS_SYSLINUX(iso_report)) {
safe_sprintf(isolinux_str, sizeof(isolinux_str), "Yes (%s)", iso_report.sl_version_str);
}
uprintf("ISO label: '%s'\r\n Size: %lld bytes\r\n Has a >64 chars filename: %s\r\n Has a >4GB file: %s\r\n" uprintf("ISO label: '%s'\r\n Size: %lld bytes\r\n Has a >64 chars filename: %s\r\n Has a >4GB file: %s\r\n"
" ReactOS: %s\r\n Uses EFI: %s%s\r\n Uses Bootmgr: %s\r\n Uses WinPE: %s%s\r\n Uses isolinux: %s %s\r\n", " ReactOS: %s\r\n Uses EFI: %s%s\r\n Uses Bootmgr: %s\r\n Uses WinPE: %s%s\r\n Uses isolinux: %s\r\n",
iso_report.label, iso_report.projected_size, iso_report.has_long_filename?"Yes":"No", iso_report.has_4GB_file?"Yes":"No", iso_report.label, iso_report.projected_size, iso_report.has_long_filename?"Yes":"No", iso_report.has_4GB_file?"Yes":"No",
IS_REACTOS(iso_report)?"Yes":"No", (iso_report.has_efi || iso_report.has_win7_efi)?"Yes":"No", IS_REACTOS(iso_report)?"Yes":"No", (iso_report.has_efi || iso_report.has_win7_efi)?"Yes":"No",
(iso_report.has_win7_efi && (!iso_report.has_efi))?" (win7_x64)":"", iso_report.has_bootmgr?"Yes":"No", (iso_report.has_win7_efi && (!iso_report.has_efi))?" (win7_x64)":"", iso_report.has_bootmgr?"Yes":"No",
IS_WINPE(iso_report.winpe)?"Yes":"No", (iso_report.uses_minint)?" (with /minint)":"", iso_report.has_isolinux?"Yes":"No", IS_WINPE(iso_report.winpe)?"Yes":"No", (iso_report.uses_minint)?" (with /minint)":"", isolinux_str);
iso_report.has_syslinux_v5?"(v5.0 or later)":iso_report.has_isolinux?"(v4.x or earlier)":""); if (HAS_SYSLINUX(iso_report) && (SL_MAJOR(iso_report.sl_version) < 5)) {
if (iso_report.has_isolinux && !iso_report.has_syslinux_v5) {
for (i=0; i<NB_OLD_C32; i++) { for (i=0; i<NB_OLD_C32; i++) {
uprintf(" With an old %s: %s\n", old_c32_name[i], iso_report.has_old_c32[i]?"Yes":"No"); uprintf(" With an old %s: %s\n", old_c32_name[i], iso_report.has_old_c32[i]?"Yes":"No");
} }
} }
if ( (!iso_report.has_bootmgr) && (!iso_report.has_isolinux) && (!IS_WINPE(iso_report.winpe)) if ( (!iso_report.has_bootmgr) && (!HAS_SYSLINUX(iso_report)) && (!IS_WINPE(iso_report.winpe))
&& (!iso_report.has_efi) && (!IS_REACTOS(iso_report)) ) { && (!iso_report.has_efi) && (!IS_REACTOS(iso_report)) ) {
MessageBoxU(hMainDialog, lmprintf(MSG_082), lmprintf(MSG_081), MB_OK|MB_ICONINFORMATION); MessageBoxU(hMainDialog, lmprintf(MSG_082), lmprintf(MSG_081), MB_OK|MB_ICONINFORMATION);
safe_free(iso_path); safe_free(iso_path);
SetMBRProps(); SetMBRProps();
} else if (!iso_report.has_syslinux_v5) { // This check is for Syslinux v4.x or earlier } else if (HAS_SYSLINUX(iso_report)) {
_chdirU(app_dir); if (SL_MAJOR(iso_report.sl_version) < 5) {
for (i=0; i<NB_OLD_C32; i++) { _chdirU(app_dir);
if (iso_report.has_old_c32[i]) { for (i=0; i<NB_OLD_C32; i++) {
fd = fopen(old_c32_name[i], "rb"); if (iso_report.has_old_c32[i]) {
if (fd != NULL) { fd = fopen(old_c32_name[i], "rb");
// If a file already exists in the current directory, use that one if (fd != NULL) {
uprintf("Will replace obsolete '%s' from ISO with the one found in current directory\n", old_c32_name[i]); // If a file already exists in the current directory, use that one
fclose(fd); uprintf("Will replace obsolete '%s' from ISO with the one found in current directory\n", old_c32_name[i]);
use_own_c32[i] = TRUE; fclose(fd);
} else { use_own_c32[i] = TRUE;
PrintStatus(0, FALSE, MSG_204, old_c32_name[i]); } else {
if (MessageBoxU(hMainDialog, lmprintf(MSG_084, old_c32_name[i], old_c32_name[i]), PrintStatus(0, FALSE, MSG_204, old_c32_name[i]);
lmprintf(MSG_083, old_c32_name[i]), MB_YESNO|MB_ICONWARNING) == IDYES) { if (MessageBoxU(hMainDialog, lmprintf(MSG_084, old_c32_name[i], old_c32_name[i]),
SetWindowTextU(hISOProgressDlg, lmprintf(MSG_085, old_c32_name[i])); lmprintf(MSG_083, old_c32_name[i]), MB_YESNO|MB_ICONWARNING) == IDYES) {
SetWindowTextU(hISOFileName, new_c32_url[i]); SetWindowTextU(hISOProgressDlg, lmprintf(MSG_085, old_c32_name[i]));
if (DownloadFile(new_c32_url[i], old_c32_name[i], hISOProgressDlg)) SetWindowTextU(hISOFileName, new_c32_url[i]);
use_own_c32[i] = TRUE; if (DownloadFile(new_c32_url[i], old_c32_name[i], hISOProgressDlg))
use_own_c32[i] = TRUE;
}
} }
} }
} }
@ -1319,10 +1325,14 @@ void ToggleAdvanced(void)
static BOOL BootCheck(void) static BOOL BootCheck(void)
{ {
int fs, bt, dt, r; int i, fs, bt, dt, r;
FILE* fd; FILE* fd;
const char* ldlinux_name = "ldlinux.c32"; const char* ldlinux = "ldlinux";
const char* syslinux = "syslinux";
const char* ldlinux_ext[3] = { "sys", "bss", "c32" };
char tmp[MAX_PATH];
syslinux_ldlinux_len[0] = 0; syslinux_ldlinux_len[1] = 0;
dt = (int)ComboBox_GetItemData(hBootType, ComboBox_GetCurSel(hBootType)); dt = (int)ComboBox_GetItemData(hBootType, ComboBox_GetCurSel(hBootType));
if (dt == DT_ISO) { if (dt == DT_ISO) {
if (iso_path == NULL) { if (iso_path == NULL) {
@ -1350,7 +1360,7 @@ static BOOL BootCheck(void)
return FALSE; return FALSE;
} }
} else if ((fs == FS_NTFS) && (!iso_report.has_bootmgr) && (!IS_WINPE(iso_report.winpe))) { } else if ((fs == FS_NTFS) && (!iso_report.has_bootmgr) && (!IS_WINPE(iso_report.winpe))) {
if (iso_report.has_isolinux) { if (HAS_SYSLINUX(iso_report)) {
// Only FAT/FAT32 is supported for this type of ISO // Only FAT/FAT32 is supported for this type of ISO
MessageBoxU(hMainDialog, lmprintf(MSG_096), lmprintf(MSG_092), MB_OK|MB_ICONERROR); MessageBoxU(hMainDialog, lmprintf(MSG_096), lmprintf(MSG_092), MB_OK|MB_ICONERROR);
} else { } else {
@ -1358,7 +1368,7 @@ static BOOL BootCheck(void)
MessageBoxU(hMainDialog, lmprintf(MSG_097), lmprintf(MSG_090), MB_OK|MB_ICONERROR); MessageBoxU(hMainDialog, lmprintf(MSG_097), lmprintf(MSG_090), MB_OK|MB_ICONERROR);
} }
return FALSE; return FALSE;
} else if (((fs == FS_FAT16)||(fs == FS_FAT32)) && (!iso_report.has_isolinux) && (!IS_REACTOS(iso_report))) { } else if (((fs == FS_FAT16)||(fs == FS_FAT32)) && (!HAS_SYSLINUX(iso_report)) && (!IS_REACTOS(iso_report))) {
// FAT/FAT32 can only be used for isolinux based ISO images or when the Target Type is UEFI // FAT/FAT32 can only be used for isolinux based ISO images or when the Target Type is UEFI
MessageBoxU(hMainDialog, lmprintf(MSG_098), lmprintf(MSG_090), MB_OK|MB_ICONERROR); MessageBoxU(hMainDialog, lmprintf(MSG_098), lmprintf(MSG_090), MB_OK|MB_ICONERROR);
return FALSE; return FALSE;
@ -1368,23 +1378,68 @@ static BOOL BootCheck(void)
MessageBoxU(hMainDialog, lmprintf(MSG_100), lmprintf(MSG_099), MB_OK|MB_ICONERROR); MessageBoxU(hMainDialog, lmprintf(MSG_100), lmprintf(MSG_099), MB_OK|MB_ICONERROR);
return FALSE; return FALSE;
} }
if ((SL_MAJOR(iso_report.sl_version) >= 5) && (iso_report.sl_version != embedded_sl_version[1])) {
// Unlike what was the case for v4 and earlier, Syslinux v5+ versions are INCOMPATIBLE with one another!
_chdirU(app_dir);
_mkdir(FILES_DIR);
_chdir(FILES_DIR);
for (i=0; i<2; i++) {
// Check if we already have the relevant ldlinux_v#.##.sys & ldlinux_v#.##.bss files
static_sprintf(tmp, "%s-%s/%s.%s", syslinux, &iso_report.sl_version_str[1], ldlinux, ldlinux_ext[i]);
fd = fopen(tmp, "rb");
if (fd != NULL) {
fseek(fd, 0, SEEK_END);
syslinux_ldlinux_len[i] = (DWORD)ftell(fd);
fclose(fd);
}
}
if ((syslinux_ldlinux_len[0] != 0) && (syslinux_ldlinux_len[1] != 0)) {
uprintf("Will reuse '%s.%s' and '%s.%s' from './%s/%s-%s/' for Syslinux installation\n",
ldlinux, ldlinux_ext[0], ldlinux, ldlinux_ext[1], FILES_DIR, syslinux, &iso_report.sl_version_str[1]);
} else {
r = MessageBoxU(hMainDialog, lmprintf(MSG_114, iso_report.sl_version_str, embedded_sl_version_str[1]),
lmprintf(MSG_115), MB_YESNO|MB_ICONWARNING);
if (r != IDYES)
return FALSE;
for (i=0; i<2; i++) {
static_sprintf(tmp, "%s-%s", syslinux, &iso_report.sl_version_str[1]);
_mkdir(tmp);
static_sprintf(tmp, "%s.%s %s", ldlinux, ldlinux_ext[i], iso_report.sl_version_str);
SetWindowTextU(hISOProgressDlg, lmprintf(MSG_085, tmp));
static_sprintf(tmp, "%s/%s-%s/%s.%s", FILES_URL, syslinux, &iso_report.sl_version_str[1], ldlinux, ldlinux_ext[i]);
SetWindowTextU(hISOFileName, tmp);
syslinux_ldlinux_len[i] = DownloadFile(tmp, &tmp[sizeof(FILES_URL)], hISOProgressDlg);
if (syslinux_ldlinux_len[i] == 0) {
uprintf("Couldn't download the files - cancelling\n");
return FALSE;
}
}
}
}
} else if (dt == DT_SYSLINUX_V5) { } else if (dt == DT_SYSLINUX_V5) {
_chdirU(app_dir); _chdirU(app_dir);
fd = fopen(ldlinux_name, "rb"); _mkdir(FILES_DIR);
_chdir(FILES_DIR);
static_sprintf(tmp, "%s-%s/%s.%s", syslinux, &embedded_sl_version_str[1][1], ldlinux, ldlinux_ext[2]);
fd = fopenU(tmp, "rb");
if (fd != NULL) { if (fd != NULL) {
uprintf("Will reuse '%s' for Syslinux v5\n", ldlinux_name); uprintf("Will reuse './%s/%s' for Syslinux installation\n", FILES_DIR, tmp);
fclose(fd); fclose(fd);
} else { } else {
PrintStatus(0, FALSE, MSG_206, ldlinux_name); static_sprintf(tmp, "%s.%s", ldlinux, ldlinux_ext[2]);
// Syslinux v5.0 or later requires a '%s' file to be installed PrintStatus(0, FALSE, MSG_206, tmp);
r = MessageBoxU(hMainDialog, lmprintf(MSG_104, ldlinux_name, ldlinux_name), // MSG_104: "Syslinux v5.0 or later requires a '%s' file to be installed"
lmprintf(MSG_103, ldlinux_name), MB_YESNOCANCEL|MB_ICONWARNING); r = MessageBoxU(hMainDialog, lmprintf(MSG_104, tmp, tmp),
lmprintf(MSG_103, tmp), MB_YESNOCANCEL|MB_ICONWARNING);
if (r == IDCANCEL) if (r == IDCANCEL)
return FALSE; return FALSE;
if (r == IDYES) { if (r == IDYES) {
SetWindowTextU(hISOProgressDlg, lmprintf(MSG_085, ldlinux_name)); static_sprintf(tmp, "%s-%s", syslinux, &embedded_sl_version_str[1][1]);
SetWindowTextU(hISOFileName, LDLINUX_C32_URL); _mkdir(tmp);
DownloadFile(LDLINUX_C32_URL, ldlinux_name, hISOProgressDlg); static_sprintf(tmp, "%s/%s-%s/%s.%s", FILES_URL, syslinux, &embedded_sl_version_str[1][1], ldlinux, ldlinux_ext[2]);
SetWindowTextU(hISOProgressDlg, lmprintf(MSG_085, tmp));
SetWindowTextU(hISOFileName, tmp);
DownloadFile(tmp, &tmp[sizeof(FILES_URL)], hISOProgressDlg);
} }
} }
} else if (dt == DT_WINME) { } else if (dt == DT_WINME) {
@ -1401,9 +1456,11 @@ static BOOL BootCheck(void)
void InitDialog(HWND hDlg) void InitDialog(HWND hDlg)
{ {
HINSTANCE hDllInst; HINSTANCE hDllInst;
DWORD len;
HDC hDC; HDC hDC;
int i, i16, s16; int i, i16, s16;
char tmp[128], *token; char tmp[128], *token, *buf;
static char* resource[2] = { MAKEINTRESOURCEA(IDR_SL_LDLINUX_V4_SYS), MAKEINTRESOURCEA(IDR_SL_LDLINUX_V5_SYS) };
#ifdef RUFUS_TEST #ifdef RUFUS_TEST
ShowWindow(GetDlgItem(hDlg, IDC_TEST), SW_SHOW); ShowWindow(GetDlgItem(hDlg, IDC_TEST), SW_SHOW);
@ -1449,6 +1506,16 @@ void InitDialog(HWND hDlg)
rufus_version[i] = (uint16_t)atoi(token); rufus_version[i] = (uint16_t)atoi(token);
uprintf(APPLICATION_NAME " version %d.%d.%d.%d\n", rufus_version[0], rufus_version[1], rufus_version[2], rufus_version[3]); uprintf(APPLICATION_NAME " version %d.%d.%d.%d\n", rufus_version[0], rufus_version[1], rufus_version[2], rufus_version[3]);
uprintf("Windows version: %s\n", WindowsVersionStr); uprintf("Windows version: %s\n", WindowsVersionStr);
for (i=0; i<ARRAYSIZE(resource); i++) {
buf = (char*)GetResource(hMainInstance, resource[i], _RT_RCDATA, "ldlinux_sys", &len, FALSE);
if ((buf == NULL) || (len < 16)) {
uprintf("Warning: could not read embedded Syslinux v%d version", i+4);
} else {
embedded_sl_version[i] = (((uint8_t)strtoul(&buf[0xb], &token, 10))<<8) + (uint8_t)strtoul(&token[1], NULL, 10);
static_sprintf(embedded_sl_version_str[i], "v%d.%02d", SL_MAJOR(embedded_sl_version[i]), SL_MINOR(embedded_sl_version[i]));
}
}
uprintf("Syslinux version: %s, %s", embedded_sl_version_str[0], embedded_sl_version_str[1]);
uprintf("LCID: 0x%04X\n", GetUserDefaultUILanguage()); uprintf("LCID: 0x%04X\n", GetUserDefaultUILanguage());
SetClusterSizeLabels(); SetClusterSizeLabels();

View file

@ -59,7 +59,10 @@
#define WHITE RGB(255,255,255) #define WHITE RGB(255,255,255)
#define SEPARATOR_GREY RGB(223,223,223) #define SEPARATOR_GREY RGB(223,223,223)
#define RUFUS_URL "http://rufus.akeo.ie" #define RUFUS_URL "http://rufus.akeo.ie"
#define DOWNLOAD_URL RUFUS_URL "/downloads"
#define FILES_URL RUFUS_URL "/files"
#define SEVENZIP_URL "http://sourceforge.net/projects/sevenzip/files/7-Zip/" #define SEVENZIP_URL "http://sourceforge.net/projects/sevenzip/files/7-Zip/"
#define FILES_DIR "rufus_files"
#define IGNORE_RETVAL(expr) do { (void)(expr); } while(0) #define IGNORE_RETVAL(expr) do { (void)(expr); } while(0)
#ifndef ARRAYSIZE #ifndef ARRAYSIZE
#define ARRAYSIZE(A) (sizeof(A)/sizeof((A)[0])) #define ARRAYSIZE(A) (sizeof(A)/sizeof((A)[0]))
@ -80,6 +83,7 @@
#define safe_closehandle(h) do {if ((h != INVALID_HANDLE_VALUE) && (h != NULL)) {CloseHandle(h); h = INVALID_HANDLE_VALUE;}} while(0) #define safe_closehandle(h) do {if ((h != INVALID_HANDLE_VALUE) && (h != NULL)) {CloseHandle(h); h = INVALID_HANDLE_VALUE;}} while(0)
#define safe_unlockclose(h) do {if ((h != INVALID_HANDLE_VALUE) && (h != NULL)) {UnlockDrive(h); CloseHandle(h); h = INVALID_HANDLE_VALUE;}} while(0) #define safe_unlockclose(h) do {if ((h != INVALID_HANDLE_VALUE) && (h != NULL)) {UnlockDrive(h); CloseHandle(h); h = INVALID_HANDLE_VALUE;}} while(0)
#define safe_sprintf(dst, count, ...) do {_snprintf(dst, count, __VA_ARGS__); (dst)[(count)-1] = 0; } while(0) #define safe_sprintf(dst, count, ...) do {_snprintf(dst, count, __VA_ARGS__); (dst)[(count)-1] = 0; } while(0)
#define static_sprintf(dst, ...) safe_sprintf(dst, sizeof(dst), __VA_ARGS__)
#define safe_strlen(str) ((((char*)str)==NULL)?0:strlen(str)) #define safe_strlen(str) ((((char*)str)==NULL)?0:strlen(str))
#define safe_strdup _strdup #define safe_strdup _strdup
#if defined(_MSC_VER) #if defined(_MSC_VER)
@ -203,14 +207,14 @@ typedef struct {
/* Special handling for old .c32 files we need to replace */ /* Special handling for old .c32 files we need to replace */
#define NB_OLD_C32 2 #define NB_OLD_C32 2
#define OLD_C32_NAMES {"menu.c32", "vesamenu.c32"} #define OLD_C32_NAMES { "menu.c32", "vesamenu.c32" }
#define OLD_C32_THRESHOLD {53500, 148000} #define OLD_C32_THRESHOLD { 53500, 148000 }
#define NEW_C32_URL {RUFUS_URL "/downloads/menu.c32", RUFUS_URL "/downloads/vesamenu.c32"} #define NEW_C32_URL { DOWNLOAD_URL "/menu.c32", DOWNLOAD_URL "/vesamenu.c32" }
#define LDLINUX_C32_URL RUFUS_URL "/downloads/ldlinux.c32"
/* ISO details that the application may want */ /* ISO details that the application may want */
#define WINPE_MININT 0x2A #define WINPE_MININT 0x2A
#define WINPE_I386 0x15 #define WINPE_I386 0x15
#define HAS_SYSLINUX(r) (r.sl_version != 0)
#define IS_WINPE(r) (((r&WINPE_MININT) == WINPE_MININT)||((r&WINPE_I386) == WINPE_I386)) #define IS_WINPE(r) (((r&WINPE_MININT) == WINPE_MININT)||((r&WINPE_I386) == WINPE_I386))
#define IS_EFI(r) ((r.has_efi) || (r.has_win7_efi)) #define IS_EFI(r) ((r.has_efi) || (r.has_win7_efi))
#define IS_REACTOS(r) (r.reactos_path[0] != 0) #define IS_REACTOS(r) (r.reactos_path[0] != 0)
@ -228,14 +232,18 @@ typedef struct {
BOOL has_bootmgr; BOOL has_bootmgr;
BOOL has_efi; BOOL has_efi;
BOOL has_win7_efi; BOOL has_win7_efi;
BOOL has_isolinux;
BOOL has_autorun; BOOL has_autorun;
BOOL has_old_c32[NB_OLD_C32]; BOOL has_old_c32[NB_OLD_C32];
BOOL has_old_vesamenu; BOOL has_old_vesamenu;
BOOL has_syslinux_v5;
BOOL uses_minint; BOOL uses_minint;
uint16_t sl_version; // Syslinux/Isolinux version
char sl_version_str[12];
} RUFUS_ISO_REPORT; } RUFUS_ISO_REPORT;
/* Isolate the Syslinux version numbers */
#define SL_MAJOR(x) ((uint8_t)((x)>>8))
#define SL_MINOR(x) ((uint8_t)(x))
typedef struct { typedef struct {
uint16_t version[4]; uint16_t version[4];
uint32_t platform_min[2]; // minimum platform version required uint32_t platform_min[2]; // minimum platform version required
@ -277,14 +285,16 @@ extern float fScale;
extern char szFolderPath[MAX_PATH], app_dir[MAX_PATH]; extern char szFolderPath[MAX_PATH], app_dir[MAX_PATH];
extern char* iso_path; extern char* iso_path;
extern DWORD FormatStatus; extern DWORD FormatStatus;
extern DWORD syslinux_ldlinux_len[2];
extern RUFUS_DRIVE_INFO SelectedDrive; extern RUFUS_DRIVE_INFO SelectedDrive;
extern const int nb_steps[FS_MAX]; extern const int nb_steps[FS_MAX];
extern BOOL use_own_c32[NB_OLD_C32], detect_fakes, iso_op_in_progress, format_op_in_progress; extern BOOL use_own_c32[NB_OLD_C32], detect_fakes, iso_op_in_progress, format_op_in_progress;
extern RUFUS_ISO_REPORT iso_report; extern RUFUS_ISO_REPORT iso_report;
extern int64_t iso_blocking_status; extern int64_t iso_blocking_status;
extern uint16_t rufus_version[4]; extern uint16_t rufus_version[4], embedded_sl_version[2];
extern int nWindowsVersion; extern int nWindowsVersion;
extern char WindowsVersionStr[128]; extern char WindowsVersionStr[128];
extern char embedded_sl_version_str[2][12];
extern RUFUS_UPDATE update; extern RUFUS_UPDATE update;
extern int dialog_showing; extern int dialog_showing;
@ -316,7 +326,7 @@ extern BOOL Notification(int type, const notification_info* more_info, char* tit
extern BOOL Question(char* title, char* format, ...); extern BOOL Question(char* title, char* format, ...);
extern BOOL ExtractDOS(const char* path); extern BOOL ExtractDOS(const char* path);
extern BOOL ExtractISO(const char* src_iso, const char* dest_dir, BOOL scan); extern BOOL ExtractISO(const char* src_iso, const char* dest_dir, BOOL scan);
extern BOOL ExtractISOFile(const char* iso, const char* iso_file, const char* dest_file); extern int64_t ExtractISOFile(const char* iso, const char* iso_file, const char* dest_file);
extern BOOL InstallSyslinux(DWORD drive_index, char drive_letter); extern BOOL InstallSyslinux(DWORD drive_index, char drive_letter);
DWORD WINAPI FormatThread(void* param); DWORD WINAPI FormatThread(void* param);
extern BOOL CreateProgress(void); extern BOOL CreateProgress(void);
@ -326,7 +336,7 @@ extern BOOL FileIO(BOOL save, char* path, char** buffer, DWORD* size);
extern unsigned char* GetResource(HMODULE module, char* name, char* type, const char* desc, DWORD* len, BOOL duplicate); extern unsigned char* GetResource(HMODULE module, char* name, char* type, const char* desc, DWORD* len, BOOL duplicate);
extern BOOL SetLGP(BOOL bRestore, BOOL* bExistingKey, const char* szPath, const char* szPolicy, DWORD dwValue); extern BOOL SetLGP(BOOL bRestore, BOOL* bExistingKey, const char* szPath, const char* szPolicy, DWORD dwValue);
extern LONG GetEntryWidth(HWND hDropDown, const char* entry); extern LONG GetEntryWidth(HWND hDropDown, const char* entry);
extern BOOL DownloadFile(const char* url, const char* file, HWND hProgressDialog); extern DWORD DownloadFile(const char* url, const char* file, HWND hProgressDialog);
extern HANDLE DownloadFileThreaded(const char* url, const char* file, HWND hProgressDialog); extern HANDLE DownloadFileThreaded(const char* url, const char* file, HWND hProgressDialog);
extern INT_PTR CALLBACK UpdateCallback(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam); extern INT_PTR CALLBACK UpdateCallback(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
extern BOOL SetUpdateCheck(void); extern BOOL SetUpdateCheck(void);
@ -358,6 +368,7 @@ static __inline void *_reallocf(void *ptr, size_t size)
/* Basic String Array */ /* Basic String Array */
typedef struct { typedef struct {
// TODO: rename 'Table' to 'String'
char** Table; char** Table;
size_t Index; // Current array size size_t Index; // Current array size
size_t Max; // Maximum array size size_t Max; // Maximum array size
@ -366,6 +377,7 @@ extern void StrArrayCreate(StrArray* arr, size_t initial_size);
extern void StrArrayAdd(StrArray* arr, const char* str); extern void StrArrayAdd(StrArray* arr, const char* str);
extern void StrArrayClear(StrArray* arr); extern void StrArrayClear(StrArray* arr);
extern void StrArrayDestroy(StrArray* arr); extern void StrArrayDestroy(StrArray* arr);
#define IsStrArrayEmpty(arr) (arr.Index == 0)
/* /*
* typedefs for the function prototypes. Use the something like: * typedefs for the function prototypes. Use the something like:
@ -389,7 +401,7 @@ static __inline HMODULE GetDLLHandle(char* szDLLName)
#define PF_INIT(proc, dllname) pf##proc = (proc##_t) GetProcAddress(GetDLLHandle(#dllname), #proc) #define PF_INIT(proc, dllname) pf##proc = (proc##_t) GetProcAddress(GetDLLHandle(#dllname), #proc)
#define PF_INIT_OR_OUT(proc, dllname) \ #define PF_INIT_OR_OUT(proc, dllname) \
PF_INIT(proc, dllname); if (pf##proc == NULL) { \ PF_INIT(proc, dllname); if (pf##proc == NULL) { \
uprintf("Unable to access %s DLL: %s\n", #dllname, \ uprintf("Unable to locate %s() in %s.dll: %s\n", #proc, #dllname, \
WindowsErrorString()); goto out; } WindowsErrorString()); goto out; }
/* Clang/MinGW32 has an issue with intptr_t */ /* Clang/MinGW32 has an issue with intptr_t */

View file

@ -33,7 +33,7 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
IDD_DIALOG DIALOGEX 12, 12, 206, 329 IDD_DIALOG DIALOGEX 12, 12, 206, 329
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
EXSTYLE WS_EX_APPWINDOW EXSTYLE WS_EX_APPWINDOW
CAPTION "Rufus v1.4.3.385" CAPTION "Rufus v1.4.3.386"
FONT 8, "MS Shell Dlg", 400, 0, 0x1 FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN BEGIN
DEFPUSHBUTTON "Start",IDC_START,94,291,50,14 DEFPUSHBUTTON "Start",IDC_START,94,291,50,14
@ -288,8 +288,8 @@ END
// //
VS_VERSION_INFO VERSIONINFO VS_VERSION_INFO VERSIONINFO
FILEVERSION 1,4,3,385 FILEVERSION 1,4,3,386
PRODUCTVERSION 1,4,3,385 PRODUCTVERSION 1,4,3,386
FILEFLAGSMASK 0x3fL FILEFLAGSMASK 0x3fL
#ifdef _DEBUG #ifdef _DEBUG
FILEFLAGS 0x1L FILEFLAGS 0x1L
@ -306,13 +306,13 @@ BEGIN
BEGIN BEGIN
VALUE "CompanyName", "Akeo Consulting (http://akeo.ie)" VALUE "CompanyName", "Akeo Consulting (http://akeo.ie)"
VALUE "FileDescription", "Rufus" VALUE "FileDescription", "Rufus"
VALUE "FileVersion", "1.4.3.385" VALUE "FileVersion", "1.4.3.386"
VALUE "InternalName", "Rufus" VALUE "InternalName", "Rufus"
VALUE "LegalCopyright", "© 2011-2014 Pete Batard (GPL v3)" VALUE "LegalCopyright", "© 2011-2014 Pete Batard (GPL v3)"
VALUE "LegalTrademarks", "http://www.gnu.org/copyleft/gpl.html" VALUE "LegalTrademarks", "http://www.gnu.org/copyleft/gpl.html"
VALUE "OriginalFilename", "rufus.exe" VALUE "OriginalFilename", "rufus.exe"
VALUE "ProductName", "Rufus" VALUE "ProductName", "Rufus"
VALUE "ProductVersion", "1.4.3.385" VALUE "ProductVersion", "1.4.3.386"
END END
END END
BLOCK "VarFileInfo" BLOCK "VarFileInfo"

View file

@ -30,16 +30,15 @@
#include "drive.h" #include "drive.h"
#include "resource.h" #include "resource.h"
#include "localization.h" #include "localization.h"
#include "msapi_utf8.h"
#include "syslinux.h" #include "syslinux.h"
#include "syslxfs.h" #include "syslxfs.h"
#include "libfat.h" #include "libfat.h"
#include "setadv.h" #include "setadv.h"
unsigned char* syslinux_ldlinux = NULL; unsigned char* syslinux_ldlinux[2] = { NULL, NULL };
DWORD syslinux_ldlinux_len; DWORD syslinux_ldlinux_len[2];
unsigned char* syslinux_bootsect = NULL;
DWORD syslinux_bootsect_len;
unsigned char* syslinux_mboot = NULL; unsigned char* syslinux_mboot = NULL;
DWORD syslinux_mboot_len; DWORD syslinux_mboot_len;
@ -78,68 +77,90 @@ BOOL InstallSyslinux(DWORD drive_index, char drive_letter)
DWORD bytes_written; DWORD bytes_written;
BOOL r = FALSE; BOOL r = FALSE;
FILE* fd; FILE* fd;
size_t len;
static unsigned char sectbuf[SECTOR_SIZE]; static unsigned char sectbuf[SECTOR_SIZE];
static char* resource[2][2] = { static char* resource[2][2] = {
{ MAKEINTRESOURCEA(IDR_SL_LDLINUX_V4_SYS), MAKEINTRESOURCEA(IDR_SL_LDLINUX_V4_BSS) }, { MAKEINTRESOURCEA(IDR_SL_LDLINUX_V4_SYS), MAKEINTRESOURCEA(IDR_SL_LDLINUX_V4_BSS) },
{ MAKEINTRESOURCEA(IDR_SL_LDLINUX_V5_SYS), MAKEINTRESOURCEA(IDR_SL_LDLINUX_V5_BSS) } }; { MAKEINTRESOURCEA(IDR_SL_LDLINUX_V5_SYS), MAKEINTRESOURCEA(IDR_SL_LDLINUX_V5_BSS) } };
static char ldlinux_path[] = "?:\\ldlinux.sys"; const char* ldlinux = "ldlinux";
static char* ldlinux_sys = &ldlinux_path[3]; const char* syslinux = "syslinux";
const char* ldlinux_c32 = "ldlinux.c32"; const char* ldlinux_ext[3] = { "sys", "bss", "c32" };
const char* mboot_c32 = "mboot.c32"; const char* mboot_c32 = "mboot.c32";
char path[MAX_PATH]; char path[MAX_PATH], tmp[64];
struct libfat_filesystem *fs; struct libfat_filesystem *fs;
libfat_sector_t s, *secp; libfat_sector_t s, *secp;
libfat_sector_t *sectors = NULL; libfat_sector_t *sectors = NULL;
int ldlinux_sectors; int ldlinux_sectors;
uint32_t ldlinux_cluster; uint32_t ldlinux_cluster;
int nsectors; int i, nsectors;
int dt = (int)ComboBox_GetItemData(hBootType, ComboBox_GetCurSel(hBootType)); int dt = (int)ComboBox_GetItemData(hBootType, ComboBox_GetCurSel(hBootType));
BOOL use_v5 = (dt == DT_SYSLINUX_V5) || ((dt == DT_ISO) && (iso_report.has_syslinux_v5)); BOOL use_v5 = (dt == DT_SYSLINUX_V5) || ((dt == DT_ISO) && (SL_MAJOR(iso_report.sl_version) >= 5));
PrintStatus(0, TRUE, MSG_234, use_v5?5:4); PrintStatus(0, TRUE, MSG_234, (dt == DT_ISO)?iso_report.sl_version_str:embedded_sl_version_str[use_v5?1:0]);
ldlinux_path[0] = drive_letter;
/* Initialize the ADV -- this should be smarter */ /* Initialize the ADV -- this should be smarter */
syslinux_reset_adv(syslinux_adv); syslinux_reset_adv(syslinux_adv);
/* Access a copy of the ldlinux.sys & ldlinux.bss resources */ /* Access a copy of the ldlinux.sys & ldlinux.bss resources (downloaded or embedded) */
syslinux_ldlinux = GetResource(hMainInstance, resource[use_v5?1:0][0], if ((syslinux_ldlinux_len[0] != 0) && (syslinux_ldlinux_len[1] != 0)) {
_RT_RCDATA, ldlinux_sys, &syslinux_ldlinux_len, TRUE); _chdirU(app_dir);
syslinux_bootsect = GetResource(hMainInstance, resource[use_v5?1:0][1], for (i=0; i<2; i++) {
_RT_RCDATA, "ldlinux.bss", &syslinux_bootsect_len, TRUE); syslinux_ldlinux[i] = (unsigned char*) malloc(syslinux_ldlinux_len[i]);
if ((syslinux_ldlinux == NULL) || (syslinux_bootsect == NULL)) { if (syslinux_ldlinux[i] == NULL)
goto out; goto out;
static_sprintf(path, "%s/%s-%s/%s.%s", FILES_DIR, syslinux, &iso_report.sl_version_str[1], ldlinux, i==0?"sys":"bss");
fd = fopen(path, "rb");
if (fd == NULL) {
uprintf("Could not open %s\n", path);
goto out;
}
len = fread(syslinux_ldlinux[i], 1, (size_t)syslinux_ldlinux_len[i], fd);
fclose(fd);
if (len != (size_t)syslinux_ldlinux_len[i]) {
uprintf("Could not read %s\n", path);
goto out;
}
uprintf("Using existing './%s'\n", path);
}
} else {
for (i=0; i<2; i++) {
static_sprintf(tmp, "%s.%s", ldlinux, ldlinux_ext[i]);
syslinux_ldlinux[i] = GetResource(hMainInstance, resource[use_v5?1:0][i],
_RT_RCDATA, tmp, &syslinux_ldlinux_len[i], TRUE);
if (syslinux_ldlinux[i] == NULL)
goto out;
}
} }
/* Create ldlinux.sys file */ /* Create ldlinux.sys file */
f_handle = CreateFileA(ldlinux_path, GENERIC_READ | GENERIC_WRITE, static_sprintf(path, "%C:\\%s.%s", drive_letter, ldlinux, ldlinux_ext[0]);
f_handle = CreateFileA(path, GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL, CREATE_ALWAYS, NULL, CREATE_ALWAYS,
FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_SYSTEM |
FILE_ATTRIBUTE_HIDDEN, NULL); FILE_ATTRIBUTE_HIDDEN, NULL);
if (f_handle == INVALID_HANDLE_VALUE) { if (f_handle == INVALID_HANDLE_VALUE) {
uprintf("Unable to create '%s'\n", ldlinux_sys); uprintf("Unable to create '%s'\n", &path[3]);
goto out; goto out;
} }
/* Write ldlinux.sys file */ /* Write ldlinux.sys file */
if (!WriteFile(f_handle, syslinux_ldlinux, syslinux_ldlinux_len, if (!WriteFile(f_handle, syslinux_ldlinux[0], syslinux_ldlinux_len[0],
&bytes_written, NULL) || &bytes_written, NULL) ||
bytes_written != syslinux_ldlinux_len) { bytes_written != syslinux_ldlinux_len[0]) {
uprintf("Could not write '%s'\n", ldlinux_sys); uprintf("Could not write '%s'\n", &path[3]);
goto out; goto out;
} }
if (!WriteFile(f_handle, syslinux_adv, 2 * ADV_SIZE, if (!WriteFile(f_handle, syslinux_adv, 2 * ADV_SIZE,
&bytes_written, NULL) || &bytes_written, NULL) ||
bytes_written != 2 * ADV_SIZE) { bytes_written != 2 * ADV_SIZE) {
uprintf("Could not write ADV to '%s'\n", ldlinux_sys); uprintf("Could not write ADV to '%s'\n", &path[3]);
goto out; goto out;
} }
uprintf("Successfully wrote '%s'\n", ldlinux_sys); uprintf("Successfully wrote '%s'\n", &path[3]);
if (dt != DT_ISO) if (dt != DT_ISO)
UpdateProgress(OP_DOS, -1.0f); UpdateProgress(OP_DOS, -1.0f);
@ -157,7 +178,7 @@ BOOL InstallSyslinux(DWORD drive_index, char drive_letter)
} }
/* Map the file (is there a better way to do this?) */ /* Map the file (is there a better way to do this?) */
ldlinux_sectors = (syslinux_ldlinux_len + 2 * ADV_SIZE + SECTOR_SIZE - 1) >> SECTOR_SHIFT; ldlinux_sectors = (syslinux_ldlinux_len[0] + 2 * ADV_SIZE + SECTOR_SIZE - 1) >> SECTOR_SHIFT;
sectors = (libfat_sector_t*) calloc(ldlinux_sectors, sizeof *sectors); sectors = (libfat_sector_t*) calloc(ldlinux_sectors, sizeof *sectors);
if (sectors == NULL) if (sectors == NULL)
goto out; goto out;
@ -182,10 +203,10 @@ BOOL InstallSyslinux(DWORD drive_index, char drive_letter)
/* Rewrite the file */ /* Rewrite the file */
if (SetFilePointer(f_handle, 0, NULL, FILE_BEGIN) != 0 || if (SetFilePointer(f_handle, 0, NULL, FILE_BEGIN) != 0 ||
!WriteFile(f_handle, syslinux_ldlinux, syslinux_ldlinux_len, !WriteFile(f_handle, syslinux_ldlinux[0], syslinux_ldlinux_len[0],
&bytes_written, NULL) &bytes_written, NULL)
|| bytes_written != syslinux_ldlinux_len) { || bytes_written != syslinux_ldlinux_len[0]) {
uprintf("Could not write '%s': %s\n", ldlinux_sys, WindowsErrorString()); uprintf("Could not write '%s': %s\n", &path[3], WindowsErrorString());
goto out; goto out;
} }
@ -216,16 +237,19 @@ BOOL InstallSyslinux(DWORD drive_index, char drive_letter)
uprintf("Successfully wrote Syslinux boot record\n"); uprintf("Successfully wrote Syslinux boot record\n");
if (dt == DT_SYSLINUX_V5) { if (dt == DT_SYSLINUX_V5) {
fd = fopen(ldlinux_c32, "rb"); _chdirU(app_dir);
static_sprintf(path, "%s/%s-%s", FILES_DIR, syslinux, &embedded_sl_version_str[1][1]);
_chdir(path);
static_sprintf(path, "%C:\\%s.%s", drive_letter, ldlinux, ldlinux_ext[2]);
fd = fopen(&path[3], "rb");
if (fd == NULL) { if (fd == NULL) {
uprintf("Caution: No '%s' was provided. The target will be missing a required Syslinux file!\n", ldlinux_c32); uprintf("Caution: No '%s' was provided. The target will be missing a required Syslinux file!\n", &path[3]);
} else { } else {
fclose(fd); fclose(fd);
ldlinux_path[11] = 'c'; ldlinux_path[12] = '3'; ldlinux_path[13] = '2'; if (CopyFileA(&path[3], path, TRUE)) {
if (CopyFileA(ldlinux_c32, ldlinux_path, TRUE)) { uprintf("Created '%s' (from '%s/%s-%s/%s')", path, FILES_DIR, syslinux, &embedded_sl_version_str[1][1], &path[3]);
uprintf("Created '%s' (from local copy)", ldlinux_path);
} else { } else {
uprintf("Failed to create '%s': %s\n", ldlinux_path, WindowsErrorString()); uprintf("Failed to create '%s': %s\n", path, WindowsErrorString());
} }
} }
} else if (IS_REACTOS(iso_report)) { } else if (IS_REACTOS(iso_report)) {
@ -236,7 +260,7 @@ BOOL InstallSyslinux(DWORD drive_index, char drive_letter)
goto out; goto out;
} }
/* Create mboot.c32 file */ /* Create mboot.c32 file */
safe_sprintf(path, sizeof(path), "%c:\\%s", drive_letter, mboot_c32); static_sprintf(path, "%C:\\%s", drive_letter, mboot_c32);
f_handle = CreateFileA(path, GENERIC_READ | GENERIC_WRITE, f_handle = CreateFileA(path, GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
@ -251,7 +275,7 @@ BOOL InstallSyslinux(DWORD drive_index, char drive_letter)
goto out; goto out;
} }
safe_closehandle(f_handle); safe_closehandle(f_handle);
safe_sprintf(path, sizeof(path), "%c:\\syslinux.cfg", drive_letter); static_sprintf(path, "%C:\\syslinux.cfg", drive_letter);
fd = fopen(path, "w"); fd = fopen(path, "w");
if (fd == NULL) { if (fd == NULL) {
uprintf("Could not create ReactOS 'syslinux.cfg'\n"); uprintf("Could not create ReactOS 'syslinux.cfg'\n");
@ -269,8 +293,8 @@ BOOL InstallSyslinux(DWORD drive_index, char drive_letter)
r = TRUE; r = TRUE;
out: out:
safe_free(syslinux_ldlinux); safe_free(syslinux_ldlinux[0]);
safe_free(syslinux_bootsect); safe_free(syslinux_ldlinux[1]);
safe_free(sectors); safe_free(sectors);
safe_closehandle(d_handle); safe_closehandle(d_handle);
safe_closehandle(f_handle); safe_closehandle(f_handle);

View file

@ -19,18 +19,14 @@
#include "setadv.h" #include "setadv.h"
/* The standard boot sector and ldlinux image */ /* The standard boot sector and ldlinux image */
extern unsigned char* syslinux_bootsect; extern unsigned char* syslinux_ldlinux[2];
extern DWORD syslinux_bootsect_len; extern DWORD syslinux_ldlinux_len[2];
extern const int syslinux_bootsect_mtime; extern const int syslinux_ldlinux_mtime[2];
extern unsigned char* syslinux_ldlinux; #define boot_sector syslinux_ldlinux[1]
extern DWORD syslinux_ldlinux_len; #define boot_sector_len syslinux_ldlinux_len[1]
extern const int syslinux_ldlinux_mtime; #define boot_image syslinux_ldlinux[0]
#define boot_image_len syslinux_ldlinux_len[0]
#define boot_sector syslinux_bootsect
#define boot_sector_len syslinux_bootsect_len
#define boot_image syslinux_ldlinux
#define boot_image_len syslinux_ldlinux_len
extern unsigned char syslinux_mbr[]; extern unsigned char syslinux_mbr[];
extern const unsigned int syslinux_mbr_len; extern const unsigned int syslinux_mbr_len;