Rysunek poglądowy w załączniku
cholernie przydatnym toolem jest nbinfo z imgfstools
Wskazówki wstępne
Jedna linijka = jedna partycja (oprócz końcówki 2 ostatnie hexów, ale one raz raczej nie interesują)
Błędy w partycjonowaniu nie koniecznie oznaczają brak bootowania, po prostu obraz może się źle składać/rozkładać przez imgfstools (nieraz wystarczy pokombinować właśnie tymi toolsami troszkę i nasze babole zostaną załatane)
1 Block(track?) = block size z MSFLSH (zazwyczaj 0x20000 dla urządzeń ze zmiennym i 0x10000 dla urządzeń ze stałym storage)
1 Sector = tyle bajtów, ile ustawiliśmy przy zrzucaniu
How to remove uldr// Wskazówka techniczna dla urządzeń ze skompresowanym XIPem, można wrzucić nieskompresowany w jego miejsce, o ile mieści się
fizycznie w obszarze dla niego wyznaczonym
Robimy z 3 linijek dwie, na początek opcja z łączeniem partycji uldr i xip
Nowa Partycja powinna wyglądać tak
File System: 0x23 (XIP RAM)
Start Sector: taki jaki był pierwotnie w uldr
Total Sectors: suma total sectors uldr i xip
Boot indicator: zazwyczaj 0x00
First Head: taki jaki był w uldr
First Sector: taki jaki był w uldr
First Track: taki jaki był w uldr (czyli 0x00 prawie zawsze)
Last Head: taki jaki był gdziekolwiek, zazwyczaj jest taki sam wszędzie
Last Sector: taki jaki był w xip
Last Track: taki jaki był w xip
Rzecz jasna po tej operacji xip wklejamy na początek uldr
Budujemy nowy, świeżutki os.nb1. Zbieramy informacje.
Zakładam najgorszą opcję, dysponujecie tylko dumpem z pdocread

-na wstępie odrzucamy dump uldr
-zapisujemy sobie listę partycji np tak pdocread -l >listing.txt
-jak w takim razie policzyć block size? to jest tak zwane "dobre pytanie". W krótkiego rozpoznania (czyli przejrzenia romów na dysku) wynika, że urządzenia ze stałym storage mają block size równy 0x10000 bajtów. Urządzenia ze zmiennym storage z kolei posiadają block size równy 0x20000 bajtów. Obliczamy sobie jeszcze sectors per block
-rozmiar boot, msflash to odpowiednio rozmiar jednego sektora.
2. Składamy boot
No to skoro mamy podstawowe informacje to czas zacząć

- obcinamy xip z ewentualnych "FF" na końcu. Ustawiamy tak rozmiar partycji z nim, aby dodając rozmiar boot i msflash był podzielny przez block size. Zapisujemy info w boot jako pierwszą partycję
- filesystem 0x23
- start address 0x02
- total sectors (to co nam wyjdzie z ustawionego rozmiaru dzieląc przez sectors per block)
- Boot indicator 0x00
- First Head 0x02
- First Sector 0x01
- First Track 0x00
- Last Head (sector size -1)
- Last Sector 0x01
- Last Track (liczba block'ów, czyli to co wychodzi z dzielenia rozmiaru xipa przez block size -1)
- drugi etap, umieszczamy imgfs na swoim miejscu, polecam dump'nąć na chwilę i zaciągnąć z powrotem do pliku. Dopełniamy FF, aby był podzielny przez block size.
zczytujemy rozmiar i dopełniamy "FF", tak aby całość była podzielna przez sector size.
- filesystem 0x25
- start address (ilość sektorów poprzedniej partycji + start address poprzedniej partycji)
- total sectors (to co nam wyjdzie z ustawionego rozmiaru dzieląc przez sectors per block)
- Boot indicator 0x00
- First Head 0x00
- First Sector (last sector poprzedniej partycji)
- First Track (last track poprzedniej partycji+1)
- Last Head (sector size -1)
- Last Sector (zagwozdka, czytaj niżej)
- Last Track (liczba block'ów, czyli to co wychodzi z dzielenia rozmiaru imgfs przez block size -> ponieważ zazwyczaj wychodzi ponad miejsce na wpisanie, trzeba zostawić poprawną końcówkę np z 0x205 to będzie 04, a resztę czyli 200 dzielimy przez 0x40 i wstawiamy jako pierwszy bajt Last Sector, drugim bajtem last sector jest zawsze 0x1! (o ile trzymamy się tej instrukcji i dostępnych tooli))
- ostatni krok, dla posiadaczy pda z partycją FAT na tym samym obszarze co rom.
Musimy policzyć ile zostało nam wolnych sektorów i bloków biorąc pod uwagę pojemność odczytaną z nuestorage managera.
czyli obliczamy total sectors dostępne - zużyte i wpisujemy
- filesystem 0x04
- start address (ilość sektorów poprzedniej partycji + start address poprzedniej partycji)
- total sectors (to co nam wyjdzie z total sectors dostępne - zużyte)
- Boot indicator 0x00
- First Head 0x00
- First Sector (last sector poprzedniej partycji)
- First Track (last track poprzedniej partycji+1)
- Last Head (sector size -1)
- Last Sector (liczba nadmiarowych sektorów powstałych podczas dzielenia (total sectors dostępne - zużyte) przez sectors per block)
- Last Track (liczba block'ów, czyli to co wychodzi z dzielenia (total sectors dostępne - zużyte) sectors per block -1, z zastrzeżeniem takim jak w adnotacji do imgfs)
3. Składamy MSFLSH50
Rozmiar dla pocketów ze stałym storage to 0x38 bajtów, ze zmiennym 0x54, resztę dopełniamy "FF"
Więc
- Leci sygnaturka 4D 53 46 4C 53 48 35 30
- pusty dword
- dword z rozmiarem msflash
- numer wpisu (tutaj 0, liczone od 0)
- 2 puste dword
- liczba bloków RAW FS (czyli uldr + xip)
- sectors per block (dword)
- bytes per block (dword)
- unknown (dword 0)
- numer wpisu (tutaj 1, liczone od 0)
- 2 puste dword
- liczba bloków imgfs
- Sectors per block(dword)
- Bytes per block(dword)
- unknown (dword 2 dla urządzeń ze zmiennym storage, 0 dla urządzeń ze stałym storage)(poniższe parametry tylko dla urządzeń ze zmiennym storage, reszta kończy robotę)
- numer wpisu (tutaj 2, liczone od 0)
- 2 puste dword
- liczba bloków partycji FAT, ważne dla stabilności!
- Sectors per block
- Bytes per block
- unknown (dword 2 dla urządzeń ze zmiennym storage)
4. Dla urządzeń ze zmiennym storage trzeba jeszcze ustawić parametry nbmerge, czyli zazwyczaj data = Bytes per sector i extra= 0x8 (zazwyczaj!)
//Bo jest za dużo "zazwyczaj", nie mam możliwości pobawić się każdym urządzeniem, więc poradnik jest na tą chwilę niedopracowany. Liczę na to, że pobawicie się trochę i zdacie relację, co jeszcze dopisać