Argument logging now works

Experimenting with rendering specific types, it's starting to look good.
This commit is contained in:
PatrickvL 2016-11-11 15:17:29 +01:00
parent 4f7a233391
commit ef37bc8ad2
3 changed files with 90 additions and 77 deletions

View File

@ -32,52 +32,10 @@
// * // *
// ****************************************************************** // ******************************************************************
#include <Windows.h>
#include "Logging.h" #include "Logging.h"
//#include "EmuNtDll.h"
// For thread_local, see : http://en.cppreference.com/w/cpp/language/storage_duration // For thread_local, see : http://en.cppreference.com/w/cpp/language/storage_duration
thread_local const DWORD _CurrentThreadId = GetCurrentThreadId(); thread_local const DWORD _CurrentThreadId = GetCurrentThreadId();
// TODO : Use Boost.Format http://www.boost.org/doc/libs/1_53_0/libs/format/index.html // TODO : Use Boost.Format http://www.boost.org/doc/libs/1_53_0/libs/format/index.html
thread_local std::string _logPrefix; thread_local std::string _logPrefix;
std::ostream& operator<<(std::ostream& os, const LARGE_INTEGER& value)
{
return os << value.QuadPart;
}
//std::ostream& operator<<(std::ostream& os, const LPCSTR& value);
std::ostream& operator<<(std::ostream& os, const PULONG& value)
{
os << "0x" << (void*)value;
if (value)
os << " (->0x" << (void*)*value << ")";
return os;
}
// std::ostream& operator<<(std::ostream& os, const PMM_STATISTICS& value); // ->Length
// std::ostream& operator<<(std::ostream& os, const POBJECT_ATTRIBUTES& value); // ->ObjectName->Buffer
// std::ostream& operator<<(std::ostream& os, const PIO_STATUS_BLOCK& value); // ->u1.Pointer, ->Information
// std::ostream& operator<<(std::ostream& os, const PSTRING& value); // (value != 0) ? value->Buffer : ""
std::ostream& operator<<(std::ostream& os, const PLARGE_INTEGER& value)
{
os << "0x" << (void*)value;
if (value)
os << " (->0x" << value->QuadPart << ")";
return os;
}
// std::ostream& operator<<(std::ostream& os, const PUNICODE_STRING& value);
// std::ostream& operator<<(std::ostream& os, const PVOID*& value); // * value, *value
// std::ostream& operator<<(std::ostream& os, const PXDEVICE_PREALLOC_TYPE& value);
// std::ostream& operator<<(std::ostream& os, const PXINPUT_CAPABILITIES& value);
// std::ostream& operator<<(std::ostream& os, const PXINPUT_STATE& value);
// std::ostream& operator<<(std::ostream& os, const PXPP_DEVICE_TYPE& value);
// std::ostream& operator<<(std::ostream& os, const PXTHREAD_NOTIFICATION& value); // -> pfnNotifyRoutine
// std::ostream& operator<<(std::ostream& os, const UCHAR& value);

View File

