diff --git a/src/core/hle/service/service.cpp b/src/core/hle/service/service.cpp index 148d60185..6ead40057 100644 --- a/src/core/hle/service/service.cpp +++ b/src/core/hle/service/service.cpp @@ -178,7 +178,7 @@ void ServiceFrameworkBase::ReportUnimplementedFunction(u32* cmd_buf, const Funct void ServiceFrameworkBase::HandleSyncRequest(Kernel::HLERequestContext& context) { auto itr = handlers.find(context.CommandHeader().command_id.Value()); const FunctionInfoBase* info = itr == handlers.end() ? nullptr : &itr->second; - if (info == nullptr || info->handler_callback == nullptr) { + if (info == nullptr || !info->implemented) { context.ReportUnimplemented(); return ReportUnimplementedFunction(context.CommandBuffer(), info); } diff --git a/src/core/hle/service/service.h b/src/core/hle/service/service.h index fbe368c2c..3dddf39d4 100644 --- a/src/core/hle/service/service.h +++ b/src/core/hle/service/service.h @@ -82,6 +82,7 @@ private: struct FunctionInfoBase { u32 command_id; + bool implemented; HandlerFnP handler_callback; const char* name; }; @@ -96,6 +97,8 @@ private: void RegisterHandlersBase(const FunctionInfoBase* functions, std::size_t n); void ReportUnimplementedFunction(u32* cmd_buf, const FunctionInfoBase* info); + void Empty(Kernel::HLERequestContext& ctx) {} + /// Identifier string used to connect to the service. std::string service_name; /// Maximum number of concurrent sessions that this service can handle. @@ -134,9 +137,11 @@ protected: */ constexpr FunctionInfo(u32 command_id, HandlerFnP handler_callback, const char* name) : FunctionInfoBase{ - command_id, + command_id, handler_callback != nullptr, // Type-erase member function pointer by casting it down to the base class. - static_cast>(handler_callback), name} {} + handler_callback ? static_cast>(handler_callback) + : &ServiceFrameworkBase::Empty, + name} {} }; /**