This commit is contained in:
Ordinary205 2024-05-20 18:35:25 +04:00
parent 0a3c8a49dd
commit 5b83e13a70
9 changed files with 157 additions and 2 deletions

View File

@ -6,6 +6,7 @@
#include "utility/utility.h"
#include <windows.h>
#include <mutex>
LOG_DEFINE_MODULE(memory);
@ -299,4 +300,40 @@ void installHook_long(uintptr_t dst, uintptr_t src, _t_hook& pGateway, size_t le
protect((uintptr_t)pGateway.data.data(), pGateway.data.size(), SceProtExecute | SceProtRead, nullptr);
}
int VirtualLock::check_mmaped(void* addr, size_t len) {
return 0;
}
VirtualLock& VirtualLock::instance() {
static VirtualLock instance;
return instance;
}
void VirtualLock::lock() {
MMLock.lock();
}
void VirtualLock::unlock() {
MMLock.unlock();
}
void MLOCK(VirtualLock& vLock) {
vLock.lock();
}
void MUNLOCK(VirtualLock& vLock) {
vLock.unlock();
}
int check_mmaped(void* addr, size_t len) {
LOG_USE_MODULE(memory);
VirtualLock& vLock = VirtualLock::instance();
MLOCK(vLock);
int result = vLock.check_mmaped(addr, len);
MUNLOCK(vLock);
return result;
}
} // namespace memory

View File

@ -1,6 +1,7 @@
#pragma once
#include <array>
#include <stdint.h>
#include <mutex>
constexpr int SceProtRead = 1;
constexpr int SceProtWrite = 2;
@ -25,6 +26,20 @@ struct _t_hook {
std::array<uint8_t, 14 + 8> data; // Should be enough for inserting the hook (min 14 max 14+8)
};
class VirtualLock {
public:
int check_mmaped(void* addr, size_t len);
static VirtualLock& instance();
void lock();
void unlock();
private:
std::mutex MMLock;
};
void MLOCK(VirtualLock& vLock);
void MUNLOCK(VirtualLock& vLock);
__APICALL int getpagesize(void);
__APICALL uint64_t getTotalSystemMemory();
__APICALL uintptr_t reserve(uint64_t start, uint64_t size, uint64_t alignment, bool isGpu);
@ -37,6 +52,7 @@ __APICALL bool allocFixed(uint64_t address, uint64_t size, int prot);
__APICALL bool free(uint64_t address);
__APICALL bool protect(uint64_t address, uint64_t size, int prot, int* oldMode = nullptr);
__APICALL int getProtection(uint64_t address);
__APICALL int check_mmaped(void* addr, size_t len);
__APICALL void installHook_long(uintptr_t dst, uintptr_t src, _t_hook& pGateway, size_t lenOpCodes);
} // namespace memory

View File

@ -97,6 +97,12 @@ EXPORT SYSV_ABI int32_t sceGameLiveStreamingClearSocialFeedbackMessages(const Sc
return Ok;
}
EXPORT SYSV_ABI int32_t sceGameLiveStreamingSetStandbyScreenResource(const char* resource) {
LOG_USE_MODULE(libSceGameLiveStreaming);
LOG_ERR(L"todo %S", __FUNCTION__);
return Ok;
}
EXPORT SYSV_ABI int32_t sceGameLiveStreamingTerminate() {
LOG_USE_MODULE(libSceGameLiveStreaming);
LOG_ERR(L"todo %S", __FUNCTION__);

View File

@ -27,3 +27,4 @@ constexpr uint32_t SCE_NP_COUNTRY_CODE_LENGTH = (2);
constexpr uint32_t SCE_NP_NO_AGE_RESTRICTION = (0);
constexpr uint32_t SCE_NP_PLUS_FEATURE_REALTIME_MULTIPLAY = (0x1);
constexpr uint32_t SCE_NP_PLUS_EVENT_RECHECK_NEEDED = (0x1);
constexpr uint32_t SCE_NP_IN_GAME_MESSAGE_DATA_SIZE_MAX = (512);

View File

@ -340,4 +340,60 @@ EXPORT SYSV_ABI int sceNpInGameMessageInitialize(size_t poolSize, void* option)
LOG_ERR(L"todo %S", __FUNCTION__);
return Ok;
}
EXPORT SYSV_ABI int32_t sceNpInGameMessageAbortHandle(int32_t libCtxId, int32_t handleId) {
LOG_USE_MODULE(libSceNpManager);
LOG_ERR(L"todo %S", __FUNCTION__);
return Ok;
}
EXPORT SYSV_ABI int32_t sceNpInGameMessageCreateHandle(int32_t libCtxId) {
LOG_USE_MODULE(libSceNpManager);
LOG_ERR(L"todo %S", __FUNCTION__);
return Ok;
}
EXPORT SYSV_ABI int32_t sceNpInGameMessageDeleteHandle(int32_t libCtxId, int32_t handleId) {
LOG_USE_MODULE(libSceNpManager);
LOG_ERR(L"todo %S", __FUNCTION__);
return Ok;
}
EXPORT SYSV_ABI int32_t sceNpInGameMessagePrepare(int32_t libCtxId, int32_t handleId, const void* pReserved, SceNpInGameMessageEventCallbackA cbFunc,
void* pUserArg) {
LOG_USE_MODULE(libSceNpManager);
LOG_ERR(L"todo %S", __FUNCTION__);
return Ok;
}
EXPORT SYSV_ABI int32_t sceNpInGameMessagePrepareA(int32_t libCtxId, int32_t handleId, const void* pReserved, SceNpInGameMessageEventCallbackA cbFunc,
void* pUserArg) {
LOG_USE_MODULE(libSceNpManager);
LOG_ERR(L"todo %S", __FUNCTION__);
return Ok;
}
EXPORT SYSV_ABI int32_t sceNpInGameMessageSendData(int32_t libCtxId, const SceNpPeerAddressA* pTo, const SceNpPeerAddressA* pFrom, const SceNpInGameMessageData* pMessage) {
LOG_USE_MODULE(libSceNpManager);
LOG_ERR(L"todo %S", __FUNCTION__);
return Ok;
}
EXPORT SYSV_ABI int32_t sceNpInGameMessageSendDataA(int32_t libCtxId, const SceNpPeerAddressA* pTo, const SceNpPeerAddressA* pFrom, const SceNpInGameMessageData* pMessage) {
LOG_USE_MODULE(libSceNpManager);
LOG_ERR(L"todo %S", __FUNCTION__);
return Ok;
}
EXPORT SYSV_ABI int32_t sceNpInGameMessageGetMemoryPoolStatistics(int32_t libCtxId, SceNpInGameMessageMemoryPoolStatistics* pMemStats) {
LOG_USE_MODULE(libSceNpManager);
LOG_ERR(L"todo %S", __FUNCTION__);
return Ok;
}
EXPORT SYSV_ABI int32_t sceNpInGameMessageTerminate(int32_t libCtxId) {
LOG_USE_MODULE(libSceNpManager);
LOG_ERR(L"todo %S", __FUNCTION__);
return Ok;
}
}

View File

@ -152,3 +152,17 @@ struct SceNpCreateAsyncRequestParameter {
uint64_t cpuAffinityMask;
int threadPriority;
};
struct SceNpInGameMessageData {
char data[SCE_NP_IN_GAME_MESSAGE_DATA_SIZE_MAX];
size_t dataSize;
};
typedef void* SceNpInGameMessageEventCallbackA(int32_t libCtxId, const SceNpPeerAddressA* pTo, const SceNpOnlineId* pToOnlineId, const SceNpPeerAddressA* pFrom, const SceNpOnlineId* pFromOnlineId, const SceNpInGameMessageData* pMessage, void* pUserArg);
struct SceNpInGameMessageMemoryPoolStatistics {
size_t poolSize;
size_t maxInuseSize;
size_t currentInuseSize;
int32_t reserved;
};

View File

@ -37,6 +37,16 @@ EXPORT SYSV_ABI int32_t _sceUltWaitingQueueResourcePoolCreate(SceUltWaitingQueue
return Ok;
}
EXPORT SYSV_ABI int32_t _sceUltUlthreadRuntimeOptParamInitialize(SceUltUlthreadOptParam* optParam) {
LOG_USE_MODULE(libSceUlt);
return Ok;
}
EXPORT SYSV_ABI int32_t sceUltUlthreadRuntimeGetWorkAreaSize(uint32_t maxUlThread, uint32_t maxWorkerThread) {
LOG_USE_MODULE(libSceUlt);
return 8;
}
EXPORT SYSV_ABI int32_t _sceUltQueueDataResourcePoolCreate(SceUltQueueDataResourcePool* pool, const char* name, uint32_t numData, size_t dataSize,
uint32_t numQueueObjs, SceUltWaitingQueueResourcePool* waitingQueue, void* workArea,
SceUltQueueDataResourcePoolOptParam* param) {

View File

@ -58,6 +58,11 @@ struct SceUltQueue {
char _unknown[336];
};
struct SceUltUlthreadOptParam {
uint32_t attr;
char _unknown[127-4];
};
struct SceUltMutexOptParam {
char _unknown[128];
};

View File

@ -261,6 +261,16 @@ EXPORT SYSV_ABI int sceKernelMprotect(uint64_t addr, size_t len, int prot) {
return memory::protect(addr, len, prot, nullptr) ? Ok : getErr(ErrCode::_EACCES);
}
EXPORT SYSV_ABI int sceKernelMlock(void* addr, size_t len) {
LOG_USE_MODULE(libkernel);
return memory::check_mmaped(addr, len) ? Ok : getErr(ErrCode::_EACCES);
}
EXPORT SYSV_ABI int sceKernelMunlock(void* addr, size_t len) {
LOG_USE_MODULE(libkernel);
return memory::check_mmaped(addr, len) ? Ok : getErr(ErrCode::_EACCES);
}
EXPORT SYSV_ABI int sceKernelMsync(void* addr, size_t len, int flags) {
LOG_USE_MODULE(libkernel);
LOG_ERR(L"todo %S", __FUNCTION__);