RetroArch/xbox1/frontend/RetroLaunch/Undocumented.h
2012-07-24 18:35:29 +02:00

1374 lines
36 KiB
C

// Thanks and credit to everlame, Team Evox, and Woodoo.
//
// This file contains declarations for accessing the internal NT API.
// Some calls have changed from NT, so be careful!
//
// For the most part, all NT calls use ANSI instead of Unicode strings now.
//
// It is not known which flags work. You will have to experiment.
#ifndef __XBOX_INTERNAL_H__
#define __XBOX_INTERNAL_H__
#include <pshpack4.h>
// Do extern "C" for C++
#if defined(__cplusplus) && !defined(XBOXINTERNAL_NO_EXTERN_C)
extern "C" {
#endif // __cplusplus
// Don't do __declspec(dllimport) for things like emulators
#if defined(NTSYSAPI) && defined(DONT_IMPORT_INTERNAL)
#undef NTSYSAPI
#endif
#ifdef DONT_IMPORT_INTERNAL
#define NTSYSAPI
#endif
// The normal headers don't have this...?
#define FASTCALL __fastcall
// The usual NTSTATUS
typedef LONG NTSTATUS;
// The usual NT_SUCCESS
#define NT_SUCCESS(Status) ((NTSTATUS)(Status) >= 0)
// Just for documentation
#define EXPORTNUM(x)
// Needed for object structures and related things
typedef CONST SHORT CSHORT;
// String types
typedef CHAR *PSZ;
typedef CONST CHAR *PCSZ;
// ANSI_STRING
// Differences from NT: None.
typedef struct _STRING {
USHORT Length;
USHORT MaximumLength;
PCHAR Buffer;
} STRING;
typedef STRING *PSTRING;
typedef STRING ANSI_STRING;
typedef PSTRING PANSI_STRING;
// IO Status Block type (UNVERIFIED)
// Differences from NT: None.
typedef struct _IO_STATUS_BLOCK {
union {
NTSTATUS Status;
PVOID Pointer;
};
ULONG_PTR Information;
} IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;
// APC routine
typedef
VOID
(NTAPI *PIO_APC_ROUTINE) (
IN PVOID ApcContext,
IN PIO_STATUS_BLOCK IoStatusBlock,
IN ULONG Reserved
);
// Header for dispatcher objects
// Differences from NT: None.
typedef struct _DISPATCHER_HEADER {
UCHAR Type;
UCHAR Absolute;
UCHAR Size;
UCHAR Inserted;
LONG SignalState;
LIST_ENTRY WaitListHead;
} DISPATCHER_HEADER;
// Object types
#define NotificationTimerObject 8
#define SynchronizationTimerObject 9
#define DpcObject 19
// Object Attributes type
// Differences from NT: There are no Length, SecurityDescriptor, or
// SecurityQualityOfService fields. Also, ObjectName is ANSI, not
// Unicode.
typedef struct _OBJECT_ATTRIBUTES {
HANDLE RootDirectory;
PANSI_STRING ObjectName;
ULONG Attributes;
} OBJECT_ATTRIBUTES;
typedef OBJECT_ATTRIBUTES *POBJECT_ATTRIBUTES;
// Flags for OBJECT_ATTRIBUTES::Attributes
#define OBJ_INHERIT 0x00000002L
#define OBJ_PERMANENT 0x00000010L
#define OBJ_EXCLUSIVE 0x00000020L
#define OBJ_CASE_INSENSITIVE 0x00000040L
#define OBJ_OPENIF 0x00000080L
#define OBJ_OPENLINK 0x00000100L
#define OBJ_KERNEL_HANDLE 0x00000200L
#define OBJ_VALID_ATTRIBUTES 0x000003F2L
// Initializes an OBJECT_ATTRIBUTES.
// Works as if it were this function:
// VOID
// InitializeObjectAttributes(
// OUT POBJECT_ATTRIBUTES p,
// IN PANSI_STRING n,
// IN ULONG a,
// IN HANDLE r
// )
// Differences from NT: SECURITY_DESCRIPTOR support is gone.
#define InitializeObjectAttributes( p, n, a, r ) { \
(p)->RootDirectory = r; \
(p)->Attributes = a; \
(p)->ObjectName = n; \
}
// CreateDisposition values for NtCreateFile()
#define FILE_SUPERSEDE 0x00000000
#define FILE_OPEN 0x00000001
#define FILE_CREATE 0x00000002
#define FILE_OPEN_IF 0x00000003
#define FILE_OVERWRITE 0x00000004
#define FILE_OVERWRITE_IF 0x00000005
#define FILE_MAXIMUM_DISPOSITION 0x00000005
// CreateOption values for NtCreateFile()
// FILE_NON_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT is what CreateFile
// uses for most things when translating to NtCreateFile.
#define FILE_DIRECTORY_FILE 0x00000001
#define FILE_WRITE_THROUGH 0x00000002
#define FILE_SEQUENTIAL_ONLY 0x00000004
#define FILE_NO_INTERMEDIATE_BUFFERING 0x00000008
#define FILE_SYNCHRONOUS_IO_ALERT 0x00000010
#define FILE_SYNCHRONOUS_IO_NONALERT 0x00000020
#define FILE_NON_DIRECTORY_FILE 0x00000040
#define FILE_CREATE_TREE_CONNECTION 0x00000080
#define FILE_COMPLETE_IF_OPLOCKED 0x00000100
#define FILE_NO_EA_KNOWLEDGE 0x00000200
#define FILE_OPEN_FOR_RECOVERY 0x00000400
#define FILE_RANDOM_ACCESS 0x00000800
#define FILE_DELETE_ON_CLOSE 0x00001000
#define FILE_OPEN_BY_FILE_ID 0x00002000
#define FILE_OPEN_FOR_BACKUP_INTENT 0x00004000
#define FILE_NO_COMPRESSION 0x00008000
#define FILE_RESERVE_OPFILTER 0x00100000
#define FILE_OPEN_REPARSE_POINT 0x00200000
#define FILE_OPEN_NO_RECALL 0x00400000
#define FILE_OPEN_FOR_FREE_SPACE_QUERY 0x00800000
#define FILE_COPY_STRUCTURED_STORAGE 0x00000041
#define FILE_STRUCTURED_STORAGE 0x00000441
#define FILE_VALID_OPTION_FLAGS 0x00ffffff
#define FILE_VALID_PIPE_OPTION_FLAGS 0x00000032
#define FILE_VALID_MAILSLOT_OPTION_FLAGS 0x00000032
#define FILE_VALID_SET_FLAGS 0x00000036
// NtQueryVolumeInformation / NtSetVolumeInformation stuff
// Type of information to retrieve; FileFsSizeInformation and
// FileFsDeviceInformation are the only ones confirmed to work.
typedef enum _FSINFOCLASS {
FileFsVolumeInformation = 1,
FileFsLabelInformation,
FileFsSizeInformation,
FileFsDeviceInformation,
FileFsAttributeInformation,
FileFsControlInformation,
FileFsFullSizeInformation,
FileFsObjectInformation
} FS_INFORMATION_CLASS, *PFS_INFORMATION_CLASS;
// Structure of FileFsSizeInformation
typedef struct _FILE_FS_SIZE_INFORMATION {
LARGE_INTEGER TotalAllocationUnits;
LARGE_INTEGER AvailableAllocationUnits;
ULONG SectorsPerAllocationUnit;
ULONG BytesPerSector;
} FILE_FS_SIZE_INFORMATION, *PFILE_FS_SIZE_INFORMATION;
#define DEVICE_TYPE ULONG
// Structure of FileFsDeviceInformation
typedef struct _FILE_FS_DEVICE_INFORMATION {
DEVICE_TYPE DeviceType;
ULONG Characteristics;
} FILE_FS_DEVICE_INFORMATION, *PFILE_FS_DEVICE_INFORMATION;
// DEVICE_TYPEs (I took a guess as to which the XBOX might have.)
#define FILE_DEVICE_CD_ROM 0x00000002
#define FILE_DEVICE_CD_ROM_FILE_SYSTEM 0x00000003
#define FILE_DEVICE_CONTROLLER 0x00000004
#define FILE_DEVICE_DISK 0x00000007
#define FILE_DEVICE_DISK_FILE_SYSTEM 0x00000008
#define FILE_DEVICE_FILE_SYSTEM 0x00000009
#define FILE_DEVICE_NULL 0x00000015
#define FILE_DEVICE_SCREEN 0x0000001c
#define FILE_DEVICE_SOUND 0x0000001d
#define FILE_DEVICE_UNKNOWN 0x00000022
#define FILE_DEVICE_VIDEO 0x00000023
#define FILE_DEVICE_VIRTUAL_DISK 0x00000024
#define FILE_DEVICE_FULLSCREEN_VIDEO 0x00000034
// Characteristics
#define FILE_REMOVABLE_MEDIA 0x00000001
#define FILE_READ_ONLY_DEVICE 0x00000002
#define FILE_FLOPPY_DISKETTE 0x00000004
#define FILE_WRITE_ONCE_MEDIA 0x00000008
#define FILE_REMOTE_DEVICE 0x00000010
#define FILE_DEVICE_IS_MOUNTED 0x00000020
#define FILE_VIRTUAL_VOLUME 0x00000040
#define FILE_AUTOGENERATED_DEVICE_NAME 0x00000080
#define FILE_DEVICE_SECURE_OPEN 0x00000100
// Physical address
// Differences from NT: 32 bit address instead of 64.
typedef ULONG PHYSICAL_ADDRESS, *PPHYSICAL_ADDRESS;
// NtCreateFile/NtOpenFile stuff
#define FILE_SUPERSEDED 0x00000000
#define FILE_OPENED 0x00000001
#define FILE_CREATED 0x00000002
#define FILE_OVERWRITTEN 0x00000003
#define FILE_EXISTS 0x00000004
#define FILE_DOES_NOT_EXIST 0x00000005
// NtReadFile/NtWriteFile stuff
#define FILE_WRITE_TO_END_OF_FILE 0xffffffff
#define FILE_USE_FILE_POINTER_POSITION 0xfffffffe
// DeviceIoControl stuff
// Device types
#define FILE_DEVICE_CD_ROM 0x00000002
#define FILE_DEVICE_CD_ROM_FILE_SYSTEM 0x00000003
#define FILE_DEVICE_CONTROLLER 0x00000004
#define FILE_DEVICE_SCSI FILE_DEVICE_CONTROLLER
#define IOCTL_SCSI_BASE FILE_DEVICE_CONTROLLER
#define FILE_DEVICE_DISK 0x00000007
#define FILE_DEVICE_DISK_FILE_SYSTEM 0x00000008
#define FILE_DEVICE_DVD 0x00000033
// Access types
#define FILE_ANY_ACCESS 0
#define FILE_READ_ACCESS ( 0x0001 ) // file & pipe
#define FILE_WRITE_ACCESS ( 0x0002 ) // file & pipe
// Method types
#define METHOD_BUFFERED 0
#define METHOD_IN_DIRECT 1
#define METHOD_OUT_DIRECT 2
#define METHOD_NEITHER 3
// The all-important CTL_CODE
#define CTL_CODE( DeviceType, Function, Method, Access ) ( \
((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method) \
)
// IDE/SCSI codes
// IOCTL_SCSI_PASS_THROUGH_DIRECT is the only one known to be used.
// Differences from NT: None.
#define IOCTL_SCSI_PASS_THROUGH CTL_CODE(IOCTL_SCSI_BASE, 0x0401, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
#define IOCTL_SCSI_MINIPORT CTL_CODE(IOCTL_SCSI_BASE, 0x0402, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
#define IOCTL_SCSI_GET_INQUIRY_DATA CTL_CODE(IOCTL_SCSI_BASE, 0x0403, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_SCSI_GET_CAPABILITIES CTL_CODE(IOCTL_SCSI_BASE, 0x0404, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_SCSI_PASS_THROUGH_DIRECT CTL_CODE(IOCTL_SCSI_BASE, 0x0405, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
#define IOCTL_SCSI_GET_ADDRESS CTL_CODE(IOCTL_SCSI_BASE, 0x0406, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_SCSI_RESCAN_BUS CTL_CODE(IOCTL_SCSI_BASE, 0x0407, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_SCSI_GET_DUMP_POINTERS CTL_CODE(IOCTL_SCSI_BASE, 0x0408, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_SCSI_FREE_DUMP_POINTERS CTL_CODE(IOCTL_SCSI_BASE, 0x0409, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_IDE_PASS_THROUGH CTL_CODE(IOCTL_SCSI_BASE, 0x040a, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
// Special XBOX code?
#define IOCTL_CDROM_AUTHENTICATE_DISK CTL_CODE(FILE_DEVICE_CD_ROM, 0x0020, METHOD_BUFFERED, FILE_READ_ACCESS)
// Structure for IOCTL_SCSI_PASS_THROUGH_DIRECT
// Differences from NT: None, believe it or not.
typedef struct _SCSI_PASS_THROUGH_DIRECT {
/*000*/ USHORT Length;
/*002*/ UCHAR ScsiStatus;
/*003*/ UCHAR PathId;
/*004*/ UCHAR TargetId;
/*005*/ UCHAR Lun;
/*006*/ UCHAR CdbLength;
/*007*/ UCHAR SenseInfoLength;
/*008*/ UCHAR DataIn;
/*00C*/ ULONG DataTransferLength;
/*010*/ ULONG TimeOutValue;
/*014*/ PVOID DataBuffer;
/*018*/ ULONG SenseInfoOffset;
/*01C*/ UCHAR Cdb[16];
}SCSI_PASS_THROUGH_DIRECT, *PSCSI_PASS_THROUGH_DIRECT;
// DataIn fields for IOCTL_SCSI_PASS_THROUGH_DIRECT
#define SCSI_IOCTL_DATA_OUT 0
#define SCSI_IOCTL_DATA_IN 1
#define SCSI_IOCTL_DATA_UNSPECIFIED 2
// Kernel object type (unsure about the structure...)
typedef struct _OBJECT_TYPE
{
// Same prototype as ExAllocatePoolWithTag, because that's the usual one
PVOID
(NTAPI *AllocationFunction)(
SIZE_T NumberOfBytes,
ULONG Tag
);
// Same prototype as ExFreePool, because that's the usual one
VOID
(NTAPI *FreeFunction)(
IN PVOID P
);
// The prototypes of these are unknown
void *CloseFunction;
void *DeleteFunction;
void *ParseFunction;
// Unknown DWORD... Size of this object type maybe?
void *DefaultObjectMaybe;
// 4 letter tag for this object type
CHAR Tag[4];
} OBJECT_TYPE;
typedef OBJECT_TYPE *POBJECT_TYPE;
// Object types
extern POBJECT_TYPE IoFileObjectType;
extern POBJECT_TYPE ExEventObjectType;
extern POBJECT_TYPE ExSemaphoreObjectType;
extern POBJECT_TYPE IoCompletionObjectType;
extern POBJECT_TYPE IoDeviceObjectType;
// *_OBJECT and related structures (mostly opaque since I'm lazy)
typedef struct _DRIVER_OBJECT {
CSHORT Type;
CSHORT Size;
struct _DEVICE_OBJECT *DeviceObject;
// ...
} DRIVER_OBJECT;
typedef DRIVER_OBJECT *PDRIVER_OBJECT;
typedef struct _DEVICE_OBJECT {
CSHORT Type;
USHORT Size;
LONG ReferenceCount;
PDRIVER_OBJECT DriverObject;
// ...
} DEVICE_OBJECT;
typedef DEVICE_OBJECT *PDEVICE_OBJECT;
typedef struct _FILE_OBJECT {
CSHORT Type;
CSHORT Size;
PDEVICE_OBJECT DeviceObject;
// ...
} FILE_OBJECT;
typedef FILE_OBJECT *PFILE_OBJECT;
// Thread information structures
// IRQL
typedef UCHAR KIRQL, *PKIRQL;
#define PASSIVE_LEVEL 0 // Passive release level
#define LOW_LEVEL 0 // Lowest interrupt level
#define APC_LEVEL 1 // APC interrupt level
#define DISPATCH_LEVEL 2 // Dispatcher level
// Thread entry point
// NOTE: This is not a standard call! You can't call this function from C code!
// You push registers like stdcall, but ebp + 4 must point to the first argument before the call!
//
// Differences from NT: 2 parameters instead of 1; strange calling convention
typedef
VOID
(NTAPI *PKSTART_ROUTINE) (
IN PVOID StartContext1,
IN PVOID StartContext2
);
// Structure of a critical section
// Same as the XBOX's RTL_CRITICAL_SECTION, but with the more explicit header
typedef struct _KCRITICAL_SECTION
{
// 000 Dispatcher header
DISPATCHER_HEADER Header;
// 010 Lock count of the critical section
LONG LockCount;
// 014 Recursion count of the critical section
LONG RecursionCount;
// 018 Thread ID of the thread that currently owns this critical section
ULONG OwningThread;
} KCRITICAL_SECTION, *PKCRITICAL_SECTION;
// Structure of a thread object
typedef struct _KTHREAD
{
// 000 Dispatcher header
DISPATCHER_HEADER Header;
// 010 Unknown
BYTE unknown[0x18];
// 028 Pointer to TLS data
PVOID TlsData;
// ??? just padding - real size is unknown
BYTE unknown2[0x100];
} KTHREAD, *PKTHREAD;
// Structure of the data at FS
typedef struct _FS_STRUCTURE
{
// 000 Current exception handler information
PVOID *ExceptionFrame;
// 004 Pointer to current TLS data top
PVOID TlsDataTop;
// 008
BYTE unknown2[0x1C];
// 024 Current IRQL of the OS
KIRQL CurrentIrql;
// 028 Thread structure of the current thread
PKTHREAD ThreadObject;
// ??? just padding - real size is unknown
BYTE unknown3[0x100];
} FS_STRUCTURE, *PFS_STRUCTURE;
// DPC routine
typedef
VOID
(*PKDEFERRED_ROUTINE) (
IN struct _KDPC *Dpc,
IN PVOID DeferredContext,
IN PVOID SystemArgument1,
IN PVOID SystemArgument2
);
// DPC information
// It's not known which of these fields are used on XBOX.
typedef struct _KDPC {
CSHORT Type;
UCHAR Number;
UCHAR Importance;
LIST_ENTRY DpcListEntry;
PKDEFERRED_ROUTINE DeferredRoutine;
PVOID DeferredContext;
PVOID SystemArgument1;
PVOID SystemArgument2;
PULONG_PTR Lock;
} KDPC, *PKDPC;
// Timers
typedef enum _TIMER_TYPE {
NotificationTimer,
SynchronizationTimer
} TIMER_TYPE;
typedef struct _KTIMER {
DISPATCHER_HEADER Header;
ULARGE_INTEGER DueTime;
LIST_ENTRY TimerListEntry;
struct _KDPC *Dpc;
LONG Period;
} KTIMER, *PKTIMER;
// XBE stuff
// Not used in any exported kernel calls, but still useful.
// XBE header information
typedef struct _XBE_HEADER {
// 000 "XBEH"
CHAR Magic[4];
// 004 RSA digital signature of the entire header area
UCHAR HeaderSignature[256];
// 104 Base address of XBE image (must be 0x00010000?)
PVOID BaseAddress;
// 108 Size of all headers combined - other headers must be within this
ULONG HeaderSize;
// 10C Size of entire image
ULONG ImageSize;
// 110 Size of this header (always 0x178?)
ULONG XbeHeaderSize;
// 114 Image timestamp - unknown format
ULONG Timestamp;
// 118 Pointer to certificate data (must be within HeaderSize)
struct _XBE_CERTIFICATE *Certificate;
// 11C Number of sections
DWORD NumSections;
// 120 Pointer to section headers (must be within HeaderSize)
struct _XBE_SECTION *Sections;
// 124 Initialization flags
ULONG InitFlags;
// 128 Entry point (XOR'd; see xboxhacker.net)
PVOID EntryPoint;
// 12C Pointer to TLS directory
struct _XBE_TLS_DIRECTORY *TlsDirectory;
// 130 Stack commit size
ULONG StackCommit;
// 134 Heap reserve size
ULONG HeapReserve;
// 138 Heap commit size
ULONG HeapCommit;
// 13C PE base address (?)
PVOID PeBaseAddress;
// 140 PE image size (?)
ULONG PeImageSize;
// 144 PE checksum (?)
ULONG PeChecksum;
// 148 PE timestamp (?)
ULONG PeTimestamp;
// 14C PC path and filename to EXE file from which XBE is derived
PCSZ PcExePath;
// 150 PC filename (last part of PcExePath) from which XBE is derived
PCSZ PcExeFilename;
// 154 PC filename (Unicode version of PcExeFilename)
PWSTR PcExeFilenameUnicode;
// 158 Pointer to kernel thunk table (XOR'd; EFB1F152 debug)
ULONG_PTR *KernelThunkTable;
// 15C Non-kernel import table (debug only)
PVOID DebugImportTable;
// 160 Number of library headers
ULONG NumLibraries;
// 164 Pointer to library headers
struct _XBE_LIBRARY *Libraries;
// 168 Pointer to kernel library header
struct _XBE_LIBRARY *KernelLibrary;
// 16C Pointer to XAPI library
struct _XBE_LIBRARY *XapiLibrary;
// 170 Pointer to logo bitmap (NULL = use default of Microsoft)
PVOID LogoBitmap;
// 174 Size of logo bitmap
ULONG LogoBitmapSize;
// 178
} XBE_HEADER, *PXBE_HEADER;
// Certificate structure
typedef struct _XBE_CERTIFICATE {
// 000 Size of certificate
ULONG Size;
// 004 Certificate timestamp (unknown format)
ULONG Timestamp;
// 008 Title ID
ULONG TitleId;
// 00C Name of the game (Unicode)
WCHAR TitleName[40];
// 05C Alternate title ID's (0-terminated)
ULONG AlternateTitleIds[16];
// 09C Allowed media types - 1 bit match between XBE and media = boots
ULONG MediaTypes;
// 0A0 Allowed game regions - 1 bit match between this and XBOX = boots
ULONG GameRegion;
// 0A4 Allowed game ratings - 1 bit match between this and XBOX = boots
ULONG GameRating;
// 0A8 Disk number (?)
ULONG DiskNumber;
// 0AC Version (?)
ULONG Version;
// 0B0 LAN key for this game
UCHAR LanKey[16];
// 0C0 Signature key for this game
UCHAR SignatureKey[16];
// 0D0 Signature keys for the alternate title ID's
UCHAR AlternateSignatureKeys[16][16];
// 1D0
} XBE_CERTIFICATE, *PXBE_CERTIFICATE;
// Section headers
typedef struct _XBE_SECTION {
// 000 Flags
ULONG Flags;
// 004 Virtual address (where this section loads in RAM)
PVOID VirtualAddress;
// 008 Virtual size (size of section in RAM; after FileSize it's 00'd)
ULONG VirtualSize;
// 00C File address (where in the file from which this section comes)
ULONG FileAddress;
// 010 File size (size of the section in the XBE file)
ULONG FileSize;
// 014 Pointer to section name
PCSZ SectionName;
// 018 Section reference count - when >= 1, section is loaded
LONG SectionReferenceCount;
// 01C Pointer to head shared page reference count
WORD *HeadReferenceCount;
// 020 Pointer to tail shared page reference count
WORD *TailReferenceCount;
// 024 SHA hash. Hash DWORD containing FileSize, then hash section.
DWORD ShaHash[5];
// 038
} XBE_SECTION, *PXBE_SECTION;
// TLS directory information needed later
// Library version data needed later
// Initialization flags
#define XBE_INIT_MOUNT_UTILITY 0x00000001
#define XBE_INIT_FORMAT_UTILITY 0x00000002
#define XBE_INIT_64M_RAM_ONLY 0x00000004
#define XBE_INIT_DONT_SETUP_HDD 0x00000008
// Region codes
#define XBE_REGION_US_CANADA 0x00000001
#define XBE_REGION_JAPAN 0x00000002
#define XBE_REGION_ELSEWHERE 0x00000004
#define XBE_REGION_DEBUG 0x80000000
// Media types
#define XBE_MEDIA_HDD 0x00000001
#define XBE_MEDIA_XBOX_DVD 0x00000002
#define XBE_MEDIA_ANY_CD_OR_DVD 0x00000004
#define XBE_MEDIA_CD 0x00000008
#define XBE_MEDIA_1LAYER_DVDROM 0x00000010
#define XBE_MEDIA_2LAYER_DVDROM 0x00000020
#define XBE_MEDIA_1LAYER_DVDR 0x00000040
#define XBE_MEDIA_2LAYER_DVDR 0x00000080
#define XBE_MEDIA_USB 0x00000100
#define XBE_MEDIA_ALLOW_UNLOCKED_HDD 0x40000000
// Section flags
#define XBE_SEC_WRITABLE 0x00000001
#define XBE_SEC_PRELOAD 0x00000002
#define XBE_SEC_EXECUTABLE 0x00000004
#define XBE_SEC_INSERTED_FILE 0x00000008
#define XBE_SEC_RO_HEAD_PAGE 0x00000010
#define XBE_SEC_RO_TAIL_PAGE 0x00000020
// x86 page size
#define PAGE_SIZE 0x1000
// Native NT API calls on the XBOX
// PAGE_ALIGN:
// Returns an address rounded down to the nearest page boundary.
//
// Differences from NT: None.
#define PAGE_ALIGN(Va) ((PVOID)((ULONG_PTR)(Va) & ~(PAGE_SIZE - 1)))
// RtlInitAnsiString:
// Fills an ANSI_STRING structure to use the specified string.
//
// Differences from NT: None.
NTSYSAPI
EXPORTNUM(289)
VOID
NTAPI
RtlInitAnsiString(
OUT PANSI_STRING DestinationString,
IN PCSZ SourceString
);
// NtCreateFile:
// Creates or opens a file or device object.
//
// Differences from NT: The EaBuffer and EaLength options are gone.
// OBJECT_ATTRIBUTES uses ANSI_STRING, so only ANSI filenames work.
NTSYSAPI
EXPORTNUM(190)
NTSTATUS
NTAPI
NtCreateFile(
OUT PHANDLE FileHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes,
OUT PIO_STATUS_BLOCK IoStatusBlock,
IN PLARGE_INTEGER AllocationSize OPTIONAL,
IN ULONG FileAttributes,
IN ULONG ShareAccess,
IN ULONG CreateDisposition,
IN ULONG CreateOptions
);
// NtOpenFile:
// Opens a file or device object. Same as calling:
// NtCreateFile(FileHandle, DesiredAccess, ObjectAttributes,
// IoStatusBlock, NULL, 0, ShareAccess, OPEN_EXISTING, OpenOptions);
//
// Differences from NT: See NtCreateFile.
NTSYSAPI
EXPORTNUM(202)
NTSTATUS
NTAPI
NtOpenFile(
OUT PHANDLE FileHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes,
OUT PIO_STATUS_BLOCK IoStatusBlock,
IN ULONG ShareAccess,
IN ULONG OpenOptions
);
// NtReadFile:
// Reads a file.
//
// Differences from NT: There is no Key parameter.
NTSYSAPI
EXPORTNUM(219)
NTSTATUS
NTAPI
NtReadFile(
IN HANDLE FileHandle,
IN HANDLE Event OPTIONAL,
IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
IN PVOID ApcContext OPTIONAL,
OUT PIO_STATUS_BLOCK IoStatusBlock,
OUT PVOID Buffer,
IN ULONG Length,
IN PLARGE_INTEGER ByteOffset
);
// NtWriteFile:
// Writes a file.
//
// Differences from NT: There is no Key parameter.
NTSYSAPI
EXPORTNUM(236)
NTSTATUS
NTAPI
NtWriteFile(
IN HANDLE FileHandle,
IN HANDLE Event OPTIONAL,
IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
IN PVOID ApcContext OPTIONAL,
OUT PIO_STATUS_BLOCK IoStatusBlock,
IN PVOID Buffer,
IN ULONG Length,
IN PLARGE_INTEGER ByteOffset
);
// NtQueryVolumeInformation:
// Queries information about a file system. This is not documented by
// Microsoft even under NT.
//
// Differences from NT: None known.
NTSYSAPI
EXPORTNUM(218)
NTSTATUS
NTAPI
NtQueryVolumeInformationFile(
IN HANDLE FileHandle,
OUT PIO_STATUS_BLOCK IoStatusBlock,
OUT PVOID VolumeInformation,
IN ULONG VolumeInformationLength,
IN FS_INFORMATION_CLASS VolumeInformationClass
);
// NtDeviceIoControl:
// Does an IOCTL on a device.
//
// Differences from NT: None known.
NTSYSAPI
EXPORTNUM(196)
NTSTATUS
NTAPI
NtDeviceIoControlFile(
IN HANDLE FileHandle,
IN HANDLE Event OPTIONAL,
IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
IN PVOID ApcContext OPTIONAL,
OUT PIO_STATUS_BLOCK IoStatusBlock,
IN ULONG IoControlCode,
IN PVOID InputBuffer OPTIONAL,
IN ULONG InputBufferLength,
OUT PVOID OutputBuffer OPTIONAL,
IN ULONG OutputBufferLength
);
// NtClose:
// Closes a file or other handle.
//
// Differences from NT: None.
NTSYSAPI
EXPORTNUM(187)
NTSTATUS
NTAPI
NtClose(
IN HANDLE Handle
);
// NtAllocateVirtualMemory:
// Allocates virtual memory.
//
// Differences from NT: There is no ProcessHandle parameter.
NTSYSAPI
EXPORTNUM(184)
NTSTATUS
NTAPI
NtAllocateVirtualMemory(
IN OUT PVOID *BaseAddress,
IN ULONG ZeroBits,
IN OUT PULONG AllocationSize,
IN ULONG AllocationType,
IN ULONG Protect
);
// NtFreeVirtualMemory:
// Frees virtual memory.
//
// Differences from NT: There is no ProcessHandle parameter.
NTSYSAPI
EXPORTNUM(199)
NTSTATUS
NTAPI
NtFreeVirtualMemory(
IN OUT PVOID *BaseAddress,
IN OUT PULONG FreeSize,
IN ULONG FreeType
);
// Kernel-level routines
// KeBugCheck:
// Bug checks the kernel.
// Same as KeBugCheckEx(BugCheckCode, 0, 0, 0, 0);
//
// Differences from NT: None, other than the reaction.
NTSYSAPI
EXPORTNUM(95)
VOID
NTAPI
KeBugCheck(
IN ULONG BugCheckCode
);
// KeBugCheckEx:
// Bug checks the kernel.
//
// Differences from NT: None, other than the reaction.
NTSYSAPI
EXPORTNUM(96)
VOID
NTAPI
KeBugCheckEx(
IN ULONG BugCheckCode,
IN ULONG_PTR BugCheckParameter1,
IN ULONG_PTR BugCheckParameter2,
IN ULONG_PTR BugCheckParameter3,
IN ULONG_PTR BugCheckParameter4
);
// KeInitializeDpc:
// Initializes a DPC structure.
//
// Differences from NT: This function sets less fields than the NT version.
NTSYSAPI
EXPORTNUM(107)
VOID
NTAPI
KeInitializeDpc(
IN PKDPC Dpc,
IN PKDEFERRED_ROUTINE DeferredRoutine,
IN PVOID DeferredContext
);
// KeInitializeTimerEx:
// Initializes a timer.
//
// Differences from NT: None.
NTSYSAPI
EXPORTNUM(113)
VOID
KeInitializeTimerEx(
IN OUT PKTIMER Timer,
IN TIMER_TYPE Type
);
// KeRaiseIrql:
// Raises IRQL to some value.
//
// Differences from NT: None.
#define KeRaiseIrql KfRaiseIrql
NTSYSAPI
EXPORTNUM(190)
VOID
__fastcall
KfRaiseIrql(
IN KIRQL NewIrql,
OUT PKIRQL OldIrql
);
// KeRaiseIrqlToDpcLevel:
// Raises IRQL to DISPATCH_LEVEL. Like KeRaiseIrql except returns old level directly.
//
// Differences from NT: None.
NTSYSAPI
EXPORTNUM(129)
KIRQL
NTAPI
KeRaiseIrqlToDpcLevel(
VOID
);
// KeLowerIrql:
// Lowers IRQL.
#define KeLowerIrql KfLowerIrql
NTSYSAPI
EXPORTNUM(161)
VOID
__fastcall
KfLowerIrql(
IN KIRQL NewIrql
);
// MmMapIoSpace:
// Maps a physical address area into the virtual address space.
// DO NOT USE MEMORY MAPPED WITH THIS AS A BUFFER TO OTHER CALLS. For
// example, don't WriteFile or NtWriteFile these buffers. Copy them first.
//
// Differences from NT: PhysicalAddress is 32 bit, not 64. ProtectionType
// specifies the page protections, but it's a Win32 PAGE_ macro instead
// of the normal NT enumeration. PAGE_READWRITE is probably what you
// want...
NTSYSAPI
EXPORTNUM(177)
PVOID
NTAPI
MmMapIoSpace(
IN PHYSICAL_ADDRESS PhysicalAddress,
IN ULONG NumberOfBytes,
IN ULONG ProtectionType
);
// MmGetPhysicalAddress:
// Translates a virtual address into a physical address.
//
// Differences from NT: PhysicalAddress is 32 bit, not 64.
NTSYSAPI
EXPORTNUM(173)
PHYSICAL_ADDRESS
NTAPI
MmGetPhysicalAddress(
IN PVOID BaseAddress
);
// MmUnmapIoSpace:
// Unmaps a virtual address mapping made by MmMapIoSpace.
//
// Differences from NT: None.
NTSYSAPI
EXPORTNUM(183)
PVOID
NTAPI
MmUnmapIoSpace(
IN PVOID BaseAddress,
IN ULONG NumberOfBytes
);
// MmAllocateContiguousMemory:
// Allocates a range of physically contiguous, cache-aligned memory from the
// non-paged pool (= main pool on XBOX).
//
// Differences from NT: HighestAcceptableAddress was deleted, opting instead
// to not care about the highest address.
NTSYSAPI
EXPORTNUM(165)
PVOID
NTAPI
MmAllocateContiguousMemory(
IN ULONG NumberOfBytes
);
// MmFreeContiguousMemory:
// Frees memory allocated with MmAllocateContiguousMemory.
//
// Differences from NT: None.
NTSYSAPI
EXPORTNUM(171)
VOID
NTAPI
MmFreeContiguousMemory(
IN PVOID BaseAddress
);
// DbgPrint
// Displays a message on the debugger.
//
// Differences from NT: Only how this information is displayed changed.
NTSYSAPI
EXPORTNUM(8)
ULONG
__cdecl
DbgPrint(
IN PCSZ Format,
...
);
// ExAllocatePoolWithTag:
// Allocates memory from the memory pool. The Tag parameter is a 4-letter
// character constant to which to associate the allocation.
//
// Differences from NT: There is no PoolType field, as the XBOX only has 1
// pool, the non-paged pool.
NTSYSAPI
EXPORTNUM(15)
PVOID
NTAPI
ExAllocatePoolWithTag(
IN SIZE_T NumberOfBytes,
IN ULONG Tag
);
// ExFreePool:
// Frees memory allocated by ExAllocatePool* functions.
//
// Differences from NT: None.
NTSYSAPI
EXPORTNUM(17)
VOID
NTAPI
ExFreePool(
IN PVOID P
);
// IoCreateSymbolicLink:
// Creates a symbolic link in the object namespace.
// NtCreateSymbolicLinkObject is much harder to use than this simple
// function, so just use this one.
//
// Differences from NT: Uses ANSI_STRING instead of UNICODE_STRING.
NTSYSAPI
EXPORTNUM(67)
NTSTATUS
NTAPI
IoCreateSymbolicLink(
IN PANSI_STRING SymbolicLinkName,
IN PANSI_STRING DeviceName
);
// IoDeleteSymbolicLink:
// Creates a symbolic link in the object namespace. Deleting symbolic links
// through the Nt* functions is a pain, so use this instead.
//
// Differences from NT: Uses ANSI_STRING instead of UNICODE_STRING.
NTSYSAPI
EXPORTNUM(69)
NTSTATUS
NTAPI
IoDeleteSymbolicLink(
IN PANSI_STRING SymbolicLinkName
);
// ObReferenceObjectByHandle:
// Turns a handle into a kernel object pointer. The ObjectType parameter
// specifies what type of object it is. This function also increments the
// object's reference count.
//
// Differences from NT: There are no DesiredAccess, AccessMode, or
// HandleInformation parameters.
NTSYSAPI
EXPORTNUM(246)
NTSTATUS
NTAPI
ObReferenceObjectByHandle(
IN HANDLE Handle,
IN POBJECT_TYPE ObjectType OPTIONAL,
OUT PVOID *Object
);
// ObfReferenceObject/ObReferenceObject:
// Increments the object's reference count.
//
// Differences from NT: None.
#define ObReferenceObject(Object) ObfReferenceObject(Object)
NTSYSAPI
EXPORTNUM(251)
VOID
FASTCALL
ObfReferenceObject(
IN PVOID Object
);
// ObfDereferenceObject/ObDereferenceObject:
// Decrements the object's reference count, deleting it if it is now unused.
//
// Differences from NT: None.
#define ObDereferenceObject(a) ObfDereferenceObject(a)
NTSYSAPI
EXPORTNUM(250)
VOID
FASTCALL
ObfDereferenceObject(
IN PVOID Object
);
// PsTerminateSystemThread:
// Exits the current system thread. Must be called from a system thread.
//
// Differences from NT: None.
NTSYSAPI
EXPORTNUM(258)
__declspec(noreturn)
NTSTATUS
PsTerminateSystemThread(
NTSTATUS ExitCode
);
// Kernel routines only in the XBOX
// IoSynchronousDeviceIoControlRequest:
// NICE. Makes kernel driver stuff sooooo much easier. This does a
// blocking IOCTL on the specified device.
//
// New to the XBOX.
NTSYSAPI
EXPORTNUM(84)
NTSTATUS
NTAPI
IoSynchronousDeviceIoControlRequest(
IN ULONG IoControlCode,
IN PDEVICE_OBJECT DeviceObject,
IN PVOID InputBuffer OPTIONAL,
IN ULONG InputBufferLength,
OUT PVOID OutputBuffer OPTIONAL,
IN ULONG OutputBufferLength,
OUT PDWORD unknown_use_zero OPTIONAL,
IN BOOLEAN InternalDeviceIoControl
);
// ExQueryNonVolatileSettings
// Queries saved information, such as the region code.
//
// New to the XBOX.
NTSYSAPI
EXPORTNUM(24)
NTSTATUS
NTAPI
ExQueryNonVolatileSetting(
IN ULONG ValueIndex,
OUT PULONG Type,
OUT PVOID Value,
IN ULONG ValueLength,
OUT PULONG ResultLength OPTIONAL
);
// ExSaveNonVolatileSettings
// Writes saved information, such as the region code.
//
// New to the XBOX.
NTSYSAPI
EXPORTNUM(29)
NTSTATUS
NTAPI
ExSaveNonVolatileSetting(
IN ULONG ValueIndex,
IN PULONG Type OPTIONAL,
IN PVOID Value,
IN ULONG ValueLength
);
// HalEnableSecureTrayEject:
// Notifies the SMBUS that ejecting the DVD-ROM should not reset the system.
// Note that this function can't really be called directly...
//
// New to the XBOX.
NTSYSAPI
EXPORTNUM(365)
VOID
NTAPI
HalEnableSecureTrayEject(
VOID
);
// XeLoadSection:
// Adds one to the reference count of the specified section and loads if the
// count is now above zero.
//
// New to the XBOX.
NTSYSAPI
EXPORTNUM(327)
NTSTATUS
NTAPI
XeLoadSection(
IN OUT PXBE_SECTION section
);
// XeUnloadSection:
// Subtracts one from the reference count of the specified section and loads
// if the count is now below zero.
//
// New to the XBOX.
NTSYSAPI
EXPORTNUM(328)
NTSTATUS
NTAPI
XeUnloadSection(
IN OUT PXBE_SECTION section
);
// RtlRip:
// Traps to the debugger with a certain message, then crashes.
//
// New to the XBOX.
NTSYSAPI
EXPORTNUM(352)
VOID
NTAPI
RtlRip(
IN PCSZ Part1,
IN PCSZ Part2,
IN PCSZ Part3
);
// PsCreateSystemThread:
// Creates a system thread. Same as:
// PsCreateSystemThreadEx(ThreadHandle, NULL, 0x3000, 0, ThreadId, StartContext1,
// StartContext2, FALSE, DebugStack, PspSystemThreadStartup);
//
// New to the XBOX. (It is too different from NT to be considered the same)
NTSYSAPI
EXPORTNUM(254)
NTSTATUS
NTAPI
PsCreateSystemThread(
OUT PHANDLE ThreadHandle,
OUT PULONG ThreadId OPTIONAL,
IN PVOID StartContext1,
IN PVOID StartContext2,
IN BOOLEAN DebugStack
);
// PsCreateSystemThreadEx:
// Creates a system thread.
// ThreadHandle: Receives the thread handle
// ObjectAttributes: Unsure how this works (everything I've seen uses NULL)
// KernelStackSize: Size of the allocation for both stack and TLS data
// TlsDataSize: Size within KernelStackSize to use as TLS data
// ThreadId: Receives the thread ID number
// StartContext1: Parameter 1 to StartRoutine
// StartContext2: Parameter 2 to StartRoutine
// CreateSuspended: TRUE to create the thread as a suspended thread
// DebugStack: TRUE to allocate the stack from Debug Kit memory
// StartRoutine: Called when the thread is created
//
// New to the XBOX.
NTSYSAPI
EXPORTNUM(255)
NTSTATUS
NTAPI
PsCreateSystemThreadEx(
OUT PHANDLE ThreadHandle,
IN PVOID ObjectAttributes OPTIONAL,
IN ULONG KernelStackSize,
IN ULONG TlsDataSize,
OUT PULONG ThreadId OPTIONAL,
IN PVOID StartContext1,
IN PVOID StartContext2,
IN BOOLEAN CreateSuspended,
IN BOOLEAN DebugStack,
IN PKSTART_ROUTINE StartRoutine
);
// Error codes
#define STATUS_SUCCESS 0x00000000
#define STATUS_UNSUCCESSFUL 0xC0000001
#define STATUS_UNRECOGNIZED_MEDIA 0xC0000014
// The SCSI input buffer was too large (not necessarily an error!)
#define STATUS_DATA_OVERRUN 0xC000003C
#define STATUS_INVALID_IMAGE_FORMAT 0xC000007B
#define STATUS_INSUFFICIENT_RESOURCES 0xC000009A
#define STATUS_TOO_MANY_SECRETS 0xC0000156
#define STATUS_REGION_MISMATCH 0xC0050001
// End extern "C" for C++
#if defined(__cplusplus) && !defined(XBOXINTERNAL_NO_EXTERN_C)
};
#endif // __cplusplus
#include <poppack.h>
// Thanks and credit go to Team Evox
typedef struct
{
DWORD Data_00; // Check Block Start
DWORD Data_04;
DWORD Data_08;
DWORD Data_0c;
DWORD Data_10; // Check Block End
DWORD V1_IP; // 0x14
DWORD V1_Subnetmask; // 0x18
DWORD V1_Defaultgateway; // 0x1c
DWORD V1_DNS1; // 0x20
DWORD V1_DNS2; // 0x24
DWORD Data_28; // Check Block Start
DWORD Data_2c;
DWORD Data_30;
DWORD Data_34;
DWORD Data_38; // Check Block End
DWORD V2_Tag; // V2 Tag "XBV2"
DWORD Flag; // 0x40
DWORD Data_44;
DWORD V2_IP; // 0x48
DWORD V2_Subnetmask; // 0x4c
DWORD V2_Defaultgateway; // 0x50
DWORD V2_DNS1; // 0x54
DWORD V2_DNS2; // 0x58
DWORD Data_xx[0x200-0x5c];
} TXNetConfigParams,*PTXNetConfigParams;
extern "C"
{
// Thanks and credit go to Woodoo
extern VOID WINAPI HalInitiateShutdown(VOID);
extern VOID WINAPI HalWriteSMBusValue(BYTE, BYTE, BOOL, BYTE);
extern VOID WINAPI HalReadSMCTrayState(DWORD* state, DWORD* count);
// Thanks and credit go to Team Evox
extern VOID WINAPI HalReturnToFirmware(DWORD);
extern INT WINAPI XNetLoadConfigParams(LPBYTE);
extern INT WINAPI XNetSaveConfigParams(LPBYTE);
extern INT WINAPI XWriteTitleInfoNoReboot(LPVOID,LPVOID,DWORD,DWORD,LPVOID);
extern DWORD* LaunchDataPage;
}
#endif // __XBOX_INTERNAL_H__