NtClose/NtReadFile skeleton.
This commit is contained in:
parent
388f354870
commit
a8d10cd9d3
|
@ -132,11 +132,8 @@ X_STATUS ObjectTable::RemoveHandle(X_HANDLE handle) {
|
||||||
} else {
|
} else {
|
||||||
ObjectTableEntry& entry = table_[slot];
|
ObjectTableEntry& entry = table_[slot];
|
||||||
if (entry.object) {
|
if (entry.object) {
|
||||||
|
// Release after we lose the lock.
|
||||||
object = entry.object;
|
object = entry.object;
|
||||||
|
|
||||||
// Release the object handle now that it is out of the table.
|
|
||||||
object->ReleaseHandle();
|
|
||||||
object->Release();
|
|
||||||
} else {
|
} else {
|
||||||
result = X_STATUS_INVALID_HANDLE;
|
result = X_STATUS_INVALID_HANDLE;
|
||||||
}
|
}
|
||||||
|
@ -144,6 +141,12 @@ X_STATUS ObjectTable::RemoveHandle(X_HANDLE handle) {
|
||||||
|
|
||||||
xe_mutex_unlock(table_mutex_);
|
xe_mutex_unlock(table_mutex_);
|
||||||
|
|
||||||
|
if (object) {
|
||||||
|
// Release the object handle now that it is out of the table.
|
||||||
|
object->ReleaseHandle();
|
||||||
|
object->Release();
|
||||||
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -175,5 +178,6 @@ X_STATUS ObjectTable::GetObject(X_HANDLE handle, XObject** out_object) {
|
||||||
|
|
||||||
xe_mutex_unlock(table_mutex_);
|
xe_mutex_unlock(table_mutex_);
|
||||||
|
|
||||||
|
*out_object = object;
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
|
@ -80,6 +80,10 @@ SHIM_CALL NtCreateFile_shim(
|
||||||
FileEntry* file_entry = (FileEntry*)entry;
|
FileEntry* file_entry = (FileEntry*)entry;
|
||||||
XFile* file = new XFile(state, file_entry);
|
XFile* file = new XFile(state, file_entry);
|
||||||
handle = file->handle();
|
handle = file->handle();
|
||||||
|
|
||||||
|
// TODO(benvanik): open/create/etc.
|
||||||
|
|
||||||
|
file->Release();
|
||||||
result = X_STATUS_SUCCESS;
|
result = X_STATUS_SUCCESS;
|
||||||
info = X_FILE_OPENED;
|
info = X_FILE_OPENED;
|
||||||
}
|
}
|
||||||
|
@ -103,7 +107,51 @@ SHIM_CALL NtOpenFile_shim(
|
||||||
|
|
||||||
SHIM_CALL NtReadFile_shim(
|
SHIM_CALL NtReadFile_shim(
|
||||||
xe_ppc_state_t* ppc_state, KernelState* state) {
|
xe_ppc_state_t* ppc_state, KernelState* state) {
|
||||||
SHIM_SET_RETURN(X_STATUS_NO_SUCH_FILE);
|
uint32_t file_handle = SHIM_GET_ARG_32(0);
|
||||||
|
uint32_t event_handle = SHIM_GET_ARG_32(1);
|
||||||
|
uint32_t apc_routine_ptr = SHIM_GET_ARG_32(2);
|
||||||
|
uint32_t apc_context = SHIM_GET_ARG_32(3);
|
||||||
|
uint32_t io_status_block_ptr = SHIM_GET_ARG_32(4);
|
||||||
|
uint32_t buffer = SHIM_GET_ARG_32(5);
|
||||||
|
uint32_t buffer_length = SHIM_GET_ARG_32(6);
|
||||||
|
uint32_t byte_offset_ptr = SHIM_GET_ARG_32(7);
|
||||||
|
uint32_t key = SHIM_GET_ARG_32(8);
|
||||||
|
|
||||||
|
XELOGD(
|
||||||
|
"NtReadFile(%.8X, %.8X, %.8X, %.8X, %.8X, %.8X, %d, %d, %.8X)",
|
||||||
|
file_handle,
|
||||||
|
event_handle,
|
||||||
|
apc_routine_ptr,
|
||||||
|
apc_context,
|
||||||
|
io_status_block_ptr,
|
||||||
|
buffer,
|
||||||
|
buffer_length,
|
||||||
|
byte_offset_ptr,
|
||||||
|
key);
|
||||||
|
|
||||||
|
// Async not supported yet.
|
||||||
|
XEASSERTNULL(apc_routine_ptr);
|
||||||
|
|
||||||
|
X_STATUS result = X_STATUS_INVALID_HANDLE;
|
||||||
|
uint32_t info = 0;
|
||||||
|
|
||||||
|
XFile* file = NULL;
|
||||||
|
result = state->object_table()->GetObject(
|
||||||
|
file_handle, (XObject**)&file);
|
||||||
|
if (result == X_STATUS_SUCCESS) {
|
||||||
|
// TODO(benvanik): read!
|
||||||
|
|
||||||
|
file->Release();
|
||||||
|
result = X_STATUS_SUCCESS;
|
||||||
|
info = 0; // number of bytes read
|
||||||
|
}
|
||||||
|
|
||||||
|
if (io_status_block_ptr) {
|
||||||
|
SHIM_SET_MEM_32(io_status_block_ptr, result); // Status
|
||||||
|
SHIM_SET_MEM_32(io_status_block_ptr + 4, info); // Information
|
||||||
|
}
|
||||||
|
|
||||||
|
SHIM_SET_RETURN(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
SHIM_CALL NtQueryInformationFile_shim(
|
SHIM_CALL NtQueryInformationFile_shim(
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
#include <xenia/kernel/shim_utils.h>
|
#include <xenia/kernel/shim_utils.h>
|
||||||
#include <xenia/kernel/modules/xboxkrnl/kernel_state.h>
|
#include <xenia/kernel/modules/xboxkrnl/kernel_state.h>
|
||||||
#include <xenia/kernel/modules/xboxkrnl/xboxkrnl_private.h>
|
#include <xenia/kernel/modules/xboxkrnl/xboxkrnl_private.h>
|
||||||
|
#include <xenia/kernel/modules/xboxkrnl/xobject.h>
|
||||||
|
|
||||||
|
|
||||||
using namespace xe;
|
using namespace xe;
|
||||||
|
@ -26,7 +27,17 @@ namespace xboxkrnl {
|
||||||
|
|
||||||
SHIM_CALL NtClose_shim(
|
SHIM_CALL NtClose_shim(
|
||||||
xe_ppc_state_t* ppc_state, KernelState* state) {
|
xe_ppc_state_t* ppc_state, KernelState* state) {
|
||||||
SHIM_SET_RETURN(X_STATUS_NO_SUCH_FILE);
|
uint32_t handle = SHIM_GET_ARG_32(0);
|
||||||
|
|
||||||
|
XELOGD(
|
||||||
|
"NtClose(%.8X)",
|
||||||
|
handle);
|
||||||
|
|
||||||
|
X_STATUS result = X_STATUS_INVALID_HANDLE;
|
||||||
|
|
||||||
|
result = state->object_table()->RemoveHandle(handle);
|
||||||
|
|
||||||
|
SHIM_SET_RETURN(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue