mirror of
https://github.com/Atmosphere-NX/Atmosphere.git
synced 2024-11-23 04:12:02 +00:00
fs.mitm: Add hook for postprocessing mitm messages.
This commit is contained in:
parent
40a6b7bb54
commit
ff9412feef
4 changed files with 39 additions and 3 deletions
|
@ -3,6 +3,17 @@
|
|||
|
||||
Result FsMitMService::dispatch(IpcParsedCommand &r, IpcCommand &out_c, u64 cmd_id, u8 *pointer_buffer, size_t pointer_buffer_size) {
|
||||
Result rc = 0xF601;
|
||||
while (cmd_id == 18) {
|
||||
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
||||
Result FsMitMService::postprocess(IpcParsedCommand &r, IpcCommand &out_c, u64 cmd_id, u8 *pointer_buffer, size_t pointer_buffer_size) {
|
||||
Result rc = 0xF601;
|
||||
while (cmd_id == 18) {
|
||||
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,9 +1,11 @@
|
|||
#pragma once
|
||||
#include <switch.h>
|
||||
#include <stratosphere/iserviceobject.hpp>
|
||||
#include "imitmserviceobject.hpp"
|
||||
|
||||
class FsMitMService : IServiceObject {
|
||||
class FsMitMService : public IMitMServiceObject {
|
||||
public:
|
||||
virtual Result dispatch(IpcParsedCommand &r, IpcCommand &out_c, u64 cmd_id, u8 *pointer_buffer, size_t pointer_buffer_size);
|
||||
virtual Result postprocess(IpcParsedCommand &r, IpcCommand &out_c, u64 cmd_id, u8 *pointer_buffer, size_t pointer_buffer_size);
|
||||
virtual Result handle_deferred();
|
||||
};
|
12
stratosphere/fs_mitm/source/imitmserviceobject.hpp
Normal file
12
stratosphere/fs_mitm/source/imitmserviceobject.hpp
Normal file
|
@ -0,0 +1,12 @@
|
|||
#pragma once
|
||||
#include <switch.h>
|
||||
|
||||
#include <stratosphere.hpp>
|
||||
|
||||
class IMitMServiceObject : public IServiceObject {
|
||||
protected:
|
||||
virtual ~IMitMServiceObject() { }
|
||||
virtual Result dispatch(IpcParsedCommand &r, IpcCommand &out_c, u64 cmd_id, u8 *pointer_buffer, size_t pointer_buffer_size) = 0;
|
||||
virtual Result postprocess(IpcParsedCommand &r, IpcCommand &out_c, u64 cmd_id, u8 *pointer_buffer, size_t pointer_buffer_size) = 0;
|
||||
virtual Result handle_deferred() = 0;
|
||||
};
|
|
@ -1,6 +1,7 @@
|
|||
#pragma once
|
||||
#include <switch.h>
|
||||
#include <stratosphere.hpp>
|
||||
#include "imitmserviceobject.hpp"
|
||||
|
||||
#include "mitm_server.hpp"
|
||||
|
||||
|
@ -12,7 +13,7 @@ class MitMServer;
|
|||
|
||||
template <typename T>
|
||||
class MitMSession final : public IWaitable {
|
||||
static_assert(std::is_base_of<IServiceObject, T>::value, "Service Objects must derive from IServiceObject");
|
||||
static_assert(std::is_base_of<IMitMServiceObject, T>::value, "MitM Service Objects must derive from IMitMServiceObject");
|
||||
|
||||
T *service_object;
|
||||
MitMServer<T> *server;
|
||||
|
@ -102,13 +103,19 @@ class MitMSession final : public IWaitable {
|
|||
|
||||
retval = ipcParse(&r);
|
||||
|
||||
u64 cmd_id = U64_MAX;
|
||||
|
||||
/* TODO: Close input copy handles that we don't need. */
|
||||
|
||||
if (R_SUCCEEDED(retval)) {
|
||||
rawdata_start = (u32 *)r.Raw;
|
||||
cmd_id = rawdata_start[2];
|
||||
retval = 0xF601;
|
||||
if (r.CommandType == IpcCommandType_Request || r.CommandType == IpcCommandType_RequestWithContext) {
|
||||
retval = this->service_object->dispatch(r, c, rawdata_start[2], (u8 *)this->pointer_buffer, this->pointer_buffer_size);
|
||||
retval = this->service_object->dispatch(r, c, cmd_id, (u8 *)this->pointer_buffer, this->pointer_buffer_size);
|
||||
if (R_SUCCEEDED(retval)) {
|
||||
ipcParse(&out_r);
|
||||
}
|
||||
}
|
||||
|
||||
/* 0xF601 --> Dispatch onwards. */
|
||||
|
@ -137,6 +144,10 @@ class MitMSession final : public IWaitable {
|
|||
/* Session close. */
|
||||
rc = retval;
|
||||
} else {
|
||||
if (R_SUCCEEDED(rc)) {
|
||||
ipcInitialize(&c);
|
||||
retval = this->service_object->postprocess(r, c, cmd_id, (u8 *)this->pointer_buffer, this->pointer_buffer_size);
|
||||
}
|
||||
Log(armGetTls(), 0x100);
|
||||
rc = svcReplyAndReceive(&handle_index, &this->server_handle, 0, this->server_handle, 0);
|
||||
/* Clean up copy handles. */
|
||||
|
|
Loading…
Reference in a new issue