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.

This commit is contained in:
yellows8 2019-10-25 20:28:02 -04:00
parent b4a003e176
commit 051ad2dc60
No known key found for this signature in database
GPG Key ID: 0AF90DA3F1E60E43
18 changed files with 73 additions and 42 deletions

View File

@ -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);

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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,

View File

@ -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 },

View File

@ -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 = {

View File

@ -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,

View File

@ -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,

View File

@ -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; i<count; i++) {
out->entries[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; i<count; i++) {
out->entries[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);
}

View File

@ -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,

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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);
}

View File

@ -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;
}

View File

@ -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 },

View File

@ -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;
}

View File

@ -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);
}

View File

@ -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);