From 051ad2dc601ebf2bd4e35e166e341ff7d53f0e39 Mon Sep 17 00:00:00 2001 From: yellows8 Date: Fri, 25 Oct 2019 20:28:02 -0400 Subject: [PATCH] Improved bool handling, clear IPC in-struct padding, and use serviceAssumeDomain prior to serviceClose in non-_{name}Cleanup funcs. Removed PACKED from the _usbHsIfCtrlXferAsync IPC in-struct. Fixed the code setting the IPC in-struct for _nsCmdRequestSendReceiveSystemUpdate, which is used by nssuRequestSendSystemUpdate/nssuControlRequestReceiveSystemUpdate. Minor other changes. Updated a param name for capsscCaptureRawImageWithTimeout. --- nx/include/switch/services/capssc.h | 4 ++-- nx/source/services/audin.c | 2 +- nx/source/services/audout.c | 2 +- nx/source/services/audren.c | 3 ++- nx/source/services/capssc.c | 7 ++++--- nx/source/services/capssu.c | 6 ++++-- nx/source/services/capsu.c | 17 ++++++++++++----- nx/source/services/hid.c | 8 +++++--- nx/source/services/hiddbg.c | 25 ++++++++++++++++--------- nx/source/services/irs.c | 3 ++- nx/source/services/lbl.c | 2 +- nx/source/services/nifm.c | 2 +- nx/source/services/ns.c | 13 ++++++------- nx/source/services/pctl.c | 2 +- nx/source/services/pdm.c | 3 ++- nx/source/services/set.c | 2 +- nx/source/services/usbds.c | 4 ++++ nx/source/services/usbhs.c | 10 ++++++++-- 18 files changed, 73 insertions(+), 42 deletions(-) diff --git a/nx/include/switch/services/capssc.h b/nx/include/switch/services/capssc.h index 38fb9c6e..53c3845f 100644 --- a/nx/include/switch/services/capssc.h +++ b/nx/include/switch/services/capssc.h @@ -24,12 +24,12 @@ Service* capsscGetServiceSession(void); * @note buffer_index and buffer_count correspond to buffers with size 0x384000(1280*720*4). These must not be negative. * @param buf Output buffer containing the RGBA8 image. * @param size Size of buf, should be 0x384000(1280*720*4) * buffer_count. - * @param inval Value 0 can be used for this. + * @param layer_stack Value 0 can be used for this. * @param width Image width, must be 1280. * @param height Image height, must be 720. * @param buffer_count Total number of output image buffers. * @param buffer_index Starting image buffer index. Must be < buffer_count. * @param timeout Timeout in nanoseconds. A default value of 100000000 can be used. */ -Result capsscCaptureRawImageWithTimeout(void* buf, size_t size, u32 inval, u64 width, u64 height, s64 buffer_count, s64 buffer_index, u64 timeout); +Result capsscCaptureRawImageWithTimeout(void* buf, size_t size, u32 layer_stack, u64 width, u64 height, s64 buffer_count, s64 buffer_index, u64 timeout); diff --git a/nx/source/services/audin.c b/nx/source/services/audin.c index 45abfc46..d14c50e8 100644 --- a/nx/source/services/audin.c +++ b/nx/source/services/audin.c @@ -217,6 +217,6 @@ Result audinContainsAudioInBuffer(AudioInBuffer *Buffer, bool *ContainsBuffer) { u64 tmp = (u64)Buffer; u8 out=0; Result rc = serviceDispatchInOut(&g_audinIAudioIn, 6, tmp, out); - if (R_SUCCEEDED(rc) && ContainsBuffer) *ContainsBuffer = out!=0; + if (R_SUCCEEDED(rc) && ContainsBuffer) *ContainsBuffer = out & 1; return rc; } diff --git a/nx/source/services/audout.c b/nx/source/services/audout.c index a3075829..b8ff1904 100644 --- a/nx/source/services/audout.c +++ b/nx/source/services/audout.c @@ -220,6 +220,6 @@ Result audoutContainsAudioOutBuffer(AudioOutBuffer *Buffer, bool *ContainsBuffer u64 tmp = (u64)Buffer; u8 out=0; Result rc = serviceDispatchInOut(&g_audoutIAudioOut, 6, tmp, out); - if (R_SUCCEEDED(rc) && ContainsBuffer) *ContainsBuffer = out!=0; + if (R_SUCCEEDED(rc) && ContainsBuffer) *ContainsBuffer = out & 1; return rc; } diff --git a/nx/source/services/audren.c b/nx/source/services/audren.c index 6c6bd2eb..5af62c36 100644 --- a/nx/source/services/audren.c +++ b/nx/source/services/audren.c @@ -151,9 +151,10 @@ void audrenWaitFrame(void) { Result _audrenOpenAudioRenderer(Service* srv, Service* srv_out, const AudioRendererParameter* param, u64 aruid) { const struct { AudioRendererParameter param; + u32 pad; u64 work_buffer_size; u64 aruid; - } in = { *param, g_audrenWorkBuf.size, aruid }; + } in = { *param, 0, g_audrenWorkBuf.size, aruid }; return serviceDispatchIn(srv, 0, in, .in_send_pid = true, diff --git a/nx/source/services/capssc.c b/nx/source/services/capssc.c index 12169b8d..e10b5c71 100644 --- a/nx/source/services/capssc.c +++ b/nx/source/services/capssc.c @@ -27,15 +27,16 @@ Service* capsscGetServiceSession(void) { return &g_capsscSrv; } -Result capsscCaptureRawImageWithTimeout(void* buf, size_t size, u32 inval, u64 width, u64 height, s64 buffer_count, s64 buffer_index, u64 timeout) { +Result capsscCaptureRawImageWithTimeout(void* buf, size_t size, u32 layer_stack, u64 width, u64 height, s64 buffer_count, s64 buffer_index, u64 timeout) { const struct { - u32 inval; + u32 layer_stack; + u32 pad; u64 width; u64 height; s64 buffer_count; s64 buffer_index; u64 timeout; - } in = { inval, width, height, buffer_count, buffer_index, timeout }; + } in = { layer_stack, 0, width, height, buffer_count, buffer_index, timeout }; return serviceDispatchIn(&g_capsscSrv, 2, in, .buffer_attrs = { SfBufferAttr_HipcMapTransferAllowsNonSecure | SfBufferAttr_HipcMapAlias | SfBufferAttr_Out }, diff --git a/nx/source/services/capssu.c b/nx/source/services/capssu.c index c3c621fa..993381d3 100644 --- a/nx/source/services/capssu.c +++ b/nx/source/services/capssu.c @@ -58,8 +58,9 @@ static Result _capssuSaveScreenShotEx0(const void* buffer, size_t size, const Ca const struct { CapsScreenShotAttribute attr; u32 reportoption; + u32 pad; u64 AppletResourceUserId; - } in = { *attr, reportoption, AppletResourceUserId }; + } in = { *attr, reportoption, 0, AppletResourceUserId }; return serviceDispatchInOut(&g_capssuSrv, 203, in, *out, .buffer_attrs = { SfBufferAttr_HipcMapTransferAllowsNonSecure | SfBufferAttr_HipcMapAlias | SfBufferAttr_In }, @@ -75,8 +76,9 @@ static Result _capssuSaveScreenShotEx(u32 cmd_id, bool pid, const void* argbuf, const struct { CapsScreenShotAttribute attr; u32 reportoption; + u32 pad; u64 AppletResourceUserId; - } in = { *attr, reportoption, AppletResourceUserId }; + } in = { *attr, reportoption, 0, AppletResourceUserId }; return serviceDispatchInOut(&g_capssuSrv, cmd_id, in, *out, .buffer_attrs = { diff --git a/nx/source/services/capsu.c b/nx/source/services/capsu.c index ded78e12..5fa6f4b7 100644 --- a/nx/source/services/capsu.c +++ b/nx/source/services/capsu.c @@ -68,10 +68,11 @@ static Result _capsuGetAlbumFileList0AafeAruidDeprecated(void* entries, size_t e const struct { u8 type; + u8 pad[7]; u64 start_timestamp; u64 end_timestamp; u64 AppletResourceUserId; - } in = { type, start_timestamp, end_timestamp, AppletResourceUserId }; + } in = { type, {0}, start_timestamp, end_timestamp, AppletResourceUserId }; u64 total_out=0; Result rc = serviceDispatchInOut(&g_capsuSrv, 102, in, total_out, @@ -89,9 +90,10 @@ static Result _capsuDeleteAlbumFileByAruid(u32 cmd_id, u8 type, const CapsApplic const struct { u8 type; + u8 pad[7]; CapsApplicationAlbumFileEntry entry; u64 AppletResourceUserId; - } in = { type, *entry, AppletResourceUserId }; + } in = { type, {0}, *entry, AppletResourceUserId }; return serviceDispatchIn(&g_capsuSrv, 103, in, .in_send_pid = true, @@ -118,9 +120,10 @@ static Result _capsuPrecheckToCreateContentsByAruid(u8 type, u64 unk) { const struct { u8 type; + u8 pad[7]; u64 unk; u64 AppletResourceUserId; - } in = { type, unk, AppletResourceUserId }; + } in = { type, {0}, unk, AppletResourceUserId }; return serviceDispatchIn(&g_capsuSrv, 130, in, .in_send_pid = true, @@ -158,10 +161,12 @@ static Result _capsuGetAlbumFileListAaeAruid(u32 cmd_id, void* entries, size_t e const struct { u8 type; + u8 pad; CapsAlbumFileDateTime start_datetime; CapsAlbumFileDateTime end_datetime; + u8 pad2[6]; u64 AppletResourceUserId; - } in = { type, *start_datetime, *end_datetime, AppletResourceUserId }; + } in = { type, 0, *start_datetime, *end_datetime, {0}, AppletResourceUserId }; u64 total_out=0; Result rc = serviceDispatchInOut(&g_capsuSrv, cmd_id, in, total_out, @@ -179,11 +184,13 @@ static Result _capsuGetAlbumFileListAaeUidAruid(u32 cmd_id, void* entries, size_ const struct { u8 type; + u8 pad; CapsAlbumFileDateTime start_datetime; CapsAlbumFileDateTime end_datetime; + u8 pad2[6]; AccountUid userID; u64 AppletResourceUserId; - } in = { type, *start_datetime, *end_datetime, userID, AppletResourceUserId }; + } in = { type, 0, *start_datetime, *end_datetime, {0}, userID, AppletResourceUserId }; u64 total_out=0; Result rc = serviceDispatchInOut(&g_capsuSrv, cmd_id, in, total_out, diff --git a/nx/source/services/hid.c b/nx/source/services/hid.c index 406d3cc7..7228f7f5 100644 --- a/nx/source/services/hid.c +++ b/nx/source/services/hid.c @@ -727,7 +727,7 @@ static Result _hidCmdNoInOutU8(u8 *out, u32 cmd_id) { static Result _hidCmdNoInOutBool(bool *out, u32 cmd_id) { u8 tmp=0; Result rc = _hidCmdNoInOutU8(&tmp, cmd_id); - if (R_SUCCEEDED(rc) && out) *out = tmp!=0; + if (R_SUCCEEDED(rc) && out) *out = tmp & 1; return rc; } @@ -807,9 +807,10 @@ Result hidAcquireNpadStyleSetUpdateEventHandle(HidControllerID id, Event* out_ev const struct { u32 id; + u32 pad; u64 AppletResourceUserId; u64 event_ptr; // Official sw sets this to a ptr, which the sysmodule doesn't seem to use. - } in = { hidControllerIDToOfficial(id), AppletResourceUserId, 0 }; + } in = { hidControllerIDToOfficial(id), 0, AppletResourceUserId, 0 }; rc = serviceDispatchIn(&g_hidSrv, 106, in, .in_send_pid = true, @@ -873,8 +874,9 @@ Result hidSendVibrationValue(u32 *VibrationDeviceHandle, HidVibrationValue *Vibr const struct { u32 VibrationDeviceHandle; HidVibrationValue VibrationValue; + u32 pad; u64 AppletResourceUserId; - } in = { *VibrationDeviceHandle, *VibrationValue, AppletResourceUserId }; + } in = { *VibrationDeviceHandle, *VibrationValue, 0, AppletResourceUserId }; return serviceDispatchIn(&g_hidSrv, 201, in, .in_send_pid = true, diff --git a/nx/source/services/hiddbg.c b/nx/source/services/hiddbg.c index 7165b99c..8494c316 100644 --- a/nx/source/services/hiddbg.c +++ b/nx/source/services/hiddbg.c @@ -58,6 +58,10 @@ static Result _hiddbgCmdInU8NoOut(u8 inval, u32 cmd_id) { return serviceDispatchIn(&g_hiddbgSrv, cmd_id, inval); } +static Result _hiddbgCmdInBoolNoOut(bool inval, u32 cmd_id) { + return _hiddbgCmdInU8NoOut(inval!=0, cmd_id); +} + static Result _hiddbgCmdInU64NoOut(u64 inval, u32 cmd_id) { return serviceDispatchIn(&g_hiddbgSrv, cmd_id, inval); } @@ -96,8 +100,9 @@ Result hiddbgUpdateDesignInfo(u32 colorBody, u32 colorButtons, u32 colorLeftGrip u32 colorLeftGrip; u32 colorRightGrip; u8 inval; + u8 pad[7]; u64 UniquePadId; - } in = { colorBody, colorButtons, colorLeftGrip, colorRightGrip, inval, UniquePadId }; + } in = { colorBody, colorButtons, colorLeftGrip, colorRightGrip, inval, {0}, UniquePadId }; return serviceDispatchIn(&g_hiddbgSrv, 224, in); } @@ -120,9 +125,10 @@ Result hiddbgAcquireOperationEventHandle(Event* out_event, bool autoclear, u64 U static Result _hiddbgReadSerialFlash(TransferMemory *tmem, u32 offset, u64 size, u64 UniquePadId) { const struct { u32 offset; + u32 pad; u64 size; u64 UniquePadId; - } in = { offset, size, UniquePadId }; + } in = { offset, 0, size, UniquePadId }; return serviceDispatchIn(&g_hiddbgSrv, 229, in, .in_num_handles = 1, @@ -133,10 +139,11 @@ static Result _hiddbgReadSerialFlash(TransferMemory *tmem, u32 offset, u64 size, static Result _hiddbgWriteSerialFlash(TransferMemory *tmem, u32 offset, u64 tmem_size, u64 size, u64 UniquePadId) { const struct { u32 offset; + u32 pad; u64 tmem_size; u64 size; u64 UniquePadId; - } in = { offset, tmem_size, size, UniquePadId }; + } in = { offset, 0, tmem_size, size, UniquePadId }; return serviceDispatchIn(&g_hiddbgSrv, 230, in, .in_num_handles = 1, @@ -299,7 +306,7 @@ static void _hiddbgConvertHdlsDeviceInfoFromV7(HiddbgHdlsDeviceInfo *out, const //Leave color*Grip at zero since V7 doesn't have those. } -static void _hiddbgConverHiddbgHdlsStateToV7(HiddbgHdlsStateV7 *out, const HiddbgHdlsState *in) { +static void _hiddbgConvertHiddbgHdlsStateToV7(HiddbgHdlsStateV7 *out, const HiddbgHdlsState *in) { memset(out, 0, sizeof(*out)); out->powerConnected = (in->flags & BIT(0)) != 0; @@ -310,7 +317,7 @@ static void _hiddbgConverHiddbgHdlsStateToV7(HiddbgHdlsStateV7 *out, const Hiddb out->unk_x20 = in->unk_x20; } -static void _hiddbgConverHiddbgHdlsStateFromV7(HiddbgHdlsState *out, const HiddbgHdlsStateV7 *in) { +static void _hiddbgConvertHiddbgHdlsStateFromV7(HiddbgHdlsState *out, const HiddbgHdlsStateV7 *in) { memset(out, 0, sizeof(*out)); out->batteryCharge = in->batteryCharge; @@ -329,7 +336,7 @@ static void _hiddbgConvertHdlsStateListToV7(HiddbgHdlsStateListV7 *out, const Hi for (s32 i=0; ientries[i].HdlsHandle = in->entries[i].HdlsHandle; _hiddbgConvertHdlsDeviceInfoToV7(&out->entries[i].device, &in->entries[i].device); - _hiddbgConverHiddbgHdlsStateToV7(&out->entries[i].state, &in->entries[i].state); + _hiddbgConvertHiddbgHdlsStateToV7(&out->entries[i].state, &in->entries[i].state); } } @@ -342,7 +349,7 @@ static void _hiddbgConvertHdlsStateListFromV7(HiddbgHdlsStateList *out, const Hi for (s32 i=0; ientries[i].HdlsHandle = in->entries[i].HdlsHandle; _hiddbgConvertHdlsDeviceInfoFromV7(&out->entries[i].device, &in->entries[i].device); - _hiddbgConverHiddbgHdlsStateFromV7(&out->entries[i].state, &in->entries[i].state); + _hiddbgConvertHiddbgHdlsStateFromV7(&out->entries[i].state, &in->entries[i].state); } } @@ -434,7 +441,7 @@ Result hiddbgApplyHdlsNpadAssignmentState(const HiddbgHdlsNpadAssignment *state, return MAKERESULT(Module_Libnx, LibnxError_BadInput); memcpy(g_hiddbgHdlsTmem.src_addr, state, sizeof(*state)); - return _hiddbgCmdInU8NoOut(flag!=0, 328); + return _hiddbgCmdInBoolNoOut(flag, 328); } Result hiddbgApplyHdlsStateList(const HiddbgHdlsStateList *state) { @@ -497,7 +504,7 @@ static Result _hiddbgSetHdlsStateV7(u64 HdlsHandle, const HiddbgHdlsState *state HiddbgHdlsStateV7 state; u64 handle; } in = { .handle = HdlsHandle }; - _hiddbgConverHiddbgHdlsStateToV7(&in.state, state); + _hiddbgConvertHiddbgHdlsStateToV7(&in.state, state); return serviceDispatchIn(&g_hiddbgSrv, 332, in); } diff --git a/nx/source/services/irs.c b/nx/source/services/irs.c index 64f19495..e0710358 100644 --- a/nx/source/services/irs.c +++ b/nx/source/services/irs.c @@ -189,10 +189,11 @@ Result irsStopImageProcessor(u32 IrCameraHandle) { static Result _irsRunImageTransferProcessor(u32 IrCameraHandle, u64 AppletResourceUserId, IrsPackedImageTransferProcessorConfig *config, TransferMemory *tmem) { const struct { u32 IrCameraHandle; + u32 pad; u64 AppletResourceUserId; IrsPackedImageTransferProcessorConfig config; u64 TransferMemory_size; - } in = { IrCameraHandle, AppletResourceUserId, *config, tmem->size }; + } in = { IrCameraHandle, 0, AppletResourceUserId, *config, tmem->size }; return serviceDispatchIn(&g_irsSrv, 308, in, .in_send_pid = true, diff --git a/nx/source/services/lbl.c b/nx/source/services/lbl.c index 9a476952..5dbbd1b8 100644 --- a/nx/source/services/lbl.c +++ b/nx/source/services/lbl.c @@ -33,7 +33,7 @@ static Result _lblCmdNoInOutU8(u8 *out, u32 cmd_id) { static Result _lblCmdNoInOutBool(bool *out, u32 cmd_id) { u8 tmpout=0; Result rc = _lblCmdNoInOutU8(&tmpout, cmd_id); - if (R_SUCCEEDED(rc) && out) *out = tmpout!=0; + if (R_SUCCEEDED(rc) && out) *out = tmpout & 1; return rc; } diff --git a/nx/source/services/nifm.c b/nx/source/services/nifm.c index 762cb56f..b5fae588 100644 --- a/nx/source/services/nifm.c +++ b/nx/source/services/nifm.c @@ -84,7 +84,7 @@ static Result _nifmCmdNoInOutU8(Service* srv, u8 *out, u32 cmd_id) { static Result _nifmCmdNoInOutBool(Service* srv, bool *out, u32 cmd_id) { u8 tmp=0; Result rc = _nifmCmdNoInOutU8(srv, &tmp, cmd_id); - if (R_SUCCEEDED(rc) && out) *out = tmp!=0; + if (R_SUCCEEDED(rc) && out) *out = tmp & 1; return rc; } diff --git a/nx/source/services/ns.c b/nx/source/services/ns.c index 10a18ed2..211a7a4e 100644 --- a/nx/source/services/ns.c +++ b/nx/source/services/ns.c @@ -19,8 +19,7 @@ static Result _nsGetSession(Service* srv, Service* srv_out, u32 cmd_id); NX_GENERATE_SERVICE_GUARD(ns); -Result _nsInitialize(void) -{ +Result _nsInitialize(void) { Result rc=0; if(hosversionBefore(3,0,0)) @@ -36,8 +35,7 @@ Result _nsInitialize(void) return rc; } -void _nsCleanup(void) -{ +void _nsCleanup(void) { serviceClose(&g_nsAppManSrv); if(hosversionBefore(3,0,0)) return; @@ -108,7 +106,7 @@ static Result _nsCmdNoInOutU8(Service* srv, u8 *out, u32 cmd_id) { static Result _nsCmdNoInOutBool(Service* srv, bool *out, u32 cmd_id) { u8 tmpout=0; Result rc = _nsCmdNoInOutU8(srv, &tmpout, cmd_id); - if (R_SUCCEEDED(rc) && out) *out = tmpout!=0; + if (R_SUCCEEDED(rc) && out) *out = tmpout & 1; return rc; } @@ -124,7 +122,7 @@ static Result _nsCmdRequestSendReceiveSystemUpdate(Service* srv, AsyncResult *a, const struct { u16 inval0; u32 inval1; - } in = { inval0, inval1 }; + } in = { inval1, inval0 }; memset(a, 0, sizeof(*a)); Handle event = INVALID_HANDLE; @@ -275,8 +273,9 @@ Service* nsdevGetServiceSession(void) { Result nsdevLaunchProgram(u64* out_pid, const NsLaunchProperties* properties, u32 flags) { const struct { u32 flags; + u32 pad; NsLaunchProperties properties; - } in = { flags, *properties}; + } in = { flags, 0, *properties}; return serviceDispatchInOut(&g_nsdevSrv, 0, in, *out_pid); } diff --git a/nx/source/services/pctl.c b/nx/source/services/pctl.c index 181a4c19..08e84f22 100644 --- a/nx/source/services/pctl.c +++ b/nx/source/services/pctl.c @@ -64,7 +64,7 @@ static Result _pctlCmdNoInOutU8(u8 *out, u32 cmd_id) { static Result _pctlCmdNoInOutBool(bool *out, u32 cmd_id) { u8 tmp=0; Result rc = _pctlCmdNoInOutU8(&tmp, cmd_id); - if (R_SUCCEEDED(rc) && out) *out = tmp!=0; + if (R_SUCCEEDED(rc) && out) *out = tmp & 1; return rc; } diff --git a/nx/source/services/pdm.c b/nx/source/services/pdm.c index 6b34b1f0..e4ff6a7b 100644 --- a/nx/source/services/pdm.c +++ b/nx/source/services/pdm.c @@ -102,8 +102,9 @@ Result pdmqryQueryAccountPlayEvent(s32 entry_index, AccountUid uid, PdmAccountPl const struct { s32 entry_index; + u32 pad; AccountUid uid; - } in = { entry_index, uid }; + } in = { entry_index, 0, uid }; return serviceDispatchInOut(&g_pdmqrySrv, 11, in, *total_out, .buffer_attrs = { SfBufferAttr_HipcMapAlias | SfBufferAttr_Out }, diff --git a/nx/source/services/set.c b/nx/source/services/set.c index 00dd0d10..efa6f8f7 100644 --- a/nx/source/services/set.c +++ b/nx/source/services/set.c @@ -75,7 +75,7 @@ static Result _setCmdNoInOutU8(Service* srv, u8 *out, u32 cmd_id) { static Result _setCmdNoInOutBool(Service* srv, bool *out, u32 cmd_id) { u8 tmp=0; Result rc = _setCmdNoInOutU8(srv, &tmp, cmd_id); - if (R_SUCCEEDED(rc) && out) *out = tmp!=0; + if (R_SUCCEEDED(rc) && out) *out = tmp & 1; return rc; } diff --git a/nx/source/services/usbds.c b/nx/source/services/usbds.c index 33c21bd0..f6548669 100644 --- a/nx/source/services/usbds.c +++ b/nx/source/services/usbds.c @@ -112,6 +112,7 @@ static void _usbDsFreeEndpoint(UsbDsEndpoint* endpoint) { eventClose(&endpoint->CompletionEvent); + serviceAssumeDomain(&endpoint->s); serviceClose(&endpoint->s); endpoint->initialized = false; @@ -133,6 +134,7 @@ static void _usbDsFreeInterface(UsbDsInterface* interface) { eventClose(&interface->CtrlInCompletionEvent); eventClose(&interface->SetupEvent); + serviceAssumeDomain(&interface->s); serviceClose(&interface->s); interface->initialized = false; @@ -328,6 +330,7 @@ Result usbDsGetDsInterface(UsbDsInterface** interface, struct usb_interface_desc UsbDsInterface* ptr = _usbDsTryAllocateInterface(send_desc.bInterfaceNumber); if(ptr == NULL) { + serviceAssumeDomain(&srv); serviceClose(&srv); return MAKERESULT(Module_Libnx, LibnxError_OutOfMemory); } @@ -379,6 +382,7 @@ Result usbDsRegisterInterface(UsbDsInterface** interface) { UsbDsInterface* ptr = _usbDsTryAllocateInterface(intf_num); if (ptr == NULL) { + serviceAssumeDomain(&srv); serviceClose(&srv); return MAKERESULT(Module_Libnx, LibnxError_OutOfMemory); } diff --git a/nx/source/services/usbhs.c b/nx/source/services/usbhs.c index 3b493aec..6f715989 100644 --- a/nx/source/services/usbhs.c +++ b/nx/source/services/usbhs.c @@ -191,6 +191,7 @@ Result usbHsAcquireUsbIf(UsbHsClientIfSession* s, UsbHsInterface *interface) { } void usbHsIfClose(UsbHsClientIfSession* s) { + serviceAssumeDomain(&s->s); serviceClose(&s->s); eventClose(&s->event0); eventClose(&s->eventCtrlXfer); @@ -257,7 +258,7 @@ static Result _usbHsIfCtrlXferAsync(UsbHsClientIfSession* s, u8 bmRequestType, u u16 wIndex; u16 wLength; u64 buffer; - } PACKED in = { bmRequestType, bRequest, wValue, wIndex, wLength, (u64)buffer }; + } in = { bmRequestType, bRequest, wValue, wIndex, wLength, (u64)buffer }; serviceAssumeDomain(&s->s); return serviceDispatchIn(&s->s, 5, in); @@ -293,12 +294,14 @@ Result usbHsIfCtrlXfer(UsbHsClientIfSession* s, u8 bmRequestType, u8 bRequest, u static Result _usbHsIfOpenUsbEp(UsbHsClientIfSession* s, UsbHsClientEpSession* ep, u16 maxUrbCount, u32 maxXferSize, struct usb_endpoint_descriptor *desc) { const struct { u16 maxUrbCount; + u16 pad; u32 epType; u32 epNumber; u32 epDirection; u32 maxXferSize; } in = { maxUrbCount, + 0, (desc->bmAttributes & USB_TRANSFER_TYPE_MASK) + 1, desc->bEndpointAddress & USB_ENDPOINT_ADDRESS_MASK, (desc->bEndpointAddress & USB_ENDPOINT_IN) == 0 ? 0x1 : 0x2, @@ -322,6 +325,7 @@ Result usbHsIfOpenUsbEp(UsbHsClientIfSession* s, UsbHsClientEpSession* ep, u16 m } if (R_FAILED(rc)) { + serviceAssumeDomain(&s->s); serviceClose(&ep->s); eventClose(&ep->eventXfer); } @@ -338,6 +342,7 @@ void usbHsEpClose(UsbHsClientEpSession* s) { _usbHsCmdNoIO(&s->s, hosversionAtLeast(2,0,0) ? 1 : 3);//Close + serviceAssumeDomain(&s->s); serviceClose(&s->s); eventClose(&s->eventXfer); memset(s, 0, sizeof(UsbHsClientEpSession)); @@ -366,9 +371,10 @@ static Result _usbHsEpSubmitRequest(UsbHsClientEpSession* s, void* buffer, u32 s static Result _usbHsEpPostBufferAsync(UsbHsClientEpSession* s, void* buffer, u32 size, u64 unk, u32* xferId) { const struct { u32 size; + u32 pad; u64 buffer; u64 unk; - } in = { size, (u64)buffer, unk }; + } in = { size, 0, (u64)buffer, unk }; serviceAssumeDomain(&s->s); return serviceDispatchInOut(&s->s, 4, in, *xferId);