Better faking of the user profile.
This commit is contained in:
@@ -16,6 +16,7 @@
|
||||
#include <xenia/kernel/xboxkrnl_private.h>
|
||||
#include <xenia/kernel/xobject.h>
|
||||
#include <xenia/kernel/apps/apps.h>
|
||||
#include <xenia/kernel/objects/xevent.h>
|
||||
#include <xenia/kernel/objects/xmodule.h>
|
||||
#include <xenia/kernel/objects/xnotify_listener.h>
|
||||
#include <xenia/kernel/objects/xthread.h>
|
||||
@@ -41,6 +42,7 @@ KernelState::KernelState(Emulator* emulator) :
|
||||
dispatcher_ = new Dispatcher(this);
|
||||
|
||||
app_manager_ = std::make_unique<XAppManager>();
|
||||
user_profile_ = std::make_unique<UserProfile>();
|
||||
|
||||
object_table_ = new ObjectTable();
|
||||
object_mutex_ = xe_mutex_alloc(10000);
|
||||
@@ -171,3 +173,36 @@ void KernelState::BroadcastNotification(XNotificationID id, uint32_t data) {
|
||||
}
|
||||
xe_mutex_unlock(object_mutex_);
|
||||
}
|
||||
|
||||
void KernelState::CompleteOverlapped(uint32_t overlapped_ptr, X_RESULT result, uint32_t length) {
|
||||
auto ptr = memory()->membase() + overlapped_ptr;
|
||||
XOverlappedSetResult(ptr, result);
|
||||
XOverlappedSetLength(ptr, length);
|
||||
XOverlappedSetExtendedError(ptr, result);
|
||||
X_HANDLE event_handle = XOverlappedGetEvent(ptr);
|
||||
if (event_handle) {
|
||||
XEvent* ev = nullptr;
|
||||
if (XSUCCEEDED(object_table()->GetObject(
|
||||
event_handle, reinterpret_cast<XObject**>(&ev)))) {
|
||||
ev->Set(0, false);
|
||||
ev->Release();
|
||||
}
|
||||
}
|
||||
if (XOverlappedGetCompletionRoutine(ptr)) {
|
||||
assert_always();
|
||||
X_HANDLE thread_handle = XOverlappedGetContext(ptr);
|
||||
XThread* thread = nullptr;
|
||||
if (XSUCCEEDED(object_table()->GetObject(
|
||||
thread_handle, reinterpret_cast<XObject**>(&thread)))) {
|
||||
// TODO(benvanik): queue APC on the thread that requested the overlapped operation.
|
||||
thread->Release();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void KernelState::CompleteOverlappedImmediate(uint32_t overlapped_ptr, X_RESULT result, uint32_t length) {
|
||||
auto ptr = memory()->membase() + overlapped_ptr;
|
||||
XOverlappedSetContext(ptr,
|
||||
XThread::GetCurrentThreadHandle());
|
||||
CompleteOverlapped(overlapped_ptr, result, length);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user