mirror of
https://github.com/switchbrew/libnx.git
synced 2025-06-21 12:32:40 +02:00
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:
parent
b4a003e176
commit
051ad2dc60
@ -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);
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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,
|
||||
|
@ -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 },
|
||||
|
@ -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 = {
|
||||
|
@ -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,
|
||||
|
@ -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,
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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,
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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 },
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user