// TODO: manage file sizes larger than 4 GB (usbs etc) HRESULT InlineMd5( char *value ) { CHAR bytes[0x10]; CHAR byteStr[0x22]; UINT outLen = 0x22; memset( bytes, 0, 0x10 ); memset( byteStr, 0, 0x22 ); XeCryptMd5( (const PBYTE)value, strlen(value), NULL, NULL, NULL, NULL, (PBYTE)bytes, 0x10 ); memset(value, 0, 0x23); GetBytesString( (BYTE*)bytes, 0x10, byteStr, &outLen ); strcpy_s(value, 0x22, byteStr); return S_OK; }
HRESULT Drive::Mount() { // Get our serial LoadSerial(); // Get our serial as a string CHAR serialStr[41]; serialStr[40] = 0; UINT outLen = 0x40; GetBytesString(m_Serial, 0x14, serialStr, &outLen); m_SerialStr = (string)serialStr; if (m_DriveType == DEVICE_USBMEMORY_UNIT0 || m_DriveType == DEVICE_USBMEMORY_UNIT1 || m_DriveType == DEVICE_USBMEMORY_UNIT2 ) m_SerialStr = m_SerialStr + "_USBMU"; if (m_DriveType == DEVICE_USBMEMORY_Cache0 || m_DriveType == DEVICE_USBMEMORY_Cache1 || m_DriveType == DEVICE_USBMEMORY_Cache2 ) m_SerialStr = m_SerialStr + "_USBMUC"; //DebugMsg("Mounting %s",m_MountPoint.c_str()); char MountConv[260]; sprintf_s( MountConv, "\\??\\%s", m_MountPoint.c_str() ); char SysPath[260]; sprintf_s( SysPath,"%s", m_SystemPath.c_str() ); STRING sSysPath = { (USHORT)strlen( SysPath ), (USHORT)strlen( SysPath ) + 1, SysPath }; STRING sMountConv = { (USHORT)strlen( MountConv ), (USHORT)strlen( MountConv ) + 1, MountConv }; //don't try to mount 'Game:' as it's already there if (stricmp(m_MountPoint.c_str(), "Game:") != 0) { int res = ObCreateSymbolicLink( &sMountConv, &sSysPath ); if (res != 0) { //DebugMsg("Mount failed : %d",res); return res; } } HRESULT ret = IsMounted(); if(ret == 1) { GetDiskFreeSpaceEx(getRootPath().c_str(),&m_FreeBytesAvailable,&m_TotalNumberOfBytes,&m_TotalNumberOfFreeBytes); } else { m_FreeBytesAvailable.QuadPart = 0; m_TotalNumberOfBytes.QuadPart =0; m_TotalNumberOfFreeBytes.QuadPart=0; } return ret; }