IPC_HLE: Replace (const char *)GetPointer(x) with GetString(x)

Removes 20 instances of GetPointer.
This commit is contained in:
Scott Mansell 2014-10-20 00:32:43 +13:00 committed by Scott Mansell
parent f65bb10c93
commit d77e01e6c4
8 changed files with 60 additions and 45 deletions

View File

@ -291,18 +291,18 @@ void DMA_MemoryToLC(const u32 _CacheAddr, const u32 _MemAddr, const u32 _iNumBlo
} }
} }
std::string GetString(u32 em_address) std::string GetString(u32 em_address, size_t size)
{ {
std::string str; const char* ptr = reinterpret_cast<const char*>(GetPointer(em_address));
char c; if (size == 0) // Null terminated string.
while ((c = Read_U8(em_address)) != '\0')
{ {
str += c; return std::string(ptr);
em_address++; }
else // Fixed size string, potentially null terminated or null padded.
{
size_t length = strnlen(ptr, size);
return std::string(ptr, length);
} }
return str;
} }
// GetPointer must always return an address in the bottom 32 bits of address space, so that 64-bit // GetPointer must always return an address in the bottom 32 bits of address space, so that 64-bit
@ -358,7 +358,6 @@ u8 *GetPointer(const u32 _Address)
return nullptr; return nullptr;
} }
bool IsRAMAddress(const u32 addr, bool allow_locked_cache, bool allow_fake_vmem) bool IsRAMAddress(const u32 addr, bool allow_locked_cache, bool allow_fake_vmem)
{ {
switch ((addr >> 24) & 0xFC) switch ((addr >> 24) & 0xFC)

View File

@ -118,7 +118,7 @@ void Write_U64_Swap(const u64 _Data, const u32 _Address);
// Useful helper functions, used by ARM JIT // Useful helper functions, used by ARM JIT
void Write_F64(const double _Data, const u32 _Address); void Write_F64(const double _Data, const u32 _Address);
std::string GetString(u32 em_address); std::string GetString(u32 em_address, size_t size = 0);
u8* GetPointer(const u32 _Address); u8* GetPointer(const u32 _Address);
void DMA_LCToMemory(const u32 _iMemAddr, const u32 _iCacheAddr, const u32 _iNumBlocks); void DMA_LCToMemory(const u32 _iMemAddr, const u32 _iCacheAddr, const u32 _iNumBlocks);

View File

@ -17,7 +17,7 @@
static Common::replace_v replacements; static Common::replace_v replacements;
// This is used by several of the FileIO and /dev/fs functions // This is used by several of the FileIO and /dev/fs functions
std::string HLE_IPC_BuildFilename(std::string path_wii, int _size) std::string HLE_IPC_BuildFilename(std::string path_wii)
{ {
std::string path_full = File::GetUserPath(D_WIIROOT_IDX); std::string path_full = File::GetUserPath(D_WIIROOT_IDX);
@ -103,7 +103,7 @@ bool CWII_IPC_HLE_Device_FileIO::Open(u32 _CommandAddress, u32 _Mode)
"Read and Write" "Read and Write"
}; };
m_filepath = HLE_IPC_BuildFilename(m_Name, 64); m_filepath = HLE_IPC_BuildFilename(m_Name);
// The file must exist before we can open it // The file must exist before we can open it
// It should be created by ISFS_CreateFile, not here // It should be created by ISFS_CreateFile, not here
@ -333,5 +333,5 @@ void CWII_IPC_HLE_Device_FileIO::DoState(PointerWrap &p)
p.Do(m_Mode); p.Do(m_Mode);
p.Do(m_SeekPos); p.Do(m_SeekPos);
m_filepath = HLE_IPC_BuildFilename(m_Name, 64); m_filepath = HLE_IPC_BuildFilename(m_Name);
} }

View File

@ -7,7 +7,7 @@
#include "Common/FileUtil.h" #include "Common/FileUtil.h"
#include "Core/IPC_HLE/WII_IPC_HLE_Device.h" #include "Core/IPC_HLE/WII_IPC_HLE_Device.h"
std::string HLE_IPC_BuildFilename(std::string _pFilename, int _size); std::string HLE_IPC_BuildFilename(std::string _pFilename);
void HLE_IPC_CreateVirtualFATFilesystem(); void HLE_IPC_CreateVirtualFATFilesystem();
class CWII_IPC_HLE_Device_FileIO : public IWII_IPC_HLE_Device class CWII_IPC_HLE_Device_FileIO : public IWII_IPC_HLE_Device

View File

@ -85,8 +85,8 @@ bool CWII_IPC_HLE_Device_fs::IOCtlV(u32 _CommandAddress)
case IOCTLV_READ_DIR: case IOCTLV_READ_DIR:
{ {
// the wii uses this function to define the type (dir or file) // the wii uses this function to define the type (dir or file)
std::string DirName(HLE_IPC_BuildFilename((const char*)Memory::GetPointer( std::string DirName(HLE_IPC_BuildFilename(Memory::GetString(
CommandBuffer.InBuffer[0].m_Address), CommandBuffer.InBuffer[0].m_Size)); CommandBuffer.InBuffer[0].m_Address, CommandBuffer.InBuffer[0].m_Size)));
INFO_LOG(WII_IPC_FILEIO, "FS: IOCTL_READ_DIR %s", DirName.c_str()); INFO_LOG(WII_IPC_FILEIO, "FS: IOCTL_READ_DIR %s", DirName.c_str());
@ -173,8 +173,8 @@ bool CWII_IPC_HLE_Device_fs::IOCtlV(u32 _CommandAddress)
// this command sucks because it asks of the number of used // this command sucks because it asks of the number of used
// fsBlocks and inodes // fsBlocks and inodes
// It should be correct, but don't count on it... // It should be correct, but don't count on it...
const char *relativepath = (const char*)Memory::GetPointer(CommandBuffer.InBuffer[0].m_Address); std::string relativepath = Memory::GetString(CommandBuffer.InBuffer[0].m_Address, CommandBuffer.InBuffer[0].m_Size);
std::string path(HLE_IPC_BuildFilename(relativepath, CommandBuffer.InBuffer[0].m_Size)); std::string path(HLE_IPC_BuildFilename(relativepath));
u32 fsBlocks = 0; u32 fsBlocks = 0;
u32 iNodes = 0; u32 iNodes = 0;
@ -184,8 +184,8 @@ bool CWII_IPC_HLE_Device_fs::IOCtlV(u32 _CommandAddress)
// LPFaint99: After I found that setting the number of inodes to the number of children + 1 for the directory itself // LPFaint99: After I found that setting the number of inodes to the number of children + 1 for the directory itself
// I decided to compare with sneek which has the following 2 special cases which are // I decided to compare with sneek which has the following 2 special cases which are
// Copyright (C) 2009-2011 crediar http://code.google.com/p/sneek/ // Copyright (C) 2009-2011 crediar http://code.google.com/p/sneek/
if ((memcmp(relativepath, "/title/00010001", 16 ) == 0 ) || if ((relativepath.compare(0, 16, "/title/00010001") == 0 ) ||
(memcmp(relativepath, "/title/00010005", 16) == 0 )) (relativepath.compare(0, 16, "/title/00010005") == 0 ))
{ {
fsBlocks = 23; // size is size/0x4000 fsBlocks = 23; // size is size/0x4000
iNodes = 42; // empty folders return a FileCount of 1 iNodes = 42; // empty folders return a FileCount of 1
@ -286,7 +286,7 @@ s32 CWII_IPC_HLE_Device_fs::ExecuteCommand(u32 _Parameter, u32 _BufferIn, u32 _B
u32 OwnerID = Memory::Read_U32(Addr); Addr += 4; u32 OwnerID = Memory::Read_U32(Addr); Addr += 4;
u16 GroupID = Memory::Read_U16(Addr); Addr += 2; u16 GroupID = Memory::Read_U16(Addr); Addr += 2;
std::string DirName(HLE_IPC_BuildFilename((const char*)Memory::GetPointer(Addr), 64)); Addr += 64; std::string DirName(HLE_IPC_BuildFilename(Memory::GetString(Addr, 64))); Addr += 64;
Addr += 9; // owner attribs, permission Addr += 9; // owner attribs, permission
u8 Attribs = Memory::Read_U8(Addr); u8 Attribs = Memory::Read_U8(Addr);
@ -306,7 +306,7 @@ s32 CWII_IPC_HLE_Device_fs::ExecuteCommand(u32 _Parameter, u32 _BufferIn, u32 _B
u32 OwnerID = Memory::Read_U32(Addr); Addr += 4; u32 OwnerID = Memory::Read_U32(Addr); Addr += 4;
u16 GroupID = Memory::Read_U16(Addr); Addr += 2; u16 GroupID = Memory::Read_U16(Addr); Addr += 2;
std::string Filename = HLE_IPC_BuildFilename((const char*)Memory::GetPointer(_BufferIn), 64); Addr += 64; std::string Filename = HLE_IPC_BuildFilename(Memory::GetString(_BufferIn, 64)); Addr += 64;
u8 OwnerPerm = Memory::Read_U8(Addr); Addr += 1; u8 OwnerPerm = Memory::Read_U8(Addr); Addr += 1;
u8 GroupPerm = Memory::Read_U8(Addr); Addr += 1; u8 GroupPerm = Memory::Read_U8(Addr); Addr += 1;
u8 OtherPerm = Memory::Read_U8(Addr); Addr += 1; u8 OtherPerm = Memory::Read_U8(Addr); Addr += 1;
@ -332,7 +332,7 @@ s32 CWII_IPC_HLE_Device_fs::ExecuteCommand(u32 _Parameter, u32 _BufferIn, u32 _B
u32 OwnerID = 0; u32 OwnerID = 0;
u16 GroupID = 0x3031; // this is also known as makercd, 01 (0x3031) for nintendo and 08 (0x3038) for MH3 etc u16 GroupID = 0x3031; // this is also known as makercd, 01 (0x3031) for nintendo and 08 (0x3038) for MH3 etc
std::string Filename = HLE_IPC_BuildFilename((const char*)Memory::GetPointer(_BufferIn), 64); std::string Filename = HLE_IPC_BuildFilename(Memory::GetString(_BufferIn, 64));
u8 OwnerPerm = 0x3; // read/write u8 OwnerPerm = 0x3; // read/write
u8 GroupPerm = 0x3; // read/write u8 GroupPerm = 0x3; // read/write
u8 OtherPerm = 0x3; // read/write u8 OtherPerm = 0x3; // read/write
@ -377,7 +377,7 @@ s32 CWII_IPC_HLE_Device_fs::ExecuteCommand(u32 _Parameter, u32 _BufferIn, u32 _B
_dbg_assert_(WII_IPC_FILEIO, _BufferOutSize == 0); _dbg_assert_(WII_IPC_FILEIO, _BufferOutSize == 0);
int Offset = 0; int Offset = 0;
std::string Filename = HLE_IPC_BuildFilename((const char*)Memory::GetPointer(_BufferIn+Offset), 64); std::string Filename = HLE_IPC_BuildFilename(Memory::GetString(_BufferIn+Offset, 64));
Offset += 64; Offset += 64;
if (File::Delete(Filename)) if (File::Delete(Filename))
{ {
@ -401,10 +401,10 @@ s32 CWII_IPC_HLE_Device_fs::ExecuteCommand(u32 _Parameter, u32 _BufferIn, u32 _B
_dbg_assert_(WII_IPC_FILEIO, _BufferOutSize == 0); _dbg_assert_(WII_IPC_FILEIO, _BufferOutSize == 0);
int Offset = 0; int Offset = 0;
std::string Filename = HLE_IPC_BuildFilename((const char*)Memory::GetPointer(_BufferIn+Offset), 64); std::string Filename = HLE_IPC_BuildFilename(Memory::GetString(_BufferIn+Offset, 64));
Offset += 64; Offset += 64;
std::string FilenameRename = HLE_IPC_BuildFilename((const char*)Memory::GetPointer(_BufferIn+Offset), 64); std::string FilenameRename = HLE_IPC_BuildFilename(Memory::GetString(_BufferIn+Offset, 64));
Offset += 64; Offset += 64;
// try to make the basis directory // try to make the basis directory
@ -438,7 +438,7 @@ s32 CWII_IPC_HLE_Device_fs::ExecuteCommand(u32 _Parameter, u32 _BufferIn, u32 _B
u32 Addr = _BufferIn; u32 Addr = _BufferIn;
u32 OwnerID = Memory::Read_U32(Addr); Addr += 4; u32 OwnerID = Memory::Read_U32(Addr); Addr += 4;
u16 GroupID = Memory::Read_U16(Addr); Addr += 2; u16 GroupID = Memory::Read_U16(Addr); Addr += 2;
std::string Filename(HLE_IPC_BuildFilename((const char*)Memory::GetPointer(Addr), 64)); Addr += 64; std::string Filename(HLE_IPC_BuildFilename(Memory::GetString(Addr, 64))); Addr += 64;
u8 OwnerPerm = Memory::Read_U8(Addr); Addr++; u8 OwnerPerm = Memory::Read_U8(Addr); Addr++;
u8 GroupPerm = Memory::Read_U8(Addr); Addr++; u8 GroupPerm = Memory::Read_U8(Addr); Addr++;
u8 OtherPerm = Memory::Read_U8(Addr); Addr++; u8 OtherPerm = Memory::Read_U8(Addr); Addr++;

View File

@ -919,21 +919,23 @@ bool CWII_IPC_HLE_Device_net_ip_top::IOCtl(u32 _CommandAddress)
case IOCTL_SO_INETATON: case IOCTL_SO_INETATON:
{ {
struct hostent* remoteHost = gethostbyname((char*)Memory::GetPointer(BufferIn)); std::string hostname = Memory::GetString(BufferIn);
struct hostent* remoteHost = gethostbyname(hostname.c_str());
Memory::Write_U32(Common::swap32(*(u32*)remoteHost->h_addr_list[0]), BufferOut); Memory::Write_U32(Common::swap32(*(u32*)remoteHost->h_addr_list[0]), BufferOut);
INFO_LOG(WII_IPC_NET, "IOCTL_SO_INETATON = %d " INFO_LOG(WII_IPC_NET, "IOCTL_SO_INETATON = %d "
"%s, BufferIn: (%08x, %i), BufferOut: (%08x, %i), IP Found: %08X",remoteHost->h_addr_list[0] == nullptr ? -1 : 0, "%s, BufferIn: (%08x, %i), BufferOut: (%08x, %i), IP Found: %08X",remoteHost->h_addr_list[0] == nullptr ? -1 : 0,
(char*)Memory::GetPointer(BufferIn), BufferIn, BufferInSize, BufferOut, BufferOutSize, Common::swap32(*(u32*)remoteHost->h_addr_list[0])); hostname.c_str(), BufferIn, BufferInSize, BufferOut, BufferOutSize, Common::swap32(*(u32*)remoteHost->h_addr_list[0]));
ReturnValue = remoteHost->h_addr_list[0] == nullptr ? 0 : 1; ReturnValue = remoteHost->h_addr_list[0] == nullptr ? 0 : 1;
break; break;
} }
case IOCTL_SO_INETPTON: case IOCTL_SO_INETPTON:
{ {
std::string address = Memory::GetString(BufferIn);
INFO_LOG(WII_IPC_NET, "IOCTL_SO_INETPTON " INFO_LOG(WII_IPC_NET, "IOCTL_SO_INETPTON "
"(Translating: %s)", Memory::GetPointer(BufferIn)); "(Translating: %s)", address.c_str());
ReturnValue = inet_pton((char*)Memory::GetPointer(BufferIn), Memory::GetPointer(BufferOut+4)); ReturnValue = inet_pton(address.c_str(), Memory::GetPointer(BufferOut+4));
break; break;
} }
@ -1033,11 +1035,12 @@ bool CWII_IPC_HLE_Device_net_ip_top::IOCtl(u32 _CommandAddress)
case IOCTL_SO_GETHOSTBYNAME: case IOCTL_SO_GETHOSTBYNAME:
{ {
hostent* remoteHost = gethostbyname((char*)Memory::GetPointer(BufferIn)); std::string hostname = Memory::GetString(BufferIn);
hostent* remoteHost = gethostbyname(hostname.c_str());
INFO_LOG(WII_IPC_NET, "IOCTL_SO_GETHOSTBYNAME " INFO_LOG(WII_IPC_NET, "IOCTL_SO_GETHOSTBYNAME "
"Address: %s, BufferIn: (%08x, %i), BufferOut: (%08x, %i)", "Address: %s, BufferIn: (%08x, %i), BufferOut: (%08x, %i)",
(char*)Memory::GetPointer(BufferIn), BufferIn, BufferInSize, BufferOut, BufferOutSize); hostname.c_str(), BufferIn, BufferInSize, BufferOut, BufferOutSize);
if (remoteHost) if (remoteHost)
{ {
@ -1332,13 +1335,23 @@ bool CWII_IPC_HLE_Device_net_ip_top::IOCtlV(u32 CommandAddress)
hints.ai_next = nullptr; hints.ai_next = nullptr;
} }
char* pNodeName = nullptr; // getaddrinfo allows a null pointer for the nodeName or serviceName strings
// So we have to do a bit of juggling here.
std::string nodeNameStr;
const char* pNodeName = nullptr;
if (BufferInSize > 0) if (BufferInSize > 0)
pNodeName = (char*)Memory::GetPointer(_BufferIn); {
nodeNameStr = Memory::GetString(_BufferIn, BufferInSize);
pNodeName = nodeNameStr.c_str();
}
char* pServiceName = nullptr; std::string serviceNameStr;
const char* pServiceName = nullptr;
if (BufferInSize2 > 0) if (BufferInSize2 > 0)
pServiceName = (char*)Memory::GetPointer(_BufferIn2); {
serviceNameStr = Memory::GetString(_BufferIn2, BufferInSize2);
pServiceName = serviceNameStr.c_str();
}
int ret = getaddrinfo(pNodeName, pServiceName, BufferInSize3 ? &hints : nullptr, &result); int ret = getaddrinfo(pNodeName, pServiceName, BufferInSize3 ? &hints : nullptr, &result);
u32 addr = _BufferOut; u32 addr = _BufferOut;
@ -1389,7 +1402,7 @@ bool CWII_IPC_HLE_Device_net_ip_top::IOCtlV(u32 CommandAddress)
INFO_LOG(WII_IPC_NET, "IOCTLV_SO_GETADDRINFO " INFO_LOG(WII_IPC_NET, "IOCTLV_SO_GETADDRINFO "
"(BufferIn: (%08x, %i), BufferOut: (%08x, %i)", "(BufferIn: (%08x, %i), BufferOut: (%08x, %i)",
_BufferIn, BufferInSize, _BufferOut, BufferOutSize); _BufferIn, BufferInSize, _BufferOut, BufferOutSize);
INFO_LOG(WII_IPC_NET, "IOCTLV_SO_GETADDRINFO: %s", Memory::GetPointer(_BufferIn)); INFO_LOG(WII_IPC_NET, "IOCTLV_SO_GETADDRINFO: %s", Memory::GetString(_BufferIn).c_str());
ReturnValue = ret; ReturnValue = ret;
break; break;
} }

View File

@ -135,7 +135,7 @@ bool CWII_IPC_HLE_Device_net_ssl::IOCtlV(u32 _CommandAddress)
case IOCTLV_NET_SSL_NEW: case IOCTLV_NET_SSL_NEW:
{ {
int verifyOption = Memory::Read_U32(BufferOut); int verifyOption = Memory::Read_U32(BufferOut);
const char * hostname = (const char*) Memory::GetPointer(BufferOut2); std::string hostname = Memory::GetString(BufferOut2, BufferOutSize2);
int freeSSL = this->getSSLFreeID(); int freeSSL = this->getSSLFreeID();
if (freeSSL) if (freeSSL)
@ -176,7 +176,7 @@ bool CWII_IPC_HLE_Device_net_ssl::IOCtlV(u32 _CommandAddress)
ssl_set_authmode(&ssl->ctx, SSL_VERIFY_NONE); ssl_set_authmode(&ssl->ctx, SSL_VERIFY_NONE);
ssl_set_renegotiation(&ssl->ctx, SSL_RENEGOTIATION_ENABLED); ssl_set_renegotiation(&ssl->ctx, SSL_RENEGOTIATION_ENABLED);
memcpy(ssl->hostname, hostname, std::min((int)BufferOutSize2, NET_SSL_MAX_HOSTNAME_LEN)); memcpy(ssl->hostname, hostname.c_str(), std::min((int)BufferOutSize2, NET_SSL_MAX_HOSTNAME_LEN));
ssl->hostname[NET_SSL_MAX_HOSTNAME_LEN-1] = '\0'; ssl->hostname[NET_SSL_MAX_HOSTNAME_LEN-1] = '\0';
ssl_set_hostname(&ssl->ctx, ssl->hostname); ssl_set_hostname(&ssl->ctx, ssl->hostname);
@ -193,7 +193,7 @@ _SSL_NEW_ERROR:
"BufferIn: (%08x, %i), BufferIn2: (%08x, %i), " "BufferIn: (%08x, %i), BufferIn2: (%08x, %i), "
"BufferIn3: (%08x, %i), BufferOut: (%08x, %i), " "BufferIn3: (%08x, %i), BufferOut: (%08x, %i), "
"BufferOut2: (%08x, %i), BufferOut3: (%08x, %i)", "BufferOut2: (%08x, %i), BufferOut3: (%08x, %i)",
verifyOption, hostname, verifyOption, hostname.c_str(),
_BufferIn, BufferInSize, _BufferIn2, BufferInSize2, _BufferIn, BufferInSize, _BufferIn2, BufferInSize2,
_BufferIn3, BufferInSize3, BufferOut, BufferOutSize, _BufferIn3, BufferInSize3, BufferOut, BufferOutSize,
BufferOut2, BufferOutSize2, BufferOut3, BufferOutSize3); BufferOut2, BufferOutSize2, BufferOut3, BufferOutSize3);
@ -436,7 +436,7 @@ _SSL_NEW_ERROR:
_BufferIn, BufferInSize, _BufferIn2, BufferInSize2, _BufferIn, BufferInSize, _BufferIn2, BufferInSize2,
_BufferIn3, BufferInSize3, BufferOut, BufferOutSize, _BufferIn3, BufferInSize3, BufferOut, BufferOutSize,
BufferOut2, BufferOutSize2, BufferOut3, BufferOutSize3); BufferOut2, BufferOutSize2, BufferOut3, BufferOutSize3);
INFO_LOG(WII_IPC_SSL, "%s", Memory::GetPointer(BufferOut2)); INFO_LOG(WII_IPC_SSL, "%s", Memory::GetString(BufferOut2).c_str());
break; break;
} }
case IOCTLV_NET_SSL_READ: case IOCTLV_NET_SSL_READ:

View File

@ -423,7 +423,9 @@ void WiiSocket::Update(bool read, bool write, bool except)
u32 flags = Memory::Read_U32(BufferIn2 + 0x04); u32 flags = Memory::Read_U32(BufferIn2 + 0x04);
u32 has_destaddr = Memory::Read_U32(BufferIn2 + 0x08); u32 has_destaddr = Memory::Read_U32(BufferIn2 + 0x08);
char * data = (char*)Memory::GetPointer(BufferIn);
// Not a string, windows requires a const char* for sendto
const char* data = (const char*)Memory::GetPointer(BufferIn);
// Act as non blocking when SO_MSG_NONBLOCK is specified // Act as non blocking when SO_MSG_NONBLOCK is specified
forceNonBlock = ((flags & SO_MSG_NONBLOCK) == SO_MSG_NONBLOCK); forceNonBlock = ((flags & SO_MSG_NONBLOCK) == SO_MSG_NONBLOCK);
@ -457,6 +459,7 @@ void WiiSocket::Update(bool read, bool write, bool except)
case IOCTLV_SO_RECVFROM: case IOCTLV_SO_RECVFROM:
{ {
u32 flags = Memory::Read_U32(BufferIn + 0x04); u32 flags = Memory::Read_U32(BufferIn + 0x04);
// Not a string, windows requires a char* for recvfrom
char* data = (char*)Memory::GetPointer(BufferOut); char* data = (char*)Memory::GetPointer(BufferOut);
int data_len = BufferOutSize; int data_len = BufferOutSize;