Started logging some flags (#37)

This commit is contained in:
PatrickvL 2016-12-19 17:32:09 +01:00 committed by Luke Usher
parent 399e5180fb
commit 4165ea2766
6 changed files with 194 additions and 101 deletions

View File

@ -159,6 +159,11 @@ extern thread_local std::string _logPrefix;
_had_arg = true; \
msg << "\n " << std::setw(25) << std::left << std::setfill(' ') << #arg << " : " << _log_sanitize(arg);
// LOG_FUNC_ARG_TYPE writes output using the overloaded << operator of the given type
#define LOG_FUNC_ARG_TYPE(type, arg) \
_had_arg = true; \
msg << "\n " << std::setw(25) << std::left << std::setfill(' ') << #arg << " : " << (type)arg;
// LOG_FUNC_ARG_OUT prevents expansion of types, by only rendering as a pointer
#define LOG_FUNC_ARG_OUT(arg) \
_had_arg = true; \
@ -177,6 +182,7 @@ extern thread_local std::string _logPrefix;
#else
#define LOG_FUNC_BEGIN
#define LOG_FUNC_ARG(arg)
#define LOG_FUNC_ARG_TYPE(type, arg)
#define LOG_FUNC_ARG_OUT(arg)
#define LOG_FUNC_END
#define LOG_FUNC_RESULT(r)

View File

@ -43,6 +43,7 @@
#include <ntstatus.h>
#pragma warning(default:4005)
#include "CxbxKrnl.h"
//#include "Logging.h" // For hex4()
std::string DriveSerial = "\\??\\serial:";
std::string DriveCdRom0 = "\\??\\CdRom0:"; // CD-ROM device
@ -498,6 +499,15 @@ EmuNtSymbolicLinkObject* FindNtSymbolicLinkObjectByRootHandle(const HANDLE Handl
}
// TODO : Move to a better suited file
/* TODO : Also, fix C2593: "'operator <<' is ambiguous" for this
std::ostream& operator<<(std::ostream& os, const NtDll::NTSTATUS& value)
{
os << hex4((uint32_t)value) << " = " << NtStatusToString(value);
return os;
}
*/
// TODO : Create (and use) an Xbox version of this too
CHAR* NtStatusToString(IN NTSTATUS Status)
{

View File

@ -55,6 +55,9 @@ namespace NtDll
#include "Emu.h"
// TODO : Move to a better suited file
//std::ostream& operator<<(std::ostream& os, const NtDll::NTSTATUS& value);
extern std::string DriveSerial;
extern std::string DriveCdRom0;
extern std::string DriveMbfs;

View File

@ -88,8 +88,8 @@ XBSYSAPI EXPORTNUM(66) xboxkrnl::NTSTATUS NTAPI xboxkrnl::IoCreateFile
LOG_FUNC_ARG(AllocationSize)
LOG_FUNC_ARG(FileAttributes)
LOG_FUNC_ARG(ShareAccess)
LOG_FUNC_ARG(Disposition)
LOG_FUNC_ARG(CreateOptions)
LOG_FUNC_ARG_TYPE(CREATE_DISPOSITION, Disposition)
LOG_FUNC_ARG_TYPE(CREATE_OPTION, CreateOptions)
LOG_FUNC_ARG(Options)
LOG_FUNC_END;

View File

@ -62,10 +62,23 @@ std::ostream& operator<<(std::ostream& os, const PULONG& value)
return os;
}
// Macro for implementation of rendering any Enum-ToString :
#define LOGRENDER_ENUM(EnumType) LOGRENDER_HEADER(EnumType) \
{ return os << "("#EnumType") " << EnumType##ToString(value) << " = " << hex4((int)value); }
// Macro's for Xbox Enum-ToString conversions :
#define ENUM2STR_START(EnumType) const char * EnumType##ToString(const xboxkrnl::EnumType value) { switch (value) {
#define ENUM2STR_CASE(a) case xboxkrnl::a: return #a;
// ENUM2STR_CASE_DEF is needed for #define'd symbols
#define ENUM2STR_CASE_DEF(a) case a: return #a;
#define ENUM2STR_END(EnumType) default: return "Unknown_"#EnumType; } }
#define ENUM2STR_END_and_LOGRENDER(EnumType) ENUM2STR_END(EnumType) LOGRENDER_ENUM(EnumType)
// Macro's for Xbo Flags-ToString conversions :
#define FLAGS2STR_START(Type) std::string Type##ToString(const xboxkrnl::Type value) { std::string res;
#define FLAG2STR(f) if (((uint32)value & f) == f) res = res + #f"|";
#define FLAGS2STR_END if (!res.empty()) res.pop_back(); return res; }
#define FLAGS2STR_END_and_LOGRENDER(Type) FLAGS2STR_END LOGRENDER_ENUM(Type)
// Xbox Enum-ToString conversions :
@ -84,7 +97,51 @@ ENUM2STR_START(BUS_DATA_TYPE)
ENUM2STR_CASE(PNPISAConfiguration)
ENUM2STR_CASE(SgiInternalConfiguration)
ENUM2STR_CASE(MaximumBusDataType)
ENUM2STR_END(BUS_DATA_TYPE)
ENUM2STR_END_and_LOGRENDER(BUS_DATA_TYPE)
ENUM2STR_START(CREATE_DISPOSITION)
ENUM2STR_CASE_DEF(FILE_SUPERSEDE)
ENUM2STR_CASE_DEF(FILE_OPEN)
ENUM2STR_CASE_DEF(FILE_CREATE)
ENUM2STR_CASE_DEF(FILE_OPEN_IF)
ENUM2STR_CASE_DEF(FILE_OVERWRITE)
ENUM2STR_CASE_DEF(FILE_OVERWRITE_IF)
// ENUM2STR_CASE_DEF(FILE_MAXIMUM_DISPOSITION) Skip, identical to FILE_OVERWRITE_IF
ENUM2STR_END_and_LOGRENDER(CREATE_DISPOSITION)
FLAGS2STR_START(CREATE_OPTION)
/*
#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
#define FILE_COPY_STRUCTURED_STORAGE 0x00000041
#define FILE_STRUCTURED_STORAGE 0x00000441
*/
FLAG2STR(FILE_DIRECTORY_FILE)
FLAG2STR(FILE_WRITE_THROUGH)
FLAG2STR(FILE_SEQUENTIAL_ONLY)
FLAG2STR(FILE_NO_INTERMEDIATE_BUFFERING)
FLAG2STR(FILE_SYNCHRONOUS_IO_ALERT)
FLAG2STR(FILE_SYNCHRONOUS_IO_NONALERT)
FLAG2STR(FILE_NON_DIRECTORY_FILE)
FLAG2STR(FILE_CREATE_TREE_CONNECTION)
FLAG2STR(FILE_COMPLETE_IF_OPLOCKED)
FLAG2STR(FILE_NON_DIRECTORY_FILE)
FLAG2STR(FILE_NO_EA_KNOWLEDGE)
FLAG2STR(FILE_OPEN_FOR_RECOVERY)
FLAG2STR(FILE_RANDOM_ACCESS)
FLAG2STR(FILE_DELETE_ON_CLOSE)
FLAG2STR(FILE_OPEN_BY_FILE_ID)
FLAG2STR(FILE_OPEN_FOR_BACKUP_INTENT)
FLAG2STR(FILE_NO_COMPRESSION)
FLAG2STR(FILE_RESERVE_OPFILTER)
FLAG2STR(FILE_OPEN_REPARSE_POINT)
FLAG2STR(FILE_OPEN_NO_RECALL)
FLAG2STR(FILE_OPEN_FOR_FREE_SPACE_QUERY)
FLAGS2STR_END_and_LOGRENDER(CREATE_OPTION)
ENUM2STR_START(EEPROM_INDEX)
ENUM2STR_CASE(EEPROM_LANGUAGE)
@ -108,12 +165,12 @@ ENUM2STR_START(EEPROM_INDEX)
ENUM2STR_CASE(EEPROM_MAX_FACTORY)
ENUM2STR_CASE(EEPROM_ENCRYPTED_SECTION)
ENUM2STR_CASE(EEPROM_MAX_ALL)
ENUM2STR_END(EEPROM_INDEX)
ENUM2STR_END_and_LOGRENDER(EEPROM_INDEX)
ENUM2STR_START(EVENT_TYPE)
ENUM2STR_CASE(NotificationEvent)
ENUM2STR_CASE(SynchronizationEvent)
ENUM2STR_END(EVENT_TYPE)
ENUM2STR_END_and_LOGRENDER(EVENT_TYPE)
ENUM2STR_START(FILE_INFORMATION_CLASS)
ENUM2STR_CASE(FileDirectoryInformation)
@ -157,7 +214,7 @@ ENUM2STR_START(FILE_INFORMATION_CLASS)
ENUM2STR_CASE(FileInheritContentIndexInformation)
ENUM2STR_CASE(FileOleInformation)
ENUM2STR_CASE(FileMaximumInformation)
ENUM2STR_END(FILE_INFORMATION_CLASS)
ENUM2STR_END_and_LOGRENDER(FILE_INFORMATION_CLASS)
ENUM2STR_START(FS_INFORMATION_CLASS)
ENUM2STR_CASE(FileFsVolumeInformation)
@ -169,12 +226,12 @@ ENUM2STR_START(FS_INFORMATION_CLASS)
ENUM2STR_CASE(FileFsFullSizeInformation)
ENUM2STR_CASE(FileFsObjectIdInformation)
ENUM2STR_CASE(FileFsMaximumInformation)
ENUM2STR_END(FS_INFORMATION_CLASS)
ENUM2STR_END_and_LOGRENDER(FS_INFORMATION_CLASS)
ENUM2STR_START(KINTERRUPT_MODE)
ENUM2STR_CASE(LevelSensitive)
ENUM2STR_CASE(Latched)
ENUM2STR_END(KINTERRUPT_MODE)
ENUM2STR_END_and_LOGRENDER(KINTERRUPT_MODE)
ENUM2STR_START(KWAIT_REASON)
ENUM2STR_CASE(Executive)
@ -205,17 +262,38 @@ ENUM2STR_START(KWAIT_REASON)
ENUM2STR_CASE(Spare6)
ENUM2STR_CASE(WrKernel)
ENUM2STR_CASE(MaximumWaitReason)
ENUM2STR_END(KWAIT_REASON)
ENUM2STR_END_and_LOGRENDER(KWAIT_REASON)
ENUM2STR_START(KOBJECTS)
ENUM2STR_CASE(DpcObject)
ENUM2STR_END(KOBJECTS)
ENUM2STR_END_and_LOGRENDER(KOBJECTS)
ENUM2STR_START(MODE)
ENUM2STR_CASE(KernelMode)
ENUM2STR_CASE(UserMode)
ENUM2STR_CASE(MaximumMode)
ENUM2STR_END(MODE)
ENUM2STR_END_and_LOGRENDER(MODE)
/* TODO : Fix error C2593 "'operator <<' is ambiguous",
// because often NtDLL::NTSTATUS is used instead of xboxkrnl::NTSTATUS
ENUM2STR_START(NTSTATUS) // Not really an enum
ENUM2STR_CASE(STATUS_SUCCESS)
ENUM2STR_CASE(STATUS_PENDING)
ENUM2STR_CASE(STATUS_TIMER_RESUME_IGNORED)
ENUM2STR_CASE(STATUS_UNSUCCESSFUL)
ENUM2STR_CASE(STATUS_UNRECOGNIZED_MEDIA)
ENUM2STR_CASE(STATUS_NO_MEMORY)
ENUM2STR_CASE(STATUS_ALERTED)
ENUM2STR_CASE(STATUS_USER_APC)
ENUM2STR_CASE(STATUS_DATA_OVERRUN)
ENUM2STR_CASE(STATUS_INVALID_IMAGE_FORMAT)
ENUM2STR_CASE(STATUS_INSUFFICIENT_RESOURCES)
ENUM2STR_CASE(STATUS_XBE_REGION_MISMATCH)
ENUM2STR_CASE(STATUS_XBE_MEDIA_MISMATCH)
ENUM2STR_CASE(STATUS_OBJECT_NAME_NOT_FOUND)
ENUM2STR_CASE(STATUS_OBJECT_NAME_COLLISION)
ENUM2STR_END_and_LOGRENDER(NTSTATUS)
*/
ENUM2STR_START(RETURN_FIRMWARE)
ENUM2STR_CASE(ReturnFirmwareHalt)
@ -224,40 +302,23 @@ ENUM2STR_START(RETURN_FIRMWARE)
ENUM2STR_CASE(ReturnFirmwareHard)
ENUM2STR_CASE(ReturnFirmwareFatal)
ENUM2STR_CASE(ReturnFirmwareAll)
ENUM2STR_END(RETURN_FIRMWARE)
ENUM2STR_END_and_LOGRENDER(RETURN_FIRMWARE)
ENUM2STR_START(TIMER_TYPE)
ENUM2STR_CASE(NotificationTimer)
ENUM2STR_CASE(SynchronizationTimer)
ENUM2STR_END(TIMER_TYPE)
ENUM2STR_END_and_LOGRENDER(TIMER_TYPE)
ENUM2STR_START(WAIT_TYPE)
ENUM2STR_CASE(WaitAll)
ENUM2STR_CASE(WaitAny)
ENUM2STR_END(WAIT_TYPE)
ENUM2STR_END_and_LOGRENDER(WAIT_TYPE)
// Macro for implementation of rendering EnumToString :
#define LOGRENDER_ENUM(EnumType) LOGRENDER_HEADER(EnumType) \
{ return os << "("#EnumType") " << EnumType##ToString(value) << " = " << hex4((int)value); }
// Xbox enum renderers :
LOGRENDER_ENUM(BUS_DATA_TYPE)
LOGRENDER_ENUM(EEPROM_INDEX)
LOGRENDER_ENUM(EVENT_TYPE)
LOGRENDER_ENUM(FILE_INFORMATION_CLASS)
LOGRENDER_ENUM(FS_INFORMATION_CLASS)
LOGRENDER_ENUM(KINTERRUPT_MODE)
LOGRENDER_ENUM(KWAIT_REASON)
LOGRENDER_ENUM(KOBJECTS)
LOGRENDER_ENUM(MODE)
LOGRENDER_ENUM(RETURN_FIRMWARE)
LOGRENDER_ENUM(TIMER_TYPE)
LOGRENDER_ENUM(WAIT_TYPE)
#undef ENUM_START
#undef ENUM_CASE
#undef ENUM_END
#undef RENDER_ENUM
#undef ENUM2STR_START
#undef ENUM2STR_CASE
#undef ENUM2STR_END
#undef ENUM2STR_END_and_LOGRENDER
#undef LOGRENDER_ENUM
#define LOGRENDER_MEMBER(Member) << "\n ."#Member": " << value.Member
@ -280,6 +341,14 @@ LOGRENDER_HEADER(P##Type) \
LOGRENDER_HEADER(Type) \
// Render Xbox types :
LOGRENDER_TYPE(FILETIME)
{
return os
LOGRENDER_MEMBER(dwLowDateTime)
LOGRENDER_MEMBER(dwHighDateTime);
}
LOGRENDER_TYPE(LARGE_INTEGER)
{
return os

View File

@ -40,6 +40,10 @@
namespace xboxkrnl
{
#include <xboxkrnl/xboxkrnl.h>
// Additional types, exclusively for logging :
typedef enum CREATE_DISPOSITION;
typedef enum CREATE_OPTION;
};
@ -47,70 +51,6 @@ namespace xboxkrnl
#include <sstream> // for std::ostream
//?#include "Logging.h"
// TODO : Implement renderers for each usage of these types (and/or (P/LP) pointers to them)...
//
// TODO : xboxkrnl::ANSI_STRING
// TODO : xboxkrnl::DEVICE_OBJECT
// TODO : xboxkrnl::DISPATCHER_HEADER
// TODO : xboxkrnl::DVDX2_AUTHENTICATION
// TODO : xboxkrnl::DVDX2_AUTHENTICATION_PAGE
// TODO : xboxkrnl::ERWLOCK
// TODO : xboxkrnl::ETHREAD
// TODO : xboxkrnl::EXCEPTION_RECORD
// TODO : xboxkrnl::FILE_DIRECTORY_INFORMATION
// TODO : xboxkrnl::FILE_FS_SIZE_INFORMATION
// TODO : xboxkrnl::FILETIME
// TODO : xboxkrnl::IO_STATUS_BLOCK / xboxkrnl::PIO_STATUS_BLOCK ->u1.Pointer, ->Information
// TODO : xboxkrnl::KDEVICE_QUEUE
// TODO : xboxkrnl::KDPC
// TODO : xboxkrnl::KEVENT
// TODO : xboxkrnl::KINTERRUPT
// TODO : xboxkrnl::KIRQL
// TODO : xboxkrnl::KPCR
// TODO : xboxkrnl::KPRCB
// TODO : xboxkrnl::KPROCESSOR_MODE
// TODO : xboxkrnl::KSEMAPHORE
// TODO : xboxkrnl::KSPIN_LOCK
// TODO : xboxkrnl::KSYSTEM_TIME
// TODO : xboxkrnl::KTHREAD
// TODO : xboxkrnl::KTIMER /xboxkrnl::PKTIMER
// TODO : xboxkrnl::LAUNCH_DATA_HEADER
// TODO : xboxkrnl::LAUNCH_DATA_PAGE
// TODO : xboxkrnl::LIST_ENTRY
// TODO : xboxkrnl::LPCCH
// TODO : xboxkrnl::LPCSTR
// TODO : xboxkrnl::LPCWSTR
// TODO : xboxkrnl::MEMORY_BASIC_INFORMATION
// TODO : xboxkrnl::MM_STATISTICS
// TODO : xboxkrnl::MODE_PARAMETER_HEADER10
// TODO : xboxkrnl::NT_TIB
// TODO : xboxkrnl::NTSTATUS
// TODO : xboxkrnl::OBJECT_ATTRIBUTES
// TODO : xboxkrnl::OBJECT_STRING
// TODO : xboxkrnl::OBJECT_TYPE
// TODO : xboxkrnl::PCI_COMMON_CONFIG
// TODO : xboxkrnl::PCI_SLOT_NUMBER
// TODO : xboxkrnl::PCHAR
// TODO : xboxkrnl::PKDEFERRED_ROUTINE
// TODO : xboxkrnl::PKDPC
// TODO : xboxkrnl::PKINTERRUPT
// TODO : xboxkrnl::PKSERVICE_ROUTINE
// TODO : xboxkrnl::PXDEVICE_PREALLOC_TYPE
// TODO : xboxkrnl::PXINPUT_CAPABILITIES
// TODO : xboxkrnl::PXINPUT_STATE
// TODO : xboxkrnl::PXPP_DEVICE_TYPE
// TODO : xboxkrnl::PXTHREAD_NOTIFICATION -> pfnNotifyRoutine
// TODO : xboxkrnl::RTL_CRITICAL_SECTION
// TODO : xboxkrnl::SCSI_PASS_THROUGH_DIRECT
// TODO : xboxkrnl::SINGLE_LIST_ENTRY
// TODO : xboxkrnl::SLIST_HEADER
// TODO : xboxkrnl::STRING
// TODO : xboxkrnl::TIME_FIELDS
// TODO : xboxkrnl::UCHAR
// TODO : xboxkrnl::ULARGE_INTEGER
// TODO : xboxkrnl::XBOX_HARDWARE_INFO
// TODO : xboxkrnl::XBOX_REFURB_INFO
// Headers for rendering non-Xbox types :
std::ostream& operator<<(std::ostream& os, const PULONG& value);
@ -118,7 +58,10 @@ std::ostream& operator<<(std::ostream& os, const PULONG& value);
#define LOGRENDER_HEADER(Type) std::ostream& operator<<(std::ostream& os, const xboxkrnl::Type& value)
// Headers for rendering Xbox enum types :
LOGRENDER_HEADER(BUS_DATA_TYPE);
LOGRENDER_HEADER(CREATE_DISPOSITION); // Not really an enum
LOGRENDER_HEADER(CREATE_OPTION); // Not really an enum
LOGRENDER_HEADER(EEPROM_INDEX);
LOGRENDER_HEADER(EVENT_TYPE);
LOGRENDER_HEADER(FILE_INFORMATION_CLASS);
@ -127,6 +70,7 @@ LOGRENDER_HEADER(KINTERRUPT_MODE);
LOGRENDER_HEADER(KWAIT_REASON);
LOGRENDER_HEADER(KOBJECTS);
LOGRENDER_HEADER(MODE);
//LOGRENDER_HEADER(NTSTATUS); // Not really an enum
LOGRENDER_HEADER(RETURN_FIRMWARE);
LOGRENDER_HEADER(TIMER_TYPE);
LOGRENDER_HEADER(WAIT_TYPE);
@ -138,13 +82,74 @@ LOGRENDER_HEADER(BOOLEAN);
#define LOGRENDER_HEADERS(Type) LOGRENDER_HEADER(Type); LOGRENDER_HEADER(P##Type)
// Headers for rendering functions of Xbox type and pointer-to-type :
// TODO : Implement renderers for each usage of these types (and/or (P/LP) pointers to them)...
//
// TODO : LOGRENDER_HEADER(DEVICE_OBJECT);
// TODO : LOGRENDER_HEADER(DISPATCHER_HEADER);
// TODO : LOGRENDER_HEADER(DVDX2_AUTHENTICATION);
// TODO : LOGRENDER_HEADER(DVDX2_AUTHENTICATION_PAGE);
// TODO : LOGRENDER_HEADER(ERWLOCK);
// TODO : LOGRENDER_HEADER(ETHREAD);
// TODO : LOGRENDER_HEADER(EXCEPTION_RECORD);
LOGRENDER_HEADERS(FILETIME);
// TODO : LOGRENDER_HEADER(FILE_DIRECTORY_INFORMATION);
// TODO : LOGRENDER_HEADER(FILE_FS_SIZE_INFORMATION);
// TODO : LOGRENDER_HEADER(IO_STATUS_BLOCK); // LOGRENDER_HEADER(PIO_STATUS_BLOCK ->u1.Pointer, ->Information
// TODO : LOGRENDER_HEADER(KDEVICE_QUEUE);
// TODO : LOGRENDER_HEADER(KDPC);
// TODO : LOGRENDER_HEADER(KEVENT);
// TODO : LOGRENDER_HEADER(KINTERRUPT);
// TODO : LOGRENDER_HEADER(KIRQL);
// TODO : LOGRENDER_HEADER(KPCR);
// TODO : LOGRENDER_HEADER(KPRCB);
// TODO : LOGRENDER_HEADER(KPROCESSOR_MODE);
// TODO : LOGRENDER_HEADER(KSEMAPHORE);
// TODO : LOGRENDER_HEADER(KSPIN_LOCK);
// TODO : LOGRENDER_HEADER(KSYSTEM_TIME);
// TODO : LOGRENDER_HEADER(KTHREAD);
// TODO : LOGRENDER_HEADER(KTIMER);
LOGRENDER_HEADERS(LARGE_INTEGER);
// TODO : LOGRENDER_HEADER(LAUNCH_DATA_HEADER);
// TODO : LOGRENDER_HEADER(LAUNCH_DATA_PAGE);
// TODO : LOGRENDER_HEADER(LIST_ENTRY);
// TODO : LOGRENDER_HEADER(LPCCH);
// TODO : LOGRENDER_HEADER(LPCSTR);
// TODO : LOGRENDER_HEADER(LPCWSTR);
// TODO : LOGRENDER_HEADER(MEMORY_BASIC_INFORMATION);
LOGRENDER_HEADERS(MM_STATISTICS);
// TODO : LOGRENDER_HEADER(MODE_PARAMETER_HEADER10);
// TODO : LOGRENDER_HEADER(NT_TIB);
// TODO : LOGRENDER_HEADER(NTSTATUS);
LOGRENDER_HEADERS(OBJECT_ATTRIBUTES);
LOGRENDER_HEADERS(STRING);
// TODO : LOGRENDER_HEADER(OBJECT_STRING);
// TODO : LOGRENDER_HEADER(OBJECT_TYPE);
// TODO : LOGRENDER_HEADER(PCI_COMMON_CONFIG);
// TODO : LOGRENDER_HEADER(PCI_SLOT_NUMBER);
// TODO : LOGRENDER_HEADER(PCHAR);
// TODO : LOGRENDER_HEADER(PKDEFERRED_ROUTINE);
// TODO : LOGRENDER_HEADER(PKDPC);
// TODO : LOGRENDER_HEADER(PKINTERRUPT);
// TODO : LOGRENDER_HEADER(PKSERVICE_ROUTINE);
// TODO : LOGRENDER_HEADER(PXDEVICE_PREALLOC_TYPE);
// TODO : LOGRENDER_HEADER(PXINPUT_CAPABILITIES);
// TODO : LOGRENDER_HEADER(PXINPUT_STATE);
// TODO : LOGRENDER_HEADER(PXPP_DEVICE_TYPE);
// TODO : LOGRENDER_HEADER(PXTHREAD_NOTIFICATION); // -> pfnNotifyRoutine
// TODO : LOGRENDER_HEADER(RTL_CRITICAL_SECTION);
// TODO : LOGRENDER_HEADER(SCSI_PASS_THROUGH_DIRECT);
// TODO : LOGRENDER_HEADER(SINGLE_LIST_ENTRY);
// TODO : LOGRENDER_HEADER(SLIST_HEADER);
LOGRENDER_HEADERS(STRING); // Alias ANSI_STRING
// TODO : LOGRENDER_HEADER(TIME_FIELDS);
// TODO : LOGRENDER_HEADER(UCHAR);
// TODO : LOGRENDER_HEADER(ULARGE_INTEGER);
LOGRENDER_HEADERS(UNICODE_STRING);
// TODO : LOGRENDER_HEADER(XBOX_HARDWARE_INFO);
// TODO : LOGRENDER_HEADER(XBOX_REFURB_INFO);
#undef LOGRENDER_HEADERS
// Don't #undef LOGRENDER_HEADER, because it's used in EmuKrnlLogging.cpp
#endif _EMU_KERNEL_LOGGING_H