Check kernel object types when looking up ids.

Some games misuse it, need to return an error.
This commit is contained in:
Unknown W. Brackets 2013-06-18 23:54:29 -07:00
parent 45775d4fc2
commit 933c8abb55
12 changed files with 25 additions and 9 deletions

View file

@ -158,6 +158,7 @@ public:
sprintf(ptr, "Seekpos: %08x", (u32)pspFileSystem.GetSeekPos(handle));
}
static u32 GetMissingErrorCode() { return SCE_KERNEL_ERROR_BADF; }
static int GetStaticIDType() { return PPSSPP_KERNEL_TMID_File; }
int GetIDType() const { return PPSSPP_KERNEL_TMID_File; }
virtual void DoState(PointerWrap &p) {
@ -1441,6 +1442,7 @@ public:
const char *GetName() {return name.c_str();}
const char *GetTypeName() {return "DirListing";}
static u32 GetMissingErrorCode() { return SCE_KERNEL_ERROR_BADF; }
static int GetStaticIDType() { return PPSSPP_KERNEL_TMID_DirList; }
int GetIDType() const { return PPSSPP_KERNEL_TMID_DirList; }
virtual void DoState(PointerWrap &p) {

View file

@ -404,6 +404,7 @@ public:
// Implement this in all subclasses:
// static u32 GetMissingErrorCode()
// static int GetStaticIDType()
virtual void DoState(PointerWrap &p)
{
@ -443,7 +444,7 @@ public:
if (handle < handleOffset || handle >= handleOffset+maxCount || !occupied[handle-handleOffset])
{
ERROR_LOG(HLE, "Kernel: Bad object handle %i (%08x)", handle, handle);
outError = T::GetMissingErrorCode(); // ?
outError = T::GetMissingErrorCode();
return 0;
}
else
@ -452,10 +453,10 @@ public:
// it just acted as a static case and everything worked. This means that we will never
// see the Wrong type object error below, but we'll just have to live with that danger.
T* t = static_cast<T*>(pool[handle - handleOffset]);
if (t == 0)
if (t == 0 || t->GetIDType() != T::GetStaticIDType())
{
ERROR_LOG(HLE, "Kernel: Wrong type object %i (%08x)", handle, handle);
outError = T::GetMissingErrorCode(); //FIX
ERROR_LOG(HLE, "Kernel: Wrong object type for %i (%08x)", handle, handle);
outError = T::GetMissingErrorCode();
return 0;
}
outError = SCE_KERNEL_ERROR_OK;
@ -477,8 +478,9 @@ public:
}
template <class T, typename ArgT>
void Iterate(bool func(T *, ArgT), ArgT arg, int type)
void Iterate(bool func(T *, ArgT), ArgT arg)
{
int type = T::GetStaticIDType();
for (int i = 0; i < maxCount; i++)
{
if (!occupied[i])
@ -491,8 +493,6 @@ public:
}
}
static u32 GetMissingErrorCode() { return -1; } // TODO
bool GetIDType(SceUID handle, int *type) const
{
if (handle < handleOffset || handle >= handleOffset+maxCount || !occupied[handle-handleOffset])

View file

@ -40,6 +40,7 @@ struct Alarm : public KernelObject
const char *GetName() {return "[Alarm]";}
const char *GetTypeName() {return "Alarm";}
static u32 GetMissingErrorCode() { return SCE_KERNEL_ERROR_UNKNOWN_ALMID; }
static int GetStaticIDType() { return SCE_KERNEL_TMID_Alarm; }
int GetIDType() const { return SCE_KERNEL_TMID_Alarm; }
virtual void DoState(PointerWrap &p)

View file

@ -64,6 +64,7 @@ public:
static u32 GetMissingErrorCode() {
return SCE_KERNEL_ERROR_UNKNOWN_EVFID;
}
static int GetStaticIDType() { return SCE_KERNEL_TMID_EventFlag; }
int GetIDType() const { return SCE_KERNEL_TMID_EventFlag; }
virtual void DoState(PointerWrap &p)

View file

@ -53,6 +53,7 @@ struct Mbx : public KernelObject
const char *GetName() {return nmb.name;}
const char *GetTypeName() {return "Mbx";}
static u32 GetMissingErrorCode() { return SCE_KERNEL_ERROR_UNKNOWN_MBXID; }
static int GetStaticIDType() { return SCE_KERNEL_TMID_Mbox; }
int GetIDType() const { return SCE_KERNEL_TMID_Mbox; }
void AddWaitingThread(SceUID id, u32 addr)

View file

@ -72,6 +72,7 @@ struct FPL : public KernelObject
const char *GetName() {return nf.name;}
const char *GetTypeName() {return "FPL";}
static u32 GetMissingErrorCode() { return SCE_KERNEL_ERROR_UNKNOWN_FPLID; }
static int GetStaticIDType() { return SCE_KERNEL_TMID_Fpl; }
int GetIDType() const { return SCE_KERNEL_TMID_Fpl; }
int findFreeBlock() {
@ -133,6 +134,7 @@ struct VPL : public KernelObject
const char *GetName() {return nv.name;}
const char *GetTypeName() {return "VPL";}
static u32 GetMissingErrorCode() { return SCE_KERNEL_ERROR_UNKNOWN_VPLID; }
static int GetStaticIDType() { return SCE_KERNEL_TMID_Vpl; }
int GetIDType() const { return SCE_KERNEL_TMID_Vpl; }
VPL() : alloc(8) {}
@ -424,6 +426,7 @@ public:
sprintf(ptr, "MemPart: %08x - %08x size: %08x", address, address + sz, sz);
}
static u32 GetMissingErrorCode() { return SCE_KERNEL_ERROR_UNKNOWN_UID; }
static int GetStaticIDType() { return PPSSPP_KERNEL_TMID_PMB; }
int GetIDType() const { return PPSSPP_KERNEL_TMID_PMB; }
PartitionMemoryBlock(BlockAllocator *_alloc, const char *_name, u32 size, MemblockType type, u32 alignment)
@ -1331,6 +1334,7 @@ struct TLS : public KernelObject
const char *GetName() {return ntls.name;}
const char *GetTypeName() {return "TLS";}
static u32 GetMissingErrorCode() { return PSP_ERROR_UNKNOWN_TLS_ID; }
static int GetStaticIDType() { return SCE_KERNEL_TMID_Tls; }
int GetIDType() const { return SCE_KERNEL_TMID_Tls; }
TLS() : next(0) {}

View file

@ -179,6 +179,7 @@ public:
nm.entry_addr);
}
static u32 GetMissingErrorCode() { return SCE_KERNEL_ERROR_UNKNOWN_MODULE; }
static int GetStaticIDType() { return PPSSPP_KERNEL_TMID_Module; }
int GetIDType() const { return PPSSPP_KERNEL_TMID_Module; }
virtual void DoState(PointerWrap &p)
@ -1349,7 +1350,7 @@ u32 sceKernelGetModuleIdByAddress(u32 moduleAddr)
state.addr = moduleAddr;
state.result = SCE_KERNEL_ERROR_UNKNOWN_MODULE;
kernelObjects.Iterate(&__GetModuleIdByAddressIterator, &state, PPSSPP_KERNEL_TMID_Module);
kernelObjects.Iterate(&__GetModuleIdByAddressIterator, &state);
if (state.result == SCE_KERNEL_ERROR_UNKNOWN_MODULE)
ERROR_LOG(HLE, "sceKernelGetModuleIdByAddress(%08x): module not found", moduleAddr)
else

View file

@ -55,6 +55,7 @@ struct MsgPipe : public KernelObject
const char *GetName() {return nmp.name;}
const char *GetTypeName() {return "MsgPipe";}
static u32 GetMissingErrorCode() { return SCE_KERNEL_ERROR_UNKNOWN_MPPID; }
static int GetStaticIDType() { return SCE_KERNEL_TMID_Mpipe; }
int GetIDType() const { return SCE_KERNEL_TMID_Mpipe; }
MsgPipe() : buffer(NULL) {}

View file

@ -64,6 +64,7 @@ struct Mutex : public KernelObject
const char *GetName() {return nm.name;}
const char *GetTypeName() {return "Mutex";}
static u32 GetMissingErrorCode() { return PSP_MUTEX_ERROR_NO_SUCH_MUTEX; }
static int GetStaticIDType() { return SCE_KERNEL_TMID_Mutex; }
int GetIDType() const { return SCE_KERNEL_TMID_Mutex; }
virtual void DoState(PointerWrap &p)
@ -125,6 +126,7 @@ struct LwMutex : public KernelObject
const char *GetName() {return nm.name;}
const char *GetTypeName() {return "LwMutex";}
static u32 GetMissingErrorCode() { return PSP_LWMUTEX_ERROR_NO_SUCH_LWMUTEX; }
static int GetStaticIDType() { return SCE_KERNEL_TMID_LwMutex; }
int GetIDType() const { return SCE_KERNEL_TMID_LwMutex; }
virtual void DoState(PointerWrap &p)

View file

@ -57,6 +57,7 @@ struct Semaphore : public KernelObject
const char *GetTypeName() {return "Semaphore";}
static u32 GetMissingErrorCode() { return SCE_KERNEL_ERROR_UNKNOWN_SEMID; }
static int GetStaticIDType() { return SCE_KERNEL_TMID_Semaphore; }
int GetIDType() const { return SCE_KERNEL_TMID_Semaphore; }
virtual void DoState(PointerWrap &p)

View file

@ -82,6 +82,7 @@ public:
}
static u32 GetMissingErrorCode() { return SCE_KERNEL_ERROR_UNKNOWN_CBID; }
static int GetStaticIDType() { return SCE_KERNEL_TMID_Callback; }
int GetIDType() const { return SCE_KERNEL_TMID_Callback; }
virtual void DoState(PointerWrap &p)
@ -295,7 +296,7 @@ public:
}
static u32 GetMissingErrorCode() { return SCE_KERNEL_ERROR_UNKNOWN_THID; }
static int GetStaticIDType() { return SCE_KERNEL_TMID_Thread; }
int GetIDType() const { return SCE_KERNEL_TMID_Thread; }
bool AllocateStack(u32 &stackSize)

View file

@ -42,6 +42,7 @@ struct VTimer : public KernelObject {
const char *GetName() {return nvt.name;}
const char *GetTypeName() {return "VTimer";}
static u32 GetMissingErrorCode() { return SCE_KERNEL_ERROR_UNKNOWN_VTID; }
static int GetStaticIDType() { return SCE_KERNEL_TMID_VTimer; }
int GetIDType() const { return SCE_KERNEL_TMID_VTimer; }
virtual void DoState(PointerWrap &p) {