static Result udsipc_DecryptBeaconData(udsNetworkStruct *network, u8 *tag0, u8 *tag1, udsNodeInfo *out) { u32* cmdbuf=getThreadCommandBuffer(); u32 tagsize = 0xfe; u32 saved_threadstorage[2]; cmdbuf[0]=IPC_MakeHeader(0x1F,0,6); // 0x1F0006 cmdbuf[1]=IPC_Desc_StaticBuffer(sizeof(udsNetworkStruct), 1); cmdbuf[2]=(u32)network; cmdbuf[3]=IPC_Desc_StaticBuffer(tagsize, 2); cmdbuf[4]=(u32)tag0; cmdbuf[5]=IPC_Desc_StaticBuffer(tagsize, 3); cmdbuf[6]=(u32)tag1; u32 * staticbufs = getThreadStaticBuffers(); saved_threadstorage[0] = staticbufs[0]; saved_threadstorage[1] = staticbufs[1]; staticbufs[0] = IPC_Desc_StaticBuffer(0x280,0); staticbufs[1] = (u32)out; Result ret=0; ret=svcSendSyncRequest(__uds_servhandle); staticbufs[0] = saved_threadstorage[0]; staticbufs[1] = saved_threadstorage[1]; if(R_FAILED(ret))return ret; return cmdbuf[1]; }
Result APT_AppletUtility(u32* out, u32 a, u32 size1, u8* buf1, u32 size2, u8* buf2) { u32 saved_threadstorage[2]; u32* cmdbuf=getThreadCommandBuffer(); cmdbuf[0]=IPC_MakeHeader(0x4B,3,2); // 0x4B00C2 cmdbuf[1]=a; cmdbuf[2]=size1; cmdbuf[3]=size2; cmdbuf[4]=IPC_Desc_StaticBuffer(size1,1); cmdbuf[5]=(u32)buf1; u32 *staticbufs = getThreadStaticBuffers(); saved_threadstorage[0]=staticbufs[0]; saved_threadstorage[1]=staticbufs[1]; staticbufs[0]=IPC_Desc_StaticBuffer(size2,0); staticbufs[1]=(u32)buf2; Result ret=svcSendSyncRequest(aptuHandle); staticbufs[0]=saved_threadstorage[0]; staticbufs[1]=saved_threadstorage[1]; if(R_FAILED(ret))return ret; if(out)*out=cmdbuf[2]; return cmdbuf[1]; }
Result APT_ReceiveDeliverArg_(void* param, size_t param_size, void* hmac, size_t hmac_size, u64* source_pid, bool* received) { u32 cmdbuf[16]; cmdbuf[0]=IPC_MakeHeader(0x35,2,0); cmdbuf[1]=param_size; cmdbuf[2]=hmac_size; u32 saved_threadstorage[4]; u32* staticbufs = getThreadStaticBuffers(); saved_threadstorage[0]=staticbufs[0]; saved_threadstorage[1]=staticbufs[1]; saved_threadstorage[2]=staticbufs[2]; saved_threadstorage[3]=staticbufs[3]; staticbufs[0]=IPC_Desc_StaticBuffer(param_size, 0); staticbufs[1]=(u32)param; staticbufs[2]=IPC_Desc_StaticBuffer(hmac_size, 2); staticbufs[3]=(u32)hmac; Result ret = aptSendCommand(cmdbuf); staticbufs[0]=saved_threadstorage[0]; staticbufs[1]=saved_threadstorage[1]; staticbufs[2]=saved_threadstorage[2]; staticbufs[3]=saved_threadstorage[3]; if(R_FAILED(ret)) return ret; if(source_pid) *source_pid = ((u64*)cmdbuf)[1]; if(received) *received = ((bool*)cmdbuf)[16]; return cmdbuf[1]; }
Result FSLDR_OpenFileDirectly(Handle* out, FS_Archive archive, FS_Path path, u32 openFlags, u32 attributes) { u32 *cmdbuf = getThreadCommandBuffer(); cmdbuf[0] = IPC_MakeHeader(0x803,8,4); // 0x8030204 cmdbuf[1] = 0; cmdbuf[2] = archive.id; cmdbuf[3] = archive.lowPath.type; cmdbuf[4] = archive.lowPath.size; cmdbuf[5] = path.type; cmdbuf[6] = path.size; cmdbuf[7] = openFlags; cmdbuf[8] = attributes; cmdbuf[9] = IPC_Desc_StaticBuffer(archive.lowPath.size, 2); cmdbuf[10] = (u32) archive.lowPath.data; cmdbuf[11] = IPC_Desc_StaticBuffer(path.size, 0); cmdbuf[12] = (u32) path.data; Result ret = 0; if(R_FAILED(ret = svcSendSyncRequest(fsldrHandle))) return ret; if(out) *out = cmdbuf[3]; return cmdbuf[1]; }
int socPoll(struct pollfd *fds, nfds_t nfds, int timeout) { int ret = 0; nfds_t i; u32 size = sizeof(struct pollfd)*nfds; u32 *cmdbuf = getThreadCommandBuffer(); u32 saved_threadstorage[2]; if(nfds == 0) { return -1; } for(i = 0; i < nfds; ++i) { fds[i].revents = 0; } cmdbuf[0] = IPC_MakeHeader(0x14,2,4); // 0x140084 cmdbuf[1] = (u32)nfds; cmdbuf[2] = (u32)timeout; cmdbuf[3] = IPC_Desc_CurProcessHandle(); cmdbuf[5] = IPC_Desc_StaticBuffer(size,10); cmdbuf[6] = (u32)fds; u32 * staticbufs = getThreadStaticBuffers(); saved_threadstorage[0] = staticbufs[0]; saved_threadstorage[1] = staticbufs[1]; staticbufs[0] = IPC_Desc_StaticBuffer(size,0); staticbufs[1] = (u32)fds; ret = svcSendSyncRequest(SOCU_handle); staticbufs[0] = saved_threadstorage[0]; staticbufs[1] = saved_threadstorage[1]; if(ret != 0) { return ret; } ret = (int)cmdbuf[1]; if(ret == 0) ret = _net_convert_error(cmdbuf[2]); if(ret < 0) { //errno = -ret; return -1; } return ret; }
int socSetsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen) { int ret = 0; u32 *cmdbuf = getThreadCommandBuffer(); cmdbuf[0] = IPC_MakeHeader(0x12,4,4); // 0x120104 cmdbuf[1] = (u32)sockfd; cmdbuf[2] = (u32)level; cmdbuf[3] = (u32)optname; cmdbuf[4] = (u32)optlen; cmdbuf[5] = IPC_Desc_CurProcessHandle(); cmdbuf[7] = IPC_Desc_StaticBuffer(optlen,9); cmdbuf[8] = (u32)optval; ret = svcSendSyncRequest(SOCU_handle); if(ret != 0) { return ret; } ret = (int)cmdbuf[1]; if(ret == 0) ret = _net_convert_error(cmdbuf[2]); if(ret < 0) { //errno = -ret; return -1; } return ret; }
Result APT_DoAppJump(u32 NSbuf0Size, u32 NSbuf1Size, u8 *NSbuf0Ptr, u8 *NSbuf1Ptr) { u32* cmdbuf=getThreadCommandBuffer(); cmdbuf[0]=IPC_MakeHeader(0x32,2,4); // 0x320084 cmdbuf[1]=NSbuf0Size; cmdbuf[2]=NSbuf1Size; cmdbuf[3]=IPC_Desc_StaticBuffer(NSbuf0Size,0); cmdbuf[4]=(u32)NSbuf0Ptr; cmdbuf[5]=IPC_Desc_StaticBuffer(NSbuf1Size,2); cmdbuf[6]=(u32)NSbuf1Ptr; Result ret=0; if(R_FAILED(ret=svcSendSyncRequest(aptuHandle)))return ret; return cmdbuf[1]; }
static Result udsipc_BeginHostingNetwork(const udsNetworkStruct *network, const void *passphrase, size_t passphrase_size) { u32* cmdbuf=getThreadCommandBuffer(); cmdbuf[0]=IPC_MakeHeader(0x1D,1,4); // 0x1D0044 cmdbuf[1]=passphrase_size; cmdbuf[2]=IPC_Desc_StaticBuffer(sizeof(udsNetworkStruct), 1); cmdbuf[3]=(u32)network; cmdbuf[4]=IPC_Desc_StaticBuffer(passphrase_size, 0); cmdbuf[5]=(u32)passphrase; Result ret=0; if(R_FAILED(ret=svcSendSyncRequest(__uds_servhandle)))return ret; return cmdbuf[1]; }
Result udsGetApplicationData(void *buf, size_t size, size_t *actual_size) { u32* cmdbuf=getThreadCommandBuffer(); u32 saved_threadstorage[2]; cmdbuf[0]=IPC_MakeHeader(0x11,1,0); // 0x110040 cmdbuf[1]=size; u32 * staticbufs = getThreadStaticBuffers(); saved_threadstorage[0] = staticbufs[0]; saved_threadstorage[1] = staticbufs[1]; staticbufs[0] = IPC_Desc_StaticBuffer(size,0); staticbufs[1] = (u32)buf; Result ret=0; ret=svcSendSyncRequest(__uds_servhandle); staticbufs[0] = saved_threadstorage[0]; staticbufs[1] = saved_threadstorage[1]; if(R_FAILED(ret))return ret; ret = cmdbuf[1]; if(R_SUCCEEDED(ret)) { if(actual_size)*actual_size = cmdbuf[2]; } return ret; }
static Result udsipc_ConnectToNetwork(const udsNetworkStruct *network, const void *passphrase, size_t passphrase_size, udsConnectionType connection_type) { u32* cmdbuf=getThreadCommandBuffer(); cmdbuf[0]=IPC_MakeHeader(0x1E,2,4); // 0x1E0084 cmdbuf[1]=connection_type; cmdbuf[2]=passphrase_size; cmdbuf[3]=IPC_Desc_StaticBuffer(sizeof(udsNetworkStruct), 1); cmdbuf[4]=(u32)network; cmdbuf[5]=IPC_Desc_StaticBuffer(passphrase_size, 0); cmdbuf[6]=(u32)passphrase; Result ret=0; if(R_FAILED(ret=svcSendSyncRequest(__uds_servhandle)))return ret; return cmdbuf[1]; }
Result GSPGPU_WriteHWRegsWithMask(u32 regAddr, u32* data, u8 datasize, u32* maskdata, u8 masksize) { if(datasize>0x80 || !data)return -1; u32* cmdbuf=getThreadCommandBuffer(); cmdbuf[0]=IPC_MakeHeader(0x2,2,4); // 0x20084 cmdbuf[1]=regAddr; cmdbuf[2]=datasize; cmdbuf[3]=IPC_Desc_StaticBuffer(datasize, 0); cmdbuf[4]=(u32)data; cmdbuf[5]=IPC_Desc_StaticBuffer(masksize, 1); cmdbuf[6]=(u32)maskdata; Result ret=0; if(R_FAILED(ret=svcSendSyncRequest(gspGpuHandle)))return ret; return cmdbuf[1]; }
int getsockname(int sockfd, struct sockaddr *addr, socklen_t *addrlen) { int ret = 0; u32 *cmdbuf = getThreadCommandBuffer(); u32 saved_threadstorage[2]; u8 tmpaddr[0x1c]; sockfd = soc_get_fd(sockfd); if(sockfd < 0) { errno = -sockfd; return -1; } cmdbuf[0] = IPC_MakeHeader(0x17,2,2); // 0x170082 cmdbuf[1] = (u32)sockfd; cmdbuf[2] = 0x1c; cmdbuf[3] = IPC_Desc_CurProcessHandle(); u32 * staticbufs = getThreadStaticBuffers(); saved_threadstorage[0] = staticbufs[0]; saved_threadstorage[1] = staticbufs[1]; staticbufs[0] = IPC_Desc_StaticBuffer(0x1c,0); staticbufs[1] = (u32)tmpaddr; ret = svcSendSyncRequest(SOCU_handle); staticbufs[0] = saved_threadstorage[0]; staticbufs[1] = saved_threadstorage[1]; if(ret != 0) { errno = SYNC_ERROR; return ret; } ret = (int)cmdbuf[1]; if(ret == 0) ret = _net_convert_error(cmdbuf[2]); if(ret < 0) { errno = -ret; return -1; } if(*addrlen > tmpaddr[0]) *addrlen = tmpaddr[0]; memset(addr, 0, sizeof(struct sockaddr)); addr->sa_family = tmpaddr[1]; memcpy(addr->sa_data, &tmpaddr[2], *addrlen - 2); return ret; }
int socAccept(int sockfd, struct sockaddr *addr, socklen_t *addrlen) { Result ret = 0; int tmp_addrlen = 0x1c; u32 *cmdbuf = getThreadCommandBuffer(); u8 tmpaddr[0x1c]; u32 saved_threadstorage[2]; memset(tmpaddr, 0, 0x1c); cmdbuf[0] = IPC_MakeHeader(0x4,2,2); // 0x40082 cmdbuf[1] = (u32)sockfd; cmdbuf[2] = (u32)tmp_addrlen; cmdbuf[3] = IPC_Desc_CurProcessHandle(); u32 *staticbufs = getThreadStaticBuffers(); saved_threadstorage[0] = staticbufs[0]; saved_threadstorage[1] = staticbufs[1]; staticbufs[0] = IPC_Desc_StaticBuffer(tmp_addrlen,0); staticbufs[1] = (u32)tmpaddr; ret = svcSendSyncRequest(SOCU_handle); staticbufs[0] = saved_threadstorage[0]; staticbufs[1] = saved_threadstorage[1]; if(ret != 0) return ret; ret = (int)cmdbuf[1]; if(ret == 0) ret = _net_convert_error(cmdbuf[2]); if(ret < 0) //errno = -ret; if(ret >= 0 && addr != NULL) { addr->sa_family = tmpaddr[1]; if(*addrlen > tmpaddr[0]) *addrlen = tmpaddr[0]; memcpy(addr->sa_data, &tmpaddr[2], *addrlen - 2); } if(ret < 0) return -1; return ret; }
Result APT_SendCaptureBufferInfo(u32 bufferSize, u32* buffer) { u32* cmdbuf=getThreadCommandBuffer(); cmdbuf[0] = IPC_MakeHeader(0x40,1,2); // 0x400042 cmdbuf[1] = bufferSize; cmdbuf[2] = IPC_Desc_StaticBuffer(bufferSize,0); cmdbuf[3] = (u32)buffer; Result ret=0; if(R_FAILED(ret=svcSendSyncRequest(aptuHandle)))return ret; return cmdbuf[1]; }
Result udsSetApplicationData(const void *buf, size_t size) { u32* cmdbuf=getThreadCommandBuffer(); cmdbuf[0]=IPC_MakeHeader(0x10,1,2); // 0x100042 cmdbuf[1]=size; cmdbuf[2]=IPC_Desc_StaticBuffer(size, 4); cmdbuf[3]=(u32)buf; Result ret=0; if(R_FAILED(ret=svcSendSyncRequest(__uds_servhandle)))return ret; return cmdbuf[1]; }
int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen) { int ret = 0; u32 *cmdbuf = getThreadCommandBuffer(); u32 saved_threadstorage[2]; sockfd = soc_get_fd(sockfd); if(sockfd < 0) { errno = -sockfd; return -1; } cmdbuf[0] = IPC_MakeHeader(0x11,4,2); // 0x110102 cmdbuf[1] = (u32)sockfd; cmdbuf[2] = (u32)level; cmdbuf[3] = (u32)optname; cmdbuf[4] = (u32)*optlen; cmdbuf[5] = IPC_Desc_CurProcessHandle(); u32 * staticbufs = getThreadStaticBuffers(); saved_threadstorage[0] = staticbufs[0]; saved_threadstorage[1] = staticbufs[1]; staticbufs[0] = IPC_Desc_StaticBuffer(*optlen,0); staticbufs[1] = (u32)optval; ret = svcSendSyncRequest(SOCU_handle); staticbufs[0] = saved_threadstorage[0]; staticbufs[1] = saved_threadstorage[1]; if(ret != 0) { errno = SYNC_ERROR; return ret; } ret = (int)cmdbuf[1]; if(ret == 0) ret = _net_convert_error(cmdbuf[2]); if(ret < 0) { errno = -ret; return -1; } *optlen = cmdbuf[3]; return ret; }
Result APT_JumpToApplication(const u8 *param, size_t paramSize, Handle handle) { u32* cmdbuf=getThreadCommandBuffer(); cmdbuf[0]=IPC_MakeHeader(0x24,1,4); // 0x240044 cmdbuf[1]=paramSize; cmdbuf[2]=IPC_Desc_SharedHandles(1); cmdbuf[3]=handle; cmdbuf[4]=IPC_Desc_StaticBuffer(paramSize,0); cmdbuf[5]= (u32) param; Result ret=0; if(R_FAILED(ret=svcSendSyncRequest(aptuHandle)))return ret; return cmdbuf[1]; }
int socBind(int sockfd, const struct sockaddr *addr, socklen_t addrlen) { Result ret = 0; socklen_t tmp_addrlen = 0; u32 *cmdbuf = getThreadCommandBuffer(); u8 tmpaddr[0x1c]; memset(tmpaddr, 0, 0x1c); if(addr->sa_family == AF_INET) tmp_addrlen = 8; else tmp_addrlen = 0x1c; if(addrlen < tmp_addrlen) { //errno = EINVAL; return -1; } tmpaddr[0] = tmp_addrlen; tmpaddr[1] = addr->sa_family; memcpy(&tmpaddr[2], &addr->sa_data, tmp_addrlen-2); cmdbuf[0] = IPC_MakeHeader(0x5,2,4); // 0x50084 cmdbuf[1] = (u32)sockfd; cmdbuf[2] = (u32)tmp_addrlen; cmdbuf[3] = IPC_Desc_CurProcessHandle(); cmdbuf[5] = IPC_Desc_StaticBuffer(tmp_addrlen,0); cmdbuf[6] = (u32)tmpaddr; ret = svcSendSyncRequest(SOCU_handle); if(ret != 0) { //errno = SYNC_ERROR; return ret; } ret = (int)cmdbuf[1]; if(ret == 0) ret = _net_convert_error(cmdbuf[2]); if(ret < 0) { //errno = -ret; return -1; } return ret; }
Result ACI_GetSSID(char * ssid) { u32* cmdbuf = getThreadCommandBuffer(); cmdbuf[0] = IPC_MakeHeader(0x40F,0,0); // 0x040F0000 u32* staticbufs = getThreadStaticBuffers(); staticbufs[0] = IPC_Desc_StaticBuffer(0x20, 0); //SSID length is 0x20 staticbufs[1] = (u32)ssid; Result ret = 0; if(R_FAILED(ret = svcSendSyncRequest(acHandle))) return ret; return (Result)cmdbuf[1]; }
Result ACI_GetPassphrase(char * passphrase) { u32* cmdbuf = getThreadCommandBuffer(); cmdbuf[0] = IPC_MakeHeader(0x415,0,0); // 0x04150000 u32* staticbufs = getThreadStaticBuffers(); staticbufs[0] = IPC_Desc_StaticBuffer(0x40, 0); //passphrase length is 0x40 staticbufs[1] = (u32)passphrase; Result ret = 0; if(R_FAILED(ret = svcSendSyncRequest(acHandle))) return ret; return (Result)cmdbuf[1]; }
Result APT_StartSystemApplet(NS_APPID appID, u32 bufSize, Handle applHandle, u8 *buf) { u32* cmdbuf=getThreadCommandBuffer(); cmdbuf[0] = IPC_MakeHeader(0x1F,2,4); // 0x001F0084 cmdbuf[1] = appID; cmdbuf[2] = bufSize; cmdbuf[3] = IPC_Desc_SharedHandles(1); cmdbuf[4] = applHandle; cmdbuf[5] = IPC_Desc_StaticBuffer(bufSize,0); cmdbuf[6] = (u32)buf; Result ret=0; if(R_FAILED(ret=svcSendSyncRequest(aptuHandle)))return ret; return cmdbuf[1]; }
Result GSPGPU_ReadHWRegs(u32 regAddr, u32* data, u8 size) { if(size>0x80 || !data)return -1; u32* cmdbuf=getThreadCommandBuffer(); cmdbuf[0]=IPC_MakeHeader(0x4,2,0); // 0x40080 cmdbuf[1]=regAddr; cmdbuf[2]=size; cmdbuf[0x40]=IPC_Desc_StaticBuffer(size, 0); cmdbuf[0x40+1]=(u32)data; Result ret=0; if(R_FAILED(ret=svcSendSyncRequest(gspGpuHandle)))return ret; return cmdbuf[1]; }
Result APT_StartLibraryApplet(NS_APPID appID, Handle inhandle, u32 *parambuf, u32 parambufsize) { u32* cmdbuf=getThreadCommandBuffer(); cmdbuf[0]=IPC_MakeHeader(0x1E,2,4); // 0x1E0084 cmdbuf[1]=appID; cmdbuf[2]=parambufsize; cmdbuf[3]=IPC_Desc_SharedHandles(1); cmdbuf[4]=inhandle; cmdbuf[5]=IPC_Desc_StaticBuffer(parambufsize,0); cmdbuf[6]=(u32)parambuf; Result ret=0; if(R_FAILED(ret=svcSendSyncRequest(aptuHandle)))return ret; return cmdbuf[1]; }
Result APT_ReceiveParameter(NS_APPID appID, u32 bufferSize, u32* buffer, u32* actualSize, u8* signalType) { u32* cmdbuf=getThreadCommandBuffer(); cmdbuf[0]=IPC_MakeHeader(0xD,2,0); // 0xD0080 cmdbuf[1]=appID; cmdbuf[2]=bufferSize; u32 *staticbufs = getThreadStaticBuffers(); staticbufs[0]=IPC_Desc_StaticBuffer(bufferSize,0); staticbufs[1]=(u32)buffer; Result ret=0; if(R_FAILED(ret=svcSendSyncRequest(aptuHandle)))return ret; if(signalType)*signalType=cmdbuf[3]; if(actualSize)*actualSize=cmdbuf[4]; return cmdbuf[1]; }
Result PS_VerifyRsaSha256(u8 *hash, psRSAContext *ctx, u8 *signature) { Result ret = 0; u32 *cmdbuf = getThreadCommandBuffer(); u32 size; size = ctx->rsa_bitsize>>3; cmdbuf[0] = IPC_MakeHeader(0x2,9,4); // 0x20244 memcpy(&cmdbuf[1], hash, 32); cmdbuf[9] = size; cmdbuf[10] = IPC_Desc_StaticBuffer(0x208, 0); cmdbuf[11] = (u32)ctx; cmdbuf[12] = IPC_Desc_Buffer(size, IPC_BUFFER_R); cmdbuf[13] = (u32)signature; if(R_FAILED(ret = svcSendSyncRequest(psHandle)))return ret; return (Result)cmdbuf[1]; }
Result LOADER_GetProgramInfo(ExHeader_Info* exheaderInfo, u64 programHandle) { Result ret = 0; u32 *cmdbuf = getThreadCommandBuffer(); u32 *staticbufs = getThreadStaticBuffers(); cmdbuf[0] = IPC_MakeHeader(4, 2, 0); // 0x40080 cmdbuf[1] = (u32)programHandle; cmdbuf[2] = (u32)(programHandle >> 32); u32 staticbufscpy[2] = {staticbufs[0], staticbufs[1]}; staticbufs[0] = IPC_Desc_StaticBuffer(0x400, 0); staticbufs[1] = (u32)exheaderInfo; if(R_FAILED(ret = svcSendSyncRequest(loaderHandle))) return ret; staticbufs[0] = staticbufscpy[0]; staticbufs[1] = staticbufscpy[1]; return (Result)cmdbuf[1]; }
Result APT_SendParameter(NS_APPID src_appID, NS_APPID dst_appID, u32 bufferSize, u32* buffer, Handle paramhandle, u8 signalType) { u32* cmdbuf=getThreadCommandBuffer(); cmdbuf[0] = IPC_MakeHeader(0xC,4,4); // 0xC0104 cmdbuf[1] = src_appID; cmdbuf[2] = dst_appID; cmdbuf[3] = signalType; cmdbuf[4] = bufferSize; cmdbuf[5] = IPC_Desc_SharedHandles(1); cmdbuf[6] = paramhandle; cmdbuf[7] = IPC_Desc_StaticBuffer(bufferSize,0); cmdbuf[8] = (u32)buffer; Result ret=0; if(R_FAILED(ret=svcSendSyncRequest(aptuHandle)))return ret; return cmdbuf[1]; }
Result udsSendTo(u16 dst_NetworkNodeID, u8 data_channel, u8 flags, const void *buf, size_t size) { u32* cmdbuf=getThreadCommandBuffer(); u32 aligned_size = (size+0x3) & ~0x3; cmdbuf[0]=IPC_MakeHeader(0x17,6,2); // 0x170182 cmdbuf[1]=0x1;//Unused cmdbuf[2]=dst_NetworkNodeID; cmdbuf[3]=data_channel; cmdbuf[4]=aligned_size>>2; cmdbuf[5]=size; cmdbuf[6]=flags; cmdbuf[7]=IPC_Desc_StaticBuffer(aligned_size, 5); cmdbuf[8]=(u32)buf; Result ret=0; if(R_FAILED(ret=svcSendSyncRequest(__uds_servhandle)))return ret; return cmdbuf[1]; }
Result udsPullPacket(const udsBindContext *bindcontext, void *buf, size_t size, size_t *actual_size, u16 *src_NetworkNodeID) { u32* cmdbuf=getThreadCommandBuffer(); u32 saved_threadstorage[2]; u32 aligned_size = (size+0x3) & ~0x3; cmdbuf[0]=IPC_MakeHeader(0x14,3,0); // 0x1400C0 cmdbuf[1]=bindcontext->BindNodeID; cmdbuf[2]=aligned_size>>2; cmdbuf[3]=size; u32 * staticbufs = getThreadStaticBuffers(); saved_threadstorage[0] = staticbufs[0]; saved_threadstorage[1] = staticbufs[1]; staticbufs[0] = IPC_Desc_StaticBuffer(aligned_size,0); staticbufs[1] = (u32)buf; Result ret=0; ret=svcSendSyncRequest(__uds_servhandle); staticbufs[0] = saved_threadstorage[0]; staticbufs[1] = saved_threadstorage[1]; if(R_FAILED(ret))return ret; ret = cmdbuf[1]; if(R_SUCCEEDED(ret)) { if(actual_size)*actual_size = cmdbuf[2]; if(src_NetworkNodeID)*src_NetworkNodeID = cmdbuf[3]; } return ret; }
int poll(struct pollfd *fds, nfds_t nfds, int timeout) { int ret = 0; nfds_t i; u32 size = sizeof(struct pollfd)*nfds; u32 *cmdbuf = getThreadCommandBuffer(); u32 saved_threadstorage[2]; if(nfds == 0) { errno = EINVAL; return -1; } struct pollfd *tmp_fds = (struct pollfd*)malloc(sizeof(struct pollfd) * nfds); if(tmp_fds == NULL) { errno = ENOMEM; return -1; } memcpy(tmp_fds, fds, sizeof(struct pollfd) * nfds); for(i = 0; i < nfds; ++i) { tmp_fds[i].fd = soc_get_fd(fds[i].fd); if(tmp_fds[i].fd < 0) { errno = -tmp_fds[i].fd; free(tmp_fds); return -1; } tmp_fds[i].revents = 0; } cmdbuf[0] = IPC_MakeHeader(0x14,2,4); // 0x140084 cmdbuf[1] = (u32)nfds; cmdbuf[2] = (u32)timeout; cmdbuf[3] = IPC_Desc_CurProcessHandle(); cmdbuf[5] = IPC_Desc_StaticBuffer(size,10); cmdbuf[6] = (u32)tmp_fds; u32 * staticbufs = getThreadStaticBuffers(); saved_threadstorage[0] = staticbufs[0]; saved_threadstorage[1] = staticbufs[1]; staticbufs[0] = IPC_Desc_StaticBuffer(size,0); staticbufs[1] = (u32)tmp_fds; ret = svcSendSyncRequest(SOCU_handle); if(ret != 0) { free(tmp_fds); errno = SYNC_ERROR; return ret; } staticbufs[0] = saved_threadstorage[0]; staticbufs[1] = saved_threadstorage[1]; ret = (int)cmdbuf[1]; if(ret == 0) ret = _net_convert_error(cmdbuf[2]); if(ret < 0) { free(tmp_fds); errno = -ret; return -1; } for(i = 0; i < nfds; ++i) fds[i].revents = tmp_fds[i].revents; free(tmp_fds); return ret; }