From a1123de28f8b02cf7a15569ccd76c8e5a82ccb98 Mon Sep 17 00:00:00 2001 From: Michael Sevakis Date: Sun, 14 Jan 2018 08:23:48 -0500 Subject: Gigabeat S: Remove unwanted partitions on the fly Windows now ignores the hidden flag, so just nullify the entries to hide depending upon whether or not bootloader install mode is activated. Change-Id: I00d0797e40ea3b5f5d5d8e1243b50cfcdd029bb4 --- .../target/arm/imx31/gigabeat-s/usb-gigabeat-s.c | 34 ++++++++++++---------- 1 file changed, 18 insertions(+), 16 deletions(-) (limited to 'firmware/target/arm') diff --git a/firmware/target/arm/imx31/gigabeat-s/usb-gigabeat-s.c b/firmware/target/arm/imx31/gigabeat-s/usb-gigabeat-s.c index 71e8342595..737ee36e00 100644 --- a/firmware/target/arm/imx31/gigabeat-s/usb-gigabeat-s.c +++ b/firmware/target/arm/imx31/gigabeat-s/usb-gigabeat-s.c @@ -147,9 +147,17 @@ void usb_drv_int_enable(bool enable) void usb_fix_mbr(unsigned char *mbr) { unsigned char* p = mbr + 0x1be; - char tmp[16]; - /* The Gigabeat S factory partition table contains invalid values for the + /* Windows ignores the partition flags and mounts the first partition it + sees when the device reports itself as removable. Swap the partitions + so the data partition appears to be partition 0. Mark the boot + partition 0 as hidden and make it partition 1. + + Update 2018-01-14: Windows shows it if exists, so long as it can mount + it. Resort to not exposing entries that we want hidden. + */ + + /* The Gigabeat S factory partition table contains invalid values for the "active" flag in the MBR. This prevents at least the Linux kernel from accepting the partition table, so we fix it on-the-fly. */ p[0x00] &= 0x80; @@ -158,18 +166,12 @@ void usb_fix_mbr(unsigned char *mbr) p[0x30] &= 0x80; if (bootloader_install_mode) - return; - - /* Windows ignores the partition flags and mounts the first partition it - sees when the device reports itself as removable. Swap the partitions - so the data partition appears to be partition 0. Mark the boot - partition 0 as hidden and make it partition 1. */ - - /* Mark the first partition as hidden */ - p[0x04] |= 0x10; - - /* Swap first and second partitions */ - memcpy(tmp, &p[0x00], 16); - memcpy(&p[0x00], &p[0x10], 16); - memcpy(&p[0x10], tmp, 16); + { + memset(&p[0x10], 0x00, 0x30); /* Hide non-boot partitions */ + } + else + { + memmove(&p[0x00], &p[0x10], 0x30); /* Hide boot partition */ + memset(&p[0x30], 0x00, 0x10); + } } -- cgit v1.2.3