From 6ca024ae3bd5c932f4b4a3b856e0886030096959 Mon Sep 17 00:00:00 2001 From: Pete Batard Date: Tue, 11 Nov 2014 19:53:39 +0000 Subject: [PATCH] [syslinux] update Syslinux to v6.03 * Also add experimental support for Syslinux/NTFS * Closes #391 --- res/localization/rufus.loc | 58 +-- res/syslinux/ldlinux_v5.sys | Bin 56657 -> 0 bytes .../{ldlinux_v5.bss => ldlinux_v6.bss} | Bin 512 -> 512 bytes res/syslinux/ldlinux_v6.sys | Bin 0 -> 68599 bytes res/syslinux/readme.txt | 2 +- src/format.c | 2 +- src/resource.h | 4 +- src/rufus.c | 11 +- src/rufus.h | 2 +- src/rufus.rc | 20 +- src/syslinux.c | 51 ++- .../libinstaller/.msvc/libinstaller.vcxproj | 2 + .../.msvc/libinstaller.vcxproj.filters | 6 + .../libinstaller/.msvc/libinstaller_sources | 1 + src/syslinux/libinstaller/Makefile.am | 2 +- src/syslinux/libinstaller/Makefile.in | 11 +- src/syslinux/libinstaller/fs.c | 2 + src/syslinux/libinstaller/ntfssect.c | 359 ++++++++++++++++++ src/syslinux/libinstaller/ntfssect.h | 152 ++++++++ src/syslinux/libinstaller/syslinux.h | 8 + src/syslinux/libinstaller/syslxfs.h | 7 +- src/syslinux/libinstaller/syslxint.h | 143 ++++--- src/syslinux/libinstaller/syslxmod.c | 44 ++- 23 files changed, 747 insertions(+), 140 deletions(-) delete mode 100644 res/syslinux/ldlinux_v5.sys rename res/syslinux/{ldlinux_v5.bss => ldlinux_v6.bss} (82%) create mode 100644 res/syslinux/ldlinux_v6.sys create mode 100644 src/syslinux/libinstaller/ntfssect.c create mode 100644 src/syslinux/libinstaller/ntfssect.h diff --git a/res/localization/rufus.loc b/res/localization/rufus.loc index 39b314c3..434247f9 100644 --- a/res/localization/rufus.loc +++ b/res/localization/rufus.loc @@ -294,7 +294,7 @@ t MSG_112 "Formatting a large UDF volumes can take a lot of time. At USB 2.0 spe "duration is %d:%02d, during which the progress bar will appear frozen. Please be patient!" t MSG_113 "Large UDF volume" t MSG_114 "This image uses Syslinux %s%s but this application only includes the installation files for " - "Syslinux %s.\n\nAs new versions of Syslinux are not compatible with one another, and it wouldn't " + "Syslinux %s%s.\n\nAs new versions of Syslinux are not compatible with one another, and it wouldn't " "be possible for Rufus to include them all, two additional files must be downloaded from the " "Internet ('ldlinux.sys' and 'ldlinux.bss'):\n" "- Select 'Yes' to connect to the Internet and download these files\n" @@ -686,7 +686,7 @@ t MSG_112 "فرمتة وحدات تخزين UDF كبيرة تستغرق وقتا "للفرمتة هي: %d:%02d, خلالها شريط التقدّم سيظهر مجمّد. يرجى التحلّي بالصبر!" t MSG_113 "وحدة تخزين UDF كبيرة" t MSG_114 "هذه الصورة (الإيميج) تستخدم Syslinux %s%s ولكن هذا التطبيق يشمل فقط ملفات التثبيت لـ " - "Syslinux %s. \n\nفالإصدارات الجديدة من Syslinux لا تتلاءم مع بعضها البعض, وأنه " + "Syslinux %s%s. \n\nفالإصدارات الجديدة من Syslinux لا تتلاءم مع بعضها البعض, وأنه " "من غير الممكن لروفوس إحتواء الكل, يجب تحميل ملفين إضافيين من " "الإنترنت('ldlinux.sys' و 'ldlinux.bss'):\n" "- إختر ‘نعم’ للإتصال بالإنترنت وتحميل الملفات\n" @@ -1118,7 +1118,7 @@ t MSG_112 "Форматирането на голям UDF дял може да "време е %d:%02d, при което процесната лента че изглежда не активна. Моля бъдете търпеливи!" t MSG_113 "Голям UDF дял" t MSG_114 "Този образ използва Syslinux %s%s но тази програма включва само инсталационни файлове за" - "Syslinux %s.\n\nТъй като новите версии на Syslinux не са съвместими една с друга, и няма да е " + "Syslinux %s%s.\n\nТъй като новите версии на Syslinux не са съвместими една с друга, и няма да е " "възможно за Rufus да ги включи всичките, два допълнителни файлове трябва да бъдат изтеглени от " "Интернет ('ldlinux.sys' и 'ldlinux.bss'):\n" "- Изберете 'Yes' за да се свържете с интернет и да изтеглите тези файлове\n" @@ -1489,7 +1489,7 @@ t MSG_111 "不支持的簇大小" t MSG_112 "格式化较大的 UDF 卷可能需要很长时间。过程中进度条可能会呈禁止状态,属于正常现象。" "请耐心等待!\nUSB 2.0 设备预计剩余时间:%d:%02d" t MSG_113 "大容量 UDF 卷" -t MSG_114 "此镜像使用的更新版本的 Syslinux %s%s,此程序内置的 Syslinux %s 不支持更新版本。\n\n" +t MSG_114 "此镜像使用的更新版本的 Syslinux %s%s,此程序内置的 Syslinux %s%s 不支持更新版本。\n\n" "Rufus 需要下载两个文件:'ldlinux.sys' 和 'ldlinux.bss'\n" "- 选择 '是' 连接网络下载文件\n" "- 选择 '否' 取消此项操作\n\n" @@ -1859,7 +1859,7 @@ t MSG_111 "不相容的配置單元大小" t MSG_112 "磁碟區較大的 UDF 格式化作業時間較久,過程中進度列表可能會呈現靜止狀態、乃屬正常現象,請耐心等候。" "估計剩餘時間: %d:%02d" t MSG_113 "大 UDF 磁碟區" -t MSG_114 "此映像檔使用到 Syslinux %s%s,但本軟體僅支援 Syslinux %s 安裝檔案。\n\n" +t MSG_114 "此映像檔使用到 Syslinux %s%s,但本軟體僅支援 Syslinux %s%s 安裝檔案。\n\n" "由於不同版本的 Syslinux 互不相容,因此需額外下載以下擴充檔案: \n" "'ldlinux.sys' 和 'ldlinux.bss'\n" "如欲下載這份檔案,請選擇「是」,Rufus 將會自動上網下載。若要終止作業,請選擇「否」\n\n" @@ -2245,7 +2245,7 @@ t MSG_112 "Formatiranje velike UDF jedinice može potrajati. Pri USB 2.0 brzini, " %d:%02d " t MSG_113 "Velika UDF jedinica" t MSG_114 "Ova slika koristi Syslinux %s%s ali ova aplikacija samo uključuje datoteke za " - "Syslinux %s.\n\nPošto nove ver. Syslinux nisu kompatibilne jedna s drugom, " + "Syslinux %s%s.\n\nPošto nove ver. Syslinux nisu kompatibilne jedna s drugom, " "dvije dodatne datoteke se trebaju preuzeti sa" "interneta: ('ldlinux.sys' i 'ldlinux.bss')\n" "- Odaberite 'Da' kako bi se datoteke preuzele\n" @@ -2646,7 +2646,7 @@ t MSG_112 "Formátování velkých UDF svazků může trvat delší čas. Při r "formátování trvat přibližně %d:%02d, ukazatel průběhu operace je během formátování zdánlivě nefunkční. Buďte trpělivý! " t MSG_113 "Velký UDF svazku" t MSG_114 "Tento obraz používá Syslinux %s%s, tato aplikace však obsahuje pouze instalační soubory pro " - "Syslinux %s.\n\nJelikož nové verze Syslinux nejsou vzájemně kompatibilní a není možné v programu Rufus " + "Syslinux %s%s.\n\nJelikož nové verze Syslinux nejsou vzájemně kompatibilní a není možné v programu Rufus " "zahrnout všechny verze, je nutné z Internetu stáhnout dodatečné dva soubory " "(ldlinux.sys a ldlinux.bss):\n" "- Zvolte 'Ano' pro stažení souborů z Internetu\n" @@ -3042,7 +3042,7 @@ t MSG_112 "Formatering af en stor UDF volume kan tage lang tid. Ved USB 2.0 hast "formatering %d:%02d, hvorunder statuslinjen forekommer frosset. Vær tålmodig!" t MSG_113 "Stor UDF volume" t MSG_114 "Dette image benytter Syslinux %s%s men denne applikation indeholder kun installationsfilerne til " - "Syslinux %s.\n\nDa nye versioner af Syslinux ikke er kompatible med hinanden, og det desuden ikke " + "Syslinux %s%s.\n\nDa nye versioner af Syslinux ikke er kompatible med hinanden, og det desuden ikke " "ville være muligt for Rufus at inkludere dem alle, er det nødvendigt at hente to yderligere filer fra " "nettet ('ldlinux.sys' and 'ldlinux.bss'):\n" "- Vælg 'Ja' for at tilslutte internet og hente disse filer\n" @@ -3429,7 +3429,7 @@ t MSG_111 "Incompatibel Clustergrootte" t MSG_112 "Het formatteren van grote UDF volumes kan een lange tijd duren..." t MSG_113 "Grote UDF volume" t MSG_114 "Deze image maakt gebruik van Syslinux %s%s maar de applicatie bevat alleen de installatiebestanden voor" - "Syslinux %s.\n\nOmdat oude en nieuwe versies van Syslinux niet compatibel zijn met elkaar, en het niet mogelijk is voor Rufus om alle versies te beheren," + "Syslinux %s%s.\n\nOmdat oude en nieuwe versies van Syslinux niet compatibel zijn met elkaar, en het niet mogelijk is voor Rufus om alle versies te beheren," "moeten twee extra bestanden gedownload worden van het internet ('ldlinux.sys' en 'ldlinux.bss'):\n" "- Klik op 'Ja' om via internet deze bestanden te downloaden\n" "- Klik op 'Nee' om de opdracht te annuleren\n\n" @@ -3824,7 +3824,7 @@ t MSG_112 "Suurten UDF-asemien alustus voi kestää kauan. USB 2.0-nopeuksilla a "kesto on %d:%02d, minkä aikana etenemispalkki vaikuttaa pysähtyneeltä. Ole kärsivällinen!" t MSG_113 "Suuri UDF-asema" t MSG_114 "Tämä kuva käyttää Syslinuxia %s%s, mutta tämä sovellus sisältää asennustiedostot vain " - "Syslinuxille %s.\n\nKoska Syslinuxin uudet versiot eivät ole keskenään yhteensopivia, eikä Rufus " + "Syslinuxille %s%s.\n\nKoska Syslinuxin uudet versiot eivät ole keskenään yhteensopivia, eikä Rufus " "voisi sisältää niitä kaikkia, on kaksi lisätiedostoa ladattava internetistä " "('ldlinux.sys' ja 'ldlinux.bss'):\n" "- Valitse 'Kyllä' yhdistääksesi internetiin ja ladataksesi nämä tiedostot\n" @@ -4202,7 +4202,7 @@ t MSG_111 "Taille de clusters incompatible" t MSG_112 "Le formatage d'un volume UDF de grande taille peut prendre beaucoup de temps. Aux vitesses USB 2.0, " "la durée de formatage 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_114 "Cette image utilise Syslinux %s%s mais l'application inclus seulement les fichiers d'installation pour Syslinux %s.\n\n" +t MSG_114 "Cette image utilise Syslinux %s%s mais l'application inclus seulement les fichiers d'installation pour Syslinux %s%s.\n\n" "Comme les nouvelles versions de Syslinux sont incompatibles entre elles, et il n'est pas possible à Rufus de toutes " "les inclure, deux fichiers supplémentaires ('ldlinux.sys' et 'ldlinux.bss') doivent être téléchargés :\n" "- Choisissez 'Oui' pour télécharger ces fichier depuis Internet\n" @@ -4582,7 +4582,7 @@ t MSG_110 "MS-DOS kann nicht von einem Laufwerk starten, das 64 Kilobyte große t MSG_111 "Inkompatible Zuordnungseinheitengröße" t MSG_112 "Großes UDF-Laufwerke zu formatieren, kann viel Zeit benötigen..." t MSG_113 "Großes UDF-Laufwerk" -t MSG_114 "Dieses Abbild benutzt Syslinux %s%s, aber diese Anwendung verfügt nur über Installationsdateien für Syslinux %s.\n\n" +t MSG_114 "Dieses Abbild benutzt Syslinux %s%s, aber diese Anwendung verfügt nur über Installationsdateien für Syslinux %s%s.\n\n" "Neuere Syslinux-Versionen sind untereinander nicht kompatibel. Rufus kann nicht alle Versionen unterstützen. " "Zwei zusätzliche Dateien müssen vom Internet heruntergeladen werden ('ldlinux.sys' and 'ldlinux.bss'):\n" "- Wählen Sie 'Ja', um dem Download zuzustimmen oder\n" @@ -5011,7 +5011,7 @@ t MSG_112 "Η διαμόρφωση μεγάλων τόμων UDF ίσως δια "είναι %d:%02d. Κατά την διάρκεια της διαμόρφωσης η μπάρα προόδου θα είναι στατική. Παρακαλώ περιμένετε!" t MSG_113 "Mεγάλος τόμος UDF" t MSG_114 "Αυτό το είδωλο χρησιμοποιεί το Syslinux %s%s παρόλα αυτά η εφαρμογή(Rufus) εμπεριέχει μόνο τα αρχεία εγκατάστασης του " - "Syslinux %s.\n\n Εφόσον οι νέες εκδόσεις του Syslinux δεν είναι συμβατές μεταξύ τους, δεν είναι δυνατό για το Rufus" + "Syslinux %s%s.\n\n Εφόσον οι νέες εκδόσεις του Syslinux δεν είναι συμβατές μεταξύ τους, δεν είναι δυνατό για το Rufus" "να τις εμπεριέχει όλες. Επομένως, απαιτείται η λήψη δύο νέων αρχείων απο το διαδίκτυο ('ldlinux.sys' και 'ldlinux.bss'): \n" "- Επιλέξτε το 'Ναι' για να συνδεθείτε στο διαδίκτυο και να κάνετε λήψη των αρχείων\n" "- Επιλέξτε το 'Όχι' για να ακυρώσετε τη λειτουργία.\n" @@ -6155,7 +6155,7 @@ t MSG_112 "La formattazione di un volume UDF di grandi dimensioni può richieder "per la formattazione sarà di %d:%02d, durante il quale la barra di progresso non verrà aggiornata. Attendi il completamento dell'operazione!" t MSG_113 "Voume UDF di grandi dimensioni" t MSG_114 "Questa immagine usa Syslinux %s%s ma questa applicazione include solo i file di installazione per " - "Syslinux %s.\n\nPoiché le nuove versioni di Syslinux non sono compatibili con le precedenti e " + "Syslinux %s%s.\n\nPoiché le nuove versioni di Syslinux non sono compatibili con le precedenti e " "non sarebbe possibile per Rufus includerle tutte, devono essere scaricati da Internet due file aggiuntivi " "('ldlinux.sys' e 'ldlinux.bss'):\n" "- Seleziona 'Sì' per collegarti a internet e scaricare questi due file\n" @@ -6559,7 +6559,7 @@ t MSG_111 "互換性がないクラスタサイズです。" t MSG_112 "大きいUDFボリュームがフォーマットするは時間がかかれます。USB2.0スピードで、 " "フォーマットの推定持続は%d:%02d。この時間の間にプログレスバーは凍結用に見えます。こんな時間にちょっと待って下さい。" t MSG_113 "大きいUDFボリューム" -t MSG_114 "このイメージは Syslinux %s%s を使うが、このアプリケーションは Syslinux %s のインストール " +t MSG_114 "このイメージは Syslinux %s%s を使うが、このアプリケーションは Syslinux %s%s のインストール " "ファイルだけあります。\n\nSyslinuxの新バージョンは互いに互換性のないから、RufusはSyslinkのすべて " "を含めれません。インタネットから二つのファイルはダウンロードしなければならない。 " "('ldlinux.sys' and 'ldlinux.bss'):\n" @@ -6956,7 +6956,7 @@ t MSG_112 "큰 UDF 볼륨을 포맷하려면 시간이 많이 걸릴 수 있습 "%d:%02d 입니다. 포맷 중 진행바가 멈춤상태로 있을 수도 있습니다. 기다려주십시오!" t MSG_113 "큰 UDF 볼륨" t MSG_114 "이 이미지는 Syslinux를 하지만 %s%s 이 프로그램에는 Syslinux의 설치 파일만 포함되어 있습니다. " - "Syslinux %s.\n\nSyslinux의 새 버전은 서로 호환되지 않으며, Rufus가 새 버전 모두를 포함하는 것은 불가능합니다." + "Syslinux %s%s.\n\nSyslinux의 새 버전은 서로 호환되지 않으며, Rufus가 새 버전 모두를 포함하는 것은 불가능합니다." "다음 두 개의 추가 파일을 인터넷에서 다운로드 하십시오." "('ldlinux.sys' and 'ldlinux.bss'):\n" "- '예'를 선택하면 인터넷에 연결하여 두 개의 파일을 다운로드합니다.\n" @@ -7376,7 +7376,7 @@ t MSG_112 "Large UDF disku formatēšana var aizņemt daudz laika. Izmantojot US "ilgums ir %d:%02d, kura laikā izpildes līnija var apstāties. Esiet pacietīgi!" t MSG_113 "Large UDF disks" t MSG_114 "Šis imidžs izmanto Syslinux %s%s, bet aplikācija satur instalācijas failus " - "Syslinux %s.\n\nTā kā jaunās Syslinux versijas nav savstarpēji atbalstāmas, nepieciešams " + "Syslinux %s%s.\n\nTā kā jaunās Syslinux versijas nav savstarpēji atbalstāmas, nepieciešams " "no interneta ielādēt nepieciešamos failus ('ldlinux.sys' un 'ldlinux.bss'):\n" "- Izvēlieties 'Jā' lai pieslēgtos pie interneta un ielādētu šos failus\n" "- Izvēlieties 'Nē' lai atceltu šo operāciju\n\n" @@ -7793,7 +7793,7 @@ t MSG_112 "Didelių UDF tomų formatavimas gali užimti daug laiko. USB 2.0 grei "trukmė yra %d:%02d, tuo metu eigos juosta gali atrodyti sustingusi. Prašau kantrybės!" t MSG_113 "Didelis UDF tomas" t MSG_114 "Šis atvaizdas naudoja Syslinux %s%s, bet ši programa turi tik diegimo failus, skirtus " - "Syslinux %s.\n\nKadangi naujos Syslinux versijos tarpusavyje nesuderinamos, ir nėra galimybės " + "Syslinux %s%s.\n\nKadangi naujos Syslinux versijos tarpusavyje nesuderinamos, ir nėra galimybės " "į Rufus įtraukti jas visas, du papildomi failai turi būti atsisiųsti iš " "interneto ('ldlinux.sys' ir 'ldlinux.bss'):\n" "- Pasirinkite 'Taip' norėdami prisijungti prie interneto ir atsisiųsti šiuos failus\n" @@ -8217,7 +8217,7 @@ t MSG_112 "Pemformattan jilid UDF yang besar mengambil masa yang amat lama. Pada "adalah %d:%02d, di mana bar kemajuan akan lihat seperti ia tidak bergerak. Tolong bersabar" t MSG_113 "Jilid UDF besar" t MSG_114 "Imej ini menggunakan Syslinux %s%s tetapi aplikasi ini hanya mempunyai fail pemasangan untuk" - "Syslinux %s.\n\nOleh kerana versi-versi baharu Syslinux tidak serasi dengan satu sama lain, maka tidak" + "Syslinux %s%s.\n\nOleh kerana versi-versi baharu Syslinux tidak serasi dengan satu sama lain, maka tidak" "wajarlah Rufus menyediakan semuanya, dua fail tambahan perlu dimuat turun dari" "Internet ('ldlinux.sys' dan 'ldlinux.bss'):\n" "- Pilih 'Ya' untuk menyambung ke Internet dan memuat turun fail tersebut\n" @@ -8638,7 +8638,7 @@ t MSG_112 "Formatowanie dużych woluminów UDF może zająć dużo czasu. Przy p "formatowania wynosi %d:%02d, podczas którego pasek postępu będzie wysawał się być zamrożony. Proszę być cierpliwym!" t MSG_113 "Duży wolumin UDF" t MSG_114 "Ten obraz używa Syslinux %s%s lecz ta aplikacja dołącza pliki instalacyjne tylko dla " - "Syslinux %s.\n\nPonieważ nowa wersja Syslinux nie jest kompatybilna z inną i nie jest " + "Syslinux %s%s.\n\nPonieważ nowa wersja Syslinux nie jest kompatybilna z inną i nie jest " "możliwe dla Rufusa aby załączyć je wszystkie, dwa dodatkowe pliki muszą być pobrane " "z Internetu ('ldlinux.sys' oraz 'ldlinux.bss'):\n" "- Wybierz 'Tak' aby połączyć z Internetem i pobrać te pliki\n" @@ -8873,7 +8873,7 @@ t MSG_104 "Syslinux v5.0 ou posterior requer que esteja instalado um arquivo '%s t MSG_110 "MS-DOS não inicia um disco com um tamanho de cluster de 64 kilobytes.\n" "Por favor altere o tamanho de cluster ou use FreeDOS." t MSG_114 "Esta imagem usa Syslinux %s%s, mas este aplicativo inclui somente os arquivos de instalação para " - "Syslinux %s.\n\nComo novas versões de Syslinux não são compatíveis entre si, e que não " + "Syslinux %s%s.\n\nComo novas versões de Syslinux não são compatíveis entre si, e que não " "seja possível para Rufus incluí-los todos, dois arquivos adicionais devem ser baixados a partir da " "Internet ('ldlinux.sys' and 'ldlinux.bss'):\n" "- Selecione 'Sim' para se conectar à Internet e baixar esses arquivos\n" @@ -9608,8 +9608,8 @@ t MSG_111 "Dimensiune Cluster incompatibilă" t MSG_112 "Formatarea volumului mare UDF, poate dura ceva timp. Viteza formatării USB 2.0, estimează " "durata este %d:%02d, în care va apărea pe bara de progres. Vă rugăm să aveţi răbdare!" t MSG_113 "Volumul UDF mare" -t MSG_114 "Această imagine foloseste Syslinux %s%s, dar această aplicație include doar fișierele de instalare pentru Syslinux %s. " - "Syslinux %s.\n\nNoile versiuni ale syslinux, nu sunt compatibile cu altele, și nu ar fi " +t MSG_114 "Această imagine foloseste Syslinux %s%s, dar această aplicație include doar fișierele de instalare pentru " + "Syslinux %s%s.\n\nNoile versiuni ale syslinux, nu sunt compatibile cu altele, și nu ar fi " "este posibil ca Rufus să le includă, două fișiere suplimentare, ele trebuie să fi descărcate de pe " "Internet ('ldlinux.sys' şi 'ldlinux.bss'):\n" "- Selectați 'Da' pentru a vă conecta la Internet și de a descărca aceste fișiere\n" @@ -10007,7 +10007,7 @@ t MSG_111 "Несовместимый размер кластера" t MSG_112 "Форматирование в Large UDF-тома занимает много времени..." t MSG_113 "Large UDF-том" t MSG_114 "Данный образ использует Syslinux %s%s, но данное приложение включает в себя только установочные файлы для " - "Syslinux %s.\n\nТак как новые версии Syslinux не совместимы друг с другом, необходимо, чтобы дополнительные" + "Syslinux %s%s.\n\nТак как новые версии Syslinux не совместимы друг с другом, необходимо, чтобы дополнительные" "файлы ('ldlinux.sys' and 'ldlinux.bss') были загружены из интернета:\n" "- Выберите 'Да', чтобы скачать файлы из интернета\n" "- Выберите 'Нет', чтобы отменить операцию\n\n" @@ -10398,7 +10398,7 @@ t MSG_112 "Formátovanie veľkých UDF zväzkov môže trvať dlhý čas. Rýchl "trvanie formátovania (približne %d:%02d), počas procesu sa vám môže zdať, že aplikácia zamrzla. Budte trpezlivý! " t MSG_113 "Veľkosť UDF zväzku" t MSG_114 "Tento obraz používa Syslinux %s%s ale tento program obsahuje inštaláciu pre " - "Syslinux %s.\n\nAk nová verzia Syslinuxu nie je kompaktibilná s ďalším obrazom, " + "Syslinux %s%s.\n\nAk nová verzia Syslinuxu nie je kompaktibilná s ďalším obrazom, " "je možné, že program Rufus neobsahuje dva doplnkové súbory, ktoré budú musieť byť stiahnuté " "z internetu (ldlinux.sys a ldlinux.bss):\n" "- Stlačte 'Áno' pre stiahnutie týchto súborov z internetu\n" @@ -10805,7 +10805,7 @@ t MSG_112 "Formatiranje velikih nosilcev UDF lahko traja veliko časa. Pri hitro "trajanje formatiranja %d:%02d, med čimer se kazalnik poteka ne bo premaknil. Prosim, bodite potrpežljivi!" t MSG_113 "Velik nosilec UDF" t MSG_114 "Ta slika uporablja Syslinux %s%s, toda ta aplikacija vsebuje le namestitvene datoteke za " - "Syslinux %s.\n\nKer novejše verzije Syslinuxa niso združljive in Rufus ne more vsebovati vseh, " + "Syslinux %s%s.\n\nKer novejše verzije Syslinuxa niso združljive in Rufus ne more vsebovati vseh, " "morata biti prenešeni še dve dodatni datoteki (ldlinux.sys in ldlinux.bss):\n" "- Izberite \"Da\", da se povežete na internet in prenesete ti dve datoteki.\n" "- Izberite \"Ne\", da prekinete dejanje.\n\n" @@ -11604,7 +11604,7 @@ t MSG_112 "Att formatera en stor UDF-volum kan ta lång tid. Vid USB 2.0-hastigh "tiden runt %d:%02d, och under tiden kan förloppsindikatorn se ut att stå stilla." t MSG_113 "Stor UDF-volum" t MSG_114 "Denna avbild använder Syslinux %s%s men detta programmet innehåller endast installationsfiler för " - "Syslinux %s.\n\nEftersom nya versioner av Syslinux inte är kompatibla med varandra, skulle det vara " + "Syslinux %s%s.\n\nEftersom nya versioner av Syslinux inte är kompatibla med varandra, skulle det vara " "omöjligt att alla fanns med i Rufus, så därför måste två filer laddas ned från " "internet ('ldlinux.sys' och 'ldlinux.bss'):\n" "- Välj 'Ja' för att ansluta till internet och ladda ned filerna\n" @@ -12019,7 +12019,7 @@ t MSG_111 "Uyumsuz Ayırma Boyutu" t MSG_112 "Geniş bir UDF Biriminin biçimlendirilmesi çok uzun bir süre alabilir. USB 2.0 hızında, Tahmini biçimlendirme " "süresi %d:%02d, İlerleme çubuğu donmuş görünüyorken. Lütfen sabırlı olun!" t MSG_113 "Geniş UDF Birimi" -t MSG_114 "Bu yansıma Syslinux %s%s kullanıyor fakat bu uygulama yalnız Syslinux %s için yükleme dosyalarını " +t MSG_114 "Bu yansıma Syslinux %s%s kullanıyor fakat bu uygulama yalnız Syslinux %s%s için yükleme dosyalarını " "içeriyor.\n\nSyslinux'un yeni sürümleri bir başkasıyla uyumlu olmadığından ve Rufus'un bunların" "tamamını içermesi mümkün olmadığından, iki ek dosyanın('ldlinux.sys' ve 'ldlinux.bss') internet üzerinden " "indirilmesi gerekli:\n" @@ -12441,7 +12441,7 @@ t MSG_111 "Несумісний розмір кластера" t MSG_112 "Форматування в Large UDF-тома займає багато часу..." t MSG_113 "Large UDF-том" t MSG_114 "Даний образ використовує Syslinux %s%s, проте даний додаток включає в себе тільки установочні файли для " - "Syslinux %s.\n\nТак як нові версії Syslinux несумісні одна з одною, необхідно, щоб додаткові" + "Syslinux %s%s.\n\nТак як нові версії Syslinux несумісні одна з одною, необхідно, щоб додаткові" "файли ('ldlinux.sys' та 'ldlinux.bss') були завантажені з інтернету:\n" "- Оберіть 'Так', щоб завантажити файли з інтернету\n" "- Оберіть 'Ні', щоб відмінити операцію\n\n" diff --git a/res/syslinux/ldlinux_v5.sys b/res/syslinux/ldlinux_v5.sys deleted file mode 100644 index 4ba1031b1947ad2bec1b183350b228e313943fcc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56657 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 te{v%dyZ$_MM-w79Mb>`OOU^n?DhZv diff --git a/res/syslinux/ldlinux_v5.bss b/res/syslinux/ldlinux_v6.bss similarity index 82% rename from res/syslinux/ldlinux_v5.bss rename to res/syslinux/ldlinux_v6.bss index 1696a0d9722a342cc4f6af146902b5a77c1e83d7..00b0d8ee6ec0e9851e0fd9c956aecd5a3d5ab33f 100644 GIT binary patch delta 16 XcmZo*X<*r)&&bkuupw)*G2>YPEN}(7 delta 16 XcmZo*X<*r)&&YDpStft7G2>YPD3=8o diff --git a/res/syslinux/ldlinux_v6.sys b/res/syslinux/ldlinux_v6.sys new file mode 100644 index 0000000000000000000000000000000000000000..ea2aae800457db97a14880b1127b10f6e4ea1331 GIT binary patch literal 68599 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

QJGV{pdTP{qx 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 qRSFt*JR+Nc&bjE)<_c`$B! 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%0D`7N%TXvutCn4 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 literal 0 HcmV?d00001 diff --git a/res/syslinux/readme.txt b/res/syslinux/readme.txt index d7dd611e..84d1c94d 100644 --- a/res/syslinux/readme.txt +++ b/res/syslinux/readme.txt @@ -1,4 +1,4 @@ o ldlinux_v4.[bss|sys] have been renamed from ldlinux.[bss|sys] found in syslinux-4.07/core/ -o ldlinux_v5.[bss|sys] have been renamed from ldlinux.[bss|sys] found in syslinux-5.10/core/ +o ldlinux_v6.[bss|sys] have been renamed from ldlinux.[bss|sys] found in syslinux-6.03/bios/core/ o mboot.c32 comes from syslinux-4.07/com32/mboot http://www.kernel.org/pub/linux/utils/boot/syslinux/ \ No newline at end of file diff --git a/src/format.c b/src/format.c index cb581040..93675540 100644 --- a/src/format.c +++ b/src/format.c @@ -1554,7 +1554,7 @@ DWORD WINAPI FormatThread(void* param) // We must close and unlock the volume to write files to it safe_unlockclose(hLogicalVolume); } else if ( (dt == DT_SYSLINUX_V4) || (dt == DT_SYSLINUX_V5) || ((dt == DT_ISO) && ((fs == FS_FAT16) || (fs == FS_FAT32))) ) { - if (!InstallSyslinux(DriveIndex, drive_name[0])) { + if (!InstallSyslinux(DriveIndex, drive_name[0], fs)) { FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_INSTALL_FAILURE; } } diff --git a/src/resource.h b/src/resource.h index babac41d..f6a03494 100644 --- a/src/resource.h +++ b/src/resource.h @@ -50,8 +50,8 @@ #define IDR_FD_EGA18_CPX 326 #define IDR_SL_LDLINUX_V4_BSS 400 #define IDR_SL_LDLINUX_V4_SYS 401 -#define IDR_SL_LDLINUX_V5_BSS 402 -#define IDR_SL_LDLINUX_V5_SYS 403 +#define IDR_SL_LDLINUX_V6_BSS 402 +#define IDR_SL_LDLINUX_V6_SYS 403 #define IDR_SL_MBOOT_C32 404 #define IDR_LC_RUFUS_LOC 500 #define IDR_XT_HOGGER 501 diff --git a/src/rufus.c b/src/rufus.c index ea2f4d5e..278d9063 100644 --- a/src/rufus.c +++ b/src/rufus.c @@ -1178,7 +1178,8 @@ static BOOL BootCheck(void) } } } - } else if (iso_report.sl_version != embedded_sl_version[1]) { + } else if ((iso_report.sl_version != embedded_sl_version[1]) || + (safe_strcmp(iso_report.sl_version_ext, embedded_sl_version_ext[1]) != 0)) { // Unlike what was the case for v4 and earlier, Syslinux v5+ versions are INCOMPATIBLE with one another! IGNORE_RETVAL(_chdirU(app_dir)); IGNORE_RETVAL(_mkdir(FILES_DIR)); @@ -1200,7 +1201,7 @@ static BOOL BootCheck(void) iso_report.sl_version_str, iso_report.sl_version_ext); } else { r = MessageBoxU(hMainDialog, lmprintf(MSG_114, iso_report.sl_version_str, iso_report.sl_version_ext, - embedded_sl_version_str[1]), + embedded_sl_version_str[1], embedded_sl_version_ext[1]), lmprintf(MSG_115), MB_YESNO|MB_ICONWARNING|MB_IS_RTL); if (r != IDYES) return FALSE; @@ -1287,7 +1288,7 @@ void InitDialog(HWND hDlg) HDC hDC; int i, i16, s16; char tmp[128], *token, *buf, *ext; - static char* resource[2] = { MAKEINTRESOURCEA(IDR_SL_LDLINUX_V4_SYS), MAKEINTRESOURCEA(IDR_SL_LDLINUX_V5_SYS) }; + static char* resource[2] = { MAKEINTRESOURCEA(IDR_SL_LDLINUX_V4_SYS), MAKEINTRESOURCEA(IDR_SL_LDLINUX_V6_SYS) }; #ifdef RUFUS_TEST ShowWindow(GetDlgItem(hDlg, IDC_TEST), SW_SHOW); @@ -1505,9 +1506,9 @@ void SetBoot(int fs, int bt) IGNORE_RETVAL(ComboBox_SetItemData(hBootType, ComboBox_AddStringU(hBootType, lmprintf(MSG_036)), DT_ISO)); IGNORE_RETVAL(ComboBox_SetItemData(hBootType, ComboBox_AddStringU(hBootType, lmprintf(MSG_095)), DT_IMG)); // If needed (advanced mode) also append a Syslinux option - if ( (bt == BT_BIOS) && (((fs == FS_FAT16) || (fs == FS_FAT32)) && (advanced_mode)) ) { + if ( (bt == BT_BIOS) && (((fs == FS_FAT16) || (fs == FS_FAT32) || (fs == FS_NTFS)) && (advanced_mode)) ) { IGNORE_RETVAL(ComboBox_SetItemData(hBootType, ComboBox_AddStringU(hBootType, "Syslinux 4"), DT_SYSLINUX_V4)); - IGNORE_RETVAL(ComboBox_SetItemData(hBootType, ComboBox_AddStringU(hBootType, "Syslinux 5"), DT_SYSLINUX_V5)); + IGNORE_RETVAL(ComboBox_SetItemData(hBootType, ComboBox_AddStringU(hBootType, "Syslinux 6"), DT_SYSLINUX_V5)); IGNORE_RETVAL(ComboBox_SetItemData(hBootType, ComboBox_AddStringU(hBootType, "ReactOS"), DT_REACTOS)); } if ((!advanced_mode) && (selection_default >= DT_SYSLINUX_V4)) { diff --git a/src/rufus.h b/src/rufus.h index e996cfa3..53e49a9c 100644 --- a/src/rufus.h +++ b/src/rufus.h @@ -369,7 +369,7 @@ extern BOOL Question(char* title, char* format, ...); extern BOOL ExtractDOS(const char* path); extern BOOL ExtractISO(const char* src_iso, const char* dest_dir, BOOL scan); extern int64_t ExtractISOFile(const char* iso, const char* iso_file, const char* dest_file, DWORD attributes); -extern BOOL InstallSyslinux(DWORD drive_index, char drive_letter); +extern BOOL InstallSyslinux(DWORD drive_index, char drive_letter, int fs); extern uint16_t GetSyslinuxVersion(char* buf, size_t buf_size, char** ext); extern BOOL CreateProgress(void); extern BOOL SetAutorun(const char* path); diff --git a/src/rufus.rc b/src/rufus.rc index 37e8ea34..20163aac 100644 --- a/src/rufus.rc +++ b/src/rufus.rc @@ -32,7 +32,7 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL IDD_DIALOG DIALOGEX 12, 12, 206, 329 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Rufus 1.5.0.537" +CAPTION "Rufus 1.5.0.538" FONT 8, "MS Shell Dlg", 400, 0, 0x1 BEGIN DEFPUSHBUTTON "Start",IDC_START,94,291,50,14 @@ -165,7 +165,7 @@ END RTL_IDD_DIALOG DIALOGEX 12, 12, 206, 329 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU EXSTYLE WS_EX_RTLREADING | WS_EX_APPWINDOW | WS_EX_LAYOUTRTL -CAPTION "Rufus 1.5.0.537" +CAPTION "Rufus 1.5.0.538" FONT 8, "MS Shell Dlg", 400, 0, 0x1 BEGIN DEFPUSHBUTTON "Start",IDC_START,94,291,50,14 @@ -336,8 +336,8 @@ BEGIN "#endif\r\n" "IDR_SL_LDLINUX_V4_BSS RCDATA ""../res/syslinux/ldlinux_v4.bss""\r\n" "IDR_SL_LDLINUX_V4_SYS RCDATA ""../res/syslinux/ldlinux_v4.sys""\r\n" - "IDR_SL_LDLINUX_V5_BSS RCDATA ""../res/syslinux/ldlinux_v5.bss""\r\n" - "IDR_SL_LDLINUX_V5_SYS RCDATA ""../res/syslinux/ldlinux_v5.sys""\r\n" + "IDR_SL_LDLINUX_V6_BSS RCDATA ""../res/syslinux/ldlinux_v6.bss""\r\n" + "IDR_SL_LDLINUX_V6_SYS RCDATA ""../res/syslinux/ldlinux_v6.sys""\r\n" "IDR_SL_MBOOT_C32 RCDATA ""../res/syslinux/mboot.c32""\r\n" "IDR_FD_COMMAND_COM RCDATA ""../res/freedos/COMMAND.COM""\r\n" "IDR_FD_KERNEL_SYS RCDATA ""../res/freedos/KERNEL.SYS""\r\n" @@ -428,8 +428,8 @@ END // VS_VERSION_INFO VERSIONINFO - FILEVERSION 1,5,0,537 - PRODUCTVERSION 1,5,0,537 + FILEVERSION 1,5,0,538 + PRODUCTVERSION 1,5,0,538 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -446,13 +446,13 @@ BEGIN BEGIN VALUE "CompanyName", "Akeo Consulting (http://akeo.ie)" VALUE "FileDescription", "Rufus" - VALUE "FileVersion", "1.5.0.537" + VALUE "FileVersion", "1.5.0.538" VALUE "InternalName", "Rufus" VALUE "LegalCopyright", " 2011-2014 Pete Batard (GPL v3)" VALUE "LegalTrademarks", "http://www.gnu.org/copyleft/gpl.html" VALUE "OriginalFilename", "rufus.exe" VALUE "ProductName", "Rufus" - VALUE "ProductVersion", "1.5.0.537" + VALUE "ProductVersion", "1.5.0.538" END END BLOCK "VarFileInfo" @@ -490,8 +490,8 @@ IDR_LC_RUFUS_LOC RCDATA "../res/localization/embedded.lo #endif IDR_SL_LDLINUX_V4_BSS RCDATA "../res/syslinux/ldlinux_v4.bss" IDR_SL_LDLINUX_V4_SYS RCDATA "../res/syslinux/ldlinux_v4.sys" -IDR_SL_LDLINUX_V5_BSS RCDATA "../res/syslinux/ldlinux_v5.bss" -IDR_SL_LDLINUX_V5_SYS RCDATA "../res/syslinux/ldlinux_v5.sys" +IDR_SL_LDLINUX_V6_BSS RCDATA "../res/syslinux/ldlinux_v6.bss" +IDR_SL_LDLINUX_V6_SYS RCDATA "../res/syslinux/ldlinux_v6.sys" IDR_SL_MBOOT_C32 RCDATA "../res/syslinux/mboot.c32" IDR_FD_COMMAND_COM RCDATA "../res/freedos/COMMAND.COM" IDR_FD_KERNEL_SYS RCDATA "../res/freedos/KERNEL.SYS" diff --git a/src/syslinux.c b/src/syslinux.c index ab17113c..62b88c21 100644 --- a/src/syslinux.c +++ b/src/syslinux.c @@ -36,6 +36,7 @@ #include "syslxfs.h" #include "libfat.h" #include "setadv.h" +#include "ntfssect.h" unsigned char* syslinux_ldlinux[2] = { NULL, NULL }; DWORD syslinux_ldlinux_len[2]; @@ -69,7 +70,7 @@ int libfat_readfile(intptr_t pp, void *buf, size_t secsize, * Extract the ldlinux.sys and ldlinux.bss from resources, * then patch and install them */ -BOOL InstallSyslinux(DWORD drive_index, char drive_letter) +BOOL InstallSyslinux(DWORD drive_index, char drive_letter, int fs_type) { HANDLE f_handle = INVALID_HANDLE_VALUE; HANDLE d_handle = INVALID_HANDLE_VALUE; @@ -77,12 +78,12 @@ BOOL InstallSyslinux(DWORD drive_index, char drive_letter) DWORD bytes_written; BOOL r = FALSE; FILE* fd; - size_t len; + size_t length; static unsigned char sectbuf[SECTOR_SIZE]; static char* resource[2][2] = { { 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_V6_SYS), MAKEINTRESOURCEA(IDR_SL_LDLINUX_V6_BSS) } }; const char* ldlinux = "ldlinux"; const char* syslinux = "syslinux"; const char* ldlinux_ext[3] = { "sys", "bss", "c32" }; @@ -116,9 +117,9 @@ BOOL InstallSyslinux(DWORD drive_index, char drive_letter) uprintf("Could not open %s\n", path); goto out; } - len = fread(syslinux_ldlinux[i], 1, (size_t)syslinux_ldlinux_len[i], fd); + length = fread(syslinux_ldlinux[i], 1, (size_t)syslinux_ldlinux_len[i], fd); fclose(fd); - if (len != (size_t)syslinux_ldlinux_len[i]) { + if (length != (size_t)syslinux_ldlinux_len[i]) { uprintf("Could not read %s\n", path); goto out; } @@ -148,8 +149,8 @@ BOOL InstallSyslinux(DWORD drive_index, char drive_letter) } /* Write ldlinux.sys file */ - if (!WriteFile(f_handle, syslinux_ldlinux[0], syslinux_ldlinux_len[0], - &bytes_written, NULL) || + if (!WriteFile(f_handle, (const char _force *)syslinux_ldlinux[0], + syslinux_ldlinux_len[0], &bytes_written, NULL) || bytes_written != syslinux_ldlinux_len[0]) { uprintf("Could not write '%s'\n", &path[3]); goto out; @@ -183,6 +184,39 @@ BOOL InstallSyslinux(DWORD drive_index, char drive_letter) sectors = (libfat_sector_t*) calloc(ldlinux_sectors, sizeof *sectors); if (sectors == NULL) goto out; + if (fs_type == FS_NTFS) { + DWORD err; + S_NTFSSECT_VOLINFO vol_info; + LARGE_INTEGER vcn, lba, len; + S_NTFSSECT_EXTENT extent; + + static_sprintf(tmp, "%C:\\", drive_letter); + err = NtfsSectGetVolumeInfo(tmp, &vol_info); + if (err != ERROR_SUCCESS) { + uprintf("Could not fetch NTFS volume info"); + goto out; + } + secp = sectors; + nsectors = 0; + for (vcn.QuadPart = 0; + NtfsSectGetFileVcnExtent(f_handle, &vcn, &extent) == ERROR_SUCCESS; + vcn = extent.NextVcn) { + err = NtfsSectLcnToLba(&vol_info, &extent.FirstLcn, &lba); + if (err != ERROR_SUCCESS) { + uprintf("Could not translate LDLINUX.SYS LCN to disk LBA"); + goto out; + } + lba.QuadPart -= vol_info.PartitionLba.QuadPart; + len.QuadPart = ((extent.NextVcn.QuadPart - + extent.FirstVcn.QuadPart) * + vol_info.SectorsPerCluster); + while (len.QuadPart-- && nsectors < ldlinux_sectors) { + *secp++ = lba.QuadPart++; + nsectors++; + } + } + goto map_done; + } fs = libfat_open(libfat_readfile, (intptr_t) d_handle); if (fs == NULL) { uprintf("Syslinux FAT access error\n"); @@ -198,6 +232,7 @@ BOOL InstallSyslinux(DWORD drive_index, char drive_letter) s = libfat_nextsector(fs, s); } libfat_close(fs); +map_done: /* Patch ldlinux.sys and the boot sector */ syslinux_patch(sectors, nsectors, 0, 0, NULL, NULL); @@ -224,7 +259,7 @@ BOOL InstallSyslinux(DWORD drive_index, char drive_letter) } /* Make the syslinux boot sector */ - syslinux_make_bootsect(sectbuf, VFAT); + syslinux_make_bootsect(sectbuf, (fs_type == FS_NTFS)?NTFS:VFAT); /* Write boot sector back */ if (SetFilePointer(d_handle, 0, NULL, FILE_BEGIN) != 0 || diff --git a/src/syslinux/libinstaller/.msvc/libinstaller.vcxproj b/src/syslinux/libinstaller/.msvc/libinstaller.vcxproj index 669acad4..fda8ad36 100644 --- a/src/syslinux/libinstaller/.msvc/libinstaller.vcxproj +++ b/src/syslinux/libinstaller/.msvc/libinstaller.vcxproj @@ -20,6 +20,7 @@ + @@ -27,6 +28,7 @@ + diff --git a/src/syslinux/libinstaller/.msvc/libinstaller.vcxproj.filters b/src/syslinux/libinstaller/.msvc/libinstaller.vcxproj.filters index 5cc1daa8..29591d44 100644 --- a/src/syslinux/libinstaller/.msvc/libinstaller.vcxproj.filters +++ b/src/syslinux/libinstaller/.msvc/libinstaller.vcxproj.filters @@ -26,6 +26,9 @@ Header Files + + Header Files + @@ -37,5 +40,8 @@ Source Files + + Source Files + \ No newline at end of file diff --git a/src/syslinux/libinstaller/.msvc/libinstaller_sources b/src/syslinux/libinstaller/.msvc/libinstaller_sources index 299870cf..57d6b7ae 100644 --- a/src/syslinux/libinstaller/.msvc/libinstaller_sources +++ b/src/syslinux/libinstaller/.msvc/libinstaller_sources @@ -13,5 +13,6 @@ TARGETLIBS=$(SDK_LIB_PATH)\kernel32.lib \ $(SDK_LIB_PATH)\user32.lib SOURCES=fs.c \ + ntfssect.c \ setadv.c \ syslxmod.c \ No newline at end of file diff --git a/src/syslinux/libinstaller/Makefile.am b/src/syslinux/libinstaller/Makefile.am index 21249cde..71948b40 100644 --- a/src/syslinux/libinstaller/Makefile.am +++ b/src/syslinux/libinstaller/Makefile.am @@ -1,4 +1,4 @@ noinst_LIBRARIES = libinstaller.a -libinstaller_a_SOURCES = fs.c setadv.c syslxmod.c +libinstaller_a_SOURCES = fs.c ntfssect.c setadv.c syslxmod.c libinstaller_a_CFLAGS = $(AM_CFLAGS) \ No newline at end of file diff --git a/src/syslinux/libinstaller/Makefile.in b/src/syslinux/libinstaller/Makefile.in index 2066c768..893aeda4 100644 --- a/src/syslinux/libinstaller/Makefile.in +++ b/src/syslinux/libinstaller/Makefile.in @@ -53,6 +53,7 @@ am__v_at_0 = @ libinstaller_a_AR = $(AR) $(ARFLAGS) libinstaller_a_LIBADD = am_libinstaller_a_OBJECTS = libinstaller_a-fs.$(OBJEXT) \ + libinstaller_a-ntfssect.$(OBJEXT) \ libinstaller_a-setadv.$(OBJEXT) \ libinstaller_a-syslxmod.$(OBJEXT) libinstaller_a_OBJECTS = $(am_libinstaller_a_OBJECTS) @@ -166,7 +167,7 @@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LIBRARIES = libinstaller.a -libinstaller_a_SOURCES = fs.c setadv.c syslxmod.c +libinstaller_a_SOURCES = fs.c ntfssect.c setadv.c syslxmod.c libinstaller_a_CFLAGS = $(AM_CFLAGS) all: all-am @@ -232,6 +233,14 @@ libinstaller_a-fs.obj: fs.c $(AM_V_CC) @AM_BACKSLASH@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libinstaller_a_CFLAGS) $(CFLAGS) -c -o libinstaller_a-fs.obj `if test -f 'fs.c'; then $(CYGPATH_W) 'fs.c'; else $(CYGPATH_W) '$(srcdir)/fs.c'; fi` +libinstaller_a-ntfssect.o: ntfssect.c + $(AM_V_CC) @AM_BACKSLASH@ + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libinstaller_a_CFLAGS) $(CFLAGS) -c -o libinstaller_a-ntfssect.o `test -f 'ntfssect.c' || echo '$(srcdir)/'`ntfssect.c + +libinstaller_a-ntfssect.obj: ntfssect.c + $(AM_V_CC) @AM_BACKSLASH@ + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libinstaller_a_CFLAGS) $(CFLAGS) -c -o libinstaller_a-ntfssect.obj `if test -f 'ntfssect.c'; then $(CYGPATH_W) 'ntfssect.c'; else $(CYGPATH_W) '$(srcdir)/ntfssect.c'; fi` + libinstaller_a-setadv.o: setadv.c $(AM_V_CC) @AM_BACKSLASH@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libinstaller_a_CFLAGS) $(CFLAGS) -c -o libinstaller_a-setadv.o `test -f 'setadv.c' || echo '$(srcdir)/'`setadv.c diff --git a/src/syslinux/libinstaller/fs.c b/src/syslinux/libinstaller/fs.c index 179629e9..19d69d3e 100644 --- a/src/syslinux/libinstaller/fs.c +++ b/src/syslinux/libinstaller/fs.c @@ -18,6 +18,8 @@ #define _XOPEN_SOURCE 500 /* Required on glibc 2.x */ #define _BSD_SOURCE +/* glibc 2.20 deprecates _BSD_SOURCE in favour of _DEFAULT_SOURCE */ +#define _DEFAULT_SOURCE 1 #include #include #include diff --git a/src/syslinux/libinstaller/ntfssect.c b/src/syslinux/libinstaller/ntfssect.c new file mode 100644 index 00000000..32f6d779 --- /dev/null +++ b/src/syslinux/libinstaller/ntfssect.c @@ -0,0 +1,359 @@ +/* -------------------------------------------------------------------------- * + * + * Copyright 2011 Shao Miller - All Rights Reserved + * + * 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 + * the Free Software Foundation, Inc., 53 Temple Place Ste 330, + * Boston MA 02111-1307, USA; either version 2 of the License, or + * (at your option) any later version; incorporated herein by reference. + * + * ------------------------------------------------------------------------- */ + +/**** + * ntfssect.c + * + * Fetch NTFS file cluster & sector information via Windows + * + * With special thanks to Mark Roddy for his article: + * http://www.wd-3.com/archive/luserland.htm + */ +#if defined(_MSC_VER) +#pragma warning(disable:4996) +#endif + +#include +#include +#include +#include + +#include "ntfssect.h" + +/*** Macros */ +#define M_ERR(msg) (NtfsSectLastErrorMessage = (msg)) + +/*** Function declarations */ +static DWORD NtfsSectGetVolumeHandle( + CHAR * VolumeName, + S_NTFSSECT_VOLINFO * VolumeInfo + ); +static DWORD NtfsSectGetVolumePartitionLba(S_NTFSSECT_VOLINFO * VolumeInfo); + +/*** Objects */ +CHAR * NtfsSectLastErrorMessage; + +/*** Function definitions */ +DWORD M_NTFSSECT_API NtfsSectGetFileVcnExtent( + HANDLE File, + LARGE_INTEGER * Vcn, + S_NTFSSECT_EXTENT * Extent + ) { + BOOL bad, ok; + DWORD output_size, rc; + STARTING_VCN_INPUT_BUFFER input; + RETRIEVAL_POINTERS_BUFFER output; + + bad = ( + File == INVALID_HANDLE_VALUE || + !Vcn || + Vcn->QuadPart < 0 || + !Extent + ); + if (bad) + return ERROR_INVALID_PARAMETER; + + input.StartingVcn = *Vcn; + ok = DeviceIoControl( + File, + FSCTL_GET_RETRIEVAL_POINTERS, + &input, + sizeof input, + &output, + sizeof output, + &output_size, + NULL + ); + ok = ok; + rc = GetLastError(); + switch (rc) { + case NO_ERROR: + case ERROR_MORE_DATA: + Extent->FirstVcn = output.StartingVcn; + Extent->NextVcn = output.Extents[0].NextVcn; + Extent->FirstLcn = output.Extents[0].Lcn; + return ERROR_SUCCESS; + + case ERROR_HANDLE_EOF: + break; + + default: + M_ERR("NtfsSectGetFileVcnExtent(): Unknown status!"); + } + + return rc; + } + +/* Internal use only */ +static DWORD NtfsSectGetVolumeHandle( + CHAR * VolumeName, + S_NTFSSECT_VOLINFO * VolumeInfo + ) { + #define M_VOL_PREFIX "\\\\.\\" + CHAR volname[sizeof M_VOL_PREFIX - 1 + MAX_PATH + 1] = M_VOL_PREFIX; + CHAR * const volname_short = volname + sizeof M_VOL_PREFIX - 1; + CHAR * c; + DWORD rc; + + /* Prefix "\\.\" onto the passed volume name */ + strcpy(volname + sizeof M_VOL_PREFIX - 1, VolumeName); + + /* Find the last non-null character */ + for (c = volname_short; *c; ++c) + ; + + /* Remove trailing back-slash */ + if (c[-1] == '\\') + c[-1] = 0; + + /* Open the volume */ + VolumeInfo->Handle = CreateFileA( + volname, + GENERIC_READ, + FILE_SHARE_READ | FILE_SHARE_WRITE, + NULL, + OPEN_EXISTING, + 0, + NULL + ); + rc = GetLastError(); + if (VolumeInfo->Handle == INVALID_HANDLE_VALUE) { + M_ERR("Unable to open volume handle!"); + goto err_handle; + } + + return ERROR_SUCCESS; + + CloseHandle(VolumeInfo->Handle); + err_handle: + + return rc; + } + +DWORD M_NTFSSECT_API NtfsSectGetVolumeInfo( + CHAR * VolumeName, + S_NTFSSECT_VOLINFO * VolumeInfo + ) { + S_NTFSSECT_XPFUNCS xp_funcs; + DWORD rc, free_clusts, total_clusts; + BOOL ok; + + if (!VolumeName || !VolumeInfo) + return ERROR_INVALID_PARAMETER; + + rc = NtfsSectGetVolumeHandle(VolumeName, VolumeInfo); + if (rc != ERROR_SUCCESS) + goto err_handle; + + rc = NtfsSectLoadXpFuncs(&xp_funcs); + if (rc != ERROR_SUCCESS) + goto err_xp_funcs; + + ok = xp_funcs.GetDiskFreeSpace( + VolumeName, + &VolumeInfo->SectorsPerCluster, + &VolumeInfo->BytesPerSector, + &free_clusts, + &total_clusts + ); + rc = GetLastError(); + if (!ok) { + M_ERR("GetDiskFreeSpace() failed!"); + goto err_freespace; + } + + rc = NtfsSectGetVolumePartitionLba(VolumeInfo); + if (rc != ERROR_SUCCESS) + goto err_lba; + + VolumeInfo->Size = sizeof *VolumeInfo; + rc = ERROR_SUCCESS; + + err_lba: + + err_freespace: + + NtfsSectUnloadXpFuncs(&xp_funcs); + err_xp_funcs: + + if (rc != ERROR_SUCCESS) { + CloseHandle(VolumeInfo->Handle); + VolumeInfo->Handle = INVALID_HANDLE_VALUE; + } + err_handle: + + return rc; + } + +DWORD M_NTFSSECT_API NtfsSectGetVolumeInfoFromFileName( + CHAR * FileName, + S_NTFSSECT_VOLINFO * VolumeInfo + ) { + S_NTFSSECT_XPFUNCS xp_funcs; + DWORD rc; + CHAR volname[MAX_PATH + 1]; + BOOL ok; + + if (!FileName || !VolumeInfo) + return ERROR_INVALID_PARAMETER; + + rc = NtfsSectLoadXpFuncs(&xp_funcs); + if (rc != ERROR_SUCCESS) { + goto err_xp_funcs; + } + + ok = xp_funcs.GetVolumePathName( + FileName, + volname, + sizeof volname + ); + rc = GetLastError(); + if (!ok) { + M_ERR("GetVolumePathName() failed!"); + goto err_volname; + } + + rc = NtfsSectGetVolumeInfo(volname, VolumeInfo); + + err_volname: + + NtfsSectUnloadXpFuncs(&xp_funcs); + err_xp_funcs: + + return rc; + } + +/* Internal use only */ +static DWORD NtfsSectGetVolumePartitionLba(S_NTFSSECT_VOLINFO * VolumeInfo) { + BOOL ok; + VOLUME_DISK_EXTENTS vol_disk_extents; + DWORD output_size, rc; + + ok = DeviceIoControl( + VolumeInfo->Handle, + IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS, + NULL, + 0, + &vol_disk_extents, + sizeof vol_disk_extents, + &output_size, + NULL + ); + rc = GetLastError(); + if (!ok) { + M_ERR("Couldn't fetch volume disk extent(s)!"); + goto err_vol_disk_extents; + } + + if (vol_disk_extents.NumberOfDiskExtents != 1) { + M_ERR("Unsupported number of volume disk extents!"); + goto err_num_of_extents; + } + + VolumeInfo->PartitionLba.QuadPart = ( + vol_disk_extents.Extents[0].StartingOffset.QuadPart / + VolumeInfo->BytesPerSector + ); + + return ERROR_SUCCESS; + + err_num_of_extents: + + err_vol_disk_extents: + + return rc; + } + +DWORD M_NTFSSECT_API NtfsSectLcnToLba( + const S_NTFSSECT_VOLINFO * VolumeInfo, + const LARGE_INTEGER * Lcn, + LARGE_INTEGER * Lba + ) { + BOOL bad; + bad = ( + !VolumeInfo || + !VolumeInfo->BytesPerSector || + !VolumeInfo->SectorsPerCluster || + !Lcn || + Lcn->QuadPart < 0 || + !Lba + ); + if (bad) + return ERROR_INVALID_PARAMETER; + + Lba->QuadPart = ( + VolumeInfo->PartitionLba.QuadPart + + Lcn->QuadPart * + VolumeInfo->SectorsPerCluster + ); + return ERROR_SUCCESS; + } + +DWORD M_NTFSSECT_API NtfsSectLoadXpFuncs(S_NTFSSECT_XPFUNCS * XpFuncs) { + DWORD rc; + + if (!XpFuncs) + return ERROR_INVALID_PARAMETER; + + XpFuncs->Size = sizeof *XpFuncs; + + XpFuncs->Kernel32 = LoadLibraryA("kernel32.dll"); + rc = GetLastError(); + if (!XpFuncs->Kernel32) { + M_ERR("KERNEL32.DLL not found!"); + goto err; + } + + XpFuncs->GetVolumePathName = (F_KERNEL32_GETVOLUMEPATHNAME *) ( + GetProcAddress( + XpFuncs->Kernel32, + "GetVolumePathNameA" + ) + ); + rc = GetLastError(); + if (!XpFuncs->GetVolumePathName) { + M_ERR("GetVolumePathName() not found in KERNEL32.DLL!"); + goto err; + } + + XpFuncs->GetDiskFreeSpace = (F_KERNEL32_GETDISKFREESPACE *) ( + GetProcAddress( + XpFuncs->Kernel32, + "GetDiskFreeSpaceA" + ) + ); + rc = GetLastError(); + if (!XpFuncs->GetDiskFreeSpace) { + M_ERR("GetDiskFreeSpace() not found in KERNEL32.DLL!"); + goto err; + } + + return ERROR_SUCCESS; + + err: + NtfsSectUnloadXpFuncs(XpFuncs); + return rc; + } + +VOID M_NTFSSECT_API NtfsSectUnloadXpFuncs(S_NTFSSECT_XPFUNCS * XpFuncs) { + if (!XpFuncs) + return; + + XpFuncs->GetDiskFreeSpace = NULL; + XpFuncs->GetVolumePathName = NULL; + if (XpFuncs->Kernel32) + FreeLibrary(XpFuncs->Kernel32); + XpFuncs->Kernel32 = NULL; + XpFuncs->Size = 0; + return; + } + diff --git a/src/syslinux/libinstaller/ntfssect.h b/src/syslinux/libinstaller/ntfssect.h new file mode 100644 index 00000000..f260af02 --- /dev/null +++ b/src/syslinux/libinstaller/ntfssect.h @@ -0,0 +1,152 @@ +/* -------------------------------------------------------------------------- * + * + * Copyright 2011 Shao Miller - All Rights Reserved + * + * 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 + * the Free Software Foundation, Inc., 53 Temple Place Ste 330, + * Boston MA 02111-1307, USA; either version 2 of the License, or + * (at your option) any later version; incorporated herein by reference. + * + * ------------------------------------------------------------------------- */ +#ifndef M_NTFSSECT_H_ + +/**** + * ntfssect.h + * + * Fetch NTFS file cluster & sector information via Windows + * + * With special thanks to Mark Roddy for his article: + * http://www.wd-3.com/archive/luserland.htm + */ + +/*** Macros */ +#define M_NTFSSECT_H_ +#define M_NTFSSECT_API + +/*** Object types */ + +/* An "extent;" a contiguous range of file data */ +typedef struct S_NTFSSECT_EXTENT_ S_NTFSSECT_EXTENT; + +/* Volume info relevant to file cluster & sector info */ +typedef struct S_NTFSSECT_VOLINFO_ S_NTFSSECT_VOLINFO; + +/* Stores function pointers to some Windows functions */ +typedef struct S_NTFSSECT_XPFUNCS_ S_NTFSSECT_XPFUNCS; + +/*** Function types */ + +/* The function type for Kernel32.dll's GetDiskFreeSpace() */ +typedef BOOL WINAPI F_KERNEL32_GETDISKFREESPACE( + LPCSTR, + LPDWORD, + LPDWORD, + LPDWORD, + LPDWORD + ); + +/* The function type for Kernel32.dll's GetVolumePathName() */ +typedef BOOL WINAPI F_KERNEL32_GETVOLUMEPATHNAME(LPCSTR, LPCSTR, DWORD); + +/*** Function declarations */ + +/** + * Fetch the extent containing a particular VCN + * + * @v File + * @v Vcn + * @v Extent + * @ret DWORD + */ +DWORD M_NTFSSECT_API NtfsSectGetFileVcnExtent( + HANDLE File, + LARGE_INTEGER * Vcn, + S_NTFSSECT_EXTENT * Extent + ); + +/** + * Populate a volume info object + * + * @v VolumeName + * @v VolumeInfo + * @ret DWORD + */ +DWORD M_NTFSSECT_API NtfsSectGetVolumeInfo( + CHAR * VolumeName, + S_NTFSSECT_VOLINFO * VolumeInfo + ); + +/** + * Populate a volume info object + * + * @v FileName + * @v VolumeInfo + * @ret DWORD + */ +DWORD M_NTFSSECT_API NtfsSectGetVolumeInfoFromFileName( + CHAR * FileName, + S_NTFSSECT_VOLINFO * VolumeInfo + ); + +/** + * Convert a volume LCN to an absolute disk LBA + * + * @v VolumeInfo + * @v Lcn + * @v Lba + * @ret DWORD + */ +DWORD M_NTFSSECT_API NtfsSectLcnToLba( + const S_NTFSSECT_VOLINFO * VolumeInfo, + const LARGE_INTEGER * Lcn, + LARGE_INTEGER * Lba + ); + +/** + * Load some helper XP functions + * + * @v XpFuncs + * @ret DWORD + */ +DWORD M_NTFSSECT_API NtfsSectLoadXpFuncs(S_NTFSSECT_XPFUNCS * XpFuncs); + +/** + * Unload some helper XP functions + * + * @v XpFuncs + * @ret DWORD + */ +VOID M_NTFSSECT_API NtfsSectUnloadXpFuncs(S_NTFSSECT_XPFUNCS * XpFuncs); + +/*** Object declarations */ + +/** + * The last error message set by one of our functions. + * Obviously not per-thread + */ +extern CHAR * NtfsSectLastErrorMessage; + +/*** Struct/union definitions */ +struct S_NTFSSECT_EXTENT_ { + LARGE_INTEGER FirstVcn; + LARGE_INTEGER NextVcn; + LARGE_INTEGER FirstLcn; + }; + +struct S_NTFSSECT_VOLINFO_ { + DWORD Size; + HANDLE Handle; + DWORD BytesPerSector; + DWORD SectorsPerCluster; + LARGE_INTEGER PartitionLba; + }; + +struct S_NTFSSECT_XPFUNCS_ { + DWORD Size; + HMODULE Kernel32; + F_KERNEL32_GETVOLUMEPATHNAME * GetVolumePathName; + F_KERNEL32_GETDISKFREESPACE * GetDiskFreeSpace; + }; + +#endif /* M_NTFSSECT_H_ */ diff --git a/src/syslinux/libinstaller/syslinux.h b/src/syslinux/libinstaller/syslinux.h index fba4630e..8907321c 100644 --- a/src/syslinux/libinstaller/syslinux.h +++ b/src/syslinux/libinstaller/syslinux.h @@ -18,6 +18,14 @@ #include "advconst.h" #include "setadv.h" +#ifdef __CHECKER__ +# define _slimg __attribute__((noderef,address_space(1))) +# define _force __attribute__((force)) +#else +# define _slimg +# define _force +#endif + /* The standard boot sector and ldlinux image */ extern unsigned char* syslinux_ldlinux[2]; extern DWORD syslinux_ldlinux_len[2]; diff --git a/src/syslinux/libinstaller/syslxfs.h b/src/syslinux/libinstaller/syslxfs.h index 40ed56da..61568958 100644 --- a/src/syslinux/libinstaller/syslxfs.h +++ b/src/syslinux/libinstaller/syslxfs.h @@ -1,5 +1,5 @@ /* - * Copyright 2011 Paulo Alcantara + * Copyright 2011-2012 Paulo Alcantara * * 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 @@ -12,13 +12,16 @@ #ifndef _SYSLXFS_H_ #define _SYSLXFS_H_ -/* Global fs_type for handling fat, ntfs, ext2/3/4 and btrfs */ +/* Global fs_type for handling fat, ntfs, ext2/3/4, btrfs, xfs and ufs1/2 */ enum filesystem { NONE, EXT2, BTRFS, VFAT, NTFS, + XFS, + UFS1, + UFS2, }; //extern int fs_type; diff --git a/src/syslinux/libinstaller/syslxint.h b/src/syslinux/libinstaller/syslxint.h index 5872c7db..95eef2bc 100644 --- a/src/syslinux/libinstaller/syslxint.h +++ b/src/syslinux/libinstaller/syslxint.h @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------- * * * Copyright 2007-2008 H. Peter Anvin - All Rights Reserved - * Copyright 2009-2011 Intel Corporation; author: H. Peter Anvin + * Copyright 2009-2014 Intel Corporation; author: H. Peter Anvin * Copyright 2011 Paulo Alcantara * * This program is free software; you can redistribute it and/or modify @@ -26,16 +26,15 @@ #ifdef __GNUC__ # ifdef __MINGW32__ /* gcc 4.7 miscompiles packed structures in MS-bitfield mode */ -# define GNUC_PACKED __attribute__((packed,gcc_struct)) +# define PACKME +# define PACKED __attribute__((packed,gcc_struct)) # else -# define GNUC_PACKED __attribute__((packed)) +# define PACKME +# define PACKED __attribute__((packed)) # endif -# define PRAGMA_BEGIN_PACKED -# define PRAGMA_END_PACKED #elif defined(_MSC_VER) -# define GNUC_PACKED -# define PRAGMA_BEGIN_PACKED __pragma(pack(push, 1)) -# define PRAGMA_END_PACKED __pragma(pack(pop)) +# define PACKME __pragma(pack(push, 1)) +# define PACKED __pragma(pack(pop)) #else # error "Need to define PACKED for this compiler" #endif @@ -66,7 +65,7 @@ static inline uint32_t get_32(const uint32_t * p) return *p; #else const uint16_t *pp = (const uint16_t *)p; - return get_16(pp[0]) + (uint32_t)get_16(pp[1]); + return get_16(&pp[0]) + ((uint32_t)get_16(&pp[1]) << 16); #endif } @@ -77,7 +76,7 @@ static inline uint64_t get_64(const uint64_t * p) return *p; #else const uint32_t *pp = (const uint32_t *)p; - return get_32(pp[0]) + (uint64_t)get_32(pp[1]); + return get_32(&pp[0]) + ((uint64_t)get_32(&pp[1]) << 32); #endif } @@ -104,11 +103,9 @@ static inline void set_32(uint32_t *p, uint32_t v) /* Littleendian and unaligned-capable */ *p = v; #else - uint8_t *pp = (uint8_t *) p; - pp[0] = (v & 0xff); - pp[1] = ((v >> 8) & 0xff); - pp[2] = ((v >> 16) & 0xff); - pp[3] = ((v >> 24) & 0xff); + uint16_t *pp = (uint16_t *) p; + set_16(&pp[0], v); + set_16(&pp[1], v >> 16); #endif } @@ -119,8 +116,8 @@ static inline void set_64(uint64_t *p, uint64_t v) *p = v; #else uint32_t *pp = (uint32_t *) p; - set_32(pp[0], v); - set_32(pp[1], v >> 32); + set_32(&pp[0], v); + set_32(&pp[1], v >> 32); #endif } @@ -130,47 +127,65 @@ static inline void set_64(uint64_t *p, uint64_t v) */ #ifdef __MSDOS__ -static inline __attribute__ ((const)) -uint16_t ds(void) -{ - uint16_t v; - asm("movw %%ds,%0":"=rm"(v)); - return v; -} - -static inline void *set_fs(const void *p) -{ - uint16_t seg; - - seg = ds() + ((size_t) p >> 4); - asm volatile ("movw %0,%%fs"::"rm" (seg)); - return (void *)((size_t) p & 0xf); -} - -uint8_t get_8_sl(const uint8_t * p); -uint16_t get_16_sl(const uint16_t * p); -uint32_t get_32_sl(const uint32_t * p); -uint64_t get_64_sl(const uint64_t * p); -void set_8_sl(uint8_t * p, uint8_t v); -void set_16_sl(uint16_t * p, uint16_t v); -void set_32_sl(uint32_t * p, uint32_t v); -void set_64_sl(uint64_t * p, uint64_t v); -void memcpy_to_sl(void *dst, const void *src, size_t len); -void memcpy_from_sl(void *dst, const void *src, size_t len); +uint8_t get_8_sl(const uint8_t _slimg * p); +uint16_t get_16_sl(const uint16_t _slimg * p); +uint32_t get_32_sl(const uint32_t _slimg * p); +uint64_t get_64_sl(const uint64_t _slimg * p); +void set_8_sl(uint8_t _slimg * p, uint8_t v); +void set_16_sl(uint16_t _slimg * p, uint16_t v); +void set_32_sl(uint32_t _slimg * p, uint32_t v); +void set_64_sl(uint64_t _slimg * p, uint64_t v); +void memcpy_to_sl(void _slimg *dst, const void *src, size_t len); +void memcpy_from_sl(void *dst, const void _slimg *src, size_t len); +void memset_sl(void _slimg *dst, int c, size_t len); #else /* Sane system ... */ -#define get_8_sl(x) get_8(x) -#define get_16_sl(x) get_16(x) -#define get_32_sl(x) get_32(x) -#define get_64_sl(x) get_64(x) -#define set_8_sl(x,y) set_8(x,y) -#define set_16_sl(x,y) set_16(x,y) -#define set_32_sl(x,y) set_32(x,y) -#define set_64_sl(x,y) set_64(x,y) -#define memcpy_to_sl(d,s,l) memcpy(d,s,l) -#define memcpy_from_sl(d,s,l) memcpy(d,s,l) +static inline uint8_t get_8_sl(const uint8_t _slimg * p) +{ + return get_8((const uint8_t _force *)p); +} +static inline uint16_t get_16_sl(const uint16_t _slimg * p) +{ + return get_16((const uint16_t _force *)p); +} +static inline uint32_t get_32_sl(const uint32_t _slimg * p) +{ + return get_32((const uint32_t _force *)p); +} +static inline uint64_t get_64_sl(const uint64_t _slimg * p) +{ + return get_64((const uint64_t _force *)p); +} +static inline void set_8_sl(uint8_t _slimg * p, uint8_t v) +{ + set_8((uint8_t _force *)p, v); +} +static inline void set_16_sl(uint16_t _slimg * p, uint16_t v) +{ + set_16((uint16_t _force *)p, v); +} +static inline void set_32_sl(uint32_t _slimg * p, uint32_t v) +{ + set_32((uint32_t _force *)p, v); +} +static inline void set_64_sl(uint64_t _slimg * p, uint64_t v) +{ + set_64((uint64_t _force *)p, v); +} +static inline void memcpy_to_sl(void _slimg *dst, const void *src, size_t len) +{ + memcpy((void _force *)dst, src, len); +} +static inline void memcpy_from_sl(void *dst, const void _slimg *src, size_t len) +{ + memcpy(dst, (const void _force *)src, len); +} +static inline void memset_sl(void _slimg *dst, int c, size_t len) +{ + memset((void _force *)dst, c, len); +} #endif @@ -204,13 +219,14 @@ struct ext_patch_area { }; /* Sector extent */ -PRAGMA_BEGIN_PACKED +PACKME struct syslinux_extent { uint64_t lba; uint16_t len; -} GNUC_PACKED; +} PACKED; /* FAT bootsector format, also used by other disk-based derivatives */ +PACKME struct fat_boot_sector { uint8_t bsJump[3]; char bsOemName[8]; @@ -227,7 +243,9 @@ struct fat_boot_sector { uint32_t bsHiddenSecs; uint32_t bsHugeSectors; + PACKME union { + PACKME struct { uint8_t DriveNumber; uint8_t Reserved1; @@ -236,7 +254,8 @@ struct fat_boot_sector { char VolumeLabel[11]; char FileSysType[8]; uint8_t Code[442]; - } GNUC_PACKED bs16; + } PACKED bs16; + PACKME struct { uint32_t FATSz32; uint16_t ExtFlags; @@ -252,15 +271,16 @@ struct fat_boot_sector { char VolumeLabel[11]; char FileSysType[8]; uint8_t Code[414]; - } GNUC_PACKED bs32; - } GNUC_PACKED; + } PACKED bs32; + } PACKED; uint32_t bsMagic; uint16_t bsForwardPtr; uint16_t bsSignature; -} GNUC_PACKED; +} PACKED; /* NTFS bootsector format */ +PACKME struct ntfs_boot_sector { uint8_t bsJump[3]; char bsOemName[8]; @@ -291,8 +311,7 @@ struct ntfs_boot_sector { uint32_t bsMagic; uint16_t bsForwardPtr; uint16_t bsSignature; -} GNUC_PACKED; -PRAGMA_END_PACKED +} PACKED; #define FAT_bsHead bsJump #define FAT_bsHeadLen offsetof(struct fat_boot_sector, bsBytesPerSec) diff --git a/src/syslinux/libinstaller/syslxmod.c b/src/syslinux/libinstaller/syslxmod.c index e2a66bc0..6ce432f1 100644 --- a/src/syslinux/libinstaller/syslxmod.c +++ b/src/syslinux/libinstaller/syslxmod.c @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------- * * * Copyright 1998-2008 H. Peter Anvin - All Rights Reserved - * Copyright 2009-2010 Intel Corporation; author H. Peter Anvin + * Copyright 2009-2014 Intel Corporation; author H. Peter Anvin * * 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 @@ -17,6 +17,8 @@ #define _XOPEN_SOURCE 500 /* Required on glibc 2.x */ #define _BSD_SOURCE +/* glibc 2.20 deprecates _BSD_SOURCE in favour of _DEFAULT_SOURCE */ +#define _DEFAULT_SOURCE 1 #include #include #include @@ -30,7 +32,7 @@ /* * Generate sector extents */ -static void generate_extents(struct syslinux_extent *ex, int nptrs, +static void generate_extents(struct syslinux_extent _slimg *ex, int nptrs, const sector_t *sectp, int nsect) { uint32_t addr = 0x8000; /* ldlinux.sys starts loading here */ @@ -42,7 +44,7 @@ static void generate_extents(struct syslinux_extent *ex, int nptrs, len = 0; lba = 0; - memset(ex, 0, nptrs * sizeof *ex); + memset_sl(ex, 0, nptrs * sizeof *ex); while (nsect) { sect = *sectp++; @@ -81,10 +83,15 @@ static void generate_extents(struct syslinux_extent *ex, int nptrs, /* * Form a pointer based on a 16-bit patcharea/epa field */ -static inline void *ptr(void *img, uint16_t *offset_p) +static inline void *ptr(void *img, const uint16_t _slimg *offset_p) { return (char *)img + get_16_sl(offset_p); } +static inline void _slimg *slptr(void _slimg *img, + const uint16_t _slimg *offset_p) +{ + return (char _slimg *)img + get_16_sl(offset_p); +} /* * This patches the boot sector and the beginning of ldlinux.sys @@ -101,25 +108,26 @@ int syslinux_patch(const sector_t *sectp, int nsectors, int stupid, int raid_mode, const char *subdir, const char *subvol) { - struct patch_area *patcharea; - struct ext_patch_area *epa; - struct syslinux_extent *ex; - uint32_t *wp; + struct patch_area _slimg *patcharea; + struct ext_patch_area _slimg *epa; + struct syslinux_extent _slimg *ex; + const uint32_t _slimg *wp; int nsect = ((boot_image_len + SECTOR_SIZE - 1) >> SECTOR_SHIFT) + 2; uint32_t csum; int i, dw, nptrs; struct fat_boot_sector *sbs = (struct fat_boot_sector *)boot_sector; - uint64_t *advptrs; + uint64_t _slimg *advptrs; if (nsectors < nsect) return -1; /* The actual file is too small for content */ /* Search for LDLINUX_MAGIC to find the patch area */ - for (wp = (uint32_t *)boot_image; get_32_sl(wp) != LDLINUX_MAGIC; + for (wp = (const uint32_t _slimg *)boot_image; + get_32_sl(wp) != LDLINUX_MAGIC; wp++) ; - patcharea = (struct patch_area *)wp; - epa = ptr(boot_image, &patcharea->epaoffset); + patcharea = (struct patch_area _slimg *)wp; + epa = slptr(boot_image, &patcharea->epaoffset); /* First sector need pointer in boot sector */ set_32(ptr(sbs, &epa->sect1ptr0), (uint32_t) sectp[0]); @@ -145,20 +153,22 @@ int syslinux_patch(const sector_t *sectp, int nsectors, } /* Set the sector extents */ - ex = ptr(boot_image, &epa->secptroffset); + ex = slptr(boot_image, &epa->secptroffset); nptrs = get_16_sl(&epa->secptrcnt); +#if 0 if (nsect > nptrs) { /* Not necessarily an error in this case, but a general problem */ fprintf(stderr, "Insufficient extent space, build error!\n"); exit(1); } +#endif /* -1 for the pointer in the boot sector, -2 for the two ADVs */ generate_extents(ex, nptrs, sectp, nsect-1-2); /* ADV pointers */ - advptrs = ptr(boot_image, &epa->advptroffset); + advptrs = slptr(boot_image, &epa->advptroffset); set_64_sl(&advptrs[0], sectp[nsect-1-2]); set_64_sl(&advptrs[1], sectp[nsect-1-1]); @@ -169,7 +179,7 @@ int syslinux_patch(const sector_t *sectp, int nsectors, fprintf(stderr, "Subdirectory path too long... aborting install!\n"); exit(1); } - memcpy_to_sl(ptr(boot_image, &epa->diroffset), subdir, sublen); + memcpy_to_sl(slptr(boot_image, &epa->diroffset), subdir, sublen); } /* Poke in the subvolume information */ @@ -179,14 +189,14 @@ int syslinux_patch(const sector_t *sectp, int nsectors, fprintf(stderr, "Subvol name too long... aborting install!\n"); exit(1); } - memcpy_to_sl(ptr(boot_image, &epa->subvoloffset), subvol, sublen); + memcpy_to_sl(slptr(boot_image, &epa->subvoloffset), subvol, sublen); } /* Now produce a checksum */ set_32_sl(&patcharea->checksum, 0); csum = LDLINUX_MAGIC; - for (i = 0, wp = (uint32_t *)boot_image; i < dw; i++, wp++) + for (i = 0, wp = (const uint32_t _slimg *)boot_image; i < dw; i++, wp++) csum -= get_32_sl(wp); /* Negative checksum */ set_32_sl(&patcharea->checksum, csum);