[Base] Split of xbox.h file

- Splitted into: kernel.h and xam.h
- Removed UpdateSpaData from KernelState into ContentManager
This commit is contained in:
Gliniak
2025-07-25 22:23:29 +02:00
committed by Radosław Gliński
parent c4e86cfd2b
commit 4182852a4b
20 changed files with 567 additions and 524 deletions

276
src/xenia/kernel/kernel.h Normal file
View File

@@ -0,0 +1,276 @@
/**
******************************************************************************
* Xenia : Xbox 360 Emulator Research Project *
******************************************************************************
* Copyright 2025 Xenia Canary. All rights reserved. *
* Released under the BSD license - see LICENSE in the root for more details. *
******************************************************************************
*/
#ifndef XENIA_KERNEL_KERNEL_H_
#define XENIA_KERNEL_KERNEL_H_
#include "xenia/base/byte_order.h"
#include "xenia/base/memory.h"
#include "xenia/xbox.h"
namespace xe {
namespace kernel {
// IOCTL_, used by NtDeviceIoControlFile
constexpr uint32_t X_IOCTL_DISK_GET_DRIVE_GEOMETRY = 0x70000;
constexpr uint32_t X_IOCTL_DISK_GET_PARTITION_INFO = 0x74004;
// MEM_*, used by NtAllocateVirtualMemory
enum X_MEM : uint32_t {
X_MEM_COMMIT = 0x00001000,
X_MEM_RESERVE = 0x00002000,
X_MEM_DECOMMIT = 0x00004000,
X_MEM_RELEASE = 0x00008000,
X_MEM_FREE = 0x00010000,
X_MEM_PRIVATE = 0x00020000,
X_MEM_RESET = 0x00080000,
X_MEM_TOP_DOWN = 0x00100000,
X_MEM_NOZERO = 0x00800000,
X_MEM_LARGE_PAGES = 0x20000000,
X_MEM_HEAP = 0x40000000,
X_MEM_16MB_PAGES = 0x80000000 // from Valve SDK
};
// PAGE_*, used by NtAllocateVirtualMemory
enum X_PAGE : uint32_t {
X_PAGE_NOACCESS = 0x00000001,
X_PAGE_READONLY = 0x00000002,
X_PAGE_READWRITE = 0x00000004,
X_PAGE_WRITECOPY = 0x00000008,
X_PAGE_EXECUTE = 0x00000010,
X_PAGE_EXECUTE_READ = 0x00000020,
X_PAGE_EXECUTE_READWRITE = 0x00000040,
X_PAGE_EXECUTE_WRITECOPY = 0x00000080,
X_PAGE_GUARD = 0x00000100,
X_PAGE_NOCACHE = 0x00000200,
X_PAGE_WRITECOMBINE = 0x00000400
};
// Known as XOVERLAPPED to 360 code.
struct XAM_OVERLAPPED {
xe::be<uint32_t> result; // 0x0
xe::be<uint32_t> length; // 0x4
xe::be<uint32_t> context; // 0x8
xe::be<uint32_t> event; // 0xC
xe::be<uint32_t> completion_routine; // 0x10
xe::be<uint32_t> completion_context; // 0x14
xe::be<uint32_t> extended_error; // 0x18
};
static_assert_size(XAM_OVERLAPPED, 0x1C);
inline uint32_t XOverlappedGetResult(void* ptr) {
auto p = reinterpret_cast<uint32_t*>(ptr);
return xe::load_and_swap<uint32_t>(&p[0]);
}
inline void XOverlappedSetResult(void* ptr, uint32_t value) {
auto p = reinterpret_cast<uint32_t*>(ptr);
xe::store_and_swap<uint32_t>(&p[0], value);
}
inline uint32_t XOverlappedGetLength(void* ptr) {
auto p = reinterpret_cast<uint32_t*>(ptr);
return xe::load_and_swap<uint32_t>(&p[1]);
}
inline void XOverlappedSetLength(void* ptr, uint32_t value) {
auto p = reinterpret_cast<uint32_t*>(ptr);
xe::store_and_swap<uint32_t>(&p[1], value);
}
inline uint32_t XOverlappedGetContext(void* ptr) {
auto p = reinterpret_cast<uint32_t*>(ptr);
return xe::load_and_swap<uint32_t>(&p[2]);
}
inline void XOverlappedSetContext(void* ptr, uint32_t value) {
auto p = reinterpret_cast<uint32_t*>(ptr);
xe::store_and_swap<uint32_t>(&p[2], value);
}
inline X_HANDLE XOverlappedGetEvent(void* ptr) {
auto p = reinterpret_cast<uint32_t*>(ptr);
return xe::load_and_swap<uint32_t>(&p[3]);
}
inline uint32_t XOverlappedGetCompletionRoutine(void* ptr) {
auto p = reinterpret_cast<uint32_t*>(ptr);
return xe::load_and_swap<uint32_t>(&p[4]);
}
inline uint32_t XOverlappedGetCompletionContext(void* ptr) {
auto p = reinterpret_cast<uint32_t*>(ptr);
return xe::load_and_swap<uint32_t>(&p[5]);
}
inline void XOverlappedSetExtendedError(void* ptr, uint32_t value) {
auto p = reinterpret_cast<uint32_t*>(ptr);
xe::store_and_swap<uint32_t>(&p[6], value);
}
struct X_ANSI_STRING {
xe::be<uint16_t> length;
xe::be<uint16_t> maximum_length;
xe::be<uint32_t> pointer;
void reset() {
length = 0;
maximum_length = 0;
pointer = 0;
}
};
static_assert_size(X_ANSI_STRING, 8);
struct X_UNICODE_STRING {
xe::be<uint16_t> length; // 0x0
xe::be<uint16_t> maximum_length; // 0x2
xe::be<uint32_t> pointer; // 0x4
void reset() {
length = 0;
maximum_length = 0;
pointer = 0;
}
};
static_assert_size(X_UNICODE_STRING, 8);
// https://github.com/CodeAsm/ffplay360/blob/master/Common/XTLOnPC.h
struct X_VIDEO_MODE {
be<uint32_t> display_width;
be<uint32_t> display_height;
be<uint32_t> is_interlaced;
be<uint32_t> is_widescreen;
be<uint32_t> is_hi_def;
be<float> refresh_rate;
be<uint32_t> video_standard;
be<uint32_t> pixel_rate;
be<uint32_t> widescreen_flag;
be<uint32_t> reserved[3];
};
static_assert_size(X_VIDEO_MODE, 48);
// https://docs.microsoft.com/en-us/windows/win32/api/ntdef/ns-ntdef-list_entry
struct X_LIST_ENTRY {
be<uint32_t> flink_ptr; // next entry / head
be<uint32_t> blink_ptr; // previous entry / head
};
static_assert_size(X_LIST_ENTRY, 8);
struct X_SINGLE_LIST_ENTRY {
be<uint32_t> next; // 0x0 pointer to next entry
};
static_assert_size(X_SINGLE_LIST_ENTRY, 4);
// https://www.nirsoft.net/kernel_struct/vista/SLIST_HEADER.html
struct X_SLIST_HEADER {
X_SINGLE_LIST_ENTRY next; // 0x0
be<uint16_t> depth; // 0x4
be<uint16_t> sequence; // 0x6
};
static_assert_size(X_SLIST_HEADER, 8);
struct X_EX_TITLE_TERMINATE_REGISTRATION {
xe::be<uint32_t> notification_routine; // 0x0
xe::be<uint32_t> priority; // 0x4
X_LIST_ENTRY list_entry; // 0x8
};
static_assert_size(X_EX_TITLE_TERMINATE_REGISTRATION, 16);
enum X_OBJECT_HEADER_FLAGS : uint16_t {
OBJECT_HEADER_FLAG_NAMED_OBJECT =
1, // if set, has X_OBJECT_HEADER_NAME_INFO prior to X_OBJECT_HEADER
OBJECT_HEADER_FLAG_IS_PERMANENT = 2,
OBJECT_HEADER_FLAG_CONTAINED_IN_DIRECTORY =
4, // this object resides in an X_OBJECT_DIRECTORY
OBJECT_HEADER_IS_TITLE_OBJECT = 0x10, // used in obcreateobject
};
struct X_OBJECT_DIRECTORY {
// each is a pointer to X_OBJECT_HEADER_NAME_INFO
// i believe offset 0 = pointer to next in bucket
xe::be<uint32_t> name_buckets[13];
};
static_assert_size(X_OBJECT_DIRECTORY, 0x34);
// https://www.geoffchappell.com/studies/windows/km/ntoskrnl/inc/ntos/ob/object_header_name_info.htm
// quite different, though
struct X_OBJECT_HEADER_NAME_INFO {
// i think that this is the next link in an X_OBJECT_DIRECTORY's buckets
xe::be<uint32_t> next_in_directory;
xe::be<uint32_t> object_directory; // pointer to X_OBJECT_DIRECTORY
X_ANSI_STRING name;
};
struct X_OBJECT_ATTRIBUTES {
xe::be<uint32_t> root_directory; // 0x0
xe::be<uint32_t> name_ptr; // 0x4 PANSI_STRING
xe::be<uint32_t> attributes; // 0xC
};
struct X_OBJECT_TYPE {
xe::be<uint32_t> allocate_proc; // 0x0
xe::be<uint32_t> free_proc; // 0x4
xe::be<uint32_t> close_proc; // 0x8
xe::be<uint32_t> delete_proc; // 0xC
xe::be<uint32_t> unknown_proc; // 0x10
xe::be<uint32_t>
unknown_size_or_object_; // this seems to be a union, it can be a pointer
// or it can be the size of the object
xe::be<uint32_t> pool_tag; // 0x18
};
static_assert_size(X_OBJECT_TYPE, 0x1C);
struct X_KSYMLINK {
xe::be<uint32_t> refed_object_maybe;
X_ANSI_STRING refed_object_name_maybe;
};
static_assert_size(X_KSYMLINK, 0xC);
// https://msdn.microsoft.com/en-us/library/windows/desktop/aa363082.aspx
typedef struct {
// Renamed due to a collision with exception_code from Windows excpt.h.
xe::be<uint32_t> code;
xe::be<uint32_t> exception_flags;
xe::be<uint32_t> exception_record;
xe::be<uint32_t> exception_address;
xe::be<uint32_t> number_parameters;
xe::be<uint32_t> exception_information[15];
} X_EXCEPTION_RECORD;
static_assert_size(X_EXCEPTION_RECORD, 0x50);
struct X_KSPINLOCK {
xe::be<uint32_t> prcb_of_owner;
};
static_assert_size(X_KSPINLOCK, 4);
struct MESSAGEBOX_RESULT {
union {
xe::be<uint32_t> ButtonPressed;
xe::be<uint16_t> Passcode[4];
};
};
static_assert_size(MESSAGEBOX_RESULT, 0x8);
inline bool IsOfflineXUID(uint64_t xuid) { return ((xuid >> 60) & 0xF) == 0xE; }
inline bool IsOnlineXUID(uint64_t xuid) {
return ((xuid >> 48) & 0xFFFF) == 0x9;
}
inline bool IsGuestXUID(uint64_t xuid) {
const uint32_t HighPart = xuid >> 48;
return ((HighPart & 0x000F) == 0x9) && ((HighPart & 0x00C0) > 0);
}
inline bool IsTeamXUID(uint64_t xuid) {
return (xuid & 0xFF00000000000140) == 0xFE00000000000100;
}
inline bool IsValidXUID(uint64_t xuid) {
const bool valid = IsOfflineXUID(xuid) || IsOnlineXUID(xuid) ||
IsTeamXUID(xuid) || IsGuestXUID(xuid);
return valid;
}
} // namespace kernel
} // namespace xe
#endif // XENIA_KERNEL_KERNEL_H_