* Added initial NTFS support

* Added load system based on fragments

This commit is made possible for Oggzee and his great work on supporting other filesystems!
This commit is contained in:
e.bovendeur 2009-12-19 14:05:31 +00:00
parent f9358f8b30
commit 3aa838dec9
61 changed files with 1552 additions and 442 deletions

View File

@ -2,8 +2,8 @@
<app version="1">
<name> USB Loader GX</name>
<coder>USB Loader GX Team</coder>
<version>1.0 r866</version>
<release_date>200912151155</release_date>
<version>1.0 r867</version>
<release_date>200912161915</release_date>
<short_description>Loads games from USB-devices</short_description>
<long_description>USB Loader GX is a libwiigui based USB iso loader with a wii-like GUI. You can install games to your HDDs and boot them with shorter loading times.
The interactive GUI is completely controllable with WiiMote, Classic Controller or GC Controller.

View File

@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: USB Loader GX\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2009-12-13 17:09+0100\n"
"POT-Creation-Date: 2009-12-17 00:06+0100\n"
"PO-Revision-Date: 2009-10-01 01:00+0200\n"
"Last-Translator: David Jelinek (djelinek@hotmail.com) \n"
"Language-Team: r823 - last version on http://djelinek.sweb.cz/_USBLoderGX/czech.lang \n"
@ -665,6 +665,9 @@ msgstr "Chyba pri instalaci"
msgid "Install a game"
msgstr "Nainstalovat hru"
msgid "Install not possible"
msgstr ""
msgid "Install partitions"
msgstr ""
@ -813,7 +816,7 @@ msgstr "Žádné zarízení USB"
msgid "No USB Device found."
msgstr "Nebylo nalezeno zarízení USB"
msgid "No WBFS or FAT game partition found"
msgid "No WBFS or FAT/NTFS partition found"
msgstr ""
msgid "No cheats were selected"
@ -1260,6 +1263,9 @@ msgstr "Pokoušíte se smazat "
msgid "You are choosing to display favorites and you do not have any selected."
msgstr "Vybíráte zobrazení oblíbených, ale žádné jste dosud nevybral"
msgid "You are using NTFS filesystem. Due to possible write errors to a NTFS partition, installing a game is not possible."
msgstr ""
msgid "You don't have Parental Control enabled. If you wish to use Parental Control, enable it in the Wii Settings."
msgstr ""
@ -1300,7 +1306,7 @@ msgstr "souboru zbývá"
msgid "files not found on the server!"
msgstr "souboru nenalezeno na serveru"
msgid "for FAT support"
msgid "for FAT/NTFS support"
msgstr ""
msgid "for Ocarina"

View File

@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: USB Loader GX\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2009-12-13 17:09+0100\n"
"POT-Creation-Date: 2009-12-17 00:06+0100\n"
"PO-Revision-Date: 2009-10-01 01:00+0200\n"
"Last-Translator: dorf[dk]\n"
"Language-Team: dorf[dk]\n"
@ -665,6 +665,9 @@ msgstr "Installationsfejl!"
msgid "Install a game"
msgstr "Installér nyt spil"
msgid "Install not possible"
msgstr ""
msgid "Install partitions"
msgstr ""
@ -813,8 +816,8 @@ msgstr "Ingen USB-enhed tilsluttet"
msgid "No USB Device found."
msgstr "Ingen USB-enhed fundet."
msgid "No WBFS or FAT game partition found"
msgstr "Der blev ikke fundet en WBFS- eller FAT-partition med spil"
msgid "No WBFS or FAT/NTFS partition found"
msgstr ""
msgid "No cheats were selected"
msgstr "Der blev ikke valgt nogle cheats"
@ -1260,6 +1263,9 @@ msgstr "Du er ved at slette "
msgid "You are choosing to display favorites and you do not have any selected."
msgstr "Du har valgt at vise favoritter, men ingen spil er markerede som favoritter."
msgid "You are using NTFS filesystem. Due to possible write errors to a NTFS partition, installing a game is not possible."
msgstr ""
msgid "You don't have Parental Control enabled. If you wish to use Parental Control, enable it in the Wii Settings."
msgstr ""
@ -1300,7 +1306,7 @@ msgstr "filer tilbage"
msgid "files not found on the server!"
msgstr "filer blev ikke fundet på serveren!"
msgid "for FAT support"
msgid "for FAT/NTFS support"
msgstr ""
msgid "for Ocarina"
@ -1339,6 +1345,9 @@ msgstr "af"
msgid "seconds left"
msgstr "sekunder tilbage"
#~ msgid "No WBFS or FAT game partition found"
#~ msgstr "Der blev ikke fundet en WBFS- eller FAT-partition med spil"
#~ msgid "Exit USB Loader GX?"
#~ msgstr "Afslut USB Loader GX?"

View File

@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: USB Loader GX\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2009-12-15 12:58+0100\n"
"POT-Creation-Date: 2009-12-17 00:06+0100\n"
"PO-Revision-Date: 2009-10-01 01:00+0200\n"
"Last-Translator: glowy\n"
"Language-Team: tj_cool, glowy\n"
@ -665,6 +665,9 @@ msgstr "Installatiefout!"
msgid "Install a game"
msgstr "Spel installeren"
msgid "Install not possible"
msgstr ""
msgid "Install partitions"
msgstr "Installatie partitie"
@ -813,8 +816,8 @@ msgstr "Geen USB apparaat"
msgid "No USB Device found."
msgstr "Geen USB apparaat gevonden."
msgid "No WBFS or FAT game partition found"
msgstr "Geen WBFS of FAT spel partitie gevonden"
msgid "No WBFS or FAT/NTFS partition found"
msgstr ""
msgid "No cheats were selected"
msgstr "Geen cheats geselecteerd"
@ -1260,6 +1263,9 @@ msgstr "Je wilt nu verwijderen: "
msgid "You are choosing to display favorites and you do not have any selected."
msgstr "Je wilt favorieten tonen, maar je hebt er geen ingesteld."
msgid "You are using NTFS filesystem. Due to possible write errors to a NTFS partition, installing a game is not possible."
msgstr ""
msgid "You don't have Parental Control enabled. If you wish to use Parental Control, enable it in the Wii Settings."
msgstr "Je hebt ouderlijk toezicht niet ingeschakeld. Als je ouderlijk toezicht wilt gebruiken, zet het dan aan in de Wii instellingen."
@ -1300,8 +1306,8 @@ msgstr "Bestanden resterend"
msgid "files not found on the server!"
msgstr "Bestanden niet gevonden op server!"
msgid "for FAT support"
msgstr "voor FAT ondersteuning"
msgid "for FAT/NTFS support"
msgstr ""
msgid "for Ocarina"
msgstr "voor Ocarina"
@ -1339,6 +1345,12 @@ msgstr "van"
msgid "seconds left"
msgstr "seconden over"
#~ msgid "No WBFS or FAT game partition found"
#~ msgstr "Geen WBFS of FAT spel partitie gevonden"
#~ msgid "for FAT support"
#~ msgstr "voor FAT ondersteuning"
#~ msgid "Failed to extract opening.bnr"
#~ msgstr "Uitpakken opening.bnr mislukt"

View File

@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: USB Loader GX\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2009-12-13 17:09+0100\n"
"POT-Creation-Date: 2009-12-17 00:06+0100\n"
"PO-Revision-Date: 2009-10-01 01:00+0200\n"
"Last-Translator: \n"
"Language-Team: \n"
@ -665,6 +665,9 @@ msgstr ""
msgid "Install a game"
msgstr ""
msgid "Install not possible"
msgstr ""
msgid "Install partitions"
msgstr ""
@ -813,7 +816,7 @@ msgstr ""
msgid "No USB Device found."
msgstr ""
msgid "No WBFS or FAT game partition found"
msgid "No WBFS or FAT/NTFS partition found"
msgstr ""
msgid "No cheats were selected"
@ -1260,6 +1263,9 @@ msgstr ""
msgid "You are choosing to display favorites and you do not have any selected."
msgstr ""
msgid "You are using NTFS filesystem. Due to possible write errors to a NTFS partition, installing a game is not possible."
msgstr ""
msgid "You don't have Parental Control enabled. If you wish to use Parental Control, enable it in the Wii Settings."
msgstr ""
@ -1300,7 +1306,7 @@ msgstr ""
msgid "files not found on the server!"
msgstr ""
msgid "for FAT support"
msgid "for FAT/NTFS support"
msgstr ""
msgid "for Ocarina"

View File

@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: USB Loader GX\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2009-12-13 17:09+0100\n"
"POT-Creation-Date: 2009-12-17 00:06+0100\n"
"PO-Revision-Date: 2009-10-01 01:00+0200\n"
"Last-Translator: c64rmx\n"
"Language-Team: \n"
@ -665,6 +665,9 @@ msgstr "Asennusvirhe!"
msgid "Install a game"
msgstr "Asenna peli"
msgid "Install not possible"
msgstr ""
msgid "Install partitions"
msgstr ""
@ -813,7 +816,7 @@ msgstr "Ei USB-laitetta"
msgid "No USB Device found."
msgstr "USB-laitetta ei löytynyt."
msgid "No WBFS or FAT game partition found"
msgid "No WBFS or FAT/NTFS partition found"
msgstr ""
msgid "No cheats were selected"
@ -1260,6 +1263,9 @@ msgstr "Olet tuhoamassa "
msgid "You are choosing to display favorites and you do not have any selected."
msgstr "Olet valinnut näyttääksesi suosikit mutta sinulla ei ole valittuna yhtään."
msgid "You are using NTFS filesystem. Due to possible write errors to a NTFS partition, installing a game is not possible."
msgstr ""
msgid "You don't have Parental Control enabled. If you wish to use Parental Control, enable it in the Wii Settings."
msgstr ""
@ -1300,7 +1306,7 @@ msgstr "Tiedostoja jäljellä"
msgid "files not found on the server!"
msgstr "tiedostoja ei löytynyt serveriltä!"
msgid "for FAT support"
msgid "for FAT/NTFS support"
msgstr ""
msgid "for Ocarina"

View File

@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: USB Loader GX\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2009-12-13 17:09+0100\n"
"POT-Creation-Date: 2009-12-17 00:06+0100\n"
"PO-Revision-Date: 2009-10-01 01:00+0200\n"
"Last-Translator: Kin8\n"
"Language-Team: Badablek, Amour, ikya, dj_skual & Kin8\n"
@ -665,6 +665,9 @@ msgstr "Erreur à l'installation !"
msgid "Install a game"
msgstr "Installer un jeu"
msgid "Install not possible"
msgstr ""
msgid "Install partitions"
msgstr "Installation"
@ -813,8 +816,8 @@ msgstr "Aucun périphérique USB"
msgid "No USB Device found."
msgstr "Aucun périphérique USB trouvé."
msgid "No WBFS or FAT game partition found"
msgstr "Aucune partition WBFS ou FAT trouvée"
msgid "No WBFS or FAT/NTFS partition found"
msgstr ""
msgid "No cheats were selected"
msgstr "Aucune selection de triche"
@ -1260,6 +1263,9 @@ msgstr "Vous êtes sur le point de supprimer "
msgid "You are choosing to display favorites and you do not have any selected."
msgstr "Vous choisissez d'afficher des favoris alors que vous n'en avez aucun."
msgid "You are using NTFS filesystem. Due to possible write errors to a NTFS partition, installing a game is not possible."
msgstr ""
msgid "You don't have Parental Control enabled. If you wish to use Parental Control, enable it in the Wii Settings."
msgstr "Contrôle Parental désactivé. Si vous voulez l'utiliser, activez-le dans les Paramètres de votre Wii."
@ -1300,8 +1306,8 @@ msgstr "fichiers restants"
msgid "files not found on the server!"
msgstr "fichiers introuvables sur le serveur !"
msgid "for FAT support"
msgstr "pour le support FAT"
msgid "for FAT/NTFS support"
msgstr ""
msgid "for Ocarina"
msgstr "pour Ocarina"
@ -1339,6 +1345,12 @@ msgstr "sur"
msgid "seconds left"
msgstr "secondes restantes"
#~ msgid "No WBFS or FAT game partition found"
#~ msgstr "Aucune partition WBFS ou FAT trouvée"
#~ msgid "for FAT support"
#~ msgstr "pour le support FAT"
#~ msgid "Failed to extract opening.bnr"
#~ msgstr "Extraction opening.bnr échouée"

View File

@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: USB Loader GX\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2009-12-15 12:58+0100\n"
"POT-Creation-Date: 2009-12-17 00:06+0100\n"
"PO-Revision-Date: 2009-10-01 01:00+0200\n"
"Last-Translator: ZEN.13\n"
"Language-Team: Snoozer, wishmasterf, Bertilax, ZEN.13\n"
@ -665,6 +665,9 @@ msgstr "Installationsfehler!"
msgid "Install a game"
msgstr "ein Spiel installieren"
msgid "Install not possible"
msgstr ""
msgid "Install partitions"
msgstr "Partitionen installieren"
@ -813,8 +816,8 @@ msgstr "Kein USB Gerät"
msgid "No USB Device found."
msgstr "Kein USB Gerät gefunden."
msgid "No WBFS or FAT game partition found"
msgstr "Keine WBFS oder FAT Partition gefunden"
msgid "No WBFS or FAT/NTFS partition found"
msgstr ""
msgid "No cheats were selected"
msgstr "Es wurden keine Cheats ausgewählt"
@ -1260,6 +1263,9 @@ msgstr "Du bist dabei zu löschen "
msgid "You are choosing to display favorites and you do not have any selected."
msgstr "Du willst Favoriten anzeigen, hast aber keine ausgewählt."
msgid "You are using NTFS filesystem. Due to possible write errors to a NTFS partition, installing a game is not possible."
msgstr ""
msgid "You don't have Parental Control enabled. If you wish to use Parental Control, enable it in the Wii Settings."
msgstr "Du hast die Altersbeschränkung nicht aktiviert. Wenn du sie nutzen möchtest, aktiviere sie in den Wii-Systemeinstellungen."
@ -1300,8 +1306,8 @@ msgstr "Dateien fehlen"
msgid "files not found on the server!"
msgstr "Datei(en) auf dem Server nicht gefunden!"
msgid "for FAT support"
msgstr "für den FAT Support"
msgid "for FAT/NTFS support"
msgstr ""
msgid "for Ocarina"
msgstr "für Ocarina"
@ -1339,6 +1345,12 @@ msgstr "von"
msgid "seconds left"
msgstr "Sekunden verbleiben"
#~ msgid "No WBFS or FAT game partition found"
#~ msgstr "Keine WBFS oder FAT Partition gefunden"
#~ msgid "for FAT support"
#~ msgstr "für den FAT Support"
#~ msgid "No WBFS partition found"
#~ msgstr "Keine WBFS Partition gefunden"

View File

@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: USB Loader GX\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2009-12-13 17:09+0100\n"
"POT-Creation-Date: 2009-12-17 00:06+0100\n"
"PO-Revision-Date: 2009-12-01 13:23+0100\n"
"Last-Translator: Springdale\n"
"Language-Team: Tusk, Springdale\n"
@ -665,6 +665,9 @@ msgstr "Telepítési Hiba!"
msgid "Install a game"
msgstr "Játék telepítése"
msgid "Install not possible"
msgstr ""
msgid "Install partitions"
msgstr ""
@ -813,8 +816,8 @@ msgstr "Nincs USB meghajtó"
msgid "No USB Device found."
msgstr "Nincs USB meghajtó csatlakoztatva."
msgid "No WBFS or FAT game partition found"
msgstr "Nem található WBFS vagy FAT partíció"
msgid "No WBFS or FAT/NTFS partition found"
msgstr ""
msgid "No cheats were selected"
msgstr "Nincsenek kiválasztott cheat-ek"
@ -1260,6 +1263,9 @@ msgstr "Törölni készülsz: "
msgid "You are choosing to display favorites and you do not have any selected."
msgstr "A Kedvencek megjelenítését választottad, de egy játék sincs így megjelölve."
msgid "You are using NTFS filesystem. Due to possible write errors to a NTFS partition, installing a game is not possible."
msgstr ""
msgid "You don't have Parental Control enabled. If you wish to use Parental Control, enable it in the Wii Settings."
msgstr ""
@ -1300,7 +1306,7 @@ msgstr "hátralévõ fájl"
msgid "files not found on the server!"
msgstr "fájl nem található a szerveren"
msgid "for FAT support"
msgid "for FAT/NTFS support"
msgstr ""
msgid "for Ocarina"
@ -1339,6 +1345,9 @@ msgstr "./"
msgid "seconds left"
msgstr "hátralévõ másodperc"
#~ msgid "No WBFS or FAT game partition found"
#~ msgstr "Nem található WBFS vagy FAT partíció"
#~ msgid "Exit USB Loader GX?"
#~ msgstr "Kilépés az USB Loader GX-bõl?"

View File

