diff --git a/src/xenia/kernel/modules/xboxkrnl/object_table.cc b/src/xenia/kernel/modules/xboxkrnl/object_table.cc index c781c2434..c9f3be8ad 100644 --- a/src/xenia/kernel/modules/xboxkrnl/object_table.cc +++ b/src/xenia/kernel/modules/xboxkrnl/object_table.cc @@ -132,11 +132,8 @@ X_STATUS ObjectTable::RemoveHandle(X_HANDLE handle) { } else { ObjectTableEntry& entry = table_[slot]; if (entry.object) { + // Release after we lose the lock. object = entry.object; - - // Release the object handle now that it is out of the table. - object->ReleaseHandle(); - object->Release(); } else { result = X_STATUS_INVALID_HANDLE; } @@ -144,6 +141,12 @@ X_STATUS ObjectTable::RemoveHandle(X_HANDLE handle) { 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; } @@ -175,5 +178,6 @@ X_STATUS ObjectTable::GetObject(X_HANDLE handle, XObject** out_object) { xe_mutex_unlock(table_mutex_); + *out_object = object; return result; } diff --git a/src/xenia/kernel/modules/xboxkrnl/xboxkrnl_io.cc b/src/xenia/kernel/modules/xboxkrnl/xboxkrnl_io.cc index 610a0e6b4..f8b5eecdb 100644 --- a/src/xenia/kernel/modules/xboxkrnl/xboxkrnl_io.cc +++ b/src/xenia/kernel/modules/xboxkrnl/xboxkrnl_io.cc @@ -80,6 +80,10 @@ SHIM_CALL NtCreateFile_shim( FileEntry* file_entry = (FileEntry*)entry; XFile* file = new XFile(state, file_entry); handle = file->handle(); + + // TODO(benvanik): open/create/etc. + + file->Release(); result = X_STATUS_SUCCESS; info = X_FILE_OPENED; } @@ -103,7 +107,51 @@ SHIM_CALL NtOpenFile_shim( SHIM_CALL NtReadFile_shim( 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( diff --git a/src/xenia/kernel/modules/xboxkrnl/xboxkrnl_nt.cc b/src/xenia/kernel/modules/xboxkrnl/xboxkrnl_nt.cc index 7a022b9e5..195a1c58a 100644 --- a/src/xenia/kernel/modules/xboxkrnl/xboxkrnl_nt.cc +++ b/src/xenia/kernel/modules/xboxkrnl/xboxkrnl_nt.cc @@ -12,6 +12,7 @@ #include #include #include +#include using namespace xe; @@ -26,7 +27,17 @@ namespace xboxkrnl { SHIM_CALL NtClose_shim( 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); }