@ -74,21 +74,20 @@ extern thread_local std::string _logPrefix;
tmp << __FILENAME__ << " (0x" << std::hex << std::uppercase << _CurrentThreadId << "): "; \ tmp << __FILENAME__ << " (0x" << std::hex << std::uppercase << _CurrentThreadId << "): "; \
_logPrefix = tmp.str(); \ _logPrefix = tmp.str(); \
}; \ }; \
bool had_args = false; \
std::stringstream msg; \ std::stringstream msg; \
msg << _logPrefix << __func__ << "("; msg << _logPrefix << __func__ << "(";
// LOG_FUNC_ARG_OUT writes output via all available ostream << operator overloads, adding detail where possible // LOG_FUNC_ARG_OUT writes output via all available ostream << operator overloads, adding detail where possible
#define LOG_FUNC_ARG(arg) \ #define LOG_FUNC_ARG(arg) \
had_args = true; \ msg << "\n " << std::setw(26) << std::left << std::setfill(' ') << #arg << " : " << arg;
msg << "\n " << std::setw(18) << std::left << std::setfill(' ') << #arg << " : " << arg;
// LOG_FUNC_ARG_OUT prevents expansion of types, by only rendering as a pointer // LOG_FUNC_ARG_OUT prevents expansion of types, by only rendering as a pointer
#define LOG_FUNC_ARG_OUT(arg) \ #define LOG_FUNC_ARG_OUT(arg) \
msg << "\n " << std::setw(18) << std::left << std::setfill(' ') << #arg << " : 0x" << (void*)arg; msg << "\n " << std::setw(26) << std::left << std::setfill(' ') << #arg << " : 0x" << (void*)arg;
// LOG_FUNC_END closes off function and optional argument logging
#define LOG_FUNC_END \ #define LOG_FUNC_END \
if (had_args) msg << "\n"; \ msg.seekg(-1, std::ios::end); if (msg.get() != '(') msg << '\n'; \
msg << ");\n"; \ msg << ");\n"; \
std::cout << msg.str(); \ std::cout << msg.str(); \
} } while (0) } } while (0)
@ -104,25 +103,4 @@ extern thread_local std::string _logPrefix;
// Log function with one out argument // Log function with one out argument
#define LOG_FUNC_ONE_ARG_OUT(arg) LOG_FUNC_BEGIN LOG_FUNC_ARG_OUT(arg) LOG_FUNC_END #define LOG_FUNC_ONE_ARG_OUT(arg) LOG_FUNC_BEGIN LOG_FUNC_ARG_OUT(arg) LOG_FUNC_END
//#include "EmuNtDll.h"
// TODO :
//std::ostream& operator<<(std::ostream&, const LARGE_INTEGER&); // .QuadPart
//std::ostream& operator<<(std::ostream&, const LPCSTR&);
std::ostream& operator<<(std::ostream&, const PLARGE_INTEGER&);
// std::ostream& operator<<(std::ostream&, const PMM_STATISTICS&); // ->Length
// std::ostream& operator<<(std::ostream&, const POBJECT_ATTRIBUTES&); // ->ObjectName->Buffer
// std::ostream& operator<<(std::ostream&, const PIO_STATUS_BLOCK&); // ->u1.Pointer, ->Information
// std::ostream& operator<<(std::ostream&, const PSTRING&); // (value != 0) ? value->Buffer : ""
std::ostream& operator<<(std::ostream&, const PULONG&);
// std::ostream& operator<<(std::ostream&, const PUNICODE_STRING&);
// std::ostream& operator<<(std::ostream&, const PVOID*&); // * value, *value
// std::ostream& operator<<(std::ostream&, const PXDEVICE_PREALLOC_TYPE&);
// std::ostream& operator<<(std::ostream&, const PXINPUT_CAPABILITIES&);
// std::ostream& operator<<(std::ostream&, const PXINPUT_STATE&);
// std::ostream& operator<<(std::ostream&, const PXPP_DEVICE_TYPE&);
// std::ostream& operator<<(std::ostream&, const PXTHREAD_NOTIFICATION&); // -> pfnNotifyRoutine
// std::ostream& operator<<(std::ostream&, const UCHAR&);
#endif _LOGGING_H #endif _LOGGING_H

View File

