mirror of
https://github.com/switchbrew/libnx.git
synced 2025-07-06 19:32:15 +02:00
sf: add serialization fixes necessary for htcs
This commit is contained in:
parent
d4542ec9b0
commit
f3fb9b8f7b
@ -225,25 +225,25 @@ NX_CONSTEXPR void cmifRequestOutPointer(CmifRequest* req, void* buffer, size_t s
|
|||||||
*req->out_pointer_sizes++ = size;
|
*req->out_pointer_sizes++ = size;
|
||||||
}
|
}
|
||||||
|
|
||||||
NX_CONSTEXPR void cmifRequestInAutoBuffer(CmifRequest* req, const void* buffer, size_t size)
|
NX_CONSTEXPR void cmifRequestInAutoBuffer(CmifRequest* req, const void* buffer, size_t size, HipcBufferMode mode)
|
||||||
{
|
{
|
||||||
if (req->server_pointer_size && size <= req->server_pointer_size) {
|
if (req->server_pointer_size && size <= req->server_pointer_size) {
|
||||||
cmifRequestInPointer(req, buffer, size);
|
cmifRequestInPointer(req, buffer, size);
|
||||||
cmifRequestInBuffer(req, NULL, 0, HipcBufferMode_Normal);
|
cmifRequestInBuffer(req, NULL, 0, mode);
|
||||||
} else {
|
} else {
|
||||||
cmifRequestInPointer(req, NULL, 0);
|
cmifRequestInPointer(req, NULL, 0);
|
||||||
cmifRequestInBuffer(req, buffer, size, HipcBufferMode_Normal);
|
cmifRequestInBuffer(req, buffer, size, mode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
NX_CONSTEXPR void cmifRequestOutAutoBuffer(CmifRequest* req, void* buffer, size_t size)
|
NX_CONSTEXPR void cmifRequestOutAutoBuffer(CmifRequest* req, void* buffer, size_t size, HipcBufferMode mode)
|
||||||
{
|
{
|
||||||
if (req->server_pointer_size && size <= req->server_pointer_size) {
|
if (req->server_pointer_size && size <= req->server_pointer_size) {
|
||||||
cmifRequestOutPointer(req, buffer, size);
|
cmifRequestOutPointer(req, buffer, size);
|
||||||
cmifRequestOutBuffer(req, NULL, 0, HipcBufferMode_Normal);
|
cmifRequestOutBuffer(req, NULL, 0, mode);
|
||||||
} else {
|
} else {
|
||||||
cmifRequestOutPointer(req, NULL, 0);
|
cmifRequestOutPointer(req, NULL, 0);
|
||||||
cmifRequestOutBuffer(req, buffer, size, HipcBufferMode_Normal);
|
cmifRequestOutBuffer(req, buffer, size, mode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -150,10 +150,14 @@ NX_INLINE void serviceCreate(Service* s, Handle h)
|
|||||||
*/
|
*/
|
||||||
NX_INLINE void serviceCreateNonDomainSubservice(Service* s, Service* parent, Handle h)
|
NX_INLINE void serviceCreateNonDomainSubservice(Service* s, Service* parent, Handle h)
|
||||||
{
|
{
|
||||||
|
if (h != INVALID_HANDLE) {
|
||||||
s->session = h;
|
s->session = h;
|
||||||
s->own_handle = 1;
|
s->own_handle = 1;
|
||||||
s->object_id = 0;
|
s->object_id = 0;
|
||||||
s->pointer_buffer_size = parent->pointer_buffer_size;
|
s->pointer_buffer_size = parent->pointer_buffer_size;
|
||||||
|
} else {
|
||||||
|
*s = (Service){};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -164,10 +168,14 @@ NX_INLINE void serviceCreateNonDomainSubservice(Service* s, Service* parent, Han
|
|||||||
*/
|
*/
|
||||||
NX_CONSTEXPR void serviceCreateDomainSubservice(Service* s, Service* parent, u32 object_id)
|
NX_CONSTEXPR void serviceCreateDomainSubservice(Service* s, Service* parent, u32 object_id)
|
||||||
{
|
{
|
||||||
|
if (object_id != 0) {
|
||||||
s->session = parent->session;
|
s->session = parent->session;
|
||||||
s->own_handle = 0;
|
s->own_handle = 0;
|
||||||
s->object_id = object_id;
|
s->object_id = object_id;
|
||||||
s->pointer_buffer_size = parent->pointer_buffer_size;
|
s->pointer_buffer_size = parent->pointer_buffer_size;
|
||||||
|
} else {
|
||||||
|
*s = (Service){};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -293,10 +301,15 @@ NX_CONSTEXPR void _serviceRequestProcessBuffer(CmifRequest* req, const SfBuffer*
|
|||||||
const bool is_out = (attr & SfBufferAttr_Out);
|
const bool is_out = (attr & SfBufferAttr_Out);
|
||||||
|
|
||||||
if (attr & SfBufferAttr_HipcAutoSelect) {
|
if (attr & SfBufferAttr_HipcAutoSelect) {
|
||||||
|
HipcBufferMode mode = HipcBufferMode_Normal;
|
||||||
|
if (attr & SfBufferAttr_HipcMapTransferAllowsNonSecure)
|
||||||
|
mode = HipcBufferMode_NonSecure;
|
||||||
|
if (attr & SfBufferAttr_HipcMapTransferAllowsNonDevice)
|
||||||
|
mode = HipcBufferMode_NonDevice;
|
||||||
if (is_in)
|
if (is_in)
|
||||||
cmifRequestInAutoBuffer(req, buf->ptr, buf->size);
|
cmifRequestInAutoBuffer(req, buf->ptr, buf->size, mode);
|
||||||
if (is_out)
|
if (is_out)
|
||||||
cmifRequestOutAutoBuffer(req, (void*)buf->ptr, buf->size);
|
cmifRequestOutAutoBuffer(req, (void*)buf->ptr, buf->size, mode);
|
||||||
} else if (attr & SfBufferAttr_HipcPointer) {
|
} else if (attr & SfBufferAttr_HipcPointer) {
|
||||||
if (is_in)
|
if (is_in)
|
||||||
cmifRequestInPointer(req, buf->ptr, buf->size);
|
cmifRequestInPointer(req, buf->ptr, buf->size);
|
||||||
|
Loading…
Reference in New Issue
Block a user