From 5176a7e7c9534ec19fd890ff06f547f2a4b498e6 Mon Sep 17 00:00:00 2001 From: gibbed Date: Tue, 15 Oct 2013 05:16:05 -0700 Subject: [PATCH] Stubbing out some file stuff. --- src/xenia/kernel/modules/xboxkrnl/module.cc | 2 + .../modules/xboxkrnl/objects/sources.gypi | 2 + .../kernel/modules/xboxkrnl/objects/xfile.cc | 26 ++++ .../kernel/modules/xboxkrnl/objects/xfile.h | 37 ++++++ .../kernel/modules/xboxkrnl/sources.gypi | 4 + .../kernel/modules/xboxkrnl/xboxkrnl_file.cc | 114 ++++++++++++++++++ .../kernel/modules/xboxkrnl/xboxkrnl_file.h | 29 +++++ .../kernel/modules/xboxkrnl/xboxkrnl_misc.cc | 35 ++++++ .../kernel/modules/xboxkrnl/xboxkrnl_misc.h | 29 +++++ .../modules/xboxkrnl/xboxkrnl_private.h | 3 +- src/xenia/kernel/modules/xboxkrnl/xobject.h | 1 + 11 files changed, 281 insertions(+), 1 deletion(-) create mode 100644 src/xenia/kernel/modules/xboxkrnl/objects/xfile.cc create mode 100644 src/xenia/kernel/modules/xboxkrnl/objects/xfile.h create mode 100644 src/xenia/kernel/modules/xboxkrnl/xboxkrnl_file.cc create mode 100644 src/xenia/kernel/modules/xboxkrnl/xboxkrnl_file.h create mode 100644 src/xenia/kernel/modules/xboxkrnl/xboxkrnl_misc.cc create mode 100644 src/xenia/kernel/modules/xboxkrnl/xboxkrnl_misc.h diff --git a/src/xenia/kernel/modules/xboxkrnl/module.cc b/src/xenia/kernel/modules/xboxkrnl/module.cc index d1f8ffea1..c49a7ffaf 100644 --- a/src/xenia/kernel/modules/xboxkrnl/module.cc +++ b/src/xenia/kernel/modules/xboxkrnl/module.cc @@ -52,8 +52,10 @@ XboxkrnlModule::XboxkrnlModule(Runtime* runtime) : // Register all exported functions. RegisterDebugExports(resolver, kernel_state_.get()); + RegisterFileExports(resolver, kernel_state_.get()); RegisterHalExports(resolver, kernel_state_.get()); RegisterMemoryExports(resolver, kernel_state_.get()); + RegisterMiscExports(resolver, kernel_state_.get()); RegisterModuleExports(resolver, kernel_state_.get()); RegisterRtlExports(resolver, kernel_state_.get()); RegisterThreadingExports(resolver, kernel_state_.get()); diff --git a/src/xenia/kernel/modules/xboxkrnl/objects/sources.gypi b/src/xenia/kernel/modules/xboxkrnl/objects/sources.gypi index ddbfdb3c3..21ec444ef 100644 --- a/src/xenia/kernel/modules/xboxkrnl/objects/sources.gypi +++ b/src/xenia/kernel/modules/xboxkrnl/objects/sources.gypi @@ -3,6 +3,8 @@ 'sources': [ 'xevent.cc', 'xevent.h', + 'xfile.cc', + 'xfile.h', 'xmodule.cc', 'xmodule.h', 'xthread.cc', diff --git a/src/xenia/kernel/modules/xboxkrnl/objects/xfile.cc b/src/xenia/kernel/modules/xboxkrnl/objects/xfile.cc new file mode 100644 index 000000000..99683afd0 --- /dev/null +++ b/src/xenia/kernel/modules/xboxkrnl/objects/xfile.cc @@ -0,0 +1,26 @@ +/** + ****************************************************************************** + * Xenia : Xbox 360 Emulator Research Project * + ****************************************************************************** + * Copyright 2013 Ben Vanik. All rights reserved. * + * Released under the BSD license - see LICENSE in the root for more details. * + ****************************************************************************** + */ + +#include + +#include +#include + + +using namespace xe; +using namespace xe::kernel; +using namespace xe::kernel::xboxkrnl; + + +XFile::XFile(KernelState* kernel_state) : + XObject(kernel_state, kTypeFile) { +} + +XFile::~XFile() { +} diff --git a/src/xenia/kernel/modules/xboxkrnl/objects/xfile.h b/src/xenia/kernel/modules/xboxkrnl/objects/xfile.h new file mode 100644 index 000000000..5cb53747e --- /dev/null +++ b/src/xenia/kernel/modules/xboxkrnl/objects/xfile.h @@ -0,0 +1,37 @@ +/** + ****************************************************************************** + * Xenia : Xbox 360 Emulator Research Project * + ****************************************************************************** + * Copyright 2013 Ben Vanik. All rights reserved. * + * Released under the BSD license - see LICENSE in the root for more details. * + ****************************************************************************** + */ + +#ifndef XENIA_KERNEL_MODULES_XBOXKRNL_XFILE_H_ +#define XENIA_KERNEL_MODULES_XBOXKRNL_XFILE_H_ + +#include + +#include + + +namespace xe { +namespace kernel { +namespace xboxkrnl { + + +class XFile : public XObject { +public: + XFile(KernelState* kernel_state); + virtual ~XFile(); + +private: +}; + + +} // namespace xboxkrnl +} // namespace kernel +} // namespace xe + + +#endif // XENIA_KERNEL_MODULES_XBOXKRNL_XFILE_H_ diff --git a/src/xenia/kernel/modules/xboxkrnl/sources.gypi b/src/xenia/kernel/modules/xboxkrnl/sources.gypi index c22754edf..173188924 100644 --- a/src/xenia/kernel/modules/xboxkrnl/sources.gypi +++ b/src/xenia/kernel/modules/xboxkrnl/sources.gypi @@ -9,10 +9,14 @@ 'object_table.h', 'xboxkrnl_debug.cc', 'xboxkrnl_debug.h', + 'xboxkrnl_file.cc', + 'xboxkrnl_file.h', 'xboxkrnl_hal.cc', 'xboxkrnl_hal.h', 'xboxkrnl_memory.cc', 'xboxkrnl_memory.h', + 'xboxkrnl_misc.cc', + 'xboxkrnl_misc.h', 'xboxkrnl_module.cc', 'xboxkrnl_module.h', 'xboxkrnl_ordinals.h', diff --git a/src/xenia/kernel/modules/xboxkrnl/xboxkrnl_file.cc b/src/xenia/kernel/modules/xboxkrnl/xboxkrnl_file.cc new file mode 100644 index 000000000..701e1c8ff --- /dev/null +++ b/src/xenia/kernel/modules/xboxkrnl/xboxkrnl_file.cc @@ -0,0 +1,114 @@ +/** + ****************************************************************************** + * Xenia : Xbox 360 Emulator Research Project * + ****************************************************************************** + * Copyright 2013 Ben Vanik. All rights reserved. * + * Released under the BSD license - see LICENSE in the root for more details. * + ****************************************************************************** + */ + +#include + +#include +#include +#include +#include + + +using namespace xe; +using namespace xe::kernel; +using namespace xe::kernel::xboxkrnl; + + +namespace xe { +namespace kernel { +namespace xboxkrnl { + + +X_STATUS xeNtCreateFile( + uint32_t* handle_ptr, uint32_t desired_access, void* object_attributes_ptr, + void* io_status_block_ptr, uint64_t allocation_size, uint32_t file_attributes, + uint32_t share_access, uint32_t creation_disposition) { + KernelState* state = shared_kernel_state_; + XEASSERTNOTNULL(state); + return X_STATUS_NO_SUCH_FILE; +} + +SHIM_CALL NtCreateFile_shim( + xe_ppc_state_t* ppc_state, KernelState* state) { + uint32_t handle_ptr = SHIM_GET_ARG_32(0); + uint32_t desired_access = SHIM_GET_ARG_32(1); + uint32_t object_attributes_ptr = SHIM_GET_ARG_32(2); + uint32_t io_status_block_ptr = SHIM_GET_ARG_32(3); + uint32_t allocation_size_ptr = SHIM_GET_ARG_32(4); + uint32_t file_attributes = SHIM_GET_ARG_32(5); + uint32_t share_access = SHIM_GET_ARG_32(6); + uint32_t creation_disposition = SHIM_GET_ARG_32(7); + + XELOGD( + "NtCreateFile(%.8X, %d, %.8X, %.8X, %.8X, %.8X, %.8X, %.8X)", + handle_ptr, + desired_access, + object_attributes_ptr, + io_status_block_ptr, + allocation_size_ptr, + file_attributes, + share_access, + creation_disposition); + + // object_attributes is: + // void *root_directory + // _STRING *object_name <- probably initialized by previous RtlInitAnsiString call + // uint32_t attributes + + uint64_t allocation_size = 0; // is this correct??? + if (allocation_size_ptr != 0) { + allocation_size = SHIM_MEM_64(allocation_size_ptr); + } + + uint32_t handle; + X_STATUS result = xeNtCreateFile( + &handle, desired_access, SHIM_MEM_ADDR(object_attributes_ptr), SHIM_MEM_ADDR(io_status_block_ptr), + allocation_size, file_attributes, share_access, creation_disposition); + + if (XSUCCEEDED(result)) { + if (handle_ptr) { + SHIM_SET_MEM_32(handle_ptr, handle); + } + } + SHIM_SET_RETURN(result); +} + +SHIM_CALL NtQueryInformationFile_shim( + xe_ppc_state_t* ppc_state, KernelState* state) { + SHIM_SET_RETURN(X_STATUS_NO_SUCH_FILE); +} + +SHIM_CALL NtReadFile_shim( + xe_ppc_state_t* ppc_state, KernelState* state) { + SHIM_SET_RETURN(X_STATUS_NO_SUCH_FILE); +} + +SHIM_CALL NtQueryFullAttributesFile_shim( + xe_ppc_state_t* ppc_state, KernelState* state) { + SHIM_SET_RETURN(X_STATUS_NO_SUCH_FILE); +} + +SHIM_CALL NtClose_shim( + xe_ppc_state_t* ppc_state, KernelState* state) { + SHIM_SET_RETURN(X_STATUS_NO_SUCH_FILE); +} + +} // namespace xboxkrnl +} // namespace kernel +} // namespace xe + + +void xe::kernel::xboxkrnl::RegisterFileExports( + ExportResolver* export_resolver, KernelState* state) { + SHIM_SET_MAPPING("xboxkrnl.exe", NtCreateFile, state); + SHIM_SET_MAPPING("xboxkrnl.exe", NtQueryInformationFile, state); + SHIM_SET_MAPPING("xboxkrnl.exe", NtReadFile, state); + SHIM_SET_MAPPING("xboxkrnl.exe", NtQueryFullAttributesFile, state); + SHIM_SET_MAPPING("xboxkrnl.exe", NtClose, state); +} diff --git a/src/xenia/kernel/modules/xboxkrnl/xboxkrnl_file.h b/src/xenia/kernel/modules/xboxkrnl/xboxkrnl_file.h new file mode 100644 index 000000000..88ec0e027 --- /dev/null +++ b/src/xenia/kernel/modules/xboxkrnl/xboxkrnl_file.h @@ -0,0 +1,29 @@ +/** + ****************************************************************************** + * Xenia : Xbox 360 Emulator Research Project * + ****************************************************************************** + * Copyright 2013 Ben Vanik. All rights reserved. * + * Released under the BSD license - see LICENSE in the root for more details. * + ****************************************************************************** + */ + +#ifndef XENIA_KERNEL_MODULES_XBOXKRNL_FILE_H_ +#define XENIA_KERNEL_MODULES_XBOXKRNL_FILE_H_ + +#include +#include + +#include + + +namespace xe { +namespace kernel { +namespace xboxkrnl { + + +} // namespace xboxkrnl +} // namespace kernel +} // namespace xe + + +#endif // XENIA_KERNEL_MODULES_XBOXKRNL_FILE_H_ diff --git a/src/xenia/kernel/modules/xboxkrnl/xboxkrnl_misc.cc b/src/xenia/kernel/modules/xboxkrnl/xboxkrnl_misc.cc new file mode 100644 index 000000000..cddb73d8e --- /dev/null +++ b/src/xenia/kernel/modules/xboxkrnl/xboxkrnl_misc.cc @@ -0,0 +1,35 @@ +/** + ****************************************************************************** + * Xenia : Xbox 360 Emulator Research Project * + ****************************************************************************** + * Copyright 2013 Ben Vanik. All rights reserved. * + * Released under the BSD license - see LICENSE in the root for more details. * + ****************************************************************************** + */ + +#include + +#include +#include +#include +#include + + +using namespace xe; +using namespace xe::kernel; +using namespace xe::kernel::xboxkrnl; + + +namespace xe { +namespace kernel { +namespace xboxkrnl { + + +} // namespace xboxkrnl +} // namespace kernel +} // namespace xe + + +void xe::kernel::xboxkrnl::RegisterMiscExports( + ExportResolver* export_resolver, KernelState* state) { +} diff --git a/src/xenia/kernel/modules/xboxkrnl/xboxkrnl_misc.h b/src/xenia/kernel/modules/xboxkrnl/xboxkrnl_misc.h new file mode 100644 index 000000000..c1e896a63 --- /dev/null +++ b/src/xenia/kernel/modules/xboxkrnl/xboxkrnl_misc.h @@ -0,0 +1,29 @@ +/** + ****************************************************************************** + * Xenia : Xbox 360 Emulator Research Project * + ****************************************************************************** + * Copyright 2013 Ben Vanik. All rights reserved. * + * Released under the BSD license - see LICENSE in the root for more details. * + ****************************************************************************** + */ + +#ifndef XENIA_KERNEL_MODULES_XBOXKRNL_MISC_H_ +#define XENIA_KERNEL_MODULES_XBOXKRNL_MISC_H_ + +#include +#include + +#include + + +namespace xe { +namespace kernel { +namespace xboxkrnl { + + +} // namespace xboxkrnl +} // namespace kernel +} // namespace xe + + +#endif // XENIA_KERNEL_MODULES_XBOXKRNL_MISC_H_ diff --git a/src/xenia/kernel/modules/xboxkrnl/xboxkrnl_private.h b/src/xenia/kernel/modules/xboxkrnl/xboxkrnl_private.h index 492c9ef61..8a0a2559d 100644 --- a/src/xenia/kernel/modules/xboxkrnl/xboxkrnl_private.h +++ b/src/xenia/kernel/modules/xboxkrnl/xboxkrnl_private.h @@ -28,11 +28,12 @@ class KernelState; // be using to stash their variables. extern KernelState* shared_kernel_state_; - // Registration functions, one per file. void RegisterDebugExports(ExportResolver* export_resolver, KernelState* state); +void RegisterFileExports(ExportResolver* export_resolver, KernelState* state); void RegisterHalExports(ExportResolver* export_resolver, KernelState* state); void RegisterMemoryExports(ExportResolver* export_resolver, KernelState* state); +void RegisterMiscExports(ExportResolver* export_resolver, KernelState* state); void RegisterModuleExports(ExportResolver* export_resolver, KernelState* state); void RegisterRtlExports(ExportResolver* export_resolver, KernelState* state); void RegisterThreadingExports(ExportResolver* export_resolver, diff --git a/src/xenia/kernel/modules/xboxkrnl/xobject.h b/src/xenia/kernel/modules/xboxkrnl/xobject.h index 804cdd471..d196ed8d5 100644 --- a/src/xenia/kernel/modules/xboxkrnl/xobject.h +++ b/src/xenia/kernel/modules/xboxkrnl/xobject.h @@ -42,6 +42,7 @@ public: kTypeModule = 0x00000001, kTypeThread = 0x00000002, kTypeEvent = 0x00000003, + kTypeFile = 0x00000004, }; XObject(KernelState* kernel_state, Type type);