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 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; }
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]; }
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]; }
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; }
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 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 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 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 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 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 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; }
static int getaddrinfo_detail(const char *node, const char *service, const struct addrinfo *hints, struct addrinfo **res, addrinfo_3ds_t *info, s32 info_count, s32 * count) { int i; u32 *cmdbuf = getThreadCommandBuffer(); u32 saved_threadstorage[2]; if(node == NULL && service == NULL) { return EAI_NONAME; } cmdbuf[ 0] = IPC_MakeHeader(0xF,4,6); // 0x00F0106 cmdbuf[ 1] = node == NULL ? 0 : strlen(node)+1; cmdbuf[ 2] = service == NULL ? 0 : strlen(service)+1; cmdbuf[ 3] = hints == NULL ? 0 : sizeof(*hints); cmdbuf[ 4] = sizeof(addrinfo_3ds_t) * info_count; cmdbuf[ 5] = IPC_Desc_StaticBuffer(cmdbuf[1], 5); cmdbuf[ 6] = (u32)node; cmdbuf[ 7] = IPC_Desc_StaticBuffer(cmdbuf[2], 6); cmdbuf[ 8] = (u32)service; cmdbuf[ 9] = IPC_Desc_StaticBuffer(cmdbuf[3], 7); cmdbuf[10] = (u32)hints; u32 * staticbufs = getThreadStaticBuffers(); // Save the thread storage values for(i = 0 ; i < 2 ; ++i) saved_threadstorage[i] = staticbufs[i]; staticbufs[0] = IPC_Desc_StaticBuffer(sizeof(addrinfo_3ds_t) * info_count, 0); staticbufs[1] = (u32)info; int ret = svcSendSyncRequest(SOCU_handle); // Restore the thread storage values for(i = 0 ; i < 2 ; ++i) staticbufs[i] = saved_threadstorage[i]; if(R_FAILED(ret)) { errno = SYNC_ERROR; return ret; } ret = cmdbuf[1]; if(R_FAILED(ret)) { errno = SYNC_ERROR; return ret; } if(cmdbuf[2] != 0) { return cmdbuf[2]; } *count = cmdbuf[3]; if(*count <= 0) *res = NULL; else if(*count <= info_count) { struct addrinfo **ptr = res; for(i = 0; i < *count; ++i) { *ptr = buffer2addrinfo(&info[i]); if(*ptr == NULL) { freeaddrinfo(*res); *res = NULL; return EAI_MEMORY; } ptr = &(*ptr)->ai_next; } *ptr = NULL; } return 0; }
struct hostent* gethostbyname(const char *name) { int ret = 0; u32 *cmdbuf = getThreadCommandBuffer(); u32 saved_threadstorage[2]; static u8 outbuf[0x1A88]; h_errno = 0; cmdbuf[0] = IPC_MakeHeader(0xD,2,2); // 0xD0082 cmdbuf[1] = strlen(name)+1; cmdbuf[2] = sizeof(outbuf); cmdbuf[3] = ((strlen(name)+1) << 14) | 0xC02; cmdbuf[4] = (u32)name; u32 * staticbufs = getThreadStaticBuffers(); saved_threadstorage[0] = staticbufs[0]; saved_threadstorage[1] = staticbufs[1]; staticbufs[0] = IPC_Desc_StaticBuffer(sizeof(outbuf),0); staticbufs[1] = (u32)outbuf; ret = svcSendSyncRequest(SOCU_handle); if(ret != 0) { h_errno = NO_RECOVERY; return NULL; } 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) { /* TODO: set h_errno based on ret */ h_errno = HOST_NOT_FOUND; return NULL; } u32 num_results, i; memcpy(&num_results, (char*)outbuf+4, sizeof(num_results)); if(num_results > MAX_HOSTENT_RESULTS) num_results = MAX_HOSTENT_RESULTS; SOC_hostent.h_name = (char*)outbuf + 8; SOC_hostent.h_aliases = &SOC_hostent_alias; SOC_hostent.h_addrtype = AF_INET; SOC_hostent.h_length = 4; SOC_hostent.h_addr_list = SOC_hostent_results; SOC_hostent_alias = NULL; for(i = 0; i < num_results; ++i) SOC_hostent_results[i] = (char*)outbuf + 0x1908 + i*0x10; SOC_hostent_results[num_results] = NULL; SOC_hostent.h_addr = SOC_hostent.h_addr_list[0]; return &SOC_hostent; }
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; }
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen) { int ret = 0; int tmp_addrlen = 0x1c; int fd, dev; __handle *handle; u32 *cmdbuf = getThreadCommandBuffer(); u8 tmpaddr[0x1c]; u32 saved_threadstorage[2]; sockfd = soc_get_fd(sockfd); if(sockfd < 0) { errno = -sockfd; return -1; } dev = FindDevice("soc:"); if(dev < 0) { errno = ENODEV; return -1; } fd = __alloc_handle(sizeof(__handle) + sizeof(Handle)); if(fd < 0) { errno = ENOMEM; return -1; } handle = __get_handle(fd); handle->device = dev; handle->fileStruct = ((void *)handle) + sizeof(__handle); 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) { __release_handle(fd); errno = SYNC_ERROR; 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) { __release_handle(fd); return -1; } else *(Handle*)handle->fileStruct = ret; return fd; }