From 8473b54bb010a2fdcf7acb9dea1341bcd151f9a8 Mon Sep 17 00:00:00 2001 From: "fix94.1" Date: Sat, 24 Nov 2012 13:49:32 +0000 Subject: [PATCH] -fixed a possible bug in partition mounting -cleaned up the coverflow dependant partition select code --- source/devicemounter/DeviceHandler.cpp | 6 +-- source/devicemounter/PartitionHandle.cpp | 16 ++++--- source/menu/menu.hpp | 2 +- source/menu/menu_config.cpp | 5 ++- source/menu/menu_main.cpp | 54 +++++++++++++++--------- source/menu/menu_nandemu.cpp | 35 --------------- 6 files changed, 51 insertions(+), 67 deletions(-) diff --git a/source/devicemounter/DeviceHandler.cpp b/source/devicemounter/DeviceHandler.cpp index f093626f..019c483d 100644 --- a/source/devicemounter/DeviceHandler.cpp +++ b/source/devicemounter/DeviceHandler.cpp @@ -86,7 +86,7 @@ bool DeviceHandler::IsInserted(int dev) return SD_Inserted() && sd.IsMounted(0); else if(dev >= USB1 && dev <= USB8) { - int portPart = PartitionToPortPartition(dev-USB1); + int portPart = dev-1;//PartitionToPortPartition(dev-USB1); return usb0.IsMounted(portPart); } @@ -139,7 +139,7 @@ bool DeviceHandler::MountUSB(int pos) if(pos >= GetUSBPartitionCount()) return false; - int portPart = PartitionToPortPartition(pos); + int portPart = pos;//PartitionToPortPartition(pos); if(PartitionToUSBPort(pos) == 0) return usb0.Mount(portPart, DeviceName[USB1+pos]); @@ -175,7 +175,7 @@ void DeviceHandler::UnMountUSB(int pos) if(pos >= GetUSBPartitionCount()) return; - int portPart = PartitionToPortPartition(pos); + int portPart = pos;//PartitionToPortPartition(pos); if(PartitionToUSBPort(pos) == 0) return usb0.UnMount(portPart); diff --git a/source/devicemounter/PartitionHandle.cpp b/source/devicemounter/PartitionHandle.cpp index 2db0f48c..7b1dc22b 100644 --- a/source/devicemounter/PartitionHandle.cpp +++ b/source/devicemounter/PartitionHandle.cpp @@ -39,6 +39,12 @@ #define PARTITION_TYPE_DOS33_EXTENDED 0x05 /* DOS 3.3+ extended partition */ #define PARTITION_TYPE_WIN95_EXTENDED 0x0F /* Windows 95 extended partition */ +/* Predefined Buffers */ +GUID_PART_ENTRY gpt_entry[MAX_BYTES_PER_SECTOR] ATTRIBUTE_ALIGN(32); +MASTER_BOOT_RECORD mbr[MAX_BYTES_PER_SECTOR] ATTRIBUTE_ALIGN(32); +u8 HeaderBuffer[MAX_BYTES_PER_SECTOR] ATTRIBUTE_ALIGN(32); +u8 AddingBuffer[MAX_BYTES_PER_SECTOR] ATTRIBUTE_ALIGN(32); + //! libfat stuff extern "C" { @@ -234,8 +240,6 @@ bool PartitionHandle::IsExisting(u64 lba) s8 PartitionHandle::FindPartitions() { - MASTER_BOOT_RECORD mbr[MAX_BYTES_PER_SECTOR] ATTRIBUTE_ALIGN(32); - // Read the first sector on the device if(!interface->readSectors(0, 1, mbr)) return -1; @@ -269,9 +273,6 @@ s8 PartitionHandle::FindPartitions() return 0; } -static u8 HeaderBuffer[MAX_BYTES_PER_SECTOR] ATTRIBUTE_ALIGN(32); -static u8 AddingBuffer[MAX_BYTES_PER_SECTOR] ATTRIBUTE_ALIGN(32); - void PartitionHandle::CheckEBR(u8 PartNum, sec_t ebr_lba) { EXTENDED_BOOT_RECORD *ebr = (EXTENDED_BOOT_RECORD *)HeaderBuffer; @@ -319,12 +320,12 @@ s8 PartitionHandle::CheckGPT(u8 PartNum) u64 next_lba = gpt_header->part_table_lba; for(u32 i = 0; i < gpt_header->part_entries; ++i) { - if(!interface->readSectors(next_lba, 1, AddingBuffer)) + if(!interface->readSectors(next_lba, 1, gpt_entry)) break; for(u32 n = 0; n < BYTES_PER_SECTOR/gpt_header->part_entry_size; ++n, ++i) { - GUID_PART_ENTRY * part_entry = (GUID_PART_ENTRY *) (AddingBuffer + gpt_header->part_entry_size*n); + GUID_PART_ENTRY *part_entry = (gpt_entry + gpt_header->part_entry_size * n); if(memcmp(part_entry->part_type_guid, TYPE_UNUSED, 16) == 0) continue; @@ -378,6 +379,7 @@ void PartitionHandle::AddPartition(const char *name, u64 lba_start, u64 sec_coun PartitionEntry.Bootable = bootable; PartitionEntry.PartitionType = part_type; PartitionEntry.PartitionNum = part_num; + gprintf("Found a %s Partition with the number %i\n", name, part_num); PartitionList.push_back(PartitionEntry); } diff --git a/source/menu/menu.hpp b/source/menu/menu.hpp index 19c7f3d4..f7e375d6 100644 --- a/source/menu/menu.hpp +++ b/source/menu/menu.hpp @@ -898,7 +898,7 @@ private: void _showConfig4(void); void _showConfigAdv(void); void _showConfigSnd(void); - void _enableNandEmu(bool fromconfig); + void _setPartition(s8 direction = 0); void _showGame(void); void _showDownload(void); void _showSettings(); diff --git a/source/menu/menu_config.cpp b/source/menu/menu_config.cpp index 01e110f3..426d8490 100644 --- a/source/menu/menu_config.cpp +++ b/source/menu/menu_config.cpp @@ -171,7 +171,7 @@ int CMenu::_config1(void) if (BTN_HOME_PRESSED || BTN_B_PRESSED) { - _enableNandEmu(false); + _setPartition(); break; } if (BTN_A_PRESSED) @@ -189,7 +189,8 @@ int CMenu::_config1(void) _code(); else if ((m_btnMgr.selected(m_configBtnPartitionP) || m_btnMgr.selected(m_configBtnPartitionM))) { - _enableNandEmu(true); + s8 direction = m_btnMgr.selected(m_configBtnPartitionP) ? 1 : -1; + _setPartition(direction); _showConfig(); } else if (m_btnMgr.selected(m_configBtnCfg4)) diff --git a/source/menu/menu_main.cpp b/source/menu/menu_main.cpp index 08d15868..440668ba 100644 --- a/source/menu/menu_main.cpp +++ b/source/menu/menu_main.cpp @@ -633,26 +633,8 @@ int CMenu::main(void) { _showWaitMessage(); _hideMain(); - bool isD2XnewerThanV6 = (CurrentIOS.Type == IOS_TYPE_NEEK2O); - if(CurrentIOS.Revision > 6 && CurrentIOS.Type == IOS_TYPE_D2X) - isD2XnewerThanV6 = true; - if(m_current_view == COVERFLOW_CHANNEL && m_cfg.getInt(CHANNEL_DOMAIN, "emulation", 0)) - NandHandle.Enable_Emu(); - u8 limiter = 0; - currentPartition = loopNum(currentPartition + 1, (int)USB8); - while(!DeviceHandle.IsInserted(currentPartition) || - ((m_current_view == COVERFLOW_CHANNEL || m_current_view == COVERFLOW_PLUGIN) && (DeviceHandle.GetFSType(currentPartition) != PART_FS_FAT || - (!isD2XnewerThanV6 && DeviceHandle.PathToDriveType(m_appDir.c_str()) == currentPartition) || - (!isD2XnewerThanV6 && DeviceHandle.PathToDriveType(m_dataDir.c_str()) == currentPartition))) || - ((m_current_view == COVERFLOW_HOMEBREW || m_current_view == COVERFLOW_DML) && DeviceHandle.GetFSType(currentPartition) == PART_FS_WBFS)) - { - currentPartition = loopNum(currentPartition + 1, (int)USB8); - if(limiter > 10) break; - limiter++; - } + _setPartition(1); partition = DeviceName[currentPartition]; - gprintf("Setting Emu NAND to Partition: %i\n",currentPartition); - m_cfg.setInt(_domainFromView(), "partition", currentPartition); } else partition = "NAND"; @@ -1060,3 +1042,37 @@ wstringEx CMenu::_getNoticeTranslation(int sorting, wstringEx curLetter) return curLetter; } + +void CMenu::_setPartition(s8 direction) +{ + _cfNeedsUpdate(); + bool disable = m_current_view == COVERFLOW_CHANNEL && !m_tempView && + (m_cfg.getBool(CHANNEL_DOMAIN, "disable", true) || neek2o()); + if(disable) + return; + + if(m_current_view == COVERFLOW_CHANNEL) + NandHandle.Enable_Emu(); + + if(direction != 0) + { + u8 limiter = 0; + bool NeedFAT = m_current_view == COVERFLOW_CHANNEL || m_current_view == COVERFLOW_DML; + currentPartition = loopNum(currentPartition + direction, 8); + int FS_Type = DeviceHandle.GetFSType(currentPartition); + while(!DeviceHandle.IsInserted(currentPartition) || + (m_current_view != COVERFLOW_USB && FS_Type == PART_FS_WBFS) || + (NeedFAT && FS_Type != PART_FS_FAT)) + { + currentPartition = loopNum(currentPartition + direction, 8); + FS_Type = DeviceHandle.GetFSType(currentPartition); + if(limiter > 10) + break; + limiter++; + } + } + if(m_tempView) + m_cfg.setInt(WII_DOMAIN, "savepartition", currentPartition); + else + m_cfg.setInt(_domainFromView(), "partition", currentPartition); +} diff --git a/source/menu/menu_nandemu.cpp b/source/menu/menu_nandemu.cpp index 09ad49f4..b328e72c 100644 --- a/source/menu/menu_nandemu.cpp +++ b/source/menu/menu_nandemu.cpp @@ -187,41 +187,6 @@ bool CMenu::_checkSave(string id, bool nand) return true; } -void CMenu::_enableNandEmu(bool fromconfig) -{ - _cfNeedsUpdate(); - bool disable = (m_cfg.getBool(CHANNEL_DOMAIN, "disable", true) || neek2o()) && m_current_view == COVERFLOW_CHANNEL && !m_tempView; - - if(!disable) - { - bool isD2XnewerThanV6 = (CurrentIOS.Type == IOS_TYPE_NEEK2O); - if(CurrentIOS.Revision > 6 && CurrentIOS.Type == IOS_TYPE_D2X) - isD2XnewerThanV6 = true; - if(m_current_view == COVERFLOW_CHANNEL && !m_cfg.getBool(CHANNEL_DOMAIN, "disable", true) && !neek2o() && !m_tempView) - NandHandle.Enable_Emu(); - u8 limiter = 0; - s8 direction = m_btnMgr.selected(m_configBtnPartitionP) ? 1 : -1; - if (!fromconfig) - direction = 0; - currentPartition = loopNum(currentPartition + direction, (int)USB8); - while(!DeviceHandle.IsInserted(currentPartition) || - (m_current_view == COVERFLOW_CHANNEL && (DeviceHandle.GetFSType(currentPartition) != PART_FS_FAT || - (!isD2XnewerThanV6 && DeviceHandle.PathToDriveType(m_appDir.c_str()) == currentPartition) || - (!isD2XnewerThanV6 && DeviceHandle.PathToDriveType(m_dataDir.c_str()) == currentPartition))) || - ((m_current_view == COVERFLOW_HOMEBREW || m_current_view == COVERFLOW_DML) && DeviceHandle.GetFSType(currentPartition) == PART_FS_WBFS)) - { - currentPartition = loopNum(currentPartition + direction, (int)USB8); - if (limiter > 10) break; - limiter++; - } - gprintf("Next item: %s\n", DeviceName[currentPartition]); - if(m_tempView) - m_cfg.setInt(WII_DOMAIN, "savepartition", currentPartition); - else - m_cfg.setInt(_domainFromView(), "partition", currentPartition); - } -} - void CMenu::_setDumpMsg(const wstringEx &msg, float totprog, float fileprog) { if(m_thrdStop) return;