@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: USB Loader GX\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2009-12-13 17:09+0100\n"
"POT-Creation-Date: 2009-12-17 00:06+0100\n"
"PO-Revision-Date: 2009-10-01 01:00+0200\n"
"Last-Translator: Cambo \n"
"Language-Team: FoxeJoe, Cambo\n"
@ -665,6 +665,9 @@ msgstr "Errore Installazione!"
msgid "Install a game"
msgstr "Installa un gioco"
msgid "Install not possible"
msgstr ""
msgid "Install partitions"
msgstr "Installa partizioni"
@ -813,8 +816,8 @@ msgstr "Nessun Dispositivo USB"
msgid "No USB Device found."
msgstr "Nessun Dispositivo USB trovato."
msgid "No WBFS or FAT game partition found"
msgstr "Nessuna partizione WBFS o FAT trovata"
msgid "No WBFS or FAT/NTFS partition found"
msgstr ""
msgid "No cheats were selected"
msgstr "Non è stato selezionato alcun trucco"
@ -1260,6 +1263,9 @@ msgstr "Stai per eliminare "
msgid "You are choosing to display favorites and you do not have any selected."
msgstr "Hai scelto di visualizzare i preferiti e non ne hai selezionato nessuno"
msgid "You are using NTFS filesystem. Due to possible write errors to a NTFS partition, installing a game is not possible."
msgstr ""
msgid "You don't have Parental Control enabled. If you wish to use Parental Control, enable it in the Wii Settings."
msgstr "Il Controllo Genitori non è attivo. Se vuoi utilizzare il Controllo Genitori abilitalo nelle Impostazioni della Wii."
@ -1300,8 +1306,8 @@ msgstr "file mancanti"
msgid "files not found on the server!"
msgstr "file non trovato/i sul server!"
msgid "for FAT support"
msgstr "per il supporto delle partizioni FAT"
msgid "for FAT/NTFS support"
msgstr ""
msgid "for Ocarina"
msgstr "per Ocarina"
@ -1339,6 +1345,12 @@ msgstr "di"
msgid "seconds left"
msgstr "secondi mancanti"
#~ msgid "No WBFS or FAT game partition found"
#~ msgstr "Nessuna partizione WBFS o FAT trovata"
#~ msgid "for FAT support"
#~ msgstr "per il supporto delle partizioni FAT"
#~ msgid "Failed to extract opening.bnr"
#~ msgstr "Estrazione opening.bnr fallita"

View File

@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: USB Loader GX\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2009-12-13 17:09+0100\n"
"POT-Creation-Date: 2009-12-17 00:06+0100\n"
"PO-Revision-Date: 2009-10-01 01:00+0200\n"
"Last-Translator: hosigumayuugi\n"
"Language-Team: hosigumayuugi\n"
@ -665,6 +665,9 @@ msgstr "インストールエラー!"
msgid "Install a game"
msgstr "ゲームをインストール"
msgid "Install not possible"
msgstr ""
msgid "Install partitions"
msgstr "保存する領域"
@ -813,8 +816,8 @@ msgstr "USB機器がありません"
msgid "No USB Device found."
msgstr "USB機器が検出されていません"
msgid "No WBFS or FAT game partition found"
msgstr "WBFS・FAT領域が見つかりません"
msgid "No WBFS or FAT/NTFS partition found"
msgstr ""
msgid "No cheats were selected"
msgstr "何も選ばれていません"
@ -1260,6 +1263,9 @@ msgstr "削除していいですか "
msgid "You are choosing to display favorites and you do not have any selected."
msgstr "お気に入りの登録がありません"
msgid "You are using NTFS filesystem. Due to possible write errors to a NTFS partition, installing a game is not possible."
msgstr ""
msgid "You don't have Parental Control enabled. If you wish to use Parental Control, enable it in the Wii Settings."
msgstr "Wii本体設定で使用制限機能を有効にしてください"
@ -1300,8 +1306,8 @@ msgstr "個未完了"
msgid "files not found on the server!"
msgstr "個サーバーにありませんでした…"
msgid "for FAT support"
msgstr "…FATの対応"
msgid "for FAT/NTFS support"
msgstr ""
msgid "for Ocarina"
msgstr "…Ocarinaを制作"
@ -1339,6 +1345,12 @@ msgstr "中"
msgid "seconds left"
msgstr "秒で完了"
#~ msgid "No WBFS or FAT game partition found"
#~ msgstr "WBFS・FAT領域が見つかりません"
#~ msgid "for FAT support"
#~ msgstr "…FATの対応"
#~ msgid "Exit USB Loader GX?"
#~ msgstr "USBLoaderGXを終了しますか"

View File

@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: USB Loader GX\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2009-12-13 17:09+0100\n"
"POT-Creation-Date: 2009-12-17 00:06+0100\n"
"PO-Revision-Date: 2009-10-01 01:00+0200\n"
"Last-Translator: nextos@korea.com\n"
"Language-Team: \n"
@ -665,6 +665,9 @@ msgstr "설치 에러!"
msgid "Install a game"
msgstr "게임을 설치할까요"
msgid "Install not possible"
msgstr ""
msgid "Install partitions"
msgstr ""
@ -813,7 +816,7 @@ msgstr "USB 장치가 없습니다."
msgid "No USB Device found."
msgstr "USB 장치가 없습니다."
msgid "No WBFS or FAT game partition found"
msgid "No WBFS or FAT/NTFS partition found"
msgstr ""
msgid "No cheats were selected"
@ -1260,6 +1263,9 @@ msgstr "삭제 하려고 합니다."
msgid "You are choosing to display favorites and you do not have any selected."
msgstr "즐겨찾기를 선택했으나 선택된 즐겨찾기가 없네요."
msgid "You are using NTFS filesystem. Due to possible write errors to a NTFS partition, installing a game is not possible."
msgstr ""
msgid "You don't have Parental Control enabled. If you wish to use Parental Control, enable it in the Wii Settings."
msgstr ""
@ -1300,7 +1306,7 @@ msgstr "화일들이 남음"
msgid "files not found on the server!"
msgstr "파일이 서버에 없습니다!"
msgid "for FAT support"
msgid "for FAT/NTFS support"
msgstr ""
msgid "for Ocarina"

View File

@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: USB Loader GX\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2009-12-13 17:09+0100\n"
"POT-Creation-Date: 2009-12-17 00:06+0100\n"
"PO-Revision-Date: 2009-10-01 01:00+0200\n"
"Last-Translator: raschi\n"
"Language-Team: raschi\n"
@ -665,6 +665,9 @@ msgstr "Installasjonsfeil!"
msgid "Install a game"
msgstr "Installér et spill"
msgid "Install not possible"
msgstr ""
msgid "Install partitions"
msgstr ""
@ -813,7 +816,7 @@ msgstr "Ingen USB enhet"
msgid "No USB Device found."
msgstr "Ingen USB enhet funnet."
msgid "No WBFS or FAT game partition found"
msgid "No WBFS or FAT/NTFS partition found"
msgstr ""
msgid "No cheats were selected"
@ -1260,6 +1263,9 @@ msgstr "Du er i ferd med å slette "
msgid "You are choosing to display favorites and you do not have any selected."
msgstr "Du prøver å vise favoritter når du ikke har noen valgt."
msgid "You are using NTFS filesystem. Due to possible write errors to a NTFS partition, installing a game is not possible."
msgstr ""
msgid "You don't have Parental Control enabled. If you wish to use Parental Control, enable it in the Wii Settings."
msgstr ""
@ -1300,7 +1306,7 @@ msgstr "filer gjenstår"
msgid "files not found on the server!"
msgstr "filer ikke funnet på serveren!"
msgid "for FAT support"
msgid "for FAT/NTFS support"
msgstr ""
msgid "for Ocarina"

View File

@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: USB Loader GX\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2009-12-13 17:09+0100\n"
"POT-Creation-Date: 2009-12-17 00:06+0100\n"
"PO-Revision-Date: 2009-10-01 01:00+0200\n"
"Last-Translator: ziom666 (zadania_prog@vp.pl)\n"
"Language-Team: \n"
@ -665,6 +665,9 @@ msgstr "Blad instalacji"
msgid "Install a game"
msgstr "Zainstaluj gre"
msgid "Install not possible"
msgstr ""
msgid "Install partitions"
msgstr ""
@ -813,7 +816,7 @@ msgstr "Nie wykryto urzadzenia USB"
msgid "No USB Device found."
msgstr "Nie wykryto urzadzenia USB"
msgid "No WBFS or FAT game partition found"
msgid "No WBFS or FAT/NTFS partition found"
msgstr ""
msgid "No cheats were selected"
@ -1260,6 +1263,9 @@ msgstr "Zamierzasz usunac"
msgid "You are choosing to display favorites and you do not have any selected."
msgstr "WybraleS wySwietlenie usubionych, ale zadnych nie wybraleS"
msgid "You are using NTFS filesystem. Due to possible write errors to a NTFS partition, installing a game is not possible."
msgstr ""
msgid "You don't have Parental Control enabled. If you wish to use Parental Control, enable it in the Wii Settings."
msgstr ""
@ -1300,7 +1306,7 @@ msgstr "pozostalo"
msgid "files not found on the server!"
msgstr "nie znaleziono na serwerze"
msgid "for FAT support"
msgid "for FAT/NTFS support"
msgstr ""
msgid "for Ocarina"

View File

@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: USB Loader GX\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2009-12-13 17:09+0100\n"
"POT-Creation-Date: 2009-12-17 00:06+0100\n"
"PO-Revision-Date: 2009-10-23 18:52+0200\n"
"Last-Translator: boto12\n"
"Language-Team: boto12\n"
@ -665,6 +665,9 @@ msgstr "Erro de Instalação!"
msgid "Install a game"
msgstr "Instalar um jogo"
msgid "Install not possible"
msgstr ""
msgid "Install partitions"
msgstr ""
@ -813,7 +816,7 @@ msgstr "Nenhum dispositivo USB"
msgid "No USB Device found."
msgstr "Nenhum dispositivo USB encontrado."
msgid "No WBFS or FAT game partition found"
msgid "No WBFS or FAT/NTFS partition found"
msgstr ""
msgid "No cheats were selected"
@ -1260,6 +1263,9 @@ msgstr "Irá eliminar "
msgid "You are choosing to display favorites and you do not have any selected."
msgstr "Está tentando visualizar os favoritos, mas não existe nenhum selecionado."
msgid "You are using NTFS filesystem. Due to possible write errors to a NTFS partition, installing a game is not possible."
msgstr ""
msgid "You don't have Parental Control enabled. If you wish to use Parental Control, enable it in the Wii Settings."
msgstr ""
@ -1300,7 +1306,7 @@ msgstr "arquivos restantes"
msgid "files not found on the server!"
msgstr "arquivos não encontrados no servidor!"
msgid "for FAT support"
msgid "for FAT/NTFS support"
msgstr ""
msgid "for Ocarina"

View File

@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: USB Loader GX\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2009-12-15 12:58+0100\n"
"POT-Creation-Date: 2009-12-17 00:06+0100\n"
"PO-Revision-Date: 2009-12-14 16:11-0000\n"
"Last-Translator: Sky8000\n"
"Language-Team: Sky8000 <sky8000@hotmail.com>\n"
@ -665,6 +665,9 @@ msgstr "Erro de Instalação!"
msgid "Install a game"
msgstr "Instalar um jogo"
msgid "Install not possible"
msgstr ""
msgid "Install partitions"
msgstr "Instalar partições"
@ -813,8 +816,8 @@ msgstr "Nenhum dispositivo USB encontrado"
msgid "No USB Device found."
msgstr "Nenhum dispositivo USB encontrado."
msgid "No WBFS or FAT game partition found"
msgstr "Nenhuma partição com jogos encontrada (WBFS ou FAT)"
msgid "No WBFS or FAT/NTFS partition found"
msgstr ""
msgid "No cheats were selected"
msgstr "Não foram seleccionados truques"
@ -1260,6 +1263,9 @@ msgstr "Vais eliminar "
msgid "You are choosing to display favorites and you do not have any selected."
msgstr "Está a tentar visualizar os favoritos mas não existe nenhum seleccionado."
msgid "You are using NTFS filesystem. Due to possible write errors to a NTFS partition, installing a game is not possible."
msgstr ""
msgid "You don't have Parental Control enabled. If you wish to use Parental Control, enable it in the Wii Settings."
msgstr "O Controlo Parental não está activo. Se deseja utilizar o Controlo Parental active-o na configuração da Wii (Wii Settings)."
@ -1300,8 +1306,8 @@ msgstr "ficheiros restantes"
msgid "files not found on the server!"
msgstr "ficheiros não encontrados no servidor!"
msgid "for FAT support"
msgstr "pelo suporte FAT"
msgid "for FAT/NTFS support"
msgstr ""
msgid "for Ocarina"
msgstr "pelo Ocarina"
@ -1339,6 +1345,12 @@ msgstr "de"
msgid "seconds left"
msgstr "segundos restantes"
#~ msgid "No WBFS or FAT game partition found"
#~ msgstr "Nenhuma partição com jogos encontrada (WBFS ou FAT)"
#~ msgid "for FAT support"
#~ msgstr "pelo suporte FAT"
#~ msgid "Failed to extract opening.bnr"
#~ msgstr "Falha ao extrair o opening.bnr"

View File

@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: USB Loader GX\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2009-12-13 17:09+0100\n"
"POT-Creation-Date: 2009-12-17 00:06+0100\n"
"PO-Revision-Date: 2009-10-01 01:00+0200\n"
"Last-Translator: Kir\n"
"Language-Team: Kir\n"
@ -665,6 +665,9 @@ msgstr "Ошибка установки!"
msgid "Install a game"
msgstr "Установить игру"
msgid "Install not possible"
msgstr ""
msgid "Install partitions"
msgstr ""
@ -813,7 +816,7 @@ msgstr "Нет USB устройств"
msgid "No USB Device found."
msgstr "USB устройств не обнаружено"
msgid "No WBFS or FAT game partition found"
msgid "No WBFS or FAT/NTFS partition found"
msgstr ""
msgid "No cheats were selected"
@ -1260,6 +1263,9 @@ msgstr "Вы хотите удалить "
msgid "You are choosing to display favorites and you do not have any selected."
msgstr "Нельзя отобразить избранные, если вы их до этого не выбрали."
msgid "You are using NTFS filesystem. Due to possible write errors to a NTFS partition, installing a game is not possible."
msgstr ""
msgid "You don't have Parental Control enabled. If you wish to use Parental Control, enable it in the Wii Settings."
msgstr ""
@ -1300,7 +1306,7 @@ msgstr "файлов осталось"
msgid "files not found on the server!"
msgstr "файлы не найдены на сервере!"
msgid "for FAT support"
msgid "for FAT/NTFS support"
msgstr ""
msgid "for Ocarina"

View File

@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: USB Loader GX\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2009-12-13 17:09+0100\n"
"POT-Creation-Date: 2009-12-17 00:06+0100\n"
"PO-Revision-Date: 2009-10-01 01:00+0200\n"
"Last-Translator: knife.hu kavid\n"
"Language-Team: kavid\n"
@ -665,6 +665,9 @@ msgstr "安装错误!"
msgid "Install a game"
msgstr "安装游戏"
msgid "Install not possible"
msgstr ""
msgid "Install partitions"
msgstr ""
@ -813,7 +816,7 @@ msgstr "没有 USB 设备"
msgid "No USB Device found."
msgstr "找不到 USB 设备."
msgid "No WBFS or FAT game partition found"
msgid "No WBFS or FAT/NTFS partition found"
msgstr ""
msgid "No cheats were selected"
@ -1260,6 +1263,9 @@ msgstr "要删除"
msgid "You are choosing to display favorites and you do not have any selected."
msgstr "你选择显示收藏夹但里面还没有任何收藏"
msgid "You are using NTFS filesystem. Due to possible write errors to a NTFS partition, installing a game is not possible."
msgstr ""
msgid "You don't have Parental Control enabled. If you wish to use Parental Control, enable it in the Wii Settings."
msgstr ""
@ -1300,7 +1306,7 @@ msgstr "剩余文件"
msgid "files not found on the server!"
msgstr "服务器中无此文件!"
msgid "for FAT support"
msgid "for FAT/NTFS support"
msgstr ""
msgid "for Ocarina"

View File

@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: USB Loader GX\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2009-12-13 17:09+0100\n"
"POT-Creation-Date: 2009-12-17 00:06+0100\n"
"PO-Revision-Date: 2009-10-01 01:00+0200\n"
"Last-Translator: Penn\n"
"Language-Team: Penn\n"
@ -665,6 +665,9 @@ msgstr "¡Error de Instalación!"
msgid "Install a game"
msgstr "Instalar un juego"
msgid "Install not possible"
msgstr ""
msgid "Install partitions"
msgstr ""
@ -813,7 +816,7 @@ msgstr "USB no encontrado"
msgid "No USB Device found."
msgstr "USB no encontrado."
msgid "No WBFS or FAT game partition found"
msgid "No WBFS or FAT/NTFS partition found"
msgstr ""
msgid "No cheats were selected"
@ -1260,6 +1263,9 @@ msgstr "Estás apunto de borrar "
msgid "You are choosing to display favorites and you do not have any selected."
msgstr "Estás intentando mostrar los favoritos pero no tienes ninguno seleccionado."
msgid "You are using NTFS filesystem. Due to possible write errors to a NTFS partition, installing a game is not possible."
msgstr ""
msgid "You don't have Parental Control enabled. If you wish to use Parental Control, enable it in the Wii Settings."
msgstr ""
@ -1300,7 +1306,7 @@ msgstr "archivos restantes"
msgid "files not found on the server!"
msgstr "archivo(s) no encontrado(s) en el servidor."
msgid "for FAT support"
msgid "for FAT/NTFS support"
msgstr ""
msgid "for Ocarina"

View File

@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: USB Loader GX\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2009-12-13 17:09+0100\n"
"POT-Creation-Date: 2009-12-17 00:06+0100\n"
"PO-Revision-Date: 2009-11-24 22:11+0200\n"
"Last-Translator: Katsurou\n"
"Language-Team: Katsurou, pirateX\n"
@ -665,6 +665,9 @@ msgstr "Fel vid installering!"
msgid "Install a game"
msgstr "Installera ett spel"
msgid "Install not possible"
msgstr ""
msgid "Install partitions"
msgstr ""
@ -813,8 +816,8 @@ msgstr "Ingen USB-enhet"
msgid "No USB Device found."
msgstr "Ingen USB-enhet hittad."
msgid "No WBFS or FAT game partition found"
msgstr "Ingen WBFS eller FAT spel partition hittad"
msgid "No WBFS or FAT/NTFS partition found"
msgstr ""
msgid "No cheats were selected"
msgstr "Inga fusk har valda"
@ -1260,6 +1263,9 @@ msgstr "Då håller på att radera "
msgid "You are choosing to display favorites and you do not have any selected."
msgstr "Du har valt att visa favoriter men du har inga favoriter valda."
msgid "You are using NTFS filesystem. Due to possible write errors to a NTFS partition, installing a game is not possible."
msgstr ""
msgid "You don't have Parental Control enabled. If you wish to use Parental Control, enable it in the Wii Settings."
msgstr ""
@ -1300,7 +1306,7 @@ msgstr "filer kvar"
msgid "files not found on the server!"
msgstr "filerna hittades inte på servern!"
msgid "for FAT support"
msgid "for FAT/NTFS support"
msgstr ""
msgid "for Ocarina"
@ -1339,6 +1345,9 @@ msgstr "av"
msgid "seconds left"
msgstr "sekunder kvar"
#~ msgid "No WBFS or FAT game partition found"
#~ msgstr "Ingen WBFS eller FAT spel partition hittad"
#~ msgid "Exit USB Loader GX?"
#~ msgstr "Avsluta USB Loader GX?"

View File

@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: USB Loader GX\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2009-12-13 17:09+0100\n"
"POT-Creation-Date: 2009-12-17 00:06+0100\n"
"PO-Revision-Date: 2009-10-01 01:00+0200\n"
"Last-Translator: Miller Liang\n"
"Language-Team: kyogc, Miller\n"
@ -665,6 +665,9 @@ msgstr "安裝錯誤!"
msgid "Install a game"
msgstr "安裝遊戲"
msgid "Install not possible"
msgstr ""
msgid "Install partitions"
msgstr ""
@ -813,8 +816,8 @@ msgstr "沒有 USB 設備"
msgid "No USB Device found."
msgstr "找不到 USB 設備."
msgid "No WBFS or FAT game partition found"
msgstr "沒有 WBFS 或 FAT 磁區中的遊戲"
msgid "No WBFS or FAT/NTFS partition found"
msgstr ""
msgid "No cheats were selected"
msgstr "沒有選擇金手指"
@ -1260,6 +1263,9 @@ msgstr "欲刪除:"
msgid "You are choosing to display favorites and you do not have any selected."
msgstr "你選擇顯示收藏夾但裡面還沒有任何收藏"
msgid "You are using NTFS filesystem. Due to possible write errors to a NTFS partition, installing a game is not possible."
msgstr ""
msgid "You don't have Parental Control enabled. If you wish to use Parental Control, enable it in the Wii Settings."
msgstr ""
@ -1300,8 +1306,8 @@ msgstr "剩下的檔案"
msgid "files not found on the server!"
msgstr "伺服器中無此檔案!"
msgid "for FAT support"
msgstr "FAT 格式支持"
msgid "for FAT/NTFS support"
msgstr ""
msgid "for Ocarina"
msgstr "的 Ocarina"
@ -1339,6 +1345,12 @@ msgstr "的"
msgid "seconds left"
msgstr "剩餘秒數"
#~ msgid "No WBFS or FAT game partition found"
#~ msgstr "沒有 WBFS 或 FAT 磁區中的遊戲"
#~ msgid "for FAT support"
#~ msgstr "FAT 格式支持"
#~ msgid "Exit USB Loader GX?"
#~ msgstr "離開 USB Loader GX?"

View File

@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: USB Loader GX\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2009-12-13 17:09+0100\n"
"POT-Creation-Date: 2009-12-17 00:06+0100\n"
"PO-Revision-Date: 2009-10-01 01:00+0200\n"
"Last-Translator: Nitro_subzero \n"
"Language-Team: Nitro_subzero\n"
@ -665,6 +665,9 @@ msgstr "ผิดพลาดขณะติดตั้ง!"
msgid "Install a game"
msgstr "ติดตั้งเกมส์"
msgid "Install not possible"
msgstr ""
msgid "Install partitions"
msgstr ""
@ -813,7 +816,7 @@ msgstr "ไม่ได้เสียบอุปกรณ์ USB"
msgid "No USB Device found."
msgstr "ไม่พบอุปกรณ์ USB"
msgid "No WBFS or FAT game partition found"
msgid "No WBFS or FAT/NTFS partition found"
msgstr ""
msgid "No cheats were selected"
@ -1260,6 +1263,9 @@ msgstr "คุณกำลังจะลบ "
msgid "You are choosing to display favorites and you do not have any selected."
msgstr "คุณเลือกจะแสดงเกมส์ที่ชอบ แต่คุณไม่ได้กำหนดเกมส์ที่ชื่นชอบไว้"
msgid "You are using NTFS filesystem. Due to possible write errors to a NTFS partition, installing a game is not possible."
msgstr ""
msgid "You don't have Parental Control enabled. If you wish to use Parental Control, enable it in the Wii Settings."
msgstr ""
@ -1300,7 +1306,7 @@ msgstr "ไฟล์ที่ยังเหลือ"
msgid "files not found on the server!"
msgstr "ไม่พบไฟล์/i บนเซิฟเวอร์!"
msgid "for FAT support"
msgid "for FAT/NTFS support"
msgstr ""
msgid "for Ocarina"

View File

@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: USB Loader GX\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2009-12-13 17:09+0100\n"
"POT-Creation-Date: 2009-12-17 00:06+0100\n"
"PO-Revision-Date: 2009-10-01 01:00+0200\n"
"Last-Translator: omercigingelini\n"
"Language-Team: omercigingelini\n"
@ -665,6 +665,9 @@ msgstr "Kurulum Hatasi!"
msgid "Install a game"
msgstr "Oyun kur"
msgid "Install not possible"
msgstr ""
msgid "Install partitions"
msgstr ""
@ -813,8 +816,8 @@ msgstr "USB Aygıtı yok"
msgid "No USB Device found."
msgstr "USB Aygıtı bulunamadı"
msgid "No WBFS or FAT game partition found"
msgstr "WBFS veya FAT oyun bölümü bulunamadı"
msgid "No WBFS or FAT/NTFS partition found"
msgstr ""
msgid "No cheats were selected"
msgstr "Hile seçilmedi"
@ -1260,6 +1263,9 @@ msgstr "Silmek üzeresiniz"
msgid "You are choosing to display favorites and you do not have any selected."
msgstr "Favorileri göstermeyi seçtiniz ama hiç seçili yok"
msgid "You are using NTFS filesystem. Due to possible write errors to a NTFS partition, installing a game is not possible."
msgstr ""
msgid "You don't have Parental Control enabled. If you wish to use Parental Control, enable it in the Wii Settings."
msgstr ""
@ -1300,8 +1306,8 @@ msgstr "dosyalar kaldı"
msgid "files not found on the server!"
msgstr "dosyalar sunucuda bulunamadı!"
msgid "for FAT support"
msgstr "FAT desteği için"
msgid "for FAT/NTFS support"
msgstr ""
msgid "for Ocarina"
msgstr "Ocarina için"
@ -1339,6 +1345,12 @@ msgstr "./"
msgid "seconds left"
msgstr "saniye kaldı"
#~ msgid "No WBFS or FAT game partition found"
#~ msgstr "WBFS veya FAT oyun bölümü bulunamadı"
#~ msgid "for FAT support"
#~ msgstr "FAT desteği için"
#~ msgid "Failed to extract opening.bnr"
#~ msgstr "opening.bnr çıkartılamadı"

View File

@ -20,7 +20,7 @@ SOURCES := source source/libwiigui source/images source/fonts source/sounds \
source/libwbfs source/unzip source/language source/mload source/patches \
source/usbloader source/xml source/network source/settings source/prompts \
source/ramdisk source/wad source/banner source/cheats source/homebrewboot \
source/themes source/menu source/libfat source/memory
source/themes source/menu source/libfat source/memory source/libntfs
DATA := data
INCLUDES := source
@ -28,7 +28,7 @@ INCLUDES := source
# options for code generation
#---------------------------------------------------------------------------------
CFLAGS = -g -O2 -save-temps -Wall $(MACHDEP) $(INCLUDE)
CFLAGS = -ffast-math -g -O3 -pipe -mrvl -mcpu=750 -meabi -mhard-float -Wall $(MACHDEP) $(INCLUDE) -DHAVE_CONFIG_H -DGEKKO -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE
CXXFLAGS = -Xassembler -aln=$@.lst $(CFLAGS)
LDFLAGS = -g $(MACHDEP) -Wl,-Map,$(notdir $@).map,--section-start,.init=0x80B00000,-wrap,malloc,-wrap,free,-wrap,memalign,-wrap,calloc,-wrap,realloc,-wrap,malloc_usable_size
-include $(PROJECTDIR)/Make.config

View File

@ -4,23 +4,35 @@
#include <ogc/system.h>
#include <ogc/usbstorage.h>
#include <sdcard/wiisd_io.h>
#include <locale.h>
#include "usbloader/sdhc.h"
#include "usbloader/usbstorage.h"
#include "usbloader/wbfs.h"
#include "libfat/fat.h"
#include "libntfs/ntfs.h"
#include "gecko.h"
//these are the only stable and speed is good
#define CACHE 32
#define SECTORS 64
#define SECTORS_SD 32
#define MOUNT_NONE 0
#define MOUNT_SD 1
#define MOUNT_SDHC 2
extern DISC_INTERFACE __io_sdhc;
/* Disc interfaces */
extern const DISC_INTERFACE __io_sdhc;
// read-only
extern const DISC_INTERFACE __io_sdhc_ro;
extern const DISC_INTERFACE __io_usbstorage_ro;
void _FAT_mem_init();
extern sec_t _FAT_startSector;
extern s32 wbfsDev;
int fat_sd_mount = MOUNT_NONE;
sec_t fat_sd_sec = 0; // u32
@ -30,23 +42,25 @@ sec_t fat_usb_sec = 0;
int fat_wbfs_mount = 0;
sec_t fat_wbfs_sec = 0;
int fs_ntfs_mount = 0;
sec_t fs_ntfs_sec = 0;
int USBDevice_Init() {
gprintf("\nUSBDevice_Init()");
gprintf("\nUSBDevice_Init()");
//closing all open Files write back the cache and then shutdown em!
//closing all open Files write back the cache and then shutdown em!
fatUnmount("USB:/");
//right now mounts first FAT-partition
//try first mount with cIOS
if (!fatMount("USB", &__io_wiiums, 0, CACHE, SECTORS)) {
//try now mount with libogc
//try now mount with libogc
if (!fatMount("USB", &__io_usbstorage, 0, CACHE, SECTORS)) {
gprintf(":-1");
gprintf(":-1");
return -1;
}
}
}
fat_usb_mount = 1;
fat_usb_sec = _FAT_startSector;
gprintf(":0");
@ -54,7 +68,7 @@ gprintf("\nUSBDevice_Init()");
}
void USBDevice_deInit() {
gprintf("\nUSBDevice_deInit()");
gprintf("\nUSBDevice_deInit()");
//closing all open Files write back the cache and then shutdown em!
fatUnmount("USB:/");
@ -68,12 +82,12 @@ int WBFSDevice_Init(u32 sector) {
//right now mounts first FAT-partition
//try first mount with cIOS
if (!fatMount("WBFS", &__io_wiiums, 0, CACHE, SECTORS)) {
//try now mount with libogc
if (!fatMount("USB", &__io_wiiums, 0, CACHE, SECTORS)) {
//try now mount with libogc
if (!fatMount("WBFS", &__io_usbstorage, 0, CACHE, SECTORS)) {
return -1;
}
}
}
fat_wbfs_mount = 1;
fat_wbfs_sec = _FAT_startSector;
@ -129,3 +143,98 @@ gprintf("\nSDCard_deInit()");
fat_sd_mount = MOUNT_NONE;
fat_sd_sec = 0;
}
void ntfsInit();
s32 MountNTFS(u32 sector)
{
s32 ret;
if (fs_ntfs_mount) return 0;
//printf("mounting NTFS\n");
//Wpad_WaitButtons();
_FAT_mem_init();
ntfsInit();
// ntfsInit resets locale settings
// which breaks unicode in console
// so we change it back to C-UTF-8
setlocale(LC_CTYPE, "C-UTF-8");
setlocale(LC_MESSAGES, "C-UTF-8");
if (wbfsDev == WBFS_DEVICE_USB) {
/* Initialize WBFS interface */
if (!__io_wiiums.startup()) {
ret = __io_usbstorage.startup();
if (!ret) {
return -1;
}
}
/* Mount device */
if (!ntfsMount("NTFS", &__io_wiiums_ro, sector, CACHE, SECTORS, NTFS_DEFAULT)) {
ret = ntfsMount("NTFS", &__io_usbstorage_ro, sector, CACHE, SECTORS, NTFS_DEFAULT);
if (!ret) {
return -2;
}
}
} else if (wbfsDev == WBFS_DEVICE_SDHC) {
if (sdhc_mode_sd == 0) {
ret = ntfsMount("NTFS", &__io_sdhc_ro, 0, CACHE, SECTORS, NTFS_DEFAULT);
} else {
ret = ntfsMount("NTFS", &__io_sdhc_ro, 0, CACHE, SECTORS_SD, NTFS_DEFAULT);
}
if (!ret) {
return -5;
}
}
fs_ntfs_mount = 1;
fs_ntfs_sec = sector; //_FAT_startSector;
return 0;
}
s32 UnmountNTFS(void)
{
/* Unmount device */
fatUnmount("NTFS:/");
fs_ntfs_mount = 0;
fs_ntfs_sec = 0;
return 0;
}
void _FAT_mem_init()
{
}
void* _FAT_mem_allocate(size_t size)
{
return malloc(size);
}
void* _FAT_mem_align(size_t size)
{
return memalign(32, size);
}
void _FAT_mem_free(void *mem)
{
free(mem);
}
void* ntfs_alloc (size_t size)
{
return _FAT_mem_allocate(size);
}
void* ntfs_align (size_t size)
{
return _FAT_mem_align(size);
}
void ntfs_free (void* mem)
{
_FAT_mem_free(mem);
}

View File

@ -19,6 +19,16 @@ extern "C" {
int isInserted(const char *path);
int SDCard_Init();
void SDCard_deInit();
s32 MountNTFS(u32 sector);
s32 UnmountNTFS(void);
extern int fat_usb_mount;
extern sec_t fat_usb_sec;
extern int fat_wbfs_mount;
extern sec_t fat_wbfs_sec;
extern int fs_ntfs_mount;
extern sec_t fs_ntfs_sec;
#ifdef __cplusplus
}

View File

@ -37,7 +37,7 @@
#include <limits.h>
#include "common.h"
#include "cache.h"
#include "fat_cache.h"
#include "disc_fat.h"
#include "mem_allocate.h"

View File

@ -36,7 +36,7 @@
#include "fatdir.h"
#include "cache.h"
#include "fat_cache.h"
#include "file_allocation_table.h"
#include "partition.h"
#include "directory.h"

View File

@ -39,7 +39,7 @@
#include <ctype.h>
#include <unistd.h>
#include "cache.h"
#include "fat_cache.h"
#include "file_allocation_table.h"
#include "bit_ops.h"
#include "filetime.h"
@ -1129,3 +1129,54 @@ int _FAT_fsync_r (struct _reent *r, int fd) {
return ret;
}
typedef int (*_frag_append_t)(void *ff, u32 offset, u32 sector, u32 count);
int _FAT_get_fragments (const char *path, _frag_append_t append_fragment, void *callback_data)
{
struct _reent r;
FILE_STRUCT file;
PARTITION* partition;
u32 cluster;
u32 sector;
u32 offset; // in sectors
u32 size; // in sectors
int ret = -1;
int fd;
fd = _FAT_open_r (&r, &file, path, O_RDONLY, 0);
if (fd == -1) return -1;
if (fd != (int)&file) return -1;
partition = file.partition;
_FAT_lock(&partition->lock);
size = file.filesize / BYTES_PER_READ;
cluster = file.startCluster;
offset = 0;
do {
if (!_FAT_fat_isValidCluster(partition, cluster)) {
// invalid cluster
goto out;
}
// add cluster to fileinfo
sector = _FAT_fat_clusterToSector(partition, cluster);
if (append_fragment(callback_data, offset, sector, partition->sectorsPerCluster)) {
// too many fragments
goto out;
}
offset += partition->sectorsPerCluster;
cluster = _FAT_fat_nextCluster (partition, cluster);
} while (offset < size);
// set size
append_fragment(callback_data, size, 0, 0);
// success
ret = 0;
out:
_FAT_unlock(&partition->lock);
_FAT_close_r(&r, fd);
return ret;
}

View File

@ -1,11 +1,11 @@
/*
fatfile.h
Functions used by the newlib disc stubs to interface with
Functions used by the newlib disc stubs to interface with
this library
Copyright (c) 2006 Michael "Chishm" Chisholm
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
@ -29,8 +29,8 @@
*/
#ifndef __FATFILE_H
#define __FATFILE_H
#ifndef _FATFILE_H
#define _FATFILE_H
#include <sys/reent.h>
#include <sys/stat.h>

View File

@ -31,7 +31,7 @@
#define __PARTITION_H
#include "common.h"
#include "cache.h"
#include "fat_cache.h"
#include "lock.h"
// Device name

View File

@ -10,6 +10,9 @@
#define ERROR(x) do {wbfs_error(x);goto error;}while(0)
#define ALIGN_LBA(x) (((x)+p->hd_sec_sz-1)&(~(p->hd_sec_sz-1)))
wbfs_t wbfs_iso_file;
static int force_mode=0;
void wbfs_set_force_mode(int force)
{
@ -217,6 +220,9 @@ void wbfs_close_disc(wbfs_disc_t*d)
// offset is pointing 32bit words to address the whole dvd, although len is in bytes
int wbfs_disc_read(wbfs_disc_t*d,u32 offset, u32 len, u8 *data)
{
if (d->p == &wbfs_iso_file) {
return wbfs_iso_file_read(d, offset, data, len);
}
wbfs_t *p = d->p;
u16 wlba = offset>>(p->wbfs_sec_sz_s-2);
@ -691,3 +697,70 @@ u32 wbfs_trim(wbfs_t*p)
// os layer will truncate the file.
return maxbl;
}
int wbfs_get_fragments(wbfs_disc_t *d, _frag_append_t append_fragment, void *callback_data)
{
if (!d) return -1;
wbfs_t *p = d->p;
int src_wbs_nlb = p->wbfs_sec_sz / p->hd_sec_sz;
int i, ret, last = 0;
for( i=0; i< p->n_wbfs_sec_per_disc; i++)
{
u32 iwlba = wbfs_ntohs(d->header->wlba_table[i]);
if (iwlba)
{
ret = append_fragment(callback_data,
i * src_wbs_nlb, // offset
p->part_lba + iwlba * src_wbs_nlb, // sector
src_wbs_nlb); // count
if (ret) return ret; // error
last = i;
}
}
if (last < p->n_wbfs_sec_per_disc / 2) {
last = p->n_wbfs_sec_per_disc / 2;
}
u32 size = last * src_wbs_nlb;
append_fragment(callback_data, size, 0, 0); // set size
return 0;
}
// wrapper for reading .iso files using wbfs apis
#include <unistd.h>
#include <sys/stat.h>
// offset is pointing 32bit words to address the whole dvd, although len is in bytes
int wbfs_iso_file_read(wbfs_disc_t*d,u32 offset, u8 *data, u32 len)
{
if (!d || d->p != &wbfs_iso_file) return -1;
int fd = (int)d->header;
off_t off = ((u64)offset) << 2;
off_t ret_off;
int ret;
ret_off = lseek(fd, off, SEEK_SET);
if (ret_off != off) return -1;
ret = read(fd, data, len);
if (ret != len) return -2;
return 0;
}
u32 wbfs_disc_sector_used(wbfs_disc_t *d, u32 *num_blk)
{
if (d->p == &wbfs_iso_file) {
int fd = (int)d->header;
struct stat st;
if (fstat(fd, &st) == -1) return 0;
if (num_blk) {
*num_blk = (st.st_size >> 9); // in 512 units
}
return st.st_blocks; // in 512 units (can be sparse)
}
u32 last_blk;
u32 ret;
ret = wbfs_sector_used2(d->p, d->header, &last_blk);
if (num_blk) {
*num_blk = last_blk + 1;
}
return ret;
}

View File

@ -224,6 +224,13 @@ u32 wbfs_size_disc(wbfs_t*p,read_wiidisc_callback_t read_src_wii_disc,
void *callback_data,partition_selector_t sel,
u32 *comp_size, u32 *real_size);
typedef int (*_frag_append_t)(void *ff, u32 offset, u32 sector, u32 count);
int wbfs_get_fragments(wbfs_disc_t *d, _frag_append_t append_fragment, void *callback_data);
extern wbfs_t wbfs_iso_file;
u32 wbfs_disc_sector_used(wbfs_disc_t *d, u32 *num_blk);
int wbfs_iso_file_read(wbfs_disc_t*d,u32 offset, u8 *data, u32 len);
/*! trim the file-system to its minimum size
This allows to use wbfs as a wiidisc container
*/

View File

@ -354,6 +354,15 @@ main(int argc, char *argv[]) {
printf("\n\tConfiguration file is on %s", bootDevice);
}
// Try opening and closing the configuration file here
// to prevent a crash dump later on - giantpune
char GXGlobal_cfg[26];
sprintf(GXGlobal_cfg, "%s/config/GXGlobal.cfg", bootDevice);
FILE *fp = fopen(GXGlobal_cfg, "r");
if (fp) {
fclose(fp);
}
gettextCleanUp();
printf("\n\tLoading configuration...");
CFG_Load();

View File

@ -31,6 +31,8 @@
#include "wpad.h"
#include "settings/newtitles.h"
#include "patches/fst.h"
#include "usbloader/frag.h"
#include "usbloader/wbfs.h"
/*** Variables that are also used extern ***/
GuiWindow * mainWindow = NULL;
@ -45,7 +47,7 @@ int currentMenu;
u8 mountMethod=0;
char game_partition[6];
bool load_from_fat;
int load_from_fs;
/*** Variables used only in the menus ***/
GuiText * GameIDTxt = NULL;
@ -460,10 +462,10 @@ int MainMenu(int menu) {
}
// When the selected ios is 249, and you're loading from FAT, reset ios to 222
if (load_from_fat && ios2 == 249) {
if (load_from_fs != PART_FS_WBFS && ios2 == 249) {
ios2 = 222;
}
bool onlinefix = !load_from_fat && ShutdownWC24();
bool onlinefix = load_from_fs != PART_FS_WBFS && ShutdownWC24();
// You cannot reload ios when loading from fat
if (IOS_GetVersion() != ios2 || onlinefix) {
@ -474,6 +476,14 @@ int MainMenu(int menu) {
}
if (!mountMethod)
{
gprintf("\nLoading fragment list...");
ret = get_frag_list(header->id);
gprintf("%d\n", ret);
gprintf("\nSetting fragment list...");
ret = set_frag_list(header->id);
gprintf("%d\n", ret);
ret = Disc_SetUSB(header->id);
if (ret < 0) Sys_BackToLoader();
gprintf("\n\tUSB set to game");
@ -497,7 +507,7 @@ int MainMenu(int menu) {
if (reloadblock == on && Sys_IsHermes()) {
patch_cios_data();
if (!load_from_fat) {
if (load_from_fs == PART_FS_WBFS) {
mload_close();
}
}

View File

@ -7,7 +7,7 @@
#include "usbloader/getentries.h"
#include "usbloader/wbfs.h"
extern bool load_from_fat;
extern int load_from_fs;
extern char game_partition[6];
extern char headlessID[8];
@ -53,7 +53,7 @@ int MenuCheck() {
ret2 = -1;
memset(game_partition, 0, 6);
load_from_fat = false;
load_from_fs = -1;
extern PartList partitions;
// Added for slow HDD
@ -62,15 +62,13 @@ int MenuCheck() {
sleep(1);
continue;
}
if (Settings.partition != -1 && partitions.num > Settings.partition) {
PartInfo pinfo = partitions.pinfo[Settings.partition];
int index = pinfo.fs_type == FS_TYPE_FAT32 ? pinfo.fat_i : pinfo.wbfs_i;
ret2 = WBFS_OpenPart(pinfo.fs_type == FS_TYPE_FAT32, index, partitions.pentry[Settings.partition].sector, partitions.pentry[Settings.partition].size, (char *) &game_partition);
if (ret2 == 0)
if (WBFS_OpenPart(pinfo.part_fs, pinfo.index, partitions.pentry[Settings.partition].sector, partitions.pentry[Settings.partition].size, (char *) &game_partition) == 0)
{
load_from_fat = pinfo.fs_type == FS_TYPE_FAT32;
ret2 = 0;
load_from_fs = pinfo.part_fs;
break;
}
}
@ -80,21 +78,23 @@ int MenuCheck() {
for (int p = 0; p < partitions.num; p++) {
if (partitions.pinfo[p].fs_type == FS_TYPE_WBFS) {
Settings.partition = p;
load_from_fs = PART_FS_WBFS;
break;
}
}
} else if (Sys_IsHermes() && partitions.fat_n != 0) {
// Loop through FAT partitions, and find the first partition with games on it (if there is one)
} else if (Sys_IsHermes() && (partitions.fat_n != 0 || partitions.ntfs_n != 0)) {
// Loop through FAT/NTFS partitions, and find the first partition with games on it (if there is one)
u32 count;
for (int i = 0; i < partitions.num; i++) {
if (partitions.pinfo[i].fs_type == FS_TYPE_FAT32) {
if (!WBFS_OpenPart(1, partitions.pinfo[i].fat_i, partitions.pentry[i].sector, partitions.pentry[i].size, (char *) &game_partition)) {
if (partitions.pinfo[i].fs_type == FS_TYPE_FAT32 || partitions.pinfo[i].fs_type == FS_TYPE_NTFS) {
if (!WBFS_OpenPart(partitions.pinfo[i].part_fs, partitions.pinfo[i].index, partitions.pentry[i].sector, partitions.pentry[i].size, (char *) &game_partition)) {
// Get the game count...
WBFS_GetCount(&count);
if (count > 0) {
load_from_fat = true;
load_from_fs = partitions.pinfo[i].part_fs;
Settings.partition = i;
break;
} else {
@ -105,19 +105,19 @@ int MenuCheck() {
}
}
if (ret2 >= 0 || load_from_fat) {
if (ret2 >= 0 || load_from_fs != PART_FS_WBFS) {
cfg_save_global();
break;
}
sleep(1);
}
if (ret2 < 0 && !load_from_fat) {
choice = WindowPrompt(tr("No WBFS or FAT game partition found"),tr("You need to select or format a partition"), tr("Select"), tr("Format"), tr("Return"));
if (ret2 < 0 && load_from_fs != PART_FS_WBFS) {
choice = WindowPrompt(tr("No WBFS or FAT/NTFS partition found"),tr("You need to select or format a partition"), tr("Select"), tr("Format"), tr("Return"));
if (choice == 0) {
Sys_LoadMenu();
} else {
load_from_fat = choice == 1;
load_from_fs = choice == 1 ? PART_FS_FAT : PART_FS_WBFS;
menu = MENU_FORMAT;
}
}
@ -136,7 +136,7 @@ int MenuCheck() {
if (wbfsinit < 0) {
sleep(1);
}
// open database if needed, load titles if needed
OpenXMLDatabase(Settings.titlestxt_path,Settings.db_language, Settings.db_JPtoEN, true, Settings.titlesOverride==1?true:false, true);

View File

@ -20,7 +20,7 @@
extern struct discHdr *dvdheader;
extern u8 mountMethod;
extern bool load_from_fat;
extern int load_from_fs;
extern s32 gameSelected;
extern GuiText * GameIDTxt;
extern GuiText * GameRegionTxt;
@ -88,7 +88,7 @@ int MenuDiscList() {
char theTime[80]="";
time_t lastrawtime=0;
if (mountMethod != 3 && !load_from_fat) {
if (mountMethod != 3 && load_from_fs == PART_FS_WBFS) {
WBFS_DiskSpace(&used, &freespace);
}
@ -189,7 +189,7 @@ int MenuDiscList() {
trig1.SetButtonOnlyTrigger(-1, WPAD_BUTTON_1 | WPAD_CLASSIC_BUTTON_Y, 0);
char spaceinfo[30];
if (load_from_fat) {
if (load_from_fs != PART_FS_WBFS) {
memset(spaceinfo, 0, 30);
} else {
if (!strcmp(Settings.db_language,"JA")) {
@ -224,7 +224,7 @@ int MenuDiscList() {
installBtnImgOver.SetWidescreen(CFG.widescreen);
GuiButton installBtn(&installBtnImg, &installBtnImgOver, ALIGN_LEFT, ALIGN_TOP, THEME.install_x, THEME.install_y, &trigA, &btnSoundOver, btnClick2, 1, &installBtnTT,24,-30, 0,5);
GuiTooltip settingsBtnTT(tr("Settings"));
if (Settings.wsprompt == yes)
@ -570,7 +570,7 @@ int MenuDiscList() {
w.Append(&sdcardBtn);
w.Append(&poweroffBtn);
w.Append(&gameInfo);
if (Settings.godmode)
if (Settings.godmode && load_from_fs != PART_FS_NTFS)
w.Append(&installBtn);
w.Append(&homeBtn);
w.Append(&settingsBtn);
@ -801,8 +801,12 @@ int MenuDiscList() {
gprintf("\n\tNew Disc Detected");
choice = WindowPrompt(tr("New Disc Detected"),0,tr("Install"),tr("Mount DVD drive"),tr("Cancel"));
if (choice == 1) {
menu = MENU_INSTALL;
break;
if (load_from_fs == PART_FS_NTFS) {
WindowPrompt(tr("Install not possible"), tr("You are using NTFS filesystem. Due to possible write errors to a NTFS partition, installing a game is not possible."), tr("OK"));
} else {
menu = MENU_INSTALL;
break;
}
}
else if (choice ==2)
{

View File

@ -7,7 +7,7 @@
#include "usbloader/wbfs.h"
#include "libwiigui/gui_customoptionbrowser.h"
extern bool load_from_fat;
extern int load_from_fs;
extern char game_partition[6];
/****************************************************************************
@ -33,9 +33,6 @@ int MenuFormat() {
//create the partitionlist
for (cnt = 0; cnt < (u32) partitions.num; cnt++) {
partitionEntry *entry = &partitions.pentry[cnt];
if (load_from_fat && partitions.pinfo[cnt].fs_type != FS_TYPE_FAT32) {
continue; // Skip non FAT partitions when fat loading is enabled.
}
/* Calculate size in gigabytes */
f32 size = entry->size * (partitions.sector_size / GB_SIZE);
@ -109,10 +106,10 @@ int MenuFormat() {
if(Settings.godmode == 1) {
partitionEntry *entry = &partitions.pentry[ret];
if (entry->size) {
if (load_from_fat) {
WBFS_OpenPart(1, partitions.pinfo[ret].fat_i, entry->sector,
if (load_from_fs == PART_FS_FAT) {
WBFS_OpenPart(partitions.pinfo[ret].part_fs, partitions.pinfo[ret].index, entry->sector,
entry->size, (char *) &game_partition);
load_from_fat = true;
load_from_fs = partitions.pinfo[ret].part_fs;
menu = MENU_DISCLIST;
Settings.partition = ret;

View File

@ -16,7 +16,7 @@
*/
#include "mload.h"
#include "ehcmodule_fat_bin.h"
#include "ehcmodule_frag_bin.h"
#include "dip_plugin.h"
#include <malloc.h>
@ -549,7 +549,7 @@ int load_ehc_module()
if(!external_ehcmodule)
{
if(mload_init()<0) return -1;
mload_elf((void *) ehcmodule_fat_bin, &my_data_elf);
mload_elf((void *) ehcmodule_frag_bin, &my_data_elf);
thread_id = mload_run_thread(my_data_elf.start, my_data_elf.stack, my_data_elf.size_stack, my_data_elf.prio);
if(thread_id < 0) return -1;
}

View File

@ -398,7 +398,7 @@ void WindowCredits() {
i++;
y+=22;
sprintf(text, "Oggzee %s", tr("for FAT support"));
sprintf(text, "Oggzee %s", tr("for FAT/NTFS support"));
txt[i] = new GuiText(text);
txt[i]->SetAlignment(ALIGN_LEFT, ALIGN_TOP);
txt[i]->SetPosition(60,y);

View File

@ -77,7 +77,7 @@ int InitBrowsers() {
char rootdir[ROOTDIRLEN];
for(int i=3; i<STD_MAX; i++)
{
if(strcmp(devoptab_list[i]->name, "stdnull"))
if(strcmp(devoptab_list[i]->name, "stdnull") && devoptab_list[i]->write_r != NULL)
{
snprintf(rootdir, sizeof(rootdir) , "%s:/", devoptab_list[i]->name);
if(DIR_ITER *dir = diropen(rootdir))

View File

@ -40,7 +40,7 @@ extern u8 mountMethod;
extern struct discHdr *dvdheader;
extern PartList partitions;
extern char game_partition[6];
extern bool load_from_fat;
extern u8 load_from_fs;
static const char *opts_no_yes[settings_off_on_max] = {trNOOP("No"),trNOOP("Yes") };
static const char *opts_off_on[settings_off_on_max] = {trNOOP("OFF"),trNOOP("ON") };
@ -55,7 +55,7 @@ bool IsValidPartition(int fs_type, int cios) {
if (cios == 249 || cios == 250) {
return fs_type == FS_TYPE_WBFS;
} else {
return fs_type == FS_TYPE_WBFS || fs_type == FS_TYPE_FAT32;
return fs_type == FS_TYPE_WBFS || fs_type == FS_TYPE_FAT32 || fs_type == FS_TYPE_NTFS;
}
}
@ -1027,8 +1027,8 @@ int MenuSettings()
f32 partition_size = partitions.pentry[Settings.partition].size * (partitions.sector_size / GB_SIZE);
// Get the partition name and it's size in GB's
options2.SetValue(Idx,"%s%d (%.2fGB)", pInfo.fs_type == FS_TYPE_FAT32 ? "FAT" : "WBFS",
pInfo.fs_type == FS_TYPE_FAT32 ? pInfo.fat_i : pInfo.wbfs_i,
options2.SetValue(Idx,"%s%d (%.2fGB)", pInfo.fs_type == FS_TYPE_FAT32 ? "FAT" : pInfo.fs_type == FS_TYPE_NTFS ? "NTFS" : "WBFS",
pInfo.index,
partition_size);
}
@ -2148,10 +2148,11 @@ int MenuSettings()
// if partition has changed, Reinitialize it
PartInfo pinfo = partitions.pinfo[Settings.partition];
load_from_fat = pinfo.fs_type == FS_TYPE_FAT32;
partitionEntry pentry = partitions.pentry[Settings.partition];
load_from_fs = pinfo.part_fs;
if (Settings.partition != settingspartitionold) {
WBFS_Close();
WBFS_OpenPart(load_from_fat, Settings.partition, partitions.pentry[Settings.partition].sector, partitions.pentry[Settings.partition].size, (char *) &game_partition);
WBFS_OpenPart(load_from_fs, pinfo.index, pentry.sector, pentry.size, (char *) &game_partition);
}
// if language has changed, reload titles

View File

@ -1310,7 +1310,7 @@ bool cfg_save_global() { // save global settings
/* Closing and reopening because of a write issue we are having right now */
f = fopen(GXGlobal_cfg, "w");
fprintf(f, "# USB Loader global settings file\n");
fprintf(f, "# Note: This file is automatically generated\n");
fprintf(f, "# Note: This file is automatically generated\n ");
fprintf(f, "video = %d\n ", Settings.video);
fprintf(f, "vpatch = %d\n ", Settings.vpatch);
fprintf(f, "language = %d\n ", Settings.language);
@ -1330,7 +1330,7 @@ bool cfg_save_global() { // save global settings
fprintf(f, "xflip = %d\n ", Settings.xflip);
fprintf(f, "gridRows = %d\n ", Settings.gridRows);
fprintf(f, "qboot = %d\n ", Settings.qboot);
fprintf(f, "wsprompt = %d\n", Settings.wsprompt);
fprintf(f, "wsprompt = %d\n ", Settings.wsprompt);
fprintf(f, "parentalcontrol = %d\n ", Settings.parentalcontrol);
fprintf(f, "cover_path = %s\n ", Settings.covers_path);
fprintf(f, "cover2d_path = %s\n ", Settings.covers2d_path);
@ -1354,8 +1354,8 @@ bool cfg_save_global() { // save global settings
fprintf(f, "theme_downloadpath = %s\n ", Settings.theme_downloadpath);
fprintf(f, "homebrewapps_path = %s\n ", Settings.homebrewapps_path);
fprintf(f, "Cheatcodespath = %s\n ", Settings.Cheatcodespath);
fprintf(f, "BcaCodepath = %s\n", Settings.BcaCodepath);
fprintf(f, "WipCodepath = %s\n", Settings.WipCodepath);
fprintf(f, "BcaCodepath = %s\n ", Settings.BcaCodepath);
fprintf(f, "WipCodepath = %s\n ", Settings.WipCodepath);
fprintf(f, "titlesOverride = %d\n ", Settings.titlesOverride);
//fprintf(f, "db_url = %s\n ", Settings.db_url);
//fprintf(f, "db_JPtoEN = %d\n ", Settings.db_JPtoEN);
@ -1365,12 +1365,12 @@ bool cfg_save_global() { // save global settings
fprintf(f, "error002 = %d\n ", Settings.error002);
fprintf(f, "autonetwork = %d\n ", Settings.autonetwork);
fprintf(f, "discart = %d\n ", Settings.discart);
fprintf(f, "partition = %d\n", Settings.partition);
fprintf(f, "marknewtitles = %d\n", Settings.marknewtitles);
fprintf(f, "fatInstallToDir = %d\n", Settings.FatInstallToDir);
fprintf(f, "partitions = %d\n", Settings.partitions_to_install);
fprintf(f, "fullcopy = %d\n", Settings.fullcopy);
fprintf(f, "beta_upgrades = %d\n", Settings.beta_upgrades);
fprintf(f, "partition = %d\n ", Settings.partition);
fprintf(f, "marknewtitles = %d\n ", Settings.marknewtitles);
fprintf(f, "fatInstallToDir = %d\n ", Settings.FatInstallToDir);
fprintf(f, "partitions = %d\n ", Settings.partitions_to_install);
fprintf(f, "fullcopy = %d\n ", Settings.fullcopy);
fprintf(f, "beta_upgrades = %d\n ", Settings.beta_upgrades);
fclose(f);
return true;
}
@ -1850,6 +1850,8 @@ void CFG_Load(void) {
// if GUI language is set to default Settings.language_path needs to remain "notset" (if the detected setting was kept detection wouldn't work next time)
if (langisdefault)
sprintf(Settings.language_path, "notset");
Settings.godmode = (Settings.parental.enabled == 0 && (Settings.parentalcontrol == 0 || strlen(Settings.unlockCode) == 0)) ? 1 : 0;
}
void CFG_LoadGlobal(void) {

View File

@ -6,6 +6,7 @@
#include "usbloader/usbstorage.h"
#include "usbloader/disc.h"
#include "usbloader/wbfs.h"
#include "usbloader/partition_usbloader.h"
#include "mload/mload.h"
#include "video.h"
#include "audio.h"
@ -15,7 +16,7 @@
#include "wpad.h"
extern char game_partition[6];
extern bool load_from_fat;
extern u8 load_from_fs;
//Wiilight stuff
static vu32 *_wiilight_reg = (u32*)0xCD0000C0;
@ -99,7 +100,7 @@ int Sys_ChangeIos(int ios) {
WBFS_Init(WBFS_DEVICE_USB);
Disc_Init();
if (load_from_fat && (ios == 222 || ios == 223)) {
if (Sys_IsHermes()) {
WBFS_OpenNamed((char *) &game_partition);
} else {
WBFS_Open();

View File

@ -12,6 +12,7 @@
#include "wdvd.h"
#include "alternatedol.h"
#include "memory.h"
#include "wbfs.h"
#include "../gecko.h"
#include "../fatmounter.h"
@ -23,10 +24,6 @@
static u32 *buffer = (u32 *)0x93000000;
static u8 *diskid = (u8 *)Disc_ID;
extern int wbfs_part_fat;
extern u32 wbfs_part_idx;
extern u32 wbfs_part_lba;
void __Disc_SetLowMem(void) {
*Sys_Magic = 0x0D15EA5E; // Standard Boot Code
@ -240,7 +237,7 @@ s32 Disc_Wait(void) {
s32 Disc_SetUSB(const u8 *id) {
u32 part = 0;
if (wbfs_part_fat) {
if (wbfs_part_fs) {
part = wbfs_part_lba;
} else {
part = wbfs_part_idx ? wbfs_part_idx - 1 : 0;

272
source/usbloader/frag.c Normal file
View File

@ -0,0 +1,272 @@
#include <ogcsys.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/stat.h>
#include "fatmounter.h"
#include "libntfs/ntfs.h"
#include "libwbfs/libwbfs.h"
#include "wbfs.h"
#include "wbfs_fat.h"
#include "usbstorage.h"
#include "frag.h"
#include "utils.h"
int _FAT_get_fragments (const char *path, _frag_append_t append_fragment, void *callback_data);
FragList *frag_list = NULL;
void frag_init(FragList *ff, int maxnum)
{
memset(ff, 0, sizeof(Fragment) * (maxnum+1));
ff->maxnum = maxnum;
}
int frag_append(FragList *ff, u32 offset, u32 sector, u32 count)
{
int n;
if (count) {
n = ff->num - 1;
if (ff->num > 0
&& ff->frag[n].offset + ff->frag[n].count == offset
&& ff->frag[n].sector + ff->frag[n].count == sector)
{
// merge
ff->frag[n].count += count;
}
else
{
// add
if (ff->num >= ff->maxnum) {
// too many fragments
return -500;
}
n = ff->num;
ff->frag[n].offset = offset;
ff->frag[n].sector = sector;
ff->frag[n].count = count;
ff->num++;
}
}
ff->size = offset + count;
return 0;
}
int _frag_append(void *ff, u32 offset, u32 sector, u32 count)
{
return frag_append(ff, offset, sector, count);
}
int frag_concat(FragList *ff, FragList *src)
{
int i, ret;
u32 size = ff->size;
//printf("concat: %d %d <- %d %d\n", ff->num, ff->size, src->num, src->size);
for (i=0; i<src->num; i++) {
ret = frag_append(ff, size + src->frag[i].offset,
src->frag[i].sector, src->frag[i].count);
if (ret) return ret;
}
ff->size = size + src->size;
//printf("concat: -> %d %d\n", ff->num, ff->size);
return 0;
}
// in case a sparse block is requested,
// the returned poffset might not be equal to requested offset
// the difference should be filled with 0
int frag_get(FragList *ff, u32 offset, u32 count,
u32 *poffset, u32 *psector, u32 *pcount)
{
int i;
u32 delta;
//printf("frag_get(%u %u)\n", offset, count);
for (i=0; i<ff->num; i++) {
if (ff->frag[i].offset <= offset
&& ff->frag[i].offset + ff->frag[i].count > offset)
{
delta = offset - ff->frag[i].offset;
*poffset = offset;
*psector = ff->frag[i].sector + delta;
*pcount = ff->frag[i].count - delta;
if (*pcount > count) *pcount = count;
goto out;
}
if (ff->frag[i].offset > offset
&& ff->frag[i].offset < offset + count)
{
delta = ff->frag[i].offset - offset;
*poffset = ff->frag[i].offset;
*psector = ff->frag[i].sector;
*pcount = ff->frag[i].count;
count -= delta;
if (*pcount > count) *pcount = count;
goto out;
}
}
// not found
if (offset + count > ff->size) {
// error: out of range!
return -1;
}
// if inside range, then it must be just sparse, zero filled
// return empty block at the end of requested
*poffset = offset + count;
*psector = 0;
*pcount = 0;
out:
//printf("=>(%u %u %u)\n", *poffset, *psector, *pcount);
return 0;
}
int frag_remap(FragList *ff, FragList *log, FragList *phy)
{
int i;
int ret;
u32 offset;
u32 sector;
u32 count;
u32 delta;
for (i=0; i<log->num; i++) {
delta = 0;
count = 0;
do {
ret = frag_get(phy,
log->frag[i].sector + delta + count,
log->frag[i].count - delta - count,
&offset, &sector, &count);
if (ret) return ret; // error
delta = offset - log->frag[i].sector;
ret = frag_append(ff, log->frag[i].offset + delta, sector, count);
if (ret) return ret; // error
} while (count + delta < log->frag[i].count);
}
return 0;
}
int get_frag_list(u8 *id)
{
char fname[1024];
char fname1[1024];
struct stat st;
FragList *fs = NULL;
FragList *fa = NULL;
FragList *fw = NULL;
int ret;
int i, j;
int is_wbfs = 0;
int ret_val = -1;
if (wbfs_part_fs == PART_FS_WBFS) return 0;
ret = WBFS_FAT_find_fname(id, fname, sizeof(fname));
if (!ret) return -1;
if (strcasecmp(strrchr(fname,'.'), ".wbfs") == 0) {
is_wbfs = 1;
}
fs = malloc(sizeof(FragList));
fa = malloc(sizeof(FragList));
fw = malloc(sizeof(FragList));
frag_init(fa, MAX_FRAG);
for (i=0; i<10; i++) {
frag_init(fs, MAX_FRAG);
if (i > 0) {
fname[strlen(fname)-1] = '0' + i;
if (stat(fname, &st) == -1) break;
}
strcpy(fname1, fname);
//printf("::*%s\n", strrchr(fname,'/'));
if (wbfs_part_fs == PART_FS_FAT) {
ret = _FAT_get_fragments(fname, &_frag_append, fs);
if (ret) {
printf("fat getf: %d\n", ret);
// don't return failure, let it fallback to old method
//ret_val = ret;
ret_val = 0;
goto out;
}
} else if (wbfs_part_fs == PART_FS_NTFS) {
ret = _NTFS_get_fragments(fname, &_frag_append, fs);
if (ret) {
printf("ntfs getf: %d\n", ret);
if (ret == -50 || ret == -500) {
printf("Too many fragments! %d\n", fs->num);
}
ret_val = ret;
goto out;
}
// offset to start of partition
for (j=0; j<fs->num; j++) {
fs->frag[j].sector += fs_ntfs_sec;
}
}
frag_concat(fa, fs);
}
frag_list = malloc(sizeof(FragList));
frag_init(frag_list, MAX_FRAG);
if (is_wbfs) {
// if wbfs file format, remap.
//printf("=====\n");
wbfs_disc_t *d = WBFS_OpenDisc(id);
if (!d) goto out;
frag_init(fw, MAX_FRAG);
ret = wbfs_get_fragments(d, &_frag_append, fw);
if (ret) goto out;
WBFS_CloseDisc(d);
// DEBUG: frag_list->num = MAX_FRAG-10; // stress test
ret = frag_remap(frag_list, fw, fa);
if (ret) goto out;
} else {
// .iso does not need remap just copy
//printf("fa:\n");
memcpy(frag_list, fa, sizeof(FragList));
}
ret_val = 0;
out:
if (ret_val) {
// error
SAFE_FREE(frag_list);
}
SAFE_FREE(fs);
SAFE_FREE(fa);
SAFE_FREE(fw);
return ret_val;
}
int set_frag_list(u8 *id)
{
if (wbfs_part_fs == PART_FS_WBFS) return 0;
if (frag_list == NULL) {
if (wbfs_part_fs == PART_FS_FAT) {
// fall back to old fat method
printf("FAT: fallback to old method\n");
return 0;
}
// ntfs has no fallback, return error
return -1;
}
// (+1 for header which is same size as fragment)
int size = sizeof(Fragment) * (frag_list->num + 1);
int ret = USBStorage_WBFS_SetFragList(frag_list, size);
if (ret) {
printf("set_frag: %d\n", ret);
return ret;
}
// verify id matches
char discid[8];
memset(discid, 0, sizeof(discid));
ret = USBStorage_WBFS_Read(0, 6, discid);
return 0;
}

51
source/usbloader/frag.h Normal file
View File

@ -0,0 +1,51 @@
// worst case wbfs fragmentation scenario:
// 9GB (dual layer) / 2mb (wbfs sector size) = 4608
#define MAX_FRAG 20000
// max that ehcmodule_frag will allow at the moment is about:
// 40000/4/3-1 = 21844
#ifdef __cplusplus
extern "C" {
#endif
#include "libwbfs/libwbfs.h"
typedef struct
{
u32 offset; // file offset, in sectors unit
u32 sector;
u32 count;
} Fragment;
typedef struct
{
u32 size; // num sectors
u32 num; // num fragments
u32 maxnum;
Fragment frag[MAX_FRAG];
} FragList;
typedef int (*frag_append_t)(void *ff, u32 offset, u32 sector, u32 count);
int _FAT_get_fragments (const char *path, _frag_append_t append_fragment, void *callback_data);
void frag_init(FragList *ff, int maxnum);
int frag_append(FragList *ff, u32 offset, u32 sector, u32 count);
int _frag_append(void *ff, u32 offset, u32 sector, u32 count);
int frag_concat(FragList *ff, FragList *src);
// in case a sparse block is requested,
// the returned poffset might not be equal to requested offset
// the difference should be filled with 0
int frag_get(FragList *ff, u32 offset, u32 count,
u32 *poffset, u32 *psector, u32 *pcount);
int frag_remap(FragList *ff, FragList *log, FragList *phy);
int get_frag_list(u8 *id);
int set_frag_list(u8 *id);
#ifdef __cplusplus
}
#endif

View File

@ -273,6 +273,16 @@ int get_fs_type(void *buff)
return FS_TYPE_UNK;
}
int get_part_fs(int fs_type)
{
switch(fs_type) {
case FS_TYPE_FAT32: return PART_FS_FAT;
case FS_TYPE_NTFS: return PART_FS_NTFS;
case FS_TYPE_WBFS: return PART_FS_WBFS;
default: return -1;
}
}
bool is_type_fat(int type)
{
return (type == FS_TYPE_FAT16 || type == FS_TYPE_FAT32);
@ -309,7 +319,7 @@ s32 Partition_GetList(u32 device, PartList *plist)
pinfo = &plist->pinfo[0];
entry = &plist->pentry[0];
plist->wbfs_n = 1;
pinfo->wbfs_i = 1;
pinfo->wbfs_i = pinfo->index = 1;
return 0;
}
@ -330,11 +340,15 @@ s32 Partition_GetList(u32 device, PartList *plist)
// multiple wbfs on sdhc not supported
if (device == WBFS_DEVICE_SDHC && (plist->wbfs_n > 1 || i > 4)) continue;
plist->wbfs_n++;
pinfo->wbfs_i = plist->wbfs_n;
pinfo->wbfs_i = pinfo->index = plist->wbfs_n;
} else if (is_type_fat(pinfo->fs_type)) {
plist->fat_n++;
pinfo->fat_i = plist->fat_n;
pinfo->fat_i = pinfo->index = plist->fat_n;
} else if (pinfo->fs_type == FS_TYPE_NTFS) {
plist->ntfs_n++;
pinfo->ntfs_i = pinfo->index = plist->ntfs_n;
}
pinfo->part_fs = get_part_fs(pinfo->fs_type);
}
return 0;
}
@ -357,5 +371,3 @@ int Partition_FixEXT(u32 device, int part)
}
return -1;
}

View File

@ -39,8 +39,11 @@ typedef struct {
typedef struct
{
int fs_type;
int part_fs;
int wbfs_i; // seq wbfs part index
int fat_i; // seq fat part index
int ntfs_i; // seq ntfs part index
int index;
} PartInfo;
typedef struct
@ -50,6 +53,7 @@ typedef struct
partitionEntry pentry[MAX_PARTITIONS_EX];
int wbfs_n;
int fat_n;
int ntfs_n;
PartInfo pinfo[MAX_PARTITIONS_EX];
} PartList;

View File

@ -12,142 +12,211 @@
#define IOCTL_SDHC_ISINSERTED 0x04
#define SDHC_HEAPSIZE 0x8000
#define SDHC_MEM2_SIZE 0x10000
int sdhc_mode_sd = 0;
/* Variables */
static char fs[] ATTRIBUTE_ALIGN(32) = "/dev/sdio/sdhc";
static s32 hid = -1, fd = -1;
static u32 sector_size = SDHC_SECTOR_SIZE;
static void *sdhc_buf2;
extern void* SYS_AllocArena2MemLo(u32 size,u32 align);
bool SDHC_Init(void) {
s32 ret;
bool SDHC_Init(void)
{
s32 ret;
/* Already open */
if (fd > 0)
return true;
if (sdhc_mode_sd) {
return __io_wiisd.startup();
}
/* Create heap */
if (hid < 0) {
hid = iosCreateHeap(SDHC_HEAPSIZE);
if (hid < 0)
goto err;
}
/* Already open */
if (fd >= 0)
return true;
/* Open SDHC device */
fd = IOS_Open(fs, 0);
if (fd < 0)
goto err;
/* Create heap */
if (hid < 0) {
hid = iosCreateHeap(SDHC_HEAPSIZE);
if (hid < 0)
goto err;
}
/* Initialize SDHC */
ret = IOS_IoctlvFormat(hid, fd, IOCTL_SDHC_INIT, ":");
if (ret)
goto err;
// allocate buf2
if (sdhc_buf2 == NULL) {
sdhc_buf2 = SYS_AllocArena2MemLo(SDHC_MEM2_SIZE, 32);
}
return true;
/* Open SDHC device */
fd = IOS_Open(fs, 0);
if (fd < 0)
goto err;
/* Initialize SDHC */
ret = IOS_IoctlvFormat(hid, fd, IOCTL_SDHC_INIT, ":");
if (ret)
goto err;
return true;
err:
/* Close SDHC device */
if (fd > 0) {
IOS_Close(fd);
fd = -1;
}
/* Close SDHC device */
if (fd >= 0) {
IOS_Close(fd);
fd = -1;
}
return false;
return false;
}
bool SDHC_Close(void) {
/* Close SDHC device */
if (fd > 0) {
IOS_Close(fd);
fd = -1;
}
bool SDHC_Close(void)
{
if (sdhc_mode_sd) {
return __io_wiisd.shutdown();
}
return true;
/* Close SDHC device */
if (fd >= 0) {
IOS_Close(fd);
fd = -1;
}
/*if (hid > 0) {
iosDestroyHeap(hid);
hid = -1;
}*/
return true;
}
bool SDHC_IsInserted(void) {
s32 ret;
bool SDHC_IsInserted(void)
{
s32 ret;
if (sdhc_mode_sd) {
return __io_wiisd.isInserted();
}
/* Check if SD card is inserted */
ret = IOS_IoctlvFormat(hid, fd, IOCTL_SDHC_ISINSERTED, ":");
/* Check if SD card is inserted */
ret = IOS_IoctlvFormat(hid, fd, IOCTL_SDHC_ISINSERTED, ":");
return (!ret) ? true : false;
return (!ret) ? true : false;
}
bool SDHC_ReadSectors(u32 sector, u32 count, void *buffer) {
void *buf = (void *)buffer;
u32 len = (sector_size * count);
bool SDHC_ReadSectors(u32 sector, u32 count, void *buffer)
{
//printf("SD-R(%u %u)\n", sector, count);
if (sdhc_mode_sd) {
return __io_wiisd.readSectors(sector, count, buffer);
}
s32 ret;
void *buf = (void *)buffer;
u32 len = (sector_size * count);
/* Device not opened */
if (fd < 0)
return false;
s32 ret;
/* Buffer not aligned */
if ((u32)buffer & 0x1F) {
/* Allocate memory */
buf = iosAlloc(hid, len);
if (!buf)
return false;
}
/* Device not opened */
if (fd < 0)
return false;
/* Read data */
ret = IOS_IoctlvFormat(hid, fd, IOCTL_SDHC_READ, "ii:d", sector, count, buf, len);
/* Buffer not aligned */
if ((u32)buffer & 0x1F) {
/* Allocate memory */
//buf = iosAlloc(hid, len);
buf = sdhc_buf2;
if (!buf)
return false;
}
/* Copy data */
if (buf != buffer) {
memcpy(buffer, buf, len);
iosFree(hid, buf);
}
/* Read data */
ret = IOS_IoctlvFormat(hid, fd, IOCTL_SDHC_READ, "ii:d", sector, count, buf, len);
return (!ret) ? true : false;
/* Copy data */
if (buf != buffer) {
memcpy(buffer, buf, len);
//iosFree(hid, buf);
}
return (!ret) ? true : false;
}
bool SDHC_WriteSectors(u32 sector, u32 count, void *buffer) {
void *buf = (void *)buffer;
u32 len = (sector_size * count);
bool SDHC_WriteSectors(u32 sector, u32 count, void *buffer)
{
if (sdhc_mode_sd) {
return __io_wiisd.writeSectors(sector, count, buffer);
}
s32 ret;
void *buf = (void *)buffer;
u32 len = (sector_size * count);
/* Device not opened */
if (fd < 0)
return false;
s32 ret;
/* Buffer not aligned */
if ((u32)buffer & 0x1F) {
/* Allocate memory */
buf = iosAlloc(hid, len);
if (!buf)
return false;
/* Device not opened */
if (fd < 0)
return false;
/* Copy data */
memcpy(buf, buffer, len);
}
/* Buffer not aligned */
if ((u32)buffer & 0x1F) {
/* Allocate memory */
//buf = iosAlloc(hid, len);
buf = sdhc_buf2;
if (!buf)
return false;
/* Read data */
ret = IOS_IoctlvFormat(hid, fd, IOCTL_SDHC_WRITE, "ii:d", sector, count, buf, len);
/* Copy data */
memcpy(buf, buffer, len);
}
/* Free memory */
if (buf != buffer)
iosFree(hid, buf);
/* Read data */
ret = IOS_IoctlvFormat(hid, fd, IOCTL_SDHC_WRITE, "ii:d", sector, count, buf, len);
return (!ret) ? true : false;
/* Free memory */
//if (buf != buffer)
// iosFree(hid, buf);
return (!ret) ? true : false;
}
bool SDHC_ClearStatus(void) {
return true;
bool SDHC_ClearStatus(void)
{
return true;
}
bool __io_SDHC_Close(void)
{
// do nothing.
return true;
}
bool __io_SDHC_NOP(void)
{
// do nothing.
return true;
}
const DISC_INTERFACE __io_sdhc = {
DEVICE_TYPE_WII_SD,
FEATURE_MEDIUM_CANREAD | FEATURE_MEDIUM_CANWRITE | FEATURE_WII_SD,
(FN_MEDIUM_STARTUP)&SDHC_Init,
(FN_MEDIUM_ISINSERTED)&SDHC_IsInserted,
(FN_MEDIUM_READSECTORS)&SDHC_ReadSectors,
(FN_MEDIUM_WRITESECTORS)&SDHC_WriteSectors,
(FN_MEDIUM_CLEARSTATUS)&SDHC_ClearStatus,
(FN_MEDIUM_SHUTDOWN)&SDHC_Close
DEVICE_TYPE_WII_SD,
FEATURE_MEDIUM_CANREAD | FEATURE_MEDIUM_CANWRITE | FEATURE_WII_SD,
(FN_MEDIUM_STARTUP)&SDHC_Init,
(FN_MEDIUM_ISINSERTED)&SDHC_IsInserted,
(FN_MEDIUM_READSECTORS)&SDHC_ReadSectors,
(FN_MEDIUM_WRITESECTORS)&SDHC_WriteSectors,
(FN_MEDIUM_CLEARSTATUS)&SDHC_ClearStatus,
//(FN_MEDIUM_SHUTDOWN)&SDHC_Close
(FN_MEDIUM_SHUTDOWN)&__io_SDHC_Close
};
const DISC_INTERFACE __io_sdhc_ro = {
DEVICE_TYPE_WII_SD,
FEATURE_MEDIUM_CANREAD | FEATURE_WII_SD,
(FN_MEDIUM_STARTUP) &SDHC_Init,
(FN_MEDIUM_ISINSERTED) &SDHC_IsInserted,
(FN_MEDIUM_READSECTORS) &SDHC_ReadSectors,
(FN_MEDIUM_WRITESECTORS) &__io_SDHC_NOP, // &SDHC_WriteSectors,
(FN_MEDIUM_CLEARSTATUS) &SDHC_ClearStatus,
//(FN_MEDIUM_SHUTDOWN)&SDHC_Close
(FN_MEDIUM_SHUTDOWN) &__io_SDHC_Close
};

View File

@ -13,6 +13,7 @@ extern "C" {
bool SDHC_Close(void);
bool SDHC_ReadSectors(u32, u32, void *);
bool SDHC_WriteSectors(u32, u32, void *);
extern int sdhc_mode_sd;
#ifdef __cplusplus
}

View File

@ -1,3 +1,6 @@
// by oggzee
#include <ogcsys.h>
#include <stdio.h>
#include <stdlib.h>
@ -14,12 +17,12 @@
#define FMT_llu "%llu"
#define FMT_lld "%lld"
#define split_error(x) do { /* gprintf("\nsplit error: %s\n\n",x); */ } while(0)
#define split_error(x) do { printf("\nsplit error: %s\n\n",x); } while(0)
// 1 sector less than 4gb
u64 OPT_split_size = (u64)4LL * 1024 * 1024 * 1024 - (32 * 1024);
// 1 sector less than 2gb
// u64 OPT_split_size = (u64)2LL * 1024 * 1024 * 1024 - 512;
// 1 cluster less than 4gb
u64 OPT_split_size = (u64)4LL * 1024 * 1024 * 1024 - 32 * 1024;
// 1 cluster less than 2gb
//u64 OPT_split_size = (u64)2LL * 1024 * 1024 * 1024 - 32 * 1024;
//split_info_t split;

View File

@ -42,6 +42,13 @@ distribution.
#define USB_IOCTL_UMS_UNMOUNT (UMS_BASE+0x10)
#define USB_IOCTL_UMS_WATCHDOG (UMS_BASE+0x80)
#define WBFS_BASE (('W'<<24)|('F'<<16)|('S'<<8))
#define USB_IOCTL_WBFS_OPEN_DISC (WBFS_BASE+0x1)
#define USB_IOCTL_WBFS_READ_DISC (WBFS_BASE+0x2)
#define USB_IOCTL_WBFS_READ_DEBUG (WBFS_BASE+0x3)
#define USB_IOCTL_WBFS_SET_DEVICE (WBFS_BASE+0x4)
#define USB_IOCTL_WBFS_SET_FRAGLIST (WBFS_BASE+0x5)
#define UMS_HEAPSIZE 0x1000
/* Variables */
@ -51,16 +58,6 @@ static char fs2[] ATTRIBUTE_ALIGN(32) = "/dev/usb/ehc";
static s32 hid = -1, fd = -1;
static u32 sector_size;
extern void* SYS_AllocArena2MemLo(u32 size,u32 align);
//static void *mem2_ptr=NULL;
inline s32 __USBStorage_isMEM2Buffer(const void *buffer) {
u32 high_addr = ((u32)buffer) >> 24;
return (high_addr == 0x90) || (high_addr == 0xD0);
}
s32 USBStorage_GetCapacity(u32 *_sector_size) {
if (fd > 0) {
s32 ret;
@ -160,30 +157,12 @@ s32 USBStorage_ReadSectors(u32 sector, u32 numSectors, void *buffer) {
if (fd < 0)
return fd;
// if(!mem2_ptr) mem2_ptr=SYS_AllocArena2MemLo(2048*256,32);
/* MEM1 buffer */
// if (!__USBStorage_isMEM2Buffer(buffer)) {
/* Allocate memory */
// buf = mem2_ptr; //iosAlloc(hid, len);
// if (!buf)
// return IPC_ENOMEM;
// }
/* Read data */
ret = IOS_IoctlvFormat(hid, fd, USB_IOCTL_UMS_READ_SECTORS, "ii:d", sector, numSectors, buffer, len);
/* Copy data */
// if (buf != buffer) {
// memcpy(buffer, buf, len);
//iosFree(hid, buf);
// }
return ret;
}
s32 USBStorage_WriteSectors(u32 sector, u32 numSectors, const void *buffer) {
// void *buf = (void *)buffer;
u32 len = (sector_size * numSectors);
s32 ret;
@ -191,33 +170,145 @@ s32 USBStorage_WriteSectors(u32 sector, u32 numSectors, const void *buffer) {
/* Device not opened */
if (fd < 0)
return fd;
// if(!mem2_ptr) mem2_ptr = SYS_AllocArena2MemLo(2048*256,32);
/* MEM1 buffer */
// if (!__USBStorage_isMEM2Buffer(buffer)) {
/* Allocate memory */
// buf = mem2_ptr; //buf = iosAlloc(hid, len);
// if (!buf)
// return IPC_ENOMEM;
/* Copy data */
// memcpy(buf, buffer, len);
// }
/* Write data */
ret = IOS_IoctlvFormat(hid, fd, USB_IOCTL_UMS_WRITE_SECTORS, "ii:d", sector, numSectors, buffer, len);
/* Free memory */
// if (buf != buffer)
// iosFree(hid, buf);
return ret;
}
static bool __io_usb_Startup(void)
{
return USBStorage_Init() >= 0;
}
static bool __io_usb_IsInserted(void)
{
s32 ret;
if (fd < 0) return false;
ret = USBStorage_GetCapacity(NULL);
if (ret == 0) return false;
return true;
}
bool __io_usb_ReadSectors(u32 sector, u32 count, void *buffer)
{
s32 ret = USBStorage_ReadSectors(sector, count, buffer);
return ret > 0;
}
bool __io_usb_WriteSectors(u32 sector, u32 count, void *buffer)
{
s32 ret = USBStorage_WriteSectors(sector, count, buffer);
return ret > 0;
}
static bool __io_usb_ClearStatus(void)
{
return true;
}
static bool __io_usb_Shutdown(void)
{
// do nothing
return true;
}
static bool __io_usb_NOP(void)
{
// do nothing
return true;
}
const DISC_INTERFACE __io_usbstorage_ro = {
DEVICE_TYPE_WII_USB,
FEATURE_MEDIUM_CANREAD | FEATURE_WII_USB,
(FN_MEDIUM_STARTUP) &__io_usb_Startup,
(FN_MEDIUM_ISINSERTED) &__io_usb_IsInserted,
(FN_MEDIUM_READSECTORS) &__io_usb_ReadSectors,
(FN_MEDIUM_WRITESECTORS) &__io_usb_NOP, //&__io_usb_WriteSectors,
(FN_MEDIUM_CLEARSTATUS) &__io_usb_ClearStatus,
(FN_MEDIUM_SHUTDOWN) &__io_usb_Shutdown
};
s32 USBStorage_WBFS_Open(char *buffer)
{
u32 len = 8;
s32 ret;
/* Device not opened */
if (fd < 0)
return fd;
extern u32 wbfs_part_lba;
u32 part = wbfs_part_lba;
/* Read data */
ret = IOS_IoctlvFormat(hid, fd, USB_IOCTL_WBFS_OPEN_DISC, "dd:", buffer, len, &part, 4);
return ret;
}
// woffset is in 32bit words, len is in bytes
s32 USBStorage_WBFS_Read(u32 woffset, u32 len, void *buffer)
{
s32 ret;
USBStorage_Init();
/* Device not opened */
if (fd < 0)
return fd;
/* Read data */
ret = IOS_IoctlvFormat(hid, fd, USB_IOCTL_WBFS_READ_DISC, "ii:d", woffset, len, buffer, len);
return ret;
}
#define DEVICE_TYPE_WII_UMS (('W'<<24)|('U'<<16)|('M'<<8)|'S')
s32 USBStorage_WBFS_ReadDebug(u32 off, u32 size, void *buffer)
{
s32 ret;
USBStorage_Init();
/* Device not opened */
if (fd < 0)
return fd;
/* Read data */
ret = IOS_IoctlvFormat(hid, fd, USB_IOCTL_WBFS_READ_DEBUG, "ii:d", off, size, buffer, size);
return ret;
}
s32 USBStorage_WBFS_SetDevice(int dev)
{
s32 ret;
static s32 retval = 0;
retval = 0;
USBStorage_Init();
// Device not opened
if (fd < 0) return fd;
// ioctl
ret = IOS_IoctlvFormat(hid, fd, USB_IOCTL_WBFS_SET_DEVICE, "i:i", dev, &retval);
if (retval) return retval;
return ret;
}
s32 USBStorage_WBFS_SetFragList(void *p, int size)
{
s32 ret;
USBStorage_Init();
// Device not opened
if (fd < 0) return fd;
// ioctl
ret = IOS_IoctlvFormat(hid, fd, USB_IOCTL_WBFS_SET_FRAGLIST, "d:", p, size);
return ret;
}
#define DEVICE_TYPE_WII_UMS (('W'<<24)|('U'<<16)|('M'<<8)|'S')
bool umsio_Startup() {
return USBStorage_Init() == 0;
@ -226,6 +317,7 @@ bool umsio_Startup() {
bool umsio_IsInserted() {
return true; // allways true
}
bool umsio_ReadSectors(sec_t sector, sec_t numSectors, u8 *buffer) {
u32 cnt = 0;
s32 ret;
@ -272,6 +364,7 @@ bool umsio_WriteSectors(sec_t sector, sec_t numSectors, const u8* buffer) {
return true;
}
bool umsio_ClearStatus(void) {
return true;
}
@ -280,13 +373,25 @@ bool umsio_Shutdown() {
USBStorage_Deinit();
return true;
}
const DISC_INTERFACE __io_wiiums = {
DEVICE_TYPE_WII_UMS,
FEATURE_MEDIUM_CANREAD | FEATURE_MEDIUM_CANWRITE | FEATURE_WII_USB,
(FN_MEDIUM_STARTUP)&umsio_Startup,
(FN_MEDIUM_ISINSERTED)&umsio_IsInserted,
(FN_MEDIUM_READSECTORS)&umsio_ReadSectors,
(FN_MEDIUM_WRITESECTORS)&umsio_WriteSectors,
(FN_MEDIUM_CLEARSTATUS)&umsio_ClearStatus,
(FN_MEDIUM_SHUTDOWN)&umsio_Shutdown
(FN_MEDIUM_STARTUP) &umsio_Startup,
(FN_MEDIUM_ISINSERTED) &umsio_IsInserted,
(FN_MEDIUM_READSECTORS) &umsio_ReadSectors,
(FN_MEDIUM_WRITESECTORS) &umsio_WriteSectors,
(FN_MEDIUM_CLEARSTATUS) &umsio_ClearStatus,
(FN_MEDIUM_SHUTDOWN) &umsio_Shutdown
};
const DISC_INTERFACE __io_wiiums_ro = {
DEVICE_TYPE_WII_UMS,
FEATURE_MEDIUM_CANREAD | FEATURE_MEDIUM_CANWRITE | FEATURE_WII_USB,
(FN_MEDIUM_STARTUP) &umsio_Startup,
(FN_MEDIUM_ISINSERTED) &umsio_IsInserted,
(FN_MEDIUM_READSECTORS) &umsio_ReadSectors,
(FN_MEDIUM_WRITESECTORS) &__io_usb_NOP,
(FN_MEDIUM_CLEARSTATUS) &umsio_ClearStatus,
(FN_MEDIUM_SHUTDOWN) &umsio_Shutdown
};

View File

@ -11,7 +11,15 @@ extern "C" {
s32 USBStorage_Watchdog(u32 on_off);
s32 USBStorage_ReadSectors(u32, u32, void *);
s32 USBStorage_WriteSectors(u32, u32, const void *);
extern const DISC_INTERFACE __io_wiiums;
s32 USBStorage_WBFS_Open(char *buf_id);
s32 USBStorage_WBFS_Read(u32 woffset, u32 len, void *buffer);
s32 USBStorage_WBFS_ReadDebug(u32 off, u32 size, void *buffer);
s32 USBStorage_WBFS_SetDevice(int dev);
s32 USBStorage_WBFS_SetFragList(void *p, int size);
extern const DISC_INTERFACE __io_wiiums;
extern const DISC_INTERFACE __io_wiiums_ro;
#ifdef __cplusplus
}
#endif

View File

@ -13,6 +13,8 @@ extern "C" {
/* Macros */
#define round_up(x,n) (-(-(x) & -(n)))
#define SAFE_FREE(P) if(P){free(P);P=NULL;}
/* Prototypes */
u32 swap32(u32);

View File

@ -24,7 +24,7 @@
s32 wbfsDev = WBFS_MIN_DEVICE;
// partition
int wbfs_part_fat = 0;
int wbfs_part_fs = PART_FS_WBFS;
u32 wbfs_part_idx = 0;
u32 wbfs_part_lba = 0;
@ -46,7 +46,7 @@ void WBFS_Spinner(s32 x, s32 max) {
wbfs_disc_t* WBFS_OpenDisc(u8 *discid)
{
if (wbfs_part_fat) return WBFS_FAT_OpenDisc(discid);
if (wbfs_part_fs) return WBFS_FAT_OpenDisc(discid);
/* No device open */
if (!hdd)
@ -58,7 +58,7 @@ wbfs_disc_t* WBFS_OpenDisc(u8 *discid)
void WBFS_CloseDisc(wbfs_disc_t *disc)
{
if (wbfs_part_fat) {
if (wbfs_part_fs) {
WBFS_FAT_CloseDisc(disc);
return;
}
@ -273,7 +273,7 @@ s32 WBFS_Open(void) {
wbfs_close(hdd);
/* Open hard disk */
wbfs_part_fat = wbfs_part_idx = wbfs_part_lba = 0;
wbfs_part_fs = wbfs_part_idx = wbfs_part_lba = 0;
hdd = wbfs_open_hd(readCallback, writeCallback, NULL, sector_size, nb_sectors, 0);
if (!hdd)
return -1;
@ -285,37 +285,45 @@ s32 WBFS_Open(void) {
return 0;
}
s32 WBFS_OpenPart(u32 part_fat, u32 part_idx, u32 part_lba, u32 part_size, char *partition)
s32 WBFS_OpenPart(u32 part_fs, u32 part_idx, u32 part_lba, u32 part_size, char *partition)
{
// close
WBFS_Close();
if (part_fat) {
if (wbfsDev != WBFS_DEVICE_USB) return -1;
if (part_lba == fat_usb_sec) {
strcpy(wbfs_fat_drive, "USB:");
if (part_fs == PART_FS_FAT) {
if (wbfsDev == WBFS_DEVICE_USB && part_lba == fat_usb_sec) {
strcpy(wbfs_fs_drive, "USB:");
} else if (wbfsDev == WBFS_DEVICE_SDHC && part_lba == fat_sd_sec) {
strcpy(wbfs_fs_drive, "SD:");
} else {
if (WBFSDevice_Init(part_lba)) return -1;
strcpy(wbfs_fat_drive, "WBFS:");
strcpy(wbfs_fs_drive, "WBFS:");
}
} else if (part_fs == PART_FS_NTFS) {
int ret = MountNTFS(part_lba);
if (ret) return ret;
strcpy(wbfs_fs_drive, "NTFS:");
} else {
if (WBFS_OpenLBA(part_lba, part_size)) return -3;
}
// success
wbfs_part_fat = part_fat;
wbfs_part_fs = part_fs;
wbfs_part_idx = part_idx;
wbfs_part_lba = part_lba;
sprintf(partition, "%s%d", wbfs_part_fat ? "FAT" : "WBFS", wbfs_part_idx);
char *fs = "WBFS";
if (wbfs_part_fs == PART_FS_FAT) fs = "FAT";
if (wbfs_part_fs == PART_FS_NTFS) fs = "NTFS";
sprintf(partition, "%s%d", fs, wbfs_part_idx);
return 0;
}
s32 WBFS_OpenNamed(char *partition)
{
int i;
u32 part_fs = PART_FS_WBFS;
u32 part_idx = 0;
u32 part_fat = 0;
u32 part_lba = 0;
s32 ret = 0;
PartList plist;
@ -327,13 +335,19 @@ s32 WBFS_OpenNamed(char *partition)
if (strncasecmp(partition, "WBFS", 4) == 0) {
i = atoi(partition+4);
if (i < 1 || i > 4) goto err;
part_fs = PART_FS_WBFS;
part_idx = i;
} else if (strncasecmp(partition, "FAT", 3) == 0) {
if (wbfsDev != WBFS_DEVICE_USB) goto err;
i = atoi(partition+3);
if (i < 1 || i > 9) goto err;
part_fs = PART_FS_FAT;
part_idx = i;
} else if (strncasecmp(partition, "NTFS", 4) == 0) {
i = atoi(partition+4);
if (i < 1 || i > 9) goto err;
part_fs = PART_FS_NTFS;
part_idx = i;
part_fat = 1;
} else {
goto err;
}
@ -342,22 +356,27 @@ s32 WBFS_OpenNamed(char *partition)
ret = Partition_GetList(wbfsDev, &plist);
if (ret || plist.num == 0) return -1;
if (part_fat) {
if (part_fs == PART_FS_WBFS) {
if (part_idx > plist.wbfs_n) goto err;
for (i=0; i<plist.num; i++) {
if (plist.pinfo[i].wbfs_i == part_idx) break;
}
} else if (part_fs == PART_FS_FAT) {
if (part_idx > plist.fat_n) goto err;
for (i=0; i<plist.num; i++) {
if (plist.pinfo[i].fat_i == part_idx) break;
}
} else {
if (part_idx > plist.wbfs_n) goto err;
} else if (part_fs == PART_FS_NTFS) {
if (part_idx > plist.ntfs_n) goto err;
for (i=0; i<plist.num; i++) {
if (plist.pinfo[i].wbfs_i == part_idx) break;
if (plist.pinfo[i].ntfs_i == part_idx) break;
}
}
if (i >= plist.num) goto err;
// set partition lba sector
part_lba = plist.pentry[i].sector;
if (WBFS_OpenPart(part_fat, part_idx, part_lba, plist.pentry[i].size, partition)) {
if (WBFS_OpenPart(part_fs, part_idx, part_lba, plist.pentry[i].size, partition)) {
goto err;
}
// success
@ -390,10 +409,10 @@ bool WBFS_Close(void)
}
WBFSDevice_deInit();
wbfs_part_fat = 0;
wbfs_part_fs = 0;
wbfs_part_idx = 0;
wbfs_part_lba = 0;
wbfs_fat_drive[0] = '\0';
wbfs_fs_drive[0] = '\0';
return 0;
}
@ -405,7 +424,7 @@ bool WBFS_Mounted()
bool WBFS_Selected()
{
if (wbfs_part_fat && wbfs_part_lba && *wbfs_fat_drive) return true;
if (wbfs_part_fs && wbfs_part_lba && *wbfs_fs_drive) return true;
return WBFS_Mounted();
}
@ -424,7 +443,7 @@ s32 WBFS_Format(u32 lba, u32 size) {
}
s32 WBFS_GetCount(u32 *count) {
if (wbfs_part_fat) return WBFS_FAT_GetCount(count);
if (wbfs_part_fs) return WBFS_FAT_GetCount(count);
/* No device open */
if (!hdd)
@ -437,7 +456,7 @@ s32 WBFS_GetCount(u32 *count) {
}
s32 WBFS_GetHeaders(void *outbuf, u32 cnt, u32 len) {
if (wbfs_part_fat) return WBFS_FAT_GetHeaders(outbuf, cnt, len);
if (wbfs_part_fs) return WBFS_FAT_GetHeaders(outbuf, cnt, len);
u32 idx, size;
s32 ret;
@ -474,7 +493,7 @@ s32 WBFS_CheckGame(u8 *discid) {
}
s32 WBFS_AddGame(void) {
if (wbfs_part_fat) return WBFS_FAT_AddGame();
if (wbfs_part_fs) return WBFS_FAT_AddGame();
s32 ret;
@ -501,7 +520,7 @@ s32 WBFS_AddGame(void) {
}
s32 WBFS_RemoveGame(u8 *discid) {
if (wbfs_part_fat) return WBFS_FAT_RemoveGame(discid);
if (wbfs_part_fs) return WBFS_FAT_RemoveGame(discid);
s32 ret;
@ -540,7 +559,7 @@ s32 WBFS_GameSize(u8 *discid, f32 *size) {
}
s32 WBFS_DiskSpace(f32 *used, f32 *free) {
if (wbfs_part_fat) return WBFS_FAT_DiskSpace(used, free);
if (wbfs_part_fs) return WBFS_FAT_DiskSpace(used, free);
f32 ssize;
u32 cnt;
@ -564,7 +583,7 @@ s32 WBFS_DiskSpace(f32 *used, f32 *free) {
s32 WBFS_RenameGame(u8 *discid, const void *newname)
{
if (wbfs_part_fat)
if (wbfs_part_fs)
{
return WBFS_FAT_RenameGame(discid, newname);
}
@ -583,7 +602,7 @@ s32 WBFS_RenameGame(u8 *discid, const void *newname)
s32 WBFS_ReIDGame(u8 *discid, const void *newID)
{
if (wbfs_part_fat)
if (wbfs_part_fs)
{
return WBFS_FAT_ReIDGame(discid, newID);
}
@ -601,7 +620,7 @@ s32 WBFS_ReIDGame(u8 *discid, const void *newID)
}
f32 WBFS_EstimeGameSize(void) {
if (wbfs_part_fat) {
if (wbfs_part_fs) {
u64 comp;
WBFS_FAT_DVD_Size(&comp, NULL);
return comp;

View File

@ -16,11 +16,15 @@ extern "C" {
#define WBFS_MIN_DEVICE 1
#define WBFS_MAX_DEVICE 2
#define PART_FS_WBFS 0
#define PART_FS_FAT 1
#define PART_FS_NTFS 2
extern s32 wbfsDev;
extern int wbfs_part_fat;
extern int wbfs_part_fs;
extern u32 wbfs_part_idx;
extern u32 wbfs_part_lba;
extern char wbfs_fat_drive[16];
extern char wbfs_fs_drive[16];
/* Prototypes */
void GetProgressValue(s32 * d, s32 * m);

View File

@ -1,5 +1,8 @@
// WBFS FAT by oggzee
// WBFS FAT by oggzee
#include <stdio.h>
#include <unistd.h>
#include <malloc.h>
@ -12,27 +15,27 @@
#include <ctype.h>
#include "libwbfs/libwbfs.h"
#include "sdhc.h"
#include "usbstorage.h"
#include "utils.h"
#include "video.h"
#include "wbfs.h"
#include "wdvd.h"
#include "splits.h"
#include "fat.h"
#include "partition_usbloader.h"
#include "usbloader/disc.h"
#include "usbloader/sdhc.h"
#include "usbloader/usbstorage.h"
#include "usbloader/utils.h"
#include "usbloader/wbfs.h"
#include "usbloader/wdvd.h"
#include "usbloader/splits.h"
#include "usbloader/wbfs_fat.h"
#include "usbloader/partition_usbloader.h"
#include "libfat/fat.h"
#include "settings/cfg.h"
#include "wpad.h"
#include "wbfs_fat.h"
// max fat fname = 256
#define MAX_FAT_PATH 1024
#define D_S(A) A, sizeof(A)
char wbfs_fat_drive[16];
char wbfs_fs_drive[16];
char wbfs_fat_dir[16] = "/wbfs";
int wbfs_fat_vfs_have = 0;
int wbfs_fat_vfs_lba = 0;
int wbfs_fat_vfs_dev = 0;
struct statvfs wbfs_fat_vfs;
split_info_t split;
@ -42,6 +45,7 @@ static u32 fat_sector_size = 512;
static struct discHdr *fat_hdr_list = NULL;
static int fat_hdr_count = 0;
void WBFS_Spinner(s32 x, s32 max);
s32 __WBFS_ReadDVD(void *fp, u32 lba, u32 len, void *iobuf);
@ -54,6 +58,7 @@ bool is_gameid(char *id)
return true;
}
s32 _WBFS_FAT_GetHeadersCount()
{
DIR_ITER *dir_iter;
@ -71,19 +76,16 @@ s32 _WBFS_FAT_GetHeadersCount()
//dbg_time1();
if(fat_hdr_list){
free(fat_hdr_list);
fat_hdr_list=NULL;
}
SAFE_FREE(fat_hdr_list);
fat_hdr_count = 0;
strcpy(path, wbfs_fat_drive);
strcpy(path, wbfs_fs_drive);
strcat(path, wbfs_fat_dir);
dir_iter = diropen(path);
if (!dir_iter) return 0;
while (dirnext(dir_iter, fname, &st) == 0) {
//printf("found: %s\n", fname); Wpad_WaitButtonsCommon();
if ((char)fname[0] == '.') continue;
if (strlen(fname) < 8) continue; // "GAMEID_x"
@ -91,14 +93,24 @@ s32 _WBFS_FAT_GetHeadersCount()
id[6] = 0;
is_dir = S_ISDIR(st.st_mode);
//printf("mode: %d %d %x\n", is_dir, st.st_mode, st.st_mode);
if (is_dir) {
// usb:/wbfs/GAMEID_TITLE/GAMEID.wbfs
if (fname[6] != '_') continue;
snprintf(fpath, sizeof(fpath), "%s/%s/%s.wbfs", path, fname, id);
//printf("path2: %s\n", fpath);
// if more than 50 games, skip second stat to improve speed
if (fat_hdr_count < 50) {
do_stat2:
if (stat(fpath, &st) == -1) continue;
if (stat(fpath, &st) == -1) {
//printf("missing: %s\n", fpath);
// try .iso
strcpy(strrchr(fpath, '.'), ".iso"); // replace .wbfs with .iso
if (stat(fpath, &st) == -1) {
//printf("missing: %s\n", fpath);
continue;
}
}
} else {
// just check if gameid is valid (alphanum)
if (!is_gameid((char*)id)) goto do_stat2;
@ -106,12 +118,16 @@ s32 _WBFS_FAT_GetHeadersCount()
}
} else {
// usb:/wbfs/GAMEID.wbfs
// or usb:/wbfs/GAMEID.iso
p = strrchr(fname, '.');
if (!p) continue;
if (strcasecmp(p, ".wbfs") != 0) continue;
if (strlen(fname) != 11) continue; // GAMEID.wbfs
if ( (strcasecmp(p, ".wbfs") != 0)
&& (strcasecmp(p, ".iso") != 0) ) continue;
if (p - fname != 6) continue; // GAMEID.
snprintf(fpath, sizeof(fpath), "%s/%s", path, fname);
}
//printf("found: %s %d MB\n", fpath, (int)(st.st_size/1024/1024));
// size must be at least 1MB to be considered a valid wbfs file
if (st.st_size < 1024*1024) continue;
// if we have titles.txt entry use that
@ -128,34 +144,59 @@ s32 _WBFS_FAT_GetHeadersCount()
goto add_hdr;
}
// else read it from wbfs file directly
FILE *fp = fopen(fpath, "rb");
if (fp != NULL) {
fseek(fp, 512, SEEK_SET);
fread(&tmpHdr, sizeof(struct discHdr), 1, fp);
fclose(fp);
if ((tmpHdr.magic == 0x5D1C9EA3) && (memcmp(tmpHdr.id, id, 6) == 0)) {
// else read it from file directly
if (strcasecmp(strrchr(fpath,'.'), ".wbfs") == 0) {
// wbfs file directly
FILE *fp = fopen(fpath, "rb");
if (fp != NULL) {
fseek(fp, 512, SEEK_SET);
fread(&tmpHdr, sizeof(struct discHdr), 1, fp);
fclose(fp);
if ((tmpHdr.magic == 0x5D1C9EA3) && (memcmp(tmpHdr.id, id, 6) == 0)) {
goto add_hdr;
}
}
// no title found, read it from wbfs file
// but this is a little bit slower
// open 'partition' file
part = WBFS_FAT_OpenPart(fpath);
if (!part) {
printf("bad wbfs file: %s\n", fpath);
sleep(2);
continue;
}
/* Get header */
ret = wbfs_get_disc_info(part, 0, (u8*)&tmpHdr,
sizeof(struct discHdr), &size);
WBFS_FAT_ClosePart(part);
if (ret == 0) {
goto add_hdr;
}
} else if (strcasecmp(strrchr(fpath,'.'), ".iso") == 0) {
// iso file
FILE *fp = fopen(fpath, "rb");
if (fp != NULL) {
fseek(fp, 0, SEEK_SET);
fread(&tmpHdr, sizeof(struct discHdr), 1, fp);
fclose(fp);
if ((tmpHdr.magic == 0x5D1C9EA3) && (memcmp(tmpHdr.id, id, 6) == 0)) {
goto add_hdr;
}
}
}
// no title found, read it from wbfs file
// but this is a little bit slower
// open 'partition' file
part = WBFS_FAT_OpenPart(id);
if (!part) {
continue;
}
/* Get header */
ret = wbfs_get_disc_info(part, 0, (u8*)&tmpHdr, sizeof(struct discHdr), &size);
WBFS_FAT_ClosePart(part);
if (ret) continue;
// add tmpHdr to list:
// fail:
continue;
// succes: add tmpHdr to list:
add_hdr:
memset(&st, 0, sizeof(st));
//printf("added: %.6s %.20s\n", tmpHdr.id, tmpHdr.title); Wpad_WaitButtons();
fat_hdr_count++;
fat_hdr_list = realloc(fat_hdr_list, fat_hdr_count * sizeof(struct discHdr));
memcpy(&fat_hdr_list[fat_hdr_count-1], &tmpHdr, sizeof(struct discHdr));
}
dirclose(dir_iter);
//dbg_time2("\nFAT_GetCount"); Wpad_WaitButtonsCommon();
return 0;
}
@ -170,9 +211,7 @@ s32 WBFS_FAT_GetCount(u32 *count)
struct discHdr *buf = malloc(size);
if (buf) {
memcpy(buf, fat_hdr_list, size);
if (fat_hdr_list) {
free(fat_hdr_list);
}
SAFE_FREE(fat_hdr_list);
fat_hdr_list = buf;
}
}
@ -190,17 +229,34 @@ s32 WBFS_FAT_GetHeaders(void *outbuf, u32 cnt, u32 len)
for (i=0; i<cnt && i<fat_hdr_count; i++) {
memcpy(outbuf + i * len, &fat_hdr_list[i], slen);
}
if (fat_hdr_list) {
free(fat_hdr_list);
fat_hdr_list = NULL;
}
SAFE_FREE(fat_hdr_list);
fat_hdr_count = 0;
return 0;
}
wbfs_disc_t* WBFS_FAT_OpenDisc(u8 *discid)
{
wbfs_t *part = WBFS_FAT_OpenPart(discid);
char fname[MAX_FAT_PATH];
// wbfs 'partition' file
if ( !WBFS_FAT_find_fname(discid, fname, sizeof(fname)) ) return NULL;
if (strcasecmp(strrchr(fname,'.'), ".iso") == 0) {
// .iso file
// create a fake wbfs_disc
int fd;
fd = open(fname, O_RDONLY);
if (fd == -1) return NULL;
wbfs_disc_t *iso_file = calloc(sizeof(wbfs_disc_t),1);
if (iso_file == NULL) return NULL;
// mark with a special wbfs_part
wbfs_iso_file.wbfs_sec_sz = 512;
iso_file->p = &wbfs_iso_file;
iso_file->header = (void*)fd;
return iso_file;
}
wbfs_t *part = WBFS_FAT_OpenPart(fname);
if (!part) return NULL;
return wbfs_open_disc(part, discid);
}
@ -209,6 +265,14 @@ void WBFS_FAT_CloseDisc(wbfs_disc_t* disc)
{
if (!disc) return;
wbfs_t *part = disc->p;
// is this really a .iso file?
if (part == &wbfs_iso_file) {
close((int)disc->header);
free(disc);
return;
}
wbfs_close_disc(disc);
WBFS_FAT_ClosePart(part);
return;
@ -222,11 +286,15 @@ s32 WBFS_FAT_DiskSpace(f32 *used, f32 *free)
*used = 0;
*free = 0;
// statvfs is slow, so cache values
if (!wbfs_fat_vfs_have || wbfs_fat_vfs_lba != wbfs_part_lba) {
ret = statvfs(wbfs_fat_drive, &wbfs_fat_vfs);
if (!wbfs_fat_vfs_have
|| wbfs_fat_vfs_lba != wbfs_part_lba
|| wbfs_fat_vfs_dev != wbfsDev )
{
ret = statvfs(wbfs_fs_drive, &wbfs_fat_vfs);
if (ret) return 0;
wbfs_fat_vfs_have = 1;
wbfs_fat_vfs_lba = wbfs_part_lba;
wbfs_fat_vfs_dev = wbfsDev;
}
/* FS size in GB */
@ -240,18 +308,20 @@ s32 WBFS_FAT_DiskSpace(f32 *used, f32 *free)
static int nop_read_sector(void *_fp,u32 lba,u32 count,void*buf)
{
//printf("read %d %d\n", lba, count); //Wpad_WaitButtons();
return 0;
}
static int nop_write_sector(void *_fp,u32 lba,u32 count,void*buf)
{
//printf("write %d %d\n", lba, count); //Wpad_WaitButtons();
return 0;
}
void WBFS_FAT_fname(u8 *id, char *fname, int len, char *path)
{
if (path == NULL) {
snprintf(fname, len, "%s%s/%.6s.wbfs", wbfs_fat_drive, wbfs_fat_dir, id);
snprintf(fname, len, "%s%s/%.6s.wbfs", wbfs_fs_drive, wbfs_fat_dir, id);
} else {
snprintf(fname, len, "%s/%.6s.wbfs", path, id);
}
@ -280,7 +350,7 @@ void mk_gameid_title(struct discHdr *header, char *name, int re_space)
void WBFS_FAT_get_dir(struct discHdr *header, char *path)
{
strcpy(path, wbfs_fat_drive);
strcpy(path, wbfs_fs_drive);
strcat(path, wbfs_fat_dir);
if (Settings.FatInstallToDir) {
strcat(path, "/");
@ -288,18 +358,41 @@ void WBFS_FAT_get_dir(struct discHdr *header, char *path)
}
}
void mk_title_txt(struct discHdr *header, char *path)
{
char fname[MAX_FAT_PATH];
FILE *f;
strcpy(fname, path);
strcat(fname, "/");
mk_gameid_title(header, fname+strlen(fname), 1);
strcat(fname, ".txt");
f = fopen(fname, "wb");
if (!f) return;
fprintf(f, "%.6s = %.64s\n", header->id, get_title(header));
fclose(f);
printf("Info file: %s\n", fname);
}
int WBFS_FAT_find_fname(u8 *id, char *fname, int len)
{
struct stat st;
// look for direct .wbfs file
WBFS_FAT_fname(id, fname, len, NULL);
if (stat(fname, &st) == 0) return 1;
// look for direct .iso file
strcpy(strrchr(fname, '.'), ".iso"); // replace .wbfs with .iso
if (stat(fname, &st) == 0) return 1;
// direct file not found, check subdirs
DIR_ITER *dir_iter;
char path[MAX_FAT_PATH];
char name[MAX_FAT_PATH];
strcpy(path, wbfs_fat_drive);
strcpy(path, wbfs_fs_drive);
strcat(path, wbfs_fat_dir);
dir_iter = diropen(path);
//printf("dir: %s %p\n", path, dir); Wpad_WaitButtons();
if (!dir_iter) {
goto err;
}
@ -308,7 +401,14 @@ int WBFS_FAT_find_fname(u8 *id, char *fname, int len)
if (name[6] != '_') continue;
if (strncmp(name, (char*)id, 6) != 0) continue;
if (strlen(name) < 8) continue;
snprintf(fname, len, "%s/%s/%.6s.wbfs", path, name, id);
// look for .wbfs file
snprintf(fname, len, "%s/%s/%.6s.wbfs", path, name, id);
if (stat(fname, &st) == 0) {
dirclose(dir_iter);
return 2;
}
// look for .iso file
snprintf(fname, len, "%s/%s/%.6s.iso", path, name, id);
if (stat(fname, &st) == 0) {
dirclose(dir_iter);
return 2;
@ -321,14 +421,12 @@ int WBFS_FAT_find_fname(u8 *id, char *fname, int len)
return 0;
}
wbfs_t* WBFS_FAT_OpenPart(u8 *id)
wbfs_t* WBFS_FAT_OpenPart(char *fname)
{
char fname[MAX_FAT_PATH];
wbfs_t *part = NULL;
int ret;
// wbfs 'partition' file
if ( !WBFS_FAT_find_fname(id, fname, sizeof(fname)) ) return NULL;
ret = split_open(&split, fname);
if (ret) return NULL;
part = wbfs_open_partition(
@ -349,10 +447,12 @@ wbfs_t* WBFS_FAT_CreatePart(u8 *id, char *path)
u32 n_sector = size / 512;
int ret;
snprintf(D_S(fname), "%s%s", wbfs_fat_drive, wbfs_fat_dir);
//printf("CREATE PART %s %lld %d\n", id, size, n_sector);
snprintf(fname, sizeof(fname), "%s%s", wbfs_fs_drive, wbfs_fat_dir);
mkdir(fname, 0777); // base usb:/wbfs
mkdir(path, 0777); // game subdir
WBFS_FAT_fname(id, fname, sizeof(fname), path);
printf("Writing to %s\n", fname);
ret = split_create(&split, fname, OPT_split_size, size, true);
if (ret) return NULL;
@ -360,6 +460,8 @@ wbfs_t* WBFS_FAT_CreatePart(u8 *id, char *path)
u32 scnt = 0;
int fd = split_get_file(&split, 0, &scnt, 0);
if (fd<0) {
printf("ERROR creating file\n");
sleep(2);
split_close(&split);
return NULL;
}
@ -417,10 +519,6 @@ s32 WBFS_FAT_RemoveGame(u8 *discid)
}
dirclose(dir_iter);
// remove game subdir
//rmdir(path);
if (unlink(path) == -1) {
return -1;
}
return 0;
}
@ -441,16 +539,19 @@ s32 WBFS_FAT_AddGame(void)
part = WBFS_FAT_CreatePart(header.id, path);
if (!part) return -1;
/* Add game to device */
partition_selector_t part_sel;
int copy_1_1 = 0;
if (Settings.fullcopy) {
part_sel = ALL_PARTITIONS;
copy_1_1 = 1;
} else {
part_sel = Settings.partitions_to_install == install_game_only ? ONLY_GAME_PARTITION : ALL_PARTITIONS;
partition_selector_t part_sel = ALL_PARTITIONS;
int copy_1_1 = Settings.fullcopy;
switch (Settings.partitions_to_install) {
case install_game_only:
part_sel = ONLY_GAME_PARTITION;
break;
case install_all:
part_sel = ALL_PARTITIONS;
break;
}
if (copy_1_1) {
part_sel = ALL_PARTITIONS;
}
extern wbfs_t *hdd;
wbfs_t *old_hdd = hdd;
hdd = part; // used by spinner
@ -458,10 +559,9 @@ s32 WBFS_FAT_AddGame(void)
hdd = old_hdd;
wbfs_trim(part);
WBFS_FAT_ClosePart(part);
if (ret) {
return -1;
}
if (ret < 0) return ret;
mk_title_txt(&header, path);
return 0;
}
@ -486,12 +586,11 @@ s32 WBFS_FAT_DVD_Size(u64 *comp_size, u64 *real_size)
/* Add game to device */
partition_selector_t part_sel;
if (Settings.fullcopy) {
if (Settings.partitions_to_install) {
part_sel = ALL_PARTITIONS;
} else {
part_sel = Settings.partitions_to_install == install_game_only ? ONLY_GAME_PARTITION : ALL_PARTITIONS;
part_sel = ONLY_GAME_PARTITION;
}
ret = wbfs_size_disc(part, __WBFS_ReadDVD, NULL, part_sel, &comp_sec, &last_sec);
wbfs_close(part);
if (ret < 0)
@ -505,7 +604,7 @@ s32 WBFS_FAT_DVD_Size(u64 *comp_size, u64 *real_size)
s32 WBFS_FAT_RenameGame(u8 *discid, const void *newname)
{
wbfs_t *part = WBFS_FAT_OpenPart(discid);
wbfs_t *part = WBFS_FAT_OpenPart((char *) discid);
if (!part)
return -1;
@ -518,7 +617,7 @@ s32 WBFS_FAT_RenameGame(u8 *discid, const void *newname)
s32 WBFS_FAT_ReIDGame(u8 *discid, const void *newID)
{
wbfs_t *part = WBFS_FAT_OpenPart(discid);
wbfs_t *part = WBFS_FAT_OpenPart((char *) discid);
if (!part)
return -1;

View File

@ -1,7 +1,7 @@
#ifndef _WBFS_FAT_H
#define _WBFS_FAT_H
wbfs_t* WBFS_FAT_OpenPart(u8 *id);
wbfs_t* WBFS_FAT_OpenPart(char *fname);
void WBFS_FAT_ClosePart(wbfs_t* part);
s32 WBFS_FAT_GetCount(u32 *count);
s32 WBFS_FAT_GetHeaders(void *outbuf, u32 cnt, u32 len);
@ -11,6 +11,7 @@ s32 WBFS_FAT_DiskSpace(f32 *used, f32 *free);
s32 WBFS_FAT_RemoveGame(u8 *discid);
s32 WBFS_FAT_AddGame(void);
s32 WBFS_FAT_DVD_Size(u64 *comp_size, u64 *real_size);
int WBFS_FAT_find_fname(u8 *id, char *fname, int len);
s32 WBFS_FAT_RenameGame(u8 *discid, const void *newname);
s32 WBFS_FAT_ReIDGame(u8 *discid, const void *newID);