cleaned up ipc net... prolly mkart doesnt work anymore and so on :)

git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@2649 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
fires.gc 2009-03-13 16:09:59 +00:00
parent 37345a8199
commit 727f74fc9d
2 changed files with 191 additions and 108 deletions

View File

@ -57,44 +57,7 @@
#include "WII_IPC_HLE_Device_net.h"
#define IOCTL_NWC24_STARTUP 0x06
enum {
IOCTL_SO_ACCEPT = 1,
IOCTL_SO_BIND,
IOCTL_SO_CLOSE,
IOCTL_SO_CONNECT,
IOCTL_SO_FCNTL,
IOCTL_SO_GETPEERNAME, // todo
IOCTL_SO_GETSOCKNAME, // todo
IOCTL_SO_GETSOCKOPT, // todo 8
IOCTL_SO_SETSOCKOPT,
IOCTL_SO_LISTEN,
IOCTL_SO_POLL, // todo b
IOCTLV_SO_RECVFROM,
IOCTLV_SO_SENDTO,
IOCTL_SO_SHUTDOWN, // todo e
IOCTL_SO_SOCKET,
IOCTL_SO_GETHOSTID,
IOCTL_SO_GETHOSTBYNAME,
IOCTL_SO_GETHOSTBYADDR,// todo
IOCTLV_SO_GETNAMEINFO, // todo 13
IOCTL_SO_UNK14, // todo
IOCTL_SO_INETATON, // todo
IOCTL_SO_INETPTON, // todo
IOCTL_SO_INETNTOP, // todo
IOCTLV_SO_GETADDRINFO, // todo
IOCTL_SO_SOCKATMARK, // todo
IOCTLV_SO_UNK1A, // todo
IOCTLV_SO_UNK1B, // todo
IOCTLV_SO_GETINTERFACEOPT, // todo
IOCTLV_SO_SETINTERFACEOPT, // todo
IOCTL_SO_SETINTERFACE, // todo
IOCTL_SO_STARTUP, // 0x1f
IOCTL_SO_ICMPSOCKET = 0x30, // todo
IOCTLV_SO_ICMPPING, // todo
IOCTL_SO_ICMPCANCEL, // todo
IOCTL_SO_ICMPCLOSE // todo
};
extern std::queue<std::pair<u32,std::string> > g_ReplyQueueLater;
// **********************************************************************************
@ -124,64 +87,80 @@ bool CWII_IPC_HLE_Device_net_kd_request::Close(u32 _CommandAddress)
return true;
}
bool CWII_IPC_HLE_Device_net_kd_request::IOCtl(u32 _CommandAddress)
{
u32 Parameter = Memory::Read_U32(_CommandAddress + 0xC);
u32 BufferIn = Memory::Read_U32(_CommandAddress + 0x10);
u32 BufferInSize = Memory::Read_U32(_CommandAddress + 0x14);
u32 BufferOut = Memory::Read_U32(_CommandAddress + 0x18);
u32 BufferOutSize = Memory::Read_U32(_CommandAddress + 0x1C);
u32 BufferOutSize = Memory::Read_U32(_CommandAddress + 0x1C);
u32 ReturnValue = ExecuteCommand(Parameter, BufferIn, BufferInSize, BufferOut, BufferOutSize);
u32 ReturnValue = 0;
switch(Parameter)
{
case IOCTL_NWC24_SUSPEND_SCHEDULAR: // NWC24iResumeForCloseLib from NWC24SuspendScheduler (Input: none, Output: 32 bytes)
ERROR_LOG(WII_IPC_NET, "NET_KD_REQ: IOCTL_NWC24_SUSPEND_SCHEDULAR - NI");
ReturnValue = 0;
break;
INFO_LOG(WII_IPC_NET, "NET_KD_REQ: IOCtl (Device=%s) (Parameter: 0x%02x)", GetDeviceName().c_str(), Parameter);
case IOCTL_NWC24_EXEC_TRY_SUSPEND_SCHEDULAR: // NWC24iResumeForCloseLib
ERROR_LOG(WII_IPC_NET, "NET_KD_REQ: IOCTL_NWC24_EXEC_TRY_SUSPEND_SCHEDULAR - NI");
ReturnValue = 0;
break;
case IOCTL_NWC24_UNK_3: // NWC24iResumeForCloseLib
ERROR_LOG(WII_IPC_NET, "NET_KD_REQ: IOCTL_NWC24_UNK_3 - NI");
ReturnValue = 0;
break;
case IOCTL_NWC24_STARTUP_SOCKET:
ERROR_LOG(WII_IPC_NET, "NET_KD_REQ: IOCTL_NWC24_STARTUP_SOCKET - NI");
ReturnValue = 0;
break;
case IOCTL_NWC24_LOCK_SOCKET: // WiiMenu
ERROR_LOG(WII_IPC_NET, "NET_KD_REQ: IOCTL_NWC24_LOCK_SOCKET - NI");
ReturnValue = 0;
break;
case IOCTL_NWC24_UNLOCK_SOCKET:
ERROR_LOG(WII_IPC_NET, "NET_KD_REQ: IOCTL_NWC24_UNLOCK_SOCKET - NI");
ReturnValue = 0;
break;
case IOCTL_NWC24_REQUEST_GENERATED_USER_ID: // (Input: none, Output: 32 bytes)
PanicAlert("IOCTL_NWC24_REQUEST_GENERATED_USER_ID");
ReturnValue = 0;
break;
case IOCTL_NWC24_GET_SCHEDULAR_STAT:
ERROR_LOG(WII_IPC_NET, "NET_KD_REQ: IOCTL_NWC24_GET_SCHEDULAR_STAT - NI");
ReturnValue = 0;
break;
case IOCTL_NWC24_SAVE_MAIL_NOW:
ERROR_LOG(WII_IPC_NET, "NET_KD_REQ: IOCTL_NWC24_SAVE_MAIL_NOW - NI");
ReturnValue = 0;
break;
case IOCTL_NWC24_REQUEST_SHUTDOWN:
ERROR_LOG(WII_IPC_NET, "NET_KD_REQ: IOCTL_NWC24_REQUEST_SHUTDOWN - NI"); // if ya set the IOS version to a very high value this happens ...
ReturnValue = 0;
break;
default:
_dbg_assert_msg_(WII_IPC_NET, 0, "/dev/net/kd/request::IOCtl request 0x%x (BufferIn: (%08x, %i), BufferOut: (%08x, %i)",
Parameter, BufferIn, BufferInSize, BufferOut, BufferOutSize);
break;
}
// g_ReplyQueueLater.push(std::pair<u32, std::string>(_CommandAddress, GetDeviceName()));
Memory::Write_U32(ReturnValue, _CommandAddress + 4);
return true;
}
s32 CWII_IPC_HLE_Device_net_kd_request::ExecuteCommand(u32 _Parameter, u32 _BufferIn, u32 _BufferInSize, u32 _BufferOut, u32 _BufferOutSize)
{
// Clean the location of the output buffer to zeroes as a safety precaution */
Memory::Memset(_BufferOut, 0, _BufferOutSize);
switch(_Parameter)
{
case 1: // SuspendScheduler (Input: none, Output: 32 bytes)
//Memory::Write_U32(0, _BufferOut);
return -1;
break;
case 2: // ExecTrySuspendScheduler (Input: 32 bytes, Output: 32 bytes).
DumpCommands(_BufferIn, _BufferInSize / 4, LogTypes::WII_IPC_NET);
Memory::Write_U32(1, _BufferOut);
return 0;
break;
case 3: // ? (Input: none, Output: 32 bytes)
//Memory::Write_U32(0, _BufferOut);
return -1;
break;
case IOCTL_NWC24_STARTUP:
return 0;
case 8: // WiiMenu
case 9:
return 0;
case 0xf: // NWC24iRequestGenerateUserId (Input: none, Output: 32 bytes)
//Memory::Write_U32(0, _BufferOut);
return -1;
break;
default:
_dbg_assert_msg_(WII_IPC_NET, 0, "/dev/net/kd/request::IOCtl request 0x%x (BufferIn: (%08x, %i), BufferOut: (%08x, %i)",
_Parameter, _BufferIn, _BufferInSize, _BufferOut, _BufferOutSize);
break;
}
// We return a success for any potential unknown requests
return 0;
}
// **********************************************************************************
// Handle /dev/net/ncd/manage requests
@ -195,12 +174,14 @@ CWII_IPC_HLE_Device_net_ncd_manage::~CWII_IPC_HLE_Device_net_ncd_manage()
bool CWII_IPC_HLE_Device_net_ncd_manage::Open(u32 _CommandAddress, u32 _Mode)
{
INFO_LOG(WII_IPC_NET, "NET_NCD_MANAGE: Open");
Memory::Write_U32(GetDeviceID(), _CommandAddress+4);
return true;
}
bool CWII_IPC_HLE_Device_net_ncd_manage::Close(u32 _CommandAddress)
{
INFO_LOG(WII_IPC_NET, "NET_NCD_MANAGE: Close");
Memory::Write_U32(0, _CommandAddress + 4);
return true;
}
@ -222,12 +203,13 @@ bool CWII_IPC_HLE_Device_net_ncd_manage::IOCtlV(u32 _CommandAddress)
case 0x08:
break;
default:
INFO_LOG(WII_IPC_NET, "NET_NCD_MANAGE IOCtlV: %i", CommandBuffer.Parameter);
default:
_dbg_assert_msg_(WII_IPC_NET, 0, "NET_NCD_MANAGE IOCtlV: %i", CommandBuffer.Parameter);
break;
}
INFO_LOG(WII_IPC_NET, "NET_NCD_MANAGE IOCtlV: %i", CommandBuffer.Parameter);
Memory::Write_U32(ReturnValue, _CommandAddress+4);
return true;
@ -245,12 +227,14 @@ CWII_IPC_HLE_Device_net_ip_top::~CWII_IPC_HLE_Device_net_ip_top()
bool CWII_IPC_HLE_Device_net_ip_top::Open(u32 _CommandAddress, u32 _Mode)
{
INFO_LOG(WII_IPC_NET, "NET_IP_TOP: Open");
Memory::Write_U32(GetDeviceID(), _CommandAddress+4);
return true;
}
bool CWII_IPC_HLE_Device_net_ip_top::Close(u32 _CommandAddress)
{
INFO_LOG(WII_IPC_NET, "NET_IP_TOP: Close");
Memory::Write_U32(0, _CommandAddress + 4);
return true;
}
@ -271,10 +255,12 @@ bool CWII_IPC_HLE_Device_net_ip_top::IOCtl(u32 _CommandAddress)
return true;
}
s32 CWII_IPC_HLE_Device_net_ip_top::ExecuteCommand(u32 _Command, u32 _BufferIn, u32 _BufferInSize, u32 _BufferOut, u32 _BufferOutSize)
s32 CWII_IPC_HLE_Device_net_ip_top::ExecuteCommand(u32 _Command, u32 _BufferIn, u32 BufferInSize, u32 BufferOut, u32 BufferOutSize)
{
// Clean the location of the output buffer to zeroes as a safety precaution */
Memory::Memset(_BufferOut, 0, _BufferOutSize);
Memory::Memset(BufferOut, 0, BufferOutSize);
INFO_LOG(WII_IPC_NET, "NET_IP_TOP IOCtlV: %i", _Command);
switch(_Command)
{
@ -282,7 +268,7 @@ s32 CWII_IPC_HLE_Device_net_ip_top::ExecuteCommand(u32 _Command, u32 _BufferIn,
default:
_dbg_assert_msg_(WII_IPC_NET, 0, "/dev/net/ip/top::IOCtl request 0x%x (BufferIn: (%08x, %i), BufferOut: (%08x, %i)",
_Command, _BufferIn, _BufferInSize, _BufferOut, _BufferOutSize);
_Command, _BufferIn, BufferInSize, BufferOut, BufferOutSize);
break;
}
@ -296,6 +282,8 @@ bool CWII_IPC_HLE_Device_net_ip_top::IOCtlV(u32 _CommandAddress)
SIOCtlVBuffer CommandBuffer(_CommandAddress);
INFO_LOG(WII_IPC_NET, "NET_IP_TOP IOCtlV: %i", CommandBuffer.Parameter);
switch(CommandBuffer.Parameter)
{
default:

View File

@ -34,7 +34,31 @@ public:
private:
s32 ExecuteCommand(u32 _Parameter, u32 _BufferIn, u32 _BufferInSize, u32 _BufferOut, u32 _BufferOutSize);
enum
{
IOCTL_NWC24_SUSPEND_SCHEDULAR = 0x01,
IOCTL_NWC24_EXEC_TRY_SUSPEND_SCHEDULAR = 0x02,
IOCTL_NWC24_UNK_3 = 0x03,
IOCTL_NWC24_UNK_4 = 0x04,
IOCTL_NWC24_UNK_5 = 0x05,
IOCTL_NWC24_STARTUP_SOCKET = 0x06,
IOCTL_NWC24_CLEANUP_SOCKET = 0x07,
IOCTL_NWC24_LOCK_SOCKET = 0x08,
IOCTL_NWC24_UNLOCK_SOCKET = 0x09,
IOCTL_NWC24_UNK_A = 0x0A,
IOCTL_NWC24_UNK_B = 0x0B,
IOCTL_NWC24_UNK_C = 0x0C,
IOCTL_NWC24_SAVE_MAIL_NOW = 0x0D,
IOCTL_NWC24_DOWNLOAD_NOW_EX = 0x0E,
IOCTL_NWC24_REQUEST_GENERATED_USER_ID = 0x0F,
IOCTL_NWC24_REQUEST_REGISTER_USER_ID = 0x10,
IOCTL_NWC24_GET_SCHEDULAR_STAT = 0x1E,
IOCTL_NWC24_UNK_1F = 0x1F,
IOCTL_NWC24_UNK_20 = 0x20,
IOCTL_NWC24_UNK_21 = 0x21,
IOCTL_NWC24_SET_SCRIPT_MODE = 0x22,
IOCTL_NWC24_REQUEST_SHUTDOWN = 0x28,
};
};
// **************************************************************************************
@ -52,41 +76,73 @@ public:
virtual bool Open(u32 _CommandAddress, u32 _Mode)
{
INFO_LOG(WII_IPC_NET, "%s - IOCtl: Open", GetDeviceName().c_str());
INFO_LOG(WII_IPC_NET, "NET_KD_TIME: Open");
Memory::Write_U32(GetDeviceID(), _CommandAddress+4);
return true;
}
virtual bool Close(u32 _CommandAddress, u32 _Mode)
virtual bool Close(u32 _CommandAddress)
{
INFO_LOG(WII_IPC_NET, "%s - IOCtl: Close", GetDeviceName().c_str());
INFO_LOG(WII_IPC_NET, "NET_KD_TIME: Close");
Memory::Write_U32(0, _CommandAddress + 4);
return true;
}
virtual bool IOCtl(u32 _CommandAddress)
{
#if LOGLEVEL >= 4
u32 Parameter = Memory::Read_U32(_CommandAddress +0x0C);
u32 Buffer1 = Memory::Read_U32(_CommandAddress +0x10);
u32 BufferSize1 = Memory::Read_U32(_CommandAddress +0x14);
u32 Buffer2 = Memory::Read_U32(_CommandAddress +0x18);
u32 BufferSize2 = Memory::Read_U32(_CommandAddress +0x1C);
#endif
u32 Parameter = Memory::Read_U32(_CommandAddress +0x0C);
u32 BufferIn = Memory::Read_U32(_CommandAddress + 0x10);
u32 BufferInSize = Memory::Read_U32(_CommandAddress + 0x14);
u32 BufferOut = Memory::Read_U32(_CommandAddress + 0x18);
u32 BufferOutSize = Memory::Read_U32(_CommandAddress + 0x1C);
switch (Parameter)
{
case IOCTL_NW24_SET_RTC_COUNTER: // NWC24iSetRtcCounter (but prolly just the first 4 bytes are intresting...)
_dbg_assert_msg_(WII_IPC_NET, BufferInSize==0x20, "NET_KD_TIME: Set RTC Counter BufferIn to small");
_dbg_assert_msg_(WII_IPC_NET, BufferOutSize==0x20, "NET_KD_TIME: Set RTC Counter BufferOut to small");
for (int i=0; i<0x20; i++)
{
m_RtcCounter[i] = Memory::Read_U8(BufferIn+i);
}
// send back for sync?? at least there is a out buffer...
for (int i=0; i<0x20; i++)
{
Memory::Write_U8(m_RtcCounter[i], BufferOut+i);
}
INFO_LOG(WII_IPC_NET, "NET_KD_TIME: Set RTC Counter");
Memory::Write_U32(0, _CommandAddress + 0x4);
return true;
default:
ERROR_LOG(WII_IPC_NET, "%s - IOCtl:\n"
" Parameter: 0x%x (0x17 NWC24iSetRtcCounter) \n"
" BufferIn: 0x%08x\n"
" BufferInSize: 0x%08x\n"
" BufferOut: 0x%08x\n"
" BufferOutSize: 0x%08x\n",
GetDeviceName().c_str(), Parameter, BufferIn, BufferInSize, BufferOut, BufferOutSize);
break;
}
// write return value
Memory::Write_U32(0, _CommandAddress + 0x4);
DEBUG_LOG(WII_IPC_NET, "%s - IOCtl:\n"
" Parameter: 0x%x (0x17 could be some kind of Sync RTC) \n"
" Buffer1: 0x%08x\n"
" BufferSize1: 0x%08x\n"
" Buffer2: 0x%08x\n"
" BufferSize2: 0x%08x\n",
GetDeviceName().c_str(), Parameter, Buffer1, BufferSize1, Buffer2, BufferSize2);
return true;
}
private:
enum
{
IOCTL_NW24_SET_RTC_COUNTER = 0x17,
IOCTL_NW24_GET_TIME_DIFF = 0x18,
};
u8 m_RtcCounter[0x20];
};
// **************************************************************************************
@ -104,6 +160,45 @@ public:
virtual bool IOCtlV(u32 _CommandAddress);
private:
enum {
IOCTL_SO_ACCEPT = 1,
IOCTL_SO_BIND,
IOCTL_SO_CLOSE,
IOCTL_SO_CONNECT,
IOCTL_SO_FCNTL,
IOCTL_SO_GETPEERNAME, // todo
IOCTL_SO_GETSOCKNAME, // todo
IOCTL_SO_GETSOCKOPT, // todo 8
IOCTL_SO_SETSOCKOPT,
IOCTL_SO_LISTEN,
IOCTL_SO_POLL, // todo b
IOCTLV_SO_RECVFROM,
IOCTLV_SO_SENDTO,
IOCTL_SO_SHUTDOWN, // todo e
IOCTL_SO_SOCKET,
IOCTL_SO_GETHOSTID,
IOCTL_SO_GETHOSTBYNAME,
IOCTL_SO_GETHOSTBYADDR,// todo
IOCTLV_SO_GETNAMEINFO, // todo 13
IOCTL_SO_UNK14, // todo
IOCTL_SO_INETATON, // todo
IOCTL_SO_INETPTON, // todo
IOCTL_SO_INETNTOP, // todo
IOCTLV_SO_GETADDRINFO, // todo
IOCTL_SO_SOCKATMARK, // todo
IOCTLV_SO_UNK1A, // todo
IOCTLV_SO_UNK1B, // todo
IOCTLV_SO_GETINTERFACEOPT, // todo
IOCTLV_SO_SETINTERFACEOPT, // todo
IOCTL_SO_SETINTERFACE, // todo
IOCTL_SO_STARTUP, // 0x1f
IOCTL_SO_ICMPSOCKET = 0x30, // todo
IOCTLV_SO_ICMPPING, // todo
IOCTL_SO_ICMPCANCEL, // todo
IOCTL_SO_ICMPCLOSE // todo
};
s32 ExecuteCommand(u32 _Parameter, u32 _BufferIn, u32 _BufferInSize, u32 _BufferOut, u32 _BufferOutSize);
};