@winuser2, ioctl który sugerujesz użyć operuje na zupełnie innym numerze (numer seryjny urządzenia to nie numer seryjny woluminu), robi to tylko dla dysków USB i nie obsługuje flashowych dysków USB. Pominę fakt, że wysyłanie ioctl'i do urządzeń fizycznych niesie za sobą dokładnie to samo ryzyko co np. bezpośrednia interpretacja struktur odczytanych bezpośrednio z dysku.
Jeśli chcesz wykorzystywać WinAPI, zrób to raczej za pomocą
GetVolumeInformation(). Funkcja zwróci numer seryjny woluminu w argumencie
lpVolumeSerialNumber. Numer ten trzeba zamienić na liczbę w hex. Użycie tej metody ucina możliwości pisania kodu przenośnego między różnymi systemami operacyjnymi, ponieważ wiąże kod do środowiska kompilacji w Windows.
Btw, wszystkie Windowsy, od 2000 do Windows 8 zawierają ten sam superblok. Nie zmienia się on z wersji na wersję, musi zachowywać wsteczną kompatybilność. Jedyne do tej pory duże złamanie kompatybilności nastąpiło w czasach przejścia z NT4 na 2000 - jednak NT4 jest tak starym systemem, że nawet wykorzystanie standardowego WinAPI wymaga odpowiednich poprawek kompatybilnościowych. Jeśli w przyszłości nastąpi rozszerzenie NTFS, będzie to zaimplementowane przy użyciu modularnej architektury samego NTFS, czyli przy użyciu specjalnych plików z początku MFT ($LogFile, $Boot, etc), lub przy użyciu nowych atrybutów (z ich definicjami w $AttrDef).