@ -45,6 +45,8 @@ namespace xboxkrnl
#include <clocale> #include <clocale>
#include <process.h> #include <process.h>
#include "Logging.h"
// prevent name collisions // prevent name collisions
namespace NtDll namespace NtDll
{ {
@ -52,7 +54,6 @@ namespace NtDll
}; };
#include "CxbxKrnl.h" #include "CxbxKrnl.h"
#include "Logging.h"
#include "Emu.h" #include "Emu.h"
#include "EmuFS.h" #include "EmuFS.h"
#include "EmuFile.h" #include "EmuFile.h"
@ -64,6 +65,71 @@ namespace NtDll
#include <ntstatus.h> #include <ntstatus.h>
#pragma warning(default:4005) #pragma warning(default:4005)
std::ostream& operator<<(std::ostream& os, const xboxkrnl::PSTRING& value); // forward
std::ostream& operator<<(std::ostream& os, const xboxkrnl::LARGE_INTEGER& value)
{
return os << value.QuadPart;
}
//std::ostream& operator<<(std::ostream& os, const xboxkrnl::LPCSTR& value);
std::ostream& operator<<(std::ostream& os, const PULONG& value)
{
os << "0x" << (void*)value;
if (value)
os << " (*value: " << (void*)*value << ")";
return os;
}
std::ostream& operator<<(std::ostream& os, const xboxkrnl::PMM_STATISTICS& value)
{
os << "0x" << (void*)value;
if (value)
os << " (->Length: " << value->Length << ")";
return os;
}
std::ostream& operator<<(std::ostream& os, const xboxkrnl::POBJECT_ATTRIBUTES& value)
{
os << "0x" << (void*)value;
if (value)
os << " (->ObjectName: " << value->ObjectName << ")";
return os;
}
// std::ostream& operator<<(std::ostream& os, const xboxkrnl::PIO_STATUS_BLOCK& value); // ->u1.Pointer, ->Information
std::ostream& operator<<(std::ostream& os, const xboxkrnl::PSTRING& value)
{
os << "0x" << (void*)value;
if (value)
os << " (->Buffer: \"" << value->Buffer << "\")";
return os;
}
std::ostream& operator<<(std::ostream& os, const xboxkrnl::PLARGE_INTEGER& value)
{
os << "0x" << (void*)value;
if (value)
os << " (->QuadPart: " << value->QuadPart << ")";
return os;
}
// std::ostream& operator<<(std::ostream& os, const xboxkrnl::PUNICODE_STRING& value);
// std::ostream& operator<<(std::ostream& os, const PVOID*& value); // * value, *value
// std::ostream& operator<<(std::ostream& os, const xboxkrnl::PXDEVICE_PREALLOC_TYPE& value);
// std::ostream& operator<<(std::ostream& os, const xboxkrnl::PXINPUT_CAPABILITIES& value);
// std::ostream& operator<<(std::ostream& os, const xboxkrnl::PXINPUT_STATE& value);
// std::ostream& operator<<(std::ostream& os, const xboxkrnl::PXPP_DEVICE_TYPE& value);
// std::ostream& operator<<(std::ostream& os, const xboxkrnl::PXTHREAD_NOTIFICATION& value); // -> pfnNotifyRoutine
// std::ostream& operator<<(std::ostream& os, const xboxkrnl::UCHAR& value);
// PsCreateSystemThread proxy parameters // PsCreateSystemThread proxy parameters
typedef struct _PCSTProxyParam typedef struct _PCSTProxyParam
{ {
@ -1059,6 +1125,23 @@ static CHAR* NtStatusToString ( IN NTSTATUS Status )
} }
} }
// Separate function for logging, otherwise in PCSTProxy __try wont work (Compiler Error C2712)
void PCSTProxy_log
(
uint32 StartContext1,
uint32 StartContext2,
uint32 StartRoutine,
BOOL StartSuspended,
HANDLE hStartedEvent
)
{
LOG_FUNC_BEGIN
LOG_FUNC_ARG(StartContext1)
LOG_FUNC_ARG(StartContext2)
LOG_FUNC_ARG(StartRoutine)
LOG_FUNC_END;
}
// PsCreateSystemThread proxy procedure // PsCreateSystemThread proxy procedure
#pragma warning(push) #pragma warning(push)
#pragma warning(disable: 4731) // disable ebp modification warning #pragma warning(disable: 4731) // disable ebp modification warning
@ -1078,11 +1161,7 @@ static unsigned int WINAPI PCSTProxy
// Once deleted, unable to directly access iPCSTProxyParam in remainder of function. // Once deleted, unable to directly access iPCSTProxyParam in remainder of function.
delete iPCSTProxyParam; delete iPCSTProxyParam;
LOG_FUNC_BEGIN PCSTProxy_log(StartContext1, StartContext2, StartRoutine, StartSuspended, hStartedEvent);
LOG_FUNC_ARG(StartContext1)
LOG_FUNC_ARG(StartContext2)
LOG_FUNC_ARG(StartRoutine)
LOG_FUNC_END;
if(StartSuspended == TRUE) if(StartSuspended == TRUE)
SuspendThread(GetCurrentThread()); SuspendThread(GetCurrentThread());
@ -1115,9 +1194,7 @@ static unsigned int WINAPI PCSTProxy
{ {
SetEvent(hStartedEvent); SetEvent(hStartedEvent);
__asm
__asm
{ {
mov esi, StartRoutine mov esi, StartRoutine
push StartContext2 push StartContext2