Files
XBMC4Xbox/xbmc/utils/SystemInfo.cpp
Rocky5 921f9fe9f8 Clean Copy
If ever adding the XBMC4Xbox source to GitHub use "git add -f -A" or it wont add all the files.
2024-01-08 19:01:29 +00:00

1776 lines
59 KiB
C++

/*
* Copyright (C) 2005-2013 Team XBMC
* http://xbmc.org
*
* This Program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This Program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with XBMC; see the file COPYING. If not, see
* <http://www.gnu.org/licenses/>.
*
*/
#include "system.h"
#include "SystemInfo.h"
#include <conio.h>
#include "settings/Settings.h"
#include "utils/log.h"
#include "cores/DllLoader/DllLoader.h"
#include "GUIInfoManager.h"
#include "FileSystem/CurlFile.h"
#include "LocalizeStrings.h"
#ifdef HAS_XBOX_HARDWARE
#include "xbox/Undocumented.h"
#include "xbox/XKUtils.h"
#include "xbox/XKHDD.h"
#include "xbox/XKflash.h"
#include "xbox/XKRC4.h"
extern "C" XPP_DEVICE_TYPE XDEVICE_TYPE_IR_REMOTE_TABLE;
#endif
#include "FileSystem/CurlFile.h"
CSysInfo g_sysinfo;
bool CSysInfo::DoWork()
{
#ifdef HAS_XBOX_HARDWARE
//Request only one time!
if(!m_bRequestDone)
{
// The X2 series of modchips cause an error on XBE launching if GetModChipInfo()
if(!g_advancedSettings.m_DisableModChipDetection)
{
m_XboxModChip = GetModChipInfo();
}
m_XboxBios = GetBIOSInfo();
m_mplayerversion = GetMPlayerVersion();
m_kernelversion = GetKernelVersion();
m_cpufrequency = GetCPUFreqInfo();
m_xboxversion = GetXBVerInfo();
m_avpackinfo = GetAVPackInfo();
m_videoencoder = GetVideoEncoder();
m_xboxserial = GetXBOXSerial();
m_hddlockkey = GetHDDKey();
m_macadress = GetMACAddress();
m_videoxberegion = GetVideoXBERegion();
m_videodvdzone = GetDVDZone();
m_produceinfo = GetXBProduceInfo();
g_sysinfo.GetRefurbInfo(m_hddbootdate, m_hddcyclecount);
if (m_bSmartSupported && !m_bSmartEnabled)
{
CLog::Log(LOGNOTICE, "Enabling SMART...");
XKHDD::EnableSMART();
}
m_bRequestDone = true;
}
#endif
//Request always
m_systemuptime = GetSystemUpTime(false);
m_systemtotaluptime = GetSystemUpTime(true);
m_InternetState = GetInternetState();
#ifdef HAS_XBOX_HARDWARE
if (!m_hddRequest)
GetHDDInfo(m_HDDModel,
m_HDDSerial,
m_HDDFirmware,
m_HDDpw,
m_HDDLockState);
// don't check the DVD-ROM if we have already successfully retrieved its info, or it is specified
// as not present in advancedsettings
if (!m_dvdRequest && !g_advancedSettings.m_noDVDROM)
GetDVDInfo(m_DVDModel, m_DVDFirmware);
if (m_bSmartEnabled)
byHddTemp = XKHDD::GetHddSmartTemp();
else
byHddTemp = 0;
#endif
return true;
}
CStdString CSysInfo::TranslateInfo(int info) const
{
switch(info)
{
#ifdef HAS_XBOX_HARDWARE
case SYSTEM_MPLAYER_VERSION:
if (m_bRequestDone) return m_mplayerversion;
else return CInfoLoader::BusyInfo(info);
break;
case SYSTEM_KERNEL_VERSION:
if (m_bRequestDone) return m_kernelversion;
else return CInfoLoader::BusyInfo(info);
break;
case SYSTEM_CPUFREQUENCY:
if (m_bRequestDone) return m_cpufrequency;
else return CInfoLoader::BusyInfo(info);
break;
case SYSTEM_XBOX_VERSION:
if (m_bRequestDone) return m_xboxversion;
else return CInfoLoader::BusyInfo(info);
break;
case SYSTEM_AV_PACK_INFO:
if (m_bRequestDone) return m_avpackinfo;
else return CInfoLoader::BusyInfo(info);
break;
case SYSTEM_VIDEO_ENCODER_INFO:
if (m_bRequestDone) return m_videoencoder;
else return CInfoLoader::BusyInfo(info);
break;
case SYSTEM_XBOX_SERIAL:
if (m_bRequestDone) return m_xboxserial;
else return CInfoLoader::BusyInfo(info);
break;
case SYSTEM_HDD_LOCKKEY:
if (m_bRequestDone) return m_hddlockkey;
else return CInfoLoader::BusyInfo(info);
break;
case SYSTEM_HDD_BOOTDATE:
if (m_bRequestDone) return m_hddbootdate;
else return CInfoLoader::BusyInfo(info);
break;
case SYSTEM_HDD_CYCLECOUNT:
if (m_bRequestDone) return m_hddcyclecount;
else return CInfoLoader::BusyInfo(info);
break;
case NETWORK_MAC_ADDRESS:
if (m_bRequestDone) return m_macadress;
else return CInfoLoader::BusyInfo(info);
break;
case SYSTEM_XBE_REGION:
if (m_bRequestDone) return m_videoxberegion;
else return CInfoLoader::BusyInfo(info);
break;
case SYSTEM_DVD_ZONE:
if (m_bRequestDone) return m_videodvdzone;
else return CInfoLoader::BusyInfo(info);
break;
case SYSTEM_XBOX_PRODUCE_INFO:
if (m_bRequestDone) return m_produceinfo;
else return CInfoLoader::BusyInfo(info);
break;
case SYSTEM_XBOX_BIOS:
if (m_bRequestDone) return m_XboxBios;
else return CInfoLoader::BusyInfo(info);
break;
case SYSTEM_XBOX_MODCHIP:
if (g_advancedSettings.m_DisableModChipDetection)
return "Modchip lookup is disabled";
else
{
if (m_bRequestDone)
return m_XboxModChip;
else
return CInfoLoader::BusyInfo(info);
}
break;
// HDD request
case SYSTEM_HDD_MODEL:
if (m_hddRequest) return m_HDDModel;
else return CInfoLoader::BusyInfo(info);
case SYSTEM_HDD_SERIAL:
if (m_hddRequest) return m_HDDSerial;
else return CInfoLoader::BusyInfo(info);
case SYSTEM_HDD_FIRMWARE:
if (m_hddRequest) return m_HDDFirmware;
else return CInfoLoader::BusyInfo(info);
case SYSTEM_HDD_PASSWORD:
if (m_hddRequest) return m_HDDpw;
else return CInfoLoader::BusyInfo(info);
case SYSTEM_HDD_LOCKSTATE:
if (m_hddRequest) return m_HDDLockState;
else return CInfoLoader::BusyInfo(info);
// DVD request
case SYSTEM_DVD_MODEL:
if (m_dvdRequest) return m_DVDModel;
else return CInfoLoader::BusyInfo(info);
case SYSTEM_DVD_FIRMWARE:
if (m_dvdRequest) return m_DVDFirmware;
else return CInfoLoader::BusyInfo(info);
// All Time request
case LCD_HDD_TEMPERATURE:
case SYSTEM_HDD_TEMPERATURE:
{
CTemperature temp;
CStdString strTemp;
temp.SetState(CTemperature::invalid);
if(m_bSmartEnabled && byHddTemp != 0)
temp = CTemperature::CreateFromCelsius((double)byHddTemp);
strTemp.Format("%s",temp.ToString());
return strTemp;
}
#endif
case SYSTEM_UPTIME:
if (!m_systemuptime.IsEmpty()) return m_systemuptime;
else return CInfoLoader::BusyInfo(info);
case SYSTEM_TOTALUPTIME:
if (!m_systemtotaluptime.IsEmpty()) return m_systemtotaluptime;
else return CInfoLoader::BusyInfo(info);
case SYSTEM_INTERNET_STATE:
if (!m_InternetState.IsEmpty()) return m_InternetState;
else return g_localizeStrings.Get(503); //Busy text
default:
return g_localizeStrings.Get(503); //Busy text
}
}
void CSysInfo::Reset()
{
#ifdef HAS_XBOX_HARDWARE
m_XboxBios ="";
m_XboxModChip ="";
m_dvdRequest = false;
m_hddRequest = false;
m_HDDModel ="";
m_HDDSerial="";
m_HDDFirmware="";
m_HDDpw ="";
m_HDDLockState = "";
m_DVDModel="";
m_DVDFirmware="";
#endif
m_bInternetState = false;
m_InternetState = "";
}
CSysInfo::CSysInfo(void) : CInfoLoader(15 * 1000)
{
#ifdef HAS_XBOX_HARDWARE
m_bRequestDone = false;
m_XKEEPROM = new XKEEPROM;
m_XKEEPROM->ReadFromXBOX();
// XKEEPROM functions will automatically decrypt if encrypted already, but we should
// automatically decrypt before fetching version information to set the XBOXVersion first.
m_XKEEPROM->Decrypt();
m_XBOXVersion = m_XKEEPROM->GetXBOXVersion();
#endif
}
CSysInfo::~CSysInfo()
{
#ifdef HAS_XBOX_HARDWARE
delete m_XKEEPROM;
#endif
}
#ifdef HAS_XBOX_HARDWARE
struct Bios * CSysInfo::LoadBiosSigns()
{
FILE *infile;
if ((infile = fopen(XBOX_BIOS_ID_INI_FILE,"r")) == NULL)
{
CLog::Log(LOGDEBUG, "ERROR LOADING BIOSES.INI!!");
return NULL;
}
else
{
struct Bios * Listone = (struct Bios *)calloc(1000, sizeof(struct Bios));
int cntBioses=0;
char buffer[255];
char stringone[255];
do
{
fgets(stringone,255,infile);
if (stringone[0] != '#')
{
if (strstr(stringone,"=")!= NULL)
{
strcpy(Listone[cntBioses].Name,ReturnBiosName(buffer, stringone));
strcpy(Listone[cntBioses].Signature,ReturnBiosSign(buffer, stringone));
cntBioses++;
}
}
} while( !feof( infile ) && cntBioses < 999 );
fclose(infile);
strcpy(Listone[cntBioses++].Name,"\0");
strcpy(Listone[cntBioses++].Signature,"\0");
return Listone;
}
}
char* CSysInfo::MD5Buffer(char *buffer, long PosizioneInizio,int KBytes)
{
XBMC::XBMC_MD5 mdContext;
CStdString md5sumstring;
mdContext.append((unsigned char *)(buffer + PosizioneInizio), KBytes * 1024);
mdContext.getDigest(md5sumstring);
strcpy(MD5_Sign, md5sumstring.c_str());
return MD5_Sign;
}
char* CSysInfo::ReturnBiosName(char *buffer, char *str)
{
int cnt1,cnt2,i;
cnt1=cnt2=0;
for (i=0;i<255;i++) buffer[i]='\0';
if ( (strstr(str,"(1MB)")==0) || (strstr(str,"(512)")==0) || (strstr(str,"(256)")==0) )
cnt2=5;
while (str[cnt2] != '=')
{
buffer[cnt1]=str[cnt2];
cnt1++;
cnt2++;
}
buffer[cnt1++]='\0';
return buffer;
}
char* CSysInfo::ReturnBiosSign(char *buffer, char *str)
{
int cnt1,cnt2,i;
cnt1=cnt2=0;
for (i=0;i<255;i++) buffer[i]='\0';
while (str[cnt2] != '=') cnt2++;
cnt2++;
while (str[cnt2] != NULL)
{
if ( str[cnt2] != ' ' )
{
buffer[cnt1]=toupper(str[cnt2]);
cnt1++;
cnt2++;
}
else cnt2++;
}
buffer[cnt1++]='\0';
return buffer;
}
char* CSysInfo::CheckMD5 (struct Bios *Listone, char *Sign)
{
int cntBioses;
cntBioses=0;
do
{
if (strstr(Listone[cntBioses].Signature, Sign) != NULL)
{ return (Listone[cntBioses].Name); }
cntBioses++;
}
while( strcmp(Listone[cntBioses].Name,"\0") != 0);
return ("Unknown");
}
void CSysInfo::WriteTXTInfoFile()
{
LPCSTR strFilename = XBOX_XBMC_TXT_INFOFILE;
BOOL retVal = FALSE;
DWORD dwBytesWrote = 0;
CHAR tmpData[SYSINFO_TMP_SIZE];
CStdString tmpstring;
LPSTR tmpFileStr = new CHAR[2048];
ZeroMemory(tmpData, SYSINFO_TMP_SIZE);
ZeroMemory(tmpFileStr, 2048);
HANDLE hf = CreateFile(strFilename, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (hf != INVALID_HANDLE_VALUE)
{
//Write File Header..
strcat(tmpFileStr, "******* XBOXMEDIACENTER [XBMC] INFORMATION FILE *******\r\n");
if (m_XBOXVersion== m_XKEEPROM->V1_0)
strcat(tmpFileStr, "\r\nXBOX Version = \t\tV1.0");
else if (m_XBOXVersion == m_XKEEPROM->V1_1)
strcat(tmpFileStr, "\r\nXBOX Version = \t\tV1.1-V1.5");
else if (m_XBOXVersion == m_XKEEPROM->V1_6)
strcat(tmpFileStr, "\r\nXBOX Version = \t\tV1.6");
//Get Kernel Version
ZeroMemory(tmpData, SYSINFO_TMP_SIZE);
sprintf(tmpData, "\r\nKernel Version: \t%d.%d.%d.%d", XboxKrnlVersion->VersionMajor,XboxKrnlVersion->VersionMinor,XboxKrnlVersion->Build,XboxKrnlVersion->Qfe);
strcat(tmpFileStr, tmpData);
//Get Memory Status
strcat(tmpFileStr, "\r\nXBOX RAM = \t\t");
ZeroMemory(tmpData, SYSINFO_TMP_SIZE);
MEMORYSTATUS stat;
GlobalMemoryStatus( &stat );
ltoa(stat.dwTotalPhys/1024/1024, tmpData, 10);
strcat(tmpFileStr, tmpData);
strcat(tmpFileStr, " MBytes");
//Write Serial Number..
strcat(tmpFileStr, "\r\n\r\nXBOX Serial Number = \t");
CHAR serial[SERIALNUMBER_SIZE + 1] = "";
m_XKEEPROM->GetSerialNumberString(serial);
strcat(tmpFileStr, serial);
//Write MAC Address..
strcat(tmpFileStr, "\r\nXBOX MAC Address = \t");
m_XKEEPROM->GetMACAddressString((LPSTR)&tmpstring, ':');
strcat(tmpFileStr, tmpstring.c_str());
//Write Online Key ..
strcat(tmpFileStr, "\r\nXBOX Online Key = \t");
char livekey[ONLINEKEY_SIZE * 2 + 1] = "";
m_XKEEPROM->GetOnlineKeyString(livekey);
strcat(tmpFileStr, livekey);
//Write VideoMode ..
strcat(tmpFileStr, "\r\nXBOX Video Mode = \t");
VIDEO_STANDARD vdo = m_XKEEPROM->GetVideoStandardVal();
if (vdo == XKEEPROM::VIDEO_STANDARD::PAL_I)
strcat(tmpFileStr, "PAL");
else
strcat(tmpFileStr, "NTSC");
//Write XBE Region..
strcat(tmpFileStr, "\r\nXBOX XBE Region = \t");
ZeroMemory(tmpData, SYSINFO_TMP_SIZE);
m_XKEEPROM->GetXBERegionString(tmpData);
strcat(tmpFileStr, tmpData);
//Write HDDKey..
strcat(tmpFileStr, "\r\nXBOX HDD Key = \t\t");
ZeroMemory(tmpData, SYSINFO_TMP_SIZE);
m_XKEEPROM->GetHDDKeyString(tmpData);
strcat(tmpFileStr, tmpData);
//Write Confounder..
strcat(tmpFileStr, "\r\nXBOX Confounder = \t");
ZeroMemory(tmpData, SYSINFO_TMP_SIZE);
m_XKEEPROM->GetConfounderString(tmpData);
strcat(tmpFileStr, tmpData);
//GET HDD Info...
//Query ATA IDENTIFY
XKHDD::ATA_COMMAND_OBJ cmdObj;
ZeroMemory(&cmdObj, sizeof(XKHDD::ATA_COMMAND_OBJ));
cmdObj.DATA_BUFFSIZE = 0x200;
cmdObj.IPReg.bCommandReg = ATA_IDENTIFY_DEVICE;
XKHDD::SendATACommand(XBOX_DEVICE_HDD, &cmdObj, IDE_COMMAND_READ);
//Write HDD Model
strcat(tmpFileStr, "\r\n\r\nXBOX HDD Model = \t");
ZeroMemory(tmpData, SYSINFO_TMP_SIZE);
XKHDD::GetIDEModel(cmdObj.DATA_BUFFER, (LPSTR)tmpData);
strcat(tmpFileStr, tmpData);
//Write HDD Serial..
strcat(tmpFileStr, "\r\nXBOX HDD Serial = \t");
ZeroMemory(tmpData, SYSINFO_TMP_SIZE);
XKHDD::GetIDESerial(cmdObj.DATA_BUFFER, (LPSTR)tmpData);
strcat(tmpFileStr, tmpData);
//Write HDD Password..
ZeroMemory(tmpData, SYSINFO_TMP_SIZE);
strcat(tmpFileStr, "\r\n\r\nXBOX HDD Password = \t");
ZeroMemory(tmpData, SYSINFO_TMP_SIZE);
BYTE HDDpwd[20];
ZeroMemory(HDDpwd, 20);
XKHDD::GenerateHDDPwd((UCHAR *)XboxHDKey, cmdObj.DATA_BUFFER, (UCHAR*)&HDDpwd);
XKGeneral::BytesToHexStr(HDDpwd, 20, tmpData);
strcat(tmpFileStr, tmpData);
//Query ATAPI IDENTIFY
ZeroMemory(&cmdObj, sizeof(XKHDD::ATA_COMMAND_OBJ));
cmdObj.DATA_BUFFSIZE = 0x200;
cmdObj.IPReg.bCommandReg = ATA_IDENTIFY_PACKET_DEVICE;
XKHDD::SendATACommand(XBOX_DEVICE_DVDROM, &cmdObj, IDE_COMMAND_READ);
//Write DVD Model
strcat(tmpFileStr, "\r\n\r\nXBOX DVD Model = \t");
ZeroMemory(tmpData, SYSINFO_TMP_SIZE);
XKHDD::GetIDEModel(cmdObj.DATA_BUFFER, (LPSTR)tmpData);
strcat(tmpFileStr, tmpData);
strupr(tmpFileStr);
WriteFile(hf, tmpFileStr, (DWORD)strlen(tmpFileStr), &dwBytesWrote, NULL);
}
delete[] tmpFileStr;
CloseHandle(hf);
}
bool CSysInfo::CreateBiosBackup()
{
FILE *fp;
DWORD addr = FLASH_BASE_ADDRESS;
DWORD addr_kernel = KERNEL_BASE_ADDRESS;
char * flash_copy, data;
CXBoxFlash mbFlash;
flash_copy = (char *) malloc(0x100000);
if((fp = fopen(XBOX_BIOS_BACKUP_FILE, "wb")) != NULL)
{
for(int loop=0;loop<0x100000;loop++)
{
data = mbFlash.Read(addr++);
flash_copy[loop] = data;
}
fwrite(flash_copy, 0x100000, 1, fp);
fclose(fp);
free(flash_copy);
return true;
}
else
{
CLog::Log(LOGINFO, "BIOS FILE CREATION ERROR!");
return false;
}
}
bool CSysInfo::CreateEEPROMBackup()
{
m_XKEEPROM->WriteToBINFile(XBOX_EEPROM_BIN_BACKUP_FILE);
m_XKEEPROM->WriteToCFGFile(XBOX_EEPROM_CFG_BACKUP_FILE);
return true;
}
bool CSysInfo::CheckBios(CStdString& strDetBiosNa)
{
BYTE data;
char *BIOS_Name;
int BiosTrovato,i;
DWORD addr = FLASH_BASE_ADDRESS;
DWORD addr_kernel = KERNEL_BASE_ADDRESS;
CXBoxFlash mbFlash;
char * flash_copy;
flash_copy = (char *) malloc(0x100000);
BiosTrovato = 0;
BIOS_Name = (char*) malloc(100);
struct Bios *Listone = LoadBiosSigns();
if( !Listone )
{
free(BIOS_Name);
return false;
}
for(int loop=0;loop<0x100000;loop++)
{
data = mbFlash.Read(addr++);
flash_copy[loop] = data;
}
// Detect a 1024 KB Bios MD5
MD5Buffer (flash_copy,0,1024);
strcpy(BIOS_Name,CheckMD5(Listone, MD5_Sign));
if ( strcmp(BIOS_Name, "Unknown") == 0)
{
// Detect a 512 KB Bios MD5
MD5Buffer (flash_copy,0,512);
strcpy(BIOS_Name, CheckMD5(Listone, MD5_Sign));
if ( strcmp(BIOS_Name,"Unknown") == 0)
{
// Detect a 256 KB Bios MD5
MD5Buffer (flash_copy,0,256);
strcpy(BIOS_Name,CheckMD5(Listone, MD5_Sign));
if ( strcmp(BIOS_Name,"Unknown") != 0)
{
CLog::Log(LOGDEBUG, "- Detected BIOS [256 KB]: %hs",BIOS_Name);
CLog::Log(LOGDEBUG, "- BIOS MD5 Hash: %hs",MD5_Sign);
strDetBiosNa = BIOS_Name;
free(flash_copy);
free(Listone);
free(BIOS_Name);
return true;
}
else
{
CLog::Log(LOGINFO, "------------------- BIOS Detection Log ------------------");
// 256k Bios MD5
if ( (MD5BufferNew(flash_copy,0,256) == MD5BufferNew(flash_copy,262144,256)) && (MD5BufferNew(flash_copy,524288,256)== MD5BufferNew(flash_copy,786432,256)) )
{
for (i=0;i<16; i++) MD5_Sign[i]='\0';
MD5Buffer(flash_copy,0,256);
CLog::Log(LOGINFO, "256k BIOSES: Checksums are (256)");
CLog::Log(LOGINFO, " 1.Bios > %hs",CheckMD5(Listone, MD5_Sign));
CLog::Log(LOGINFO, " Add this to BiosIDs.ini: (256)BiosNameHere = %hs",MD5_Sign);
CLog::Log(LOGINFO, "---------------------------------------------------------");
strDetBiosNa = g_localizeStrings.Get(20306);
free(flash_copy);
free(Listone);
free(BIOS_Name);
return true;
}
else
{
CLog::Log(LOGINFO, "- BIOS: This is not a 256KB Bios!");
// 512k Bios MD5
if ((MD5BufferNew(flash_copy,0,512)) == (MD5BufferNew(flash_copy,524288,512)))
{
for (i=0;i<16; i++) MD5_Sign[i]='\0';
MD5Buffer(flash_copy,0,512);
CLog::Log(LOGINFO, "512k BIOSES: Checksums are (512)");
CLog::Log(LOGINFO, " 1.Bios > %hs",CheckMD5(Listone,MD5_Sign));
CLog::Log(LOGINFO, " Add. this to BiosIDs.ini: (512)BiosNameHere = %hs",MD5_Sign);
CLog::Log(LOGINFO, "---------------------------------------------------------");
strDetBiosNa = g_localizeStrings.Get(20306);
free(flash_copy);
free(Listone);
free(BIOS_Name);
return true;
}
else
{
CLog::Log(LOGINFO, "- BIOS: This is not a 512KB Bios!");
// 1024k Bios MD5
for (i=0;i<16; i++) MD5_Sign[i]='\0';
MD5Buffer(flash_copy,0,1024);
CLog::Log(LOGINFO, "1024k BIOS: Checksums are (1MB)");
CLog::Log(LOGINFO, " 1.Bios > %hs",CheckMD5(Listone, MD5_Sign));
CLog::Log(LOGINFO, " Add. this to BiosIDs.ini: (1MB)BiosNameHere = %hs",MD5_Sign);
CLog::Log(LOGINFO, "---------------------------------------------------------");
strDetBiosNa = g_localizeStrings.Get(20306);
free(flash_copy);
free(Listone);
free(BIOS_Name);
return true;
}
}
}
}
else
{
CLog::Log(LOGINFO, "- Detected BIOS [512 KB]: %hs",BIOS_Name);
CLog::Log(LOGINFO, "- BIOS MD5 Hash: %hs",MD5_Sign);
strDetBiosNa = BIOS_Name;
free(flash_copy);
free(Listone);
free(BIOS_Name);
return true;
}
}
else
{
CLog::Log(LOGINFO, "- Detected BIOS [1024 KB]: %hs",BIOS_Name);
CLog::Log(LOGINFO, "- BIOS MD5 Hash: %hs",MD5_Sign);
strDetBiosNa = BIOS_Name;
free(flash_copy);
free(Listone);
free(BIOS_Name);
return true;
}
free(flash_copy);
free(Listone);
free(BIOS_Name);
return false;
}
bool CSysInfo::GetXBOXVersionDetected(CStdString& strXboxVer)
{
unsigned int iTemp;
char Ver[6];
HalReadSMBusValue(0x20,0x01,0,(LPBYTE)&Ver[0]);
HalReadSMBusValue(0x20,0x01,0,(LPBYTE)&Ver[1]);
HalReadSMBusValue(0x20,0x01,0,(LPBYTE)&Ver[2]);
Ver[3] = 0; Ver[4] = 0; Ver[5] = 0;
if ( strcmp(Ver,("01D")) == NULL || strcmp(Ver,("D01")) == NULL || strcmp(Ver,("1D0")) == NULL || strcmp(Ver,("0D1")) == NULL)
{ strXboxVer = "DEVKIT"; return true;}
else if ( strcmp(Ver,("DBG")) == NULL){ strXboxVer = "DEBUGKIT Green"; return true;}
else if ( strcmp(Ver,("B11")) == NULL){ strXboxVer = "DEBUGKIT Green"; return true;}
else if ( strcmp(Ver,("P01")) == NULL){ strXboxVer = "v1.0"; return true;}
else if ( strcmp(Ver,("P05")) == NULL){ strXboxVer = "v1.1"; return true;}
else if ( strcmp(Ver,("P11")) == NULL || strcmp(Ver,("1P1")) == NULL || strcmp(Ver,("11P")) == NULL )
{
if (HalReadSMBusValue(0xD4,0x00,0,(LPBYTE)&iTemp)==0){ strXboxVer = "v1.4"; return true; }
else { strXboxVer = "v1.2/v1.3"; return true;}
}
else if ( strcmp(Ver,("P2L")) == NULL){ strXboxVer = "v1.6"; return true;}
else { strXboxVer.Format("UNKNOWN: Please report this --> %s",Ver); return true;
}
}
bool CSysInfo::GetDVDInfo(CStdString& strDVDModel, CStdString& strDVDFirmware)
{
XKHDD::ATA_COMMAND_OBJ hddcommand;
DWORD slen = 0;
ZeroMemory(&hddcommand, sizeof(XKHDD::ATA_COMMAND_OBJ));
//Detect DVD Model...
hddcommand.DATA_BUFFSIZE = 0x200;
hddcommand.IPReg.bCommandReg = ATA_IDENTIFY_PACKET_DEVICE;
if (XKHDD::SendATACommand(XBOX_DEVICE_DVDROM, &hddcommand, IDE_COMMAND_READ))
{
//Get DVD Model
CHAR lpsDVDModel[100];
ZeroMemory(&lpsDVDModel,100);
XKHDD::GetIDEModel(hddcommand.DATA_BUFFER, lpsDVDModel);
CLog::Log(LOGDEBUG, "DVD Model: %s",lpsDVDModel);
strDVDModel.Format("%s",lpsDVDModel);
//Get DVD FirmWare...
CHAR lpsDVDFirmware[100];
ZeroMemory(&lpsDVDFirmware,100);
XKHDD::GetIDEFirmWare(hddcommand.DATA_BUFFER, lpsDVDFirmware);
CLog::Log(LOGDEBUG, "DVD Firmware: %s",lpsDVDFirmware);
strDVDFirmware.Format("%s",lpsDVDFirmware);
m_dvdRequest= true;
}
//check if the requested values are empty to reset the request..
if(m_dvdRequest && strDVDModel.IsEmpty() && strDVDFirmware.IsEmpty())
m_dvdRequest=false;
return m_dvdRequest;
}
bool CSysInfo::GetHDDInfo(CStdString& strHDDModel, CStdString& strHDDSerial,CStdString& strHDDFirmware,CStdString& strHDDpw,CStdString& strHDDLockState)
{
XKHDD::ATA_COMMAND_OBJ hddcommand;
ZeroMemory(&hddcommand, sizeof(XKHDD::ATA_COMMAND_OBJ));
hddcommand.DATA_BUFFSIZE = 0x200;
hddcommand.IPReg.bCommandReg = ATA_IDENTIFY_DEVICE;
if (XKHDD::SendATACommand(XBOX_DEVICE_HDD, &hddcommand, IDE_COMMAND_READ))
{
//Get Model Name
CHAR lpsHDDModel[100] = "";
XKHDD::GetIDEModel(hddcommand.DATA_BUFFER, lpsHDDModel);
strHDDModel.Format("%s",lpsHDDModel);
//Get Serial...
CHAR lpsHDDSerial[100] = "";
XKHDD::GetIDESerial(hddcommand.DATA_BUFFER, lpsHDDSerial);
strHDDSerial.Format("%s", lpsHDDSerial);
//Get HDD FirmWare...
CHAR lpsHDDFirmware[100] = "";
XKHDD::GetIDEFirmWare(hddcommand.DATA_BUFFER, lpsHDDFirmware);
strHDDFirmware.Format("%s", lpsHDDFirmware);
//Print HDD Password...
BYTE pbHDDPassword[32] = "";
CHAR lpsHDDPassword[65] = "";
XKHDD::GenerateHDDPwd((UCHAR *)XboxHDKey, hddcommand.DATA_BUFFER, pbHDDPassword);
XKGeneral::BytesToHexStr(pbHDDPassword, 20, lpsHDDPassword);
strHDDpw.Format("%s", lpsHDDPassword);
//Get ATA Locked State
DWORD SecStatus = XKHDD::GetIDESecurityStatus(hddcommand.DATA_BUFFER);
if (!(SecStatus & ATA_SECURITY_SUPPORTED))
strHDDLockState = g_localizeStrings.Get(20164);
else if ((SecStatus & ATA_SECURITY_SUPPORTED) && !(SecStatus & ATA_SECURITY_ENABLED))
strHDDLockState = g_localizeStrings.Get(20165);
else if ((SecStatus & ATA_SECURITY_SUPPORTED) && (SecStatus & ATA_SECURITY_ENABLED))
strHDDLockState = g_localizeStrings.Get(20166);
else if (SecStatus & ATA_SECURITY_FROZEN)
strHDDLockState = g_localizeStrings.Get(20167);
else if (SecStatus & ATA_SECURITY_COUNT_EXPIRED)
strHDDLockState = g_localizeStrings.Get(20168);
if (XKHDD::IsSmartSupported(hddcommand.DATA_BUFFER))
{
m_bSmartSupported = true;
CLog::Log(LOGNOTICE, "HDD: SMART is supported.");
if (XKHDD::IsSmartEnabled(hddcommand.DATA_BUFFER))
{
m_bSmartEnabled = true;
CLog::Log(LOGNOTICE, "HDD: SMART is enabled.");
}
}
//Command was succesful
m_hddRequest = true;
}
//check if the requested values are empty to reset the request..
if(m_hddRequest && strHDDModel.IsEmpty() && strHDDSerial.IsEmpty())
m_hddRequest = false;
return m_hddRequest;
}
bool CSysInfo::GetRefurbInfo(CStdString& rfi_FirstBootTime, CStdString& rfi_PowerCycleCount)
{
XBOX_REFURB_INFO xri;
SYSTEMTIME sys_time;
if (ExReadWriteRefurbInfo(&xri, sizeof(XBOX_REFURB_INFO), FALSE) < 0)
return false;
FileTimeToSystemTime((FILETIME*)&xri.FirstBootTime, &sys_time);
rfi_FirstBootTime.Format("%d-%d-%d %d:%02d",
sys_time.wMonth,
sys_time.wDay,
sys_time.wYear,
sys_time.wHour,
sys_time.wMinute);
rfi_PowerCycleCount.Format("%d", xri.PowerCycleCount);
return true;
}
#endif
bool CSysInfo::GetDiskSpace(const CStdString drive,int& iTotal, int& iTotalFree, int& iTotalUsed, int& iPercentFree, int& iPercentUsed)
{
CStdString driveName = drive + ":\\";
ULARGE_INTEGER total, totalFree, totalUsed;
if (drive.IsEmpty() || drive.Equals("*")) //All Drives
{
ULARGE_INTEGER totalC, totalFreeC;
ULARGE_INTEGER totalE, totalFreeE;
ULARGE_INTEGER totalF, totalFreeF;
ULARGE_INTEGER totalG, totalFreeG;
ULARGE_INTEGER totalX, totalFreeX;
ULARGE_INTEGER totalY, totalFreeY;
ULARGE_INTEGER totalZ, totalFreeZ;
BOOL bC = GetDiskFreeSpaceEx("C:\\", NULL, &totalC, &totalFreeC);
BOOL bE = GetDiskFreeSpaceEx("E:\\", NULL, &totalE, &totalFreeE);
BOOL bF = GetDiskFreeSpaceEx("F:\\", NULL, &totalF, &totalFreeF);
BOOL bG = GetDiskFreeSpaceEx("G:\\", NULL, &totalG, &totalFreeG);
BOOL bX = GetDiskFreeSpaceEx("X:\\", NULL, &totalX, &totalFreeX);
BOOL bY = GetDiskFreeSpaceEx("Y:\\", NULL, &totalY, &totalFreeY);
BOOL bZ = GetDiskFreeSpaceEx("Z:\\", NULL, &totalZ, &totalFreeZ);
total.QuadPart = (bC?totalC.QuadPart:0)+
(bE?totalE.QuadPart:0)+
(bF?totalF.QuadPart:0)+
(bG?totalG.QuadPart:0)+
(bX?totalX.QuadPart:0)+
(bY?totalY.QuadPart:0)+
(bZ?totalZ.QuadPart:0);
totalFree.QuadPart = (bC?totalFreeC.QuadPart:0)+
(bE?totalFreeE.QuadPart:0)+
(bF?totalFreeF.QuadPart:0)+
(bG?totalFreeG.QuadPart:0)+
(bX?totalFreeX.QuadPart:0)+
(bY?totalFreeY.QuadPart:0)+
(bZ?totalFreeZ.QuadPart:0);
iTotal = (int)(total.QuadPart/MB);
iTotalFree = (int)(totalFree.QuadPart/MB);
iTotalUsed = (int)((total.QuadPart - totalFree.QuadPart)/MB);
totalUsed.QuadPart = total.QuadPart - totalFree.QuadPart;
iPercentUsed = (int)(100.0f * totalUsed.QuadPart/total.QuadPart + 0.5f);
iPercentFree = 100 - iPercentUsed;
return true;
}
else if ( GetDiskFreeSpaceEx(driveName.c_str(), NULL, &total, &totalFree))
{
iTotal = (int)(total.QuadPart/MB);
iTotalFree = (int)(totalFree.QuadPart/MB);
iTotalUsed = (int)((total.QuadPart - totalFree.QuadPart)/MB);
totalUsed.QuadPart = total.QuadPart - totalFree.QuadPart;
iPercentUsed = (int)(100.0f * totalUsed.QuadPart/total.QuadPart + 0.5f);
iPercentFree = 100 - iPercentUsed;
return true;
}
return false;
}
#ifdef HAS_XBOX_HARDWARE
double CSysInfo::GetCPUFrequency()
{
DWORD Twin_fsb, Twin_result;
double Tcpu_fsb, Tcpu_result, Fcpu, CPUSpeed;
Tcpu_fsb = RDTSC();
Twin_fsb = GetTickCount();
Sleep(300);
Tcpu_result = RDTSC();
Twin_result = GetTickCount();
Fcpu = (Tcpu_result-Tcpu_fsb);
Fcpu /= (Twin_result-Twin_fsb);
CPUSpeed = Fcpu/1000;
CLog::Log(LOGDEBUG, "- CPU Speed: %4.6fMHz",CPUSpeed);
return CPUSpeed;
}
double CSysInfo::RDTSC(void)
{
unsigned long a, b;
double x;
__asm
{
RDTSC
mov [a],eax
mov [b],edx
}
x=b;
x*=0x100000000;
x+=a;
return x;
}
CStdString CSysInfo::GetModCHIPDetected()
{
CXBoxFlash *mbFlash=new CXBoxFlash(); //Max description Leng= 40
{
// Unknown or TSOP
mbFlash->AddFCI(0x09,0x00,"Unknown/Onboard TSOP (protected)",0x00000);
// Known XBOX ModCHIP IDs&Names
mbFlash->AddFCI(0x01,0xAD,"XECUTER 3",0x100000); // if Write Protection is ON!: this chip can not detected! X3 Bug or Feature! it will return Unknown/Onboard TSOP (protected)!
mbFlash->AddFCI(0x01,0xD5,"XECUTER 2",0x100000);
mbFlash->AddFCI(0x01,0xC4,"XENIUM",0x100000);
mbFlash->AddFCI(0x01,0xC4,"XENIUM",0x000000);
mbFlash->AddFCI(0x04,0xBA,"ALX2+ R3 FLASH",0x40000);
// XBOX Possible Flash CHIPs
mbFlash->AddFCI(0x01,0xb0,"AMD Am29F002BT/NBT",0x40000);
mbFlash->AddFCI(0x01,0x34,"AMD Am29F002BB/NBB",0x40000);
mbFlash->AddFCI(0x01,0x51,"AMD Am29F200BT",0x40000);
mbFlash->AddFCI(0x01,0x57,"AMD Am29F200BB",0x40000);
mbFlash->AddFCI(0x01,0x40,"AMD Am29LV002BT",0x40000);
mbFlash->AddFCI(0x01,0xc2,"AMD Am29LV002BB",0x40000);
mbFlash->AddFCI(0x01,0x3b,"AMD Am29LV200BT",0x40000);
mbFlash->AddFCI(0x01,0xbf,"AMD Am29LV200BB",0x40000);
mbFlash->AddFCI(0x01,0x0c,"AMD Am29DL400BT",0x80000);
mbFlash->AddFCI(0x01,0x0f,"AMD Am29DL400BB",0x80000);
mbFlash->AddFCI(0x01,0x77,"AMD Am29F004BT",0x80000);
mbFlash->AddFCI(0x01,0x7b,"AMD Am29F004BB",0x80000);
mbFlash->AddFCI(0x01,0xa4,"AMD Am29F040B",0x80000);
mbFlash->AddFCI(0x01,0x23,"AMD Am29F400BT",0x80000);
mbFlash->AddFCI(0x01,0xab,"AMD Am29F400BB",0x80000);
mbFlash->AddFCI(0x01,0xb5,"AMD Am29LV004BT",0x80000);
mbFlash->AddFCI(0x01,0xb6,"AMD Am29LV004BB",0x80000);
mbFlash->AddFCI(0x01,0x4f,"AMD Am29LV040B",0x80000);
mbFlash->AddFCI(0x01,0xb9,"AMD Am29LV400BT",0x80000);
mbFlash->AddFCI(0x01,0xba,"AMD Am29LV400BB",0x80000);
mbFlash->AddFCI(0x01,0x4a,"AMD Am29DL800BT",0x100000);
mbFlash->AddFCI(0x01,0xcb,"AMD Am29DL800BB",0x100000);
mbFlash->AddFCI(0x01,0xd5,"AMD Am29F080B",0x100000);
mbFlash->AddFCI(0x01,0xd6,"AMD Am29F800BT",0x100000);
mbFlash->AddFCI(0x01,0x58,"AMD Am29F800BB",0x100000);
mbFlash->AddFCI(0x01,0x3e,"AMD Am29LV008BT",0x100000);
mbFlash->AddFCI(0x01,0x37,"AMD Am29LV008BB",0x100000);
mbFlash->AddFCI(0x01,0x38,"AMD Am29LV080B",0x100000);
mbFlash->AddFCI(0x01,0xda,"AMD Am29LV800BT/DT",0x100000);
mbFlash->AddFCI(0x01,0x5b,"AMD Am29LV800BB/DB",0x100000);
mbFlash->AddFCI(0x37,0x8c,"AMIC A29002T/290021T",0x40000);
mbFlash->AddFCI(0x37,0x0d,"AMIC A29002U/290021U",0x40000);
mbFlash->AddFCI(0x37,0x86,"AMIC A29040A",0x80000);
mbFlash->AddFCI(0x37,0xb0,"AMIC A29400T/294001T",0x80000);
mbFlash->AddFCI(0x37,0x31,"AMIC A29400U/294001U",0x80000);
mbFlash->AddFCI(0x37,0x34,"AMIC A29L004T/A29L400T",0x80000);
mbFlash->AddFCI(0x37,0xb5,"AMIC A29L004U/A29L400U",0x80000);
mbFlash->AddFCI(0x37,0x92,"AMIC A29L040",0x80000);
mbFlash->AddFCI(0x37,0x0e,"AMIC A29800T",0x100000);
mbFlash->AddFCI(0x37,0x8f,"AMIC A29800U",0x100000);
mbFlash->AddFCI(0x37,0x1a,"AMIC A29L008T/A29L800T",0x100000);
mbFlash->AddFCI(0x37,0x9b,"AMIC A29L008U/A29L800U",0x100000);
mbFlash->AddFCI(0x1f,0x07,"Atmel AT49F002A",0x40000);
mbFlash->AddFCI(0x1f,0x08,"Atmel AT49F002AT",0x40000);
mbFlash->AddFCI(0x04,0xb0,"Fujitsu MBM29F002TC",0x40000);
mbFlash->AddFCI(0x04,0x34,"Fujitsu MBM29F002BC",0x40000);
mbFlash->AddFCI(0x04,0x51,"Fujitsu MBM29F200TC",0x40000);
mbFlash->AddFCI(0x04,0x57,"Fujitsu MBM29F200BC",0x40000);
mbFlash->AddFCI(0x04,0x40,"Fujitsu MBM29LV002TC",0x40000);
mbFlash->AddFCI(0x04,0xc2,"Fujitsu MBM29LV002BC",0x40000);
mbFlash->AddFCI(0x04,0x3b,"Fujitsu MBM29LV200TC",0x40000);
mbFlash->AddFCI(0x04,0xbf,"Fujitsu MBM29LV200BC",0x40000);
mbFlash->AddFCI(0x04,0x0c,"Fujitsu MBM29DL400TC",0x80000);
mbFlash->AddFCI(0x04,0x0f,"Fujitsu MBM29DL400BC",0x80000);
mbFlash->AddFCI(0x04,0x77,"Fujitsu MBM29F004TC",0x80000);
mbFlash->AddFCI(0x04,0x7b,"Fujitsu MBM29F004BC",0x80000);
mbFlash->AddFCI(0x04,0xa4,"Fujitsu MBM29F040C",0x80000);
mbFlash->AddFCI(0x04,0x23,"Fujitsu MBM29F400TC",0x80000);
mbFlash->AddFCI(0x04,0xab,"Fujitsu MBM29F400BC",0x80000);
mbFlash->AddFCI(0x04,0xb5,"Fujitsu MBM29LV004TC",0x80000);
mbFlash->AddFCI(0x04,0xb6,"Fujitsu MBM29LV004BC",0x80000);
mbFlash->AddFCI(0x04,0xb9,"Fujitsu MBM29LV400TC",0x80000);
mbFlash->AddFCI(0x04,0xba,"Fujitsu MBM29LV400BC",0x80000);
mbFlash->AddFCI(0x04,0x4a,"Fujitsu MBM29DL800TA",0x100000);
mbFlash->AddFCI(0x04,0xcb,"Fujitsu MBM29DL800BA",0x100000);
mbFlash->AddFCI(0x04,0xd5,"Fujitsu MBM29F080A",0x100000);
mbFlash->AddFCI(0x04,0xd6,"Fujitsu MBM29F800TA",0x100000);
mbFlash->AddFCI(0x04,0x58,"Fujitsu MBM29F800BA",0x100000);
mbFlash->AddFCI(0x04,0x3e,"Fujitsu MBM29LV008TA",0x100000);
mbFlash->AddFCI(0x04,0x37,"Fujitsu MBM29LV008BA",0x100000);
mbFlash->AddFCI(0x04,0x38,"Fujitsu MBM29LV080A",0x100000);
mbFlash->AddFCI(0x04,0xda,"Fujitsu MBM29LV800TA/TE",0x100000);
mbFlash->AddFCI(0x04,0x5b,"Fujitsu MBM29LV800BA/BE",0x100000);
mbFlash->AddFCI(0xad,0xb0,"Hynix HY29F002",0x40000);
mbFlash->AddFCI(0xad,0xa4,"Hynix HY29F040A",0x80000);
mbFlash->AddFCI(0xad,0x23,"Hynix HY29F400T/AT",0x80000);
mbFlash->AddFCI(0xad,0xab,"Hynix HY29F400B/AB",0x80000);
mbFlash->AddFCI(0xad,0xb9,"Hynix HY29LV400T",0x80000);
mbFlash->AddFCI(0xad,0xba,"Hynix HY29LV400B",0x80000);
mbFlash->AddFCI(0xad,0xd5,"Hynix HY29F080",0x100000);
mbFlash->AddFCI(0xad,0xd6,"Hynix HY29F800T/AT",0x100000);
mbFlash->AddFCI(0xad,0x58,"Hynix HY29F800B/AB",0x100000);
mbFlash->AddFCI(0xad,0xda,"Hynix HY29LV800T",0x100000);
mbFlash->AddFCI(0xad,0x5b,"Hynix HY29LV800B",0x100000);
mbFlash->AddFCI(0xc2,0xb0,"Macronix MX29F002T/NT",0x40000);
mbFlash->AddFCI(0xc2,0x34,"Macronix MX29F002B/NB",0x40000);
mbFlash->AddFCI(0xc2,0x36,"Macronix MX29F022T/NT",0x40000);
mbFlash->AddFCI(0xc2,0x37,"Macronix MX29F022B/NB",0x40000);
mbFlash->AddFCI(0xc2,0x51,"Macronix MX29F200T",0x40000);
mbFlash->AddFCI(0xc2,0x57,"Macronix MX29F200B",0x40000);
mbFlash->AddFCI(0xc2,0x45,"Macronix MX29F004T",0x80000);
mbFlash->AddFCI(0xc2,0x46,"Macronix MX29F004B",0x80000);
mbFlash->AddFCI(0xc2,0xa4,"Macronix MX29F040",0x80000);
mbFlash->AddFCI(0xc2,0x23,"Macronix MX29F400T",0x80000);
mbFlash->AddFCI(0xc2,0xab,"Macronix MX29F400B",0x80000);
mbFlash->AddFCI(0xc2,0xb5,"Macronix MX29LV004T",0x80000);
mbFlash->AddFCI(0xc2,0xb6,"Macronix MX29LV004B",0x80000);
mbFlash->AddFCI(0xc2,0x4f,"Macronix MX29LV040",0x80000);
mbFlash->AddFCI(0xc2,0xb9,"Macronix MX29LV400T",0x80000);
mbFlash->AddFCI(0xc2,0xba,"Macronix MX29LV400B",0x80000);
mbFlash->AddFCI(0xc2,0xd5,"Macronix MX29F080",0x100000);
mbFlash->AddFCI(0xc2,0xd6,"Macronix MX29F800T",0x100000);
mbFlash->AddFCI(0xc2,0x58,"Macronix MX29F800B",0x100000);
mbFlash->AddFCI(0xc2,0x3e,"Macronix MX29LV008T",0x100000);
mbFlash->AddFCI(0xc2,0x37,"Macronix MX29LV008B",0x100000);
mbFlash->AddFCI(0xc2,0x38,"Macronix MX29LV081",0x100000);
mbFlash->AddFCI(0xc2,0xda,"Macronix MX29LV800T",0x100000);
mbFlash->AddFCI(0xc2,0x5b,"Macronix MX29LV800B",0x100000);
mbFlash->AddFCI(0xb0,0xc9,"Sharp LHF00L02/L06/L07",0x100000);
mbFlash->AddFCI(0xb0,0xcf,"Sharp LHF00L03/L04/L05",0x100000);
mbFlash->AddFCI(0x89,0xa2,"Sharp LH28F008SA series",0x100000);
mbFlash->AddFCI(0x89,0xa6,"Sharp LH28F008SC series",0x100000);
mbFlash->AddFCI(0xb0,0xec,"Sharp LH28F008BJxx-PT series",0x100000);
mbFlash->AddFCI(0xb0,0xed,"Sharp LH28F008BJxx-PB series",0x100000);
mbFlash->AddFCI(0xb0,0x4b,"Sharp LH28F800BVxx-BTL series",0x100000);
mbFlash->AddFCI(0xb0,0x4c,"Sharp LH28F800BVxx-TV series",0x100000);
mbFlash->AddFCI(0xb0,0x4d,"Sharp LH28F800BVxx-BV series",0x100000);
mbFlash->AddFCI(0xbf,0x10,"SST 29EE020",0x40000);
mbFlash->AddFCI(0xbf,0x12,"SST 29LE020/29VE020",0x40000);
mbFlash->AddFCI(0xbf,0xd6,"SST 39LF020/39VF020",0x40000);
mbFlash->AddFCI(0xbf,0xb6,"SST 39SF020A",0x40000);
mbFlash->AddFCI(0xbf,0x57,"SST 49LF002A",0x40000);
mbFlash->AddFCI(0xbf,0x57,"SST 49LF002A",0x100000);
mbFlash->AddFCI(0xbf,0x52,"SST 49LF020A",0x40000);
mbFlash->AddFCI(0xbf,0x1b,"SST 49LF003A",0x60000);
mbFlash->AddFCI(0xbf,0x1c,"SST 49LF030A",0x60000);
mbFlash->AddFCI(0xbf,0x61,"SST 49LF020",0x40000);
mbFlash->AddFCI(0xbf,0x13,"SST 29SF040",0x80000);
mbFlash->AddFCI(0xbf,0x14,"SST 29VF040",0x80000);
mbFlash->AddFCI(0xbf,0xd7,"SST 39LF040/39VF040",0x80000);
mbFlash->AddFCI(0xbf,0xb7,"SST 39SF040",0x80000);
mbFlash->AddFCI(0xbf,0x60,"SST 49LF004A/B",0x80000);
mbFlash->AddFCI(0xbf,0x51,"SST 49LF040",0x80000);
mbFlash->AddFCI(0xbf,0xd8,"SST 39LF080/39VF080/39VF088",0x100000);
mbFlash->AddFCI(0xbf,0x5a,"SST 49LF008A",0x100000);
mbFlash->AddFCI(0xbf,0x5b,"SST 49LF080A",0x100000);
mbFlash->AddFCI(0x20,0xb0,"ST M29F002T/NT/BT/BNT",0x40000);
mbFlash->AddFCI(0x20,0x34,"ST M29F002B/BB",0x40000);
mbFlash->AddFCI(0x20,0xd3,"ST M29F200BT",0x40000);
mbFlash->AddFCI(0x20,0xd4,"ST M29F200BB",0x40000);
mbFlash->AddFCI(0x20,0xe2,"ST M29F040 series",0x80000);
mbFlash->AddFCI(0x20,0xd5,"ST M29F400T/BT",0x80000);
mbFlash->AddFCI(0x20,0xd6,"ST M29F400B/BB",0x80000);
mbFlash->AddFCI(0x20,0xf1,"ST M29F080 series",0x100000);
mbFlash->AddFCI(0x20,0xec,"ST M29F800DT",0x100000);
mbFlash->AddFCI(0x20,0x58,"ST M29F800DB",0x100000);
mbFlash->AddFCI(0xda,0x45,"Winbond W29C020",0x40000);
mbFlash->AddFCI(0x09,0x00,"Winbond W49F020T",0x40000);
mbFlash->AddFCI(0xda,0xb5,"Winbond W39L020",0x40000);
mbFlash->AddFCI(0xda,0x0b,"Winbond W49F002U",0x40000);
mbFlash->AddFCI(0xda,0x8c,"Winbond W49F020",0x40000);
mbFlash->AddFCI(0xda,0xb0,"Winbond W49V002A",0x40000);
mbFlash->AddFCI(0xda,0x46,"Winbond W29C040",0x40000);
mbFlash->AddFCI(0xda,0xb6,"Winbond W39L040",0x80000);
mbFlash->AddFCI(0xda,0x3d,"Winbond W39V040A",0x80000);
}
CStdString strTemp = "", strTemp1 = "", strTemp2 = "";
if (mbFlash->CheckID()!=0 || mbFlash->CheckID2()!=0)
{
CLog::Log(LOGDEBUG, "- Detected TSOP/ModChip: %s",mbFlash->CheckID()->text);
CLog::Log(LOGDEBUG, "- Detected TSOP/ModChip: %s",mbFlash->CheckID2()->text);
strTemp1 = mbFlash->CheckID()->text;
strTemp2 = mbFlash->CheckID2()->text;
}
else { CLog::Log(LOGDEBUG, "- Detected TSOP/MOdCHIP: Unknown"); strTemp2 = "Unknown"; }
if (strTemp1 != strTemp2)
{
CLog::Log(LOGDEBUG, "- Detected TSOP/MOdCHIP: Detection does not match! (%s != %s)",strTemp1.c_str(),strTemp2.c_str());
CLog::Log(LOGDEBUG, "- Detected TSOP/ModChip: Using -> %s",strTemp1.c_str());
strTemp.Format("%s",strTemp1.c_str());
}
else strTemp = strTemp2;
delete mbFlash;
return strTemp;
}
CStdString CSysInfo::MD5BufferNew(char *buffer,long PosizioneInizio,int KBytes)
{
CStdString strReturn;
XBMC::XBMC_MD5 mdContext;
mdContext.append((unsigned char *)(buffer + PosizioneInizio), KBytes * 1024);
mdContext.getDigest(strReturn);
return strReturn;
}
CStdString CSysInfo::GetAVPackInfo()
{
//AV-Pack Detection PICReg(0x04)
int cAVPack;
HalReadSMBusValue(0x20,XKUtils::PIC16L_CMD_AV_PACK,0,(LPBYTE)&cAVPack);
if (cAVPack == XKUtils::AV_PACK_SCART) return "SCART";
else if (cAVPack == XKUtils::AV_PACK_HDTV) return "HDTV";
else if (cAVPack == XKUtils::AV_PACK_VGA) return "VGA";
else if (cAVPack == XKUtils::AV_PACK_RFU) return "RFU";
else if (cAVPack == XKUtils::AV_PACK_SVideo) return "S-Video";
else if (cAVPack == XKUtils::AV_PACK_Undefined) return "Undefined";
else if (cAVPack == XKUtils::AV_PACK_Standard) return "Standard RGB";
else if (cAVPack == XKUtils::AV_PACK_Missing) return "Missing or Unknown";
else return "Unknown";
}
CStdString CSysInfo::GetVideoEncoder()
{
int iTemp;
if (HalReadSMBusValue(XKUtils::SMBDEV_VIDEO_ENCODER_CONNEXANT,XKUtils::VIDEO_ENCODER_CMD_DETECT,0,(LPBYTE)&iTemp)==0)
{
CLog::Log(LOGDEBUG, "Video Encoder: CONNEXANT");
return "CONNEXANT";
}
if (HalReadSMBusValue(XKUtils::SMBDEV_VIDEO_ENCODER_FOCUS,XKUtils::VIDEO_ENCODER_CMD_DETECT,0,(LPBYTE)&iTemp)==0)
{
CLog::Log(LOGDEBUG, "Video Encoder: FOCUS");
return "FOCUS";
}
if (HalReadSMBusValue(XKUtils::SMBDEV_VIDEO_ENCODER_XCALIBUR,XKUtils::VIDEO_ENCODER_CMD_DETECT,0,(LPBYTE)&iTemp)==0)
{
CLog::Log(LOGDEBUG, "Video Encoder: XCALIBUR");
return "XCALIBUR";
}
else
{
CLog::Log(LOGDEBUG, "Video Encoder: UNKNOWN");
return "UNKNOWN";
}
}
CStdString CSysInfo::SmartXXModCHIP()
{
// SmartXX ModChip Detection
unsigned char uSmartXX_ID = ((_inp(0xf701)) & 0xf);
if ( uSmartXX_ID == 1 ) // SmartXX V1+V2
return "SmartXX V1/V2";
else if ( uSmartXX_ID == 2 ) // SmartXX V1+V2
return "SmartXX V1/V2";
else if ( uSmartXX_ID == 5 ) // SmartXX OPX
return "SmartXX OPX";
else if ( uSmartXX_ID == 8 ) // SmartXX V3
return "SmartXX V3";
else
return "None";
}
CStdString CSysInfo::GetMPlayerVersion()
{
CStdString strVersion="";
DllLoader* mplayerDll;
const char* (__cdecl* pMplayerGetVersion)();
const char* (__cdecl* pMplayerGetCompileDate)();
const char* (__cdecl* pMplayerGetCompileTime)();
const char *version = NULL;
const char *date = NULL;
const char *btime = NULL;
mplayerDll = new DllLoader("Q:\\system\\players\\mplayer\\mplayer.dll",true);
if( mplayerDll->Load() )
{
if (mplayerDll->ResolveExport("mplayer_getversion", (void**)&pMplayerGetVersion))
version = pMplayerGetVersion();
if (mplayerDll->ResolveExport("mplayer_getcompiledate", (void**)&pMplayerGetCompileDate))
date = pMplayerGetCompileDate();
if (mplayerDll->ResolveExport("mplayer_getcompiletime", (void**)&pMplayerGetCompileTime))
btime = pMplayerGetCompileTime();
if (version && date && btime)
{
strVersion.Format("%s (%s - %s)",version, date, btime);
}
else if (version)
{
strVersion.Format("%s",version);
}
}
delete mplayerDll;
mplayerDll=NULL;
return strVersion;
}
CStdString CSysInfo::GetKernelVersion()
{
int ikrnl = XboxKrnlVersion->Qfe & 67;
CLog::Log(LOGDEBUG, "- XBOX Kernel Qfe= %i", XboxKrnlVersion->Qfe);
CLog::Log(LOGDEBUG, "- XBOX Kernel Drive FG result= %i", ikrnl);
CStdString strKernel;
strKernel.Format("%u.%u.%u.%u", XboxKrnlVersion->VersionMajor,XboxKrnlVersion->VersionMinor,XboxKrnlVersion->Build,XboxKrnlVersion->Qfe);
return strKernel;
}
CStdString CSysInfo::GetCPUFreqInfo()
{
CStdString strCPUFreq;
double CPUFreq = GetCPUFrequency();
strCPUFreq.Format("%4.2fMHz", CPUFreq);
return strCPUFreq;
}
CStdString CSysInfo::GetXBVerInfo()
{
CStdString strXBOXVersion;
if (GetXBOXVersionDetected(strXBOXVersion))
return strXBOXVersion;
else
return g_localizeStrings.Get(13205); // "Unknown"
}
CStdString CSysInfo::GetUnits(int iFrontPort)
{
// Get the Connected Units on the Front USB Ports!
DWORD dwDeviceGamePad = XGetDevices(XDEVICE_TYPE_GAMEPAD);
DWORD dwDeviceKeyboard = XGetDevices(XDEVICE_TYPE_DEBUG_KEYBOARD);
DWORD dwDeviceMouse = XGetDevices(XDEVICE_TYPE_DEBUG_MOUSE);
DWORD dwDeviceHeadPhone = XGetDevices(XDEVICE_TYPE_VOICE_HEADPHONE);
DWORD dwDeviceMicroPhone = XGetDevices(XDEVICE_TYPE_VOICE_MICROPHONE);
DWORD dwDeviceMemory = XGetDevices(XDEVICE_TYPE_MEMORY_UNIT);
DWORD dwDeviceIRRemote = XGetDevices(XDEVICE_TYPE_IR_REMOTE);
// Values 1 -> on Port 1
// Values 2 -> on Port 2
// Values 4 -> on Port 3
// Values 8 -> on Port 4
// Values 3 -> on Port 1&2
// Values 5 -> on Port 1&3
// Values 6 -> on Port 2&3
// Values 7 -> on Port 1&2&3
// Values 9 -> on Port 1&4
// Values 10 -> on Port 2&4
// Values 11 -> on Port 1&2&4
// Values 12 -> on Port 3&4
// Values 13 -> on Port 1&3&4
// Values 14 -> on Port 2&3&4
// Values 15 -> on Port 1&2&3&4
bool bPad=false, bMem=false, bKeyb=false, bMouse=false, bHeadSet=false, bMic=false, bIR=false;
if (iFrontPort == 1)
{
bPad = dwDeviceGamePad > 0 && dwDeviceGamePad == 1 || dwDeviceGamePad == 3 || dwDeviceGamePad == 5 || dwDeviceGamePad == 7 || dwDeviceGamePad == 9 || dwDeviceGamePad == 11 || dwDeviceGamePad == 13 || dwDeviceGamePad == 15;
bMem = dwDeviceMemory > 0 && dwDeviceMemory == 1 || dwDeviceMemory == 3 || dwDeviceMemory == 5 || dwDeviceMemory == 7 || dwDeviceMemory == 9 || dwDeviceMemory == 11 || dwDeviceMemory == 13 || dwDeviceMemory == 15;
}
else if (iFrontPort == 2)
{
bPad = dwDeviceGamePad > 0 && dwDeviceGamePad == 2 || dwDeviceGamePad == 3 || dwDeviceGamePad == 6 || dwDeviceGamePad == 7 || dwDeviceGamePad == 10 || dwDeviceGamePad == 11 || dwDeviceGamePad == 14 || dwDeviceGamePad == 15;
bMem = dwDeviceMemory > 0 && dwDeviceMemory == 2 || dwDeviceMemory == 3 || dwDeviceMemory == 6 || dwDeviceMemory == 7 || dwDeviceMemory == 10 || dwDeviceMemory == 11 || dwDeviceMemory == 14 || dwDeviceMemory == 15;
}
else if (iFrontPort == 3)
{
bPad = dwDeviceGamePad > 0 && dwDeviceGamePad == 4 || dwDeviceGamePad == 5 || dwDeviceGamePad == 6 || dwDeviceGamePad == 7 || dwDeviceGamePad == 12 || dwDeviceGamePad == 13 || dwDeviceGamePad == 14 || dwDeviceGamePad == 15;
bMem = dwDeviceMemory > 0 && dwDeviceMemory == 4 || dwDeviceMemory == 5 || dwDeviceMemory == 6 || dwDeviceMemory == 7 || dwDeviceMemory == 12 || dwDeviceMemory == 13 || dwDeviceMemory == 14 || dwDeviceMemory == 15;
iFrontPort = 4;
}
else if (iFrontPort == 4)
{
bPad = dwDeviceGamePad > 0 && dwDeviceGamePad == 8 || dwDeviceGamePad == 9 || dwDeviceGamePad == 10 || dwDeviceGamePad == 11 || dwDeviceGamePad == 12 || dwDeviceGamePad == 13 || dwDeviceGamePad == 14 || dwDeviceGamePad == 15;
bMem = dwDeviceMemory > 0 && dwDeviceMemory == 8 || dwDeviceMemory == 9 || dwDeviceMemory == 10 || dwDeviceMemory == 11 || dwDeviceMemory == 12 || dwDeviceMemory == 13 || dwDeviceMemory == 14 || dwDeviceMemory == 15;
iFrontPort = 8;
}
bKeyb = dwDeviceKeyboard > 0 && dwDeviceKeyboard == iFrontPort;
bMouse = dwDeviceMouse > 0 && dwDeviceMouse == iFrontPort;
bHeadSet = dwDeviceHeadPhone > 0 && dwDeviceHeadPhone == iFrontPort;
bMic = dwDeviceMicroPhone > 0 && dwDeviceMicroPhone == iFrontPort;
bIR = dwDeviceIRRemote > 0 && dwDeviceIRRemote == iFrontPort;
CStdString strReturn;
if (iFrontPort==4) iFrontPort = 3;
if (iFrontPort==8) iFrontPort = 4;
strReturn.Format("%s%s%s%s%s%s%s%s%s%s%s%s%s",
bPad ? g_localizeStrings.Get(13163):"", bPad && bKeyb ? ", ":"", bPad && bMem ? ", ":"", bPad && (bHeadSet || bMic) ? ", ":"",
bKeyb ? g_localizeStrings.Get(13164):"", bKeyb && bMouse ? ", ":"",
bMouse ? g_localizeStrings.Get(13165):"",bMouse && (bHeadSet || bMic) ? ", ":"",
bHeadSet || bMic ? g_localizeStrings.Get(13166):"", (bHeadSet || bMic) && bMem ? ", ":"",
bMem ? g_localizeStrings.Get(13167):"", bMem && bIR ? ", ":"",
bIR ? g_localizeStrings.Get(13168):""
);
return strReturn;
}
CStdString CSysInfo::GetMACAddress()
{
char macaddress[20] = "";
m_XKEEPROM->GetMACAddressString((LPSTR)&macaddress, ':');
CStdString strMacAddress;
strMacAddress.Format("%s", macaddress);
return strMacAddress;
}
CStdString CSysInfo::GetXBOXSerial()
{
CHAR serial[SERIALNUMBER_SIZE + 1] = "";
m_XKEEPROM->GetSerialNumberString(serial);
CStdString strXBOXSerial;
strXBOXSerial.Format("%s", serial);
return strXBOXSerial;
}
CStdString CSysInfo::GetXBProduceInfo()
{
CStdString serial = GetXBOXSerial();
// Print XBOX Production Place and Date
char *info = (char *) serial.c_str();
char *country;
switch (atoi(&info[11]))
{
case 2:
country = "Mexico";
break;
case 3:
country = "Hungary";
break;
case 5:
country = "China";
break;
case 6:
country = "Taiwan";
break;
default:
country = "Unknown";
break;
}
CLog::Log(LOGDEBUG, "- XBOX production info: Country: %s, LineNumber: %c, Week %c%c, Year 200%c", country, info[0x00], info[0x08], info[0x09],info[0x07]);
CStdString strXBProDate;
strXBProDate.Format("%s, %s 200%c, %s: %c%c %s: %c",
country,
g_localizeStrings.Get(201),
info[0x07],
g_localizeStrings.Get(20169),
info[0x08],
info[0x09],
g_localizeStrings.Get(20170),
info[0x00]);
return strXBProDate;
}
CStdString CSysInfo::GetVideoXBERegion()
{
//Print Video Standard & XBE Region...
CStdString XBEString, VideoStdString;
switch (m_XKEEPROM->GetVideoStandardVal())
{
case XKEEPROM::NTSC_J:
VideoStdString = "NTSC J";
break;
case XKEEPROM::NTSC_M:
VideoStdString = "NTSC M";
break;
case XKEEPROM::PAL_I:
VideoStdString = "PAL I";
break;
case XKEEPROM::PAL_M:
VideoStdString = "PAL M";
break;
default:
VideoStdString = g_localizeStrings.Get(13205); // "Unknown"
}
switch(m_XKEEPROM->GetXBERegionVal())
{
case XKEEPROM::NORTH_AMERICA:
XBEString = "North America";
break;
case XKEEPROM::JAPAN:
XBEString = "Japan";
break;
case XKEEPROM::EURO_AUSTRALIA:
XBEString = "Europe / Australia";
break;
default:
XBEString = g_localizeStrings.Get(13205); // "Unknown"
}
CStdString strVideoXBERegion;
strVideoXBERegion.Format("%s, %s", VideoStdString, XBEString);
return strVideoXBERegion;
}
CStdString CSysInfo::GetDVDZone()
{
//Print DVD [Region] Zone ..
DVD_ZONE dvdVal;
dvdVal = m_XKEEPROM->GetDVDRegionVal();
CStdString strdvdzone;
strdvdzone.Format("%d", dvdVal);
return strdvdzone;
}
CStdString CSysInfo::GetXBLiveKey()
{
//Print XBLIVE Online Key..
char livekey[ONLINEKEY_SIZE * 2 + 1] = "";
m_XKEEPROM->GetOnlineKeyString(livekey);
CStdString strXBLiveKey;
strXBLiveKey.Format("%s", livekey);
return strXBLiveKey;
}
CStdString CSysInfo::GetHDDKey()
{
//Print HDD Key...
char hdkey[HDDKEY_SIZE * 2 + 1];
m_XKEEPROM->GetHDDKeyString((LPSTR)&hdkey);
CStdString strhddlockey;
strhddlockey.Format("%s", hdkey);
return strhddlockey;
}
CStdString CSysInfo::GetModChipInfo()
{
CStdString strModChipInfo;
// XBOX Modchip Type Detection
CStdString ModChip = GetModCHIPDetected();
CStdString SmartXX = SmartXXModCHIP();
// Check if it is a SmartXX
if (!SmartXX.Equals("None"))
{
strModChipInfo.Format("%s %s", g_localizeStrings.Get(13291), SmartXX);
CLog::Log(LOGDEBUG, "- Detected ModChip: %s",SmartXX.c_str());
}
else
{
if ( !ModChip.Equals("Unknown/Onboard TSOP (protected)"))
{
strModChipInfo.Format("%s %s", g_localizeStrings.Get(13291), ModChip);
}
else
{
strModChipInfo.Format("%s %s", g_localizeStrings.Get(13291), g_localizeStrings.Get(20311));
}
}
return strModChipInfo;
}
CStdString CSysInfo::GetBIOSInfo()
{
//Format bios informations
CStdString cBIOSName;
if(CheckBios(cBIOSName))
return cBIOSName;
else
return "File: BiosIDs.ini Not Found!";
}
CStdString CSysInfo::GetTrayState()
{
// Set DVD Drive State! [TrayOpen, NotReady....]
CStdString trayState = "D: ";
switch (CIoSupport::GetTrayState())
{
case TRAY_OPEN:
trayState+=g_localizeStrings.Get(162);
break;
case DRIVE_NOT_READY:
trayState+=g_localizeStrings.Get(163);
break;
case TRAY_CLOSED_NO_MEDIA:
trayState+=g_localizeStrings.Get(164);
break;
case TRAY_CLOSED_MEDIA_PRESENT:
trayState+=g_localizeStrings.Get(165);
break;
default:
trayState+=g_localizeStrings.Get(503); //Busy
break;
}
return trayState;
}
#endif
CStdString CSysInfo::GetHddSpaceInfo(int drive, bool shortText)
{
int percent;
return GetHddSpaceInfo( percent, drive, shortText);
}
CStdString CSysInfo::GetHddSpaceInfo(int& percent, int drive, bool shortText)
{
int total, totalFree, totalUsed, percentFree, percentused;
CStdString strDrive;
bool bRet=false;
percent = 0;
CStdString strRet;
switch (drive)
{
case SYSTEM_FREE_SPACE:
case SYSTEM_USED_SPACE:
case SYSTEM_TOTAL_SPACE:
case SYSTEM_FREE_SPACE_PERCENT:
case SYSTEM_USED_SPACE_PERCENT:
bRet = g_sysinfo.GetDiskSpace("",total, totalFree, totalUsed, percentFree, percentused);
break;
case LCD_FREE_SPACE_C:
case SYSTEM_FREE_SPACE_C:
case SYSTEM_USED_SPACE_C:
case SYSTEM_TOTAL_SPACE_C:
case SYSTEM_FREE_SPACE_PERCENT_C:
case SYSTEM_USED_SPACE_PERCENT_C:
strDrive = "C";
bRet = g_sysinfo.GetDiskSpace("C",total, totalFree, totalUsed, percentFree, percentused);
break;
case LCD_FREE_SPACE_E:
case SYSTEM_FREE_SPACE_E:
case SYSTEM_USED_SPACE_E:
case SYSTEM_TOTAL_SPACE_E:
case SYSTEM_FREE_SPACE_PERCENT_E:
case SYSTEM_USED_SPACE_PERCENT_E:
strDrive = "E";
bRet = g_sysinfo.GetDiskSpace("E",total, totalFree, totalUsed, percentFree, percentused);
break;
case LCD_FREE_SPACE_F:
case SYSTEM_FREE_SPACE_F:
case SYSTEM_USED_SPACE_F:
case SYSTEM_TOTAL_SPACE_F:
case SYSTEM_FREE_SPACE_PERCENT_F:
case SYSTEM_USED_SPACE_PERCENT_F:
strDrive = "F";
bRet = g_sysinfo.GetDiskSpace("F",total, totalFree, totalUsed, percentFree, percentused);
break;
case LCD_FREE_SPACE_G:
case SYSTEM_FREE_SPACE_G:
case SYSTEM_USED_SPACE_G:
case SYSTEM_TOTAL_SPACE_G:
case SYSTEM_FREE_SPACE_PERCENT_G:
case SYSTEM_USED_SPACE_PERCENT_G:
strDrive = "G";
bRet = g_sysinfo.GetDiskSpace("G",total, totalFree, totalUsed, percentFree, percentused);
break;
case SYSTEM_USED_SPACE_X:
case SYSTEM_FREE_SPACE_X:
case SYSTEM_TOTAL_SPACE_X:
strDrive = "X";
bRet = g_sysinfo.GetDiskSpace("X",total, totalFree, totalUsed, percentFree, percentused);
break;
case SYSTEM_USED_SPACE_Y:
case SYSTEM_FREE_SPACE_Y:
case SYSTEM_TOTAL_SPACE_Y:
strDrive = "Y";
bRet = g_sysinfo.GetDiskSpace("Y",total, totalFree, totalUsed, percentFree, percentused);
break;
case SYSTEM_USED_SPACE_Z:
case SYSTEM_FREE_SPACE_Z:
case SYSTEM_TOTAL_SPACE_Z:
strDrive = "Z";
bRet = g_sysinfo.GetDiskSpace("Z",total, totalFree, totalUsed, percentFree, percentused);
break;
}
if (bRet)
{
if (shortText)
{
switch(drive)
{
case LCD_FREE_SPACE_C:
case LCD_FREE_SPACE_E:
case LCD_FREE_SPACE_F:
case LCD_FREE_SPACE_G:
strRet.Format("%iMB", totalFree);
break;
case SYSTEM_FREE_SPACE:
case SYSTEM_FREE_SPACE_C:
case SYSTEM_FREE_SPACE_E:
case SYSTEM_FREE_SPACE_F:
case SYSTEM_FREE_SPACE_G:
case SYSTEM_FREE_SPACE_X:
case SYSTEM_FREE_SPACE_Y:
case SYSTEM_FREE_SPACE_Z:
percent = percentFree;
break;
case SYSTEM_USED_SPACE:
case SYSTEM_USED_SPACE_C:
case SYSTEM_USED_SPACE_E:
case SYSTEM_USED_SPACE_F:
case SYSTEM_USED_SPACE_G:
case SYSTEM_USED_SPACE_X:
case SYSTEM_USED_SPACE_Y:
case SYSTEM_USED_SPACE_Z:
percent = percentused;
break;
}
}
else
{
switch(drive)
{
case SYSTEM_FREE_SPACE:
case SYSTEM_FREE_SPACE_C:
case SYSTEM_FREE_SPACE_E:
case SYSTEM_FREE_SPACE_F:
case SYSTEM_FREE_SPACE_G:
case SYSTEM_FREE_SPACE_X:
case SYSTEM_FREE_SPACE_Y:
case SYSTEM_FREE_SPACE_Z:
if (strDrive.IsEmpty())
strRet.Format("%i MB %s", totalFree, g_localizeStrings.Get(160));
else
strRet.Format("%s: %i MB %s", strDrive, totalFree, g_localizeStrings.Get(160));
break;
case SYSTEM_USED_SPACE:
case SYSTEM_USED_SPACE_C:
case SYSTEM_USED_SPACE_E:
case SYSTEM_USED_SPACE_F:
case SYSTEM_USED_SPACE_G:
case SYSTEM_USED_SPACE_X:
case SYSTEM_USED_SPACE_Y:
case SYSTEM_USED_SPACE_Z:
if (strDrive.IsEmpty())
strRet.Format("%i MB %s", totalUsed, g_localizeStrings.Get(20162));
else
strRet.Format("%s: %i MB %s", strDrive, totalUsed, g_localizeStrings.Get(20162));
break;
case SYSTEM_TOTAL_SPACE:
case SYSTEM_TOTAL_SPACE_C:
case SYSTEM_TOTAL_SPACE_E:
case SYSTEM_TOTAL_SPACE_F:
case SYSTEM_TOTAL_SPACE_G:
if (strDrive.IsEmpty())
strRet.Format("%i MB %s", total, g_localizeStrings.Get(20161));
else
strRet.Format("%s: %i MB %s", strDrive, total, g_localizeStrings.Get(20161));
break;
case SYSTEM_FREE_SPACE_PERCENT:
case SYSTEM_FREE_SPACE_PERCENT_C:
case SYSTEM_FREE_SPACE_PERCENT_E:
case SYSTEM_FREE_SPACE_PERCENT_F:
case SYSTEM_FREE_SPACE_PERCENT_G:
if (strDrive.IsEmpty())
strRet.Format("%i %% %s", percentFree, g_localizeStrings.Get(160));
else
strRet.Format("%s: %i %% %s", strDrive, percentFree, g_localizeStrings.Get(160));
break;
case SYSTEM_USED_SPACE_PERCENT:
case SYSTEM_USED_SPACE_PERCENT_C:
case SYSTEM_USED_SPACE_PERCENT_E:
case SYSTEM_USED_SPACE_PERCENT_F:
case SYSTEM_USED_SPACE_PERCENT_G:
if (strDrive.IsEmpty())
strRet.Format("%i %% %s", percentused, g_localizeStrings.Get(20162));
else
strRet.Format("%s: %i %% %s", strDrive, percentused, g_localizeStrings.Get(20162));
break;
}
}
}
else
{
if (shortText)
strRet = "N/A";
else if (strDrive.IsEmpty())
strRet = g_localizeStrings.Get(161);
else
strRet.Format("%s: %s", strDrive, g_localizeStrings.Get(161));
}
return strRet;
}
bool CSysInfo::SystemUpTime(int iInputMinutes, int &iMinutes, int &iHours, int &iDays)
{
iMinutes=0;iHours=0;iDays=0;
iMinutes = iInputMinutes;
if (iMinutes >= 60) // Hour's
{
iHours = iMinutes / 60;
iMinutes = iMinutes - (iHours *60);
}
if (iHours >= 24) // Days
{
iDays = iHours / 24;
iHours = iHours - (iDays * 24);
}
return true;
}
CStdString CSysInfo::GetSystemUpTime(bool bTotalUptime)
{
CStdString strSystemUptime;
int iInputMinutes, iMinutes,iHours,iDays;
if(bTotalUptime)
{
//Total Uptime
iInputMinutes = g_settings.m_iSystemTimeTotalUp + ((int)(timeGetTime() / 60000));
}
else
{
//Current UpTime
iInputMinutes = (int)(timeGetTime() / 60000);
}
SystemUpTime(iInputMinutes,iMinutes, iHours, iDays);
if (iDays > 0)
{
strSystemUptime.Format("%i %s, %i %s, %i %s",
iDays,g_localizeStrings.Get(12393),
iHours,g_localizeStrings.Get(12392),
iMinutes, g_localizeStrings.Get(12391));
}
else if (iDays == 0 && iHours >= 1 )
{
strSystemUptime.Format("%i %s, %i %s",
iHours,g_localizeStrings.Get(12392),
iMinutes, g_localizeStrings.Get(12391));
}
else if (iDays == 0 && iHours == 0 && iMinutes >= 0)
{
strSystemUptime.Format("%i %s",
iMinutes, g_localizeStrings.Get(12391));
}
return strSystemUptime;
}
CStdString CSysInfo::GetInternetState()
{
#ifdef HAS_XBOX_HARDWARE
// check for ethernet link before checking for internet access
if (!(XNetGetEthernetLinkStatus() & XNET_ETHERNET_LINK_ACTIVE))
{
return g_localizeStrings.Get(159);
}
#endif
CStdString status;
XFILE::CCurlFile http;
m_bInternetState = http.IsInternet();
if (m_bInternetState)
status = g_localizeStrings.Get(13296);
else if (http.IsInternet(false))
status = g_localizeStrings.Get(13274);
else
status = g_localizeStrings.Get(13297);
return status;
}
CStdString CSysInfo::GetUserAgent()
{
CStdString result;
result = "XBMC/" + g_infoManager.GetLabel(SYSTEM_BUILD_VERSION) + " (";
#if defined(_WIN32PC)
result += "Windows; ";
result += GetKernelVersion();
#else
result += "Xbox";
#endif
result += "; http://www.xbmc.org)";
return result;
}