diff --git a/src/common/logging/filter.cpp b/src/common/logging/filter.cpp index 05935fbdc..1aa989af1 100644 --- a/src/common/logging/filter.cpp +++ b/src/common/logging/filter.cpp @@ -67,6 +67,7 @@ bool ParseFilterRule(Filter& instance, Iterator begin, Iterator end) { CLS(Common) \ SUB(Common, Filesystem) \ SUB(Common, Memory) \ + SUB(Common, NtApi) \ CLS(Core) \ SUB(Core, Linker) \ SUB(Core, Devices) \ diff --git a/src/common/logging/types.h b/src/common/logging/types.h index 1da84b219..1843742a4 100644 --- a/src/common/logging/types.h +++ b/src/common/logging/types.h @@ -33,6 +33,7 @@ enum class Class : u8 { Common, ///< Library routines Common_Filesystem, ///< Filesystem interface library Common_Memory, ///< Memory mapping and management functions + Common_Ntapi, ///< Native Windows API Core, ///< LLE emulation core Core_Linker, ///< The module linker Core_Devices, ///< Devices emulation diff --git a/src/common/ntapi.cpp b/src/common/ntapi.cpp index 46ec57e0a..4907b42d6 100644 --- a/src/common/ntapi.cpp +++ b/src/common/ntapi.cpp @@ -1,30 +1,118 @@ -// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#ifdef _WIN32 - -#include "ntapi.h" - -NtClose_t NtClose = nullptr; -NtSetInformationFile_t NtSetInformationFile = nullptr; -NtCreateThread_t NtCreateThread = nullptr; -NtTerminateThread_t NtTerminateThread = nullptr; -NtQueueApcThreadEx_t NtQueueApcThreadEx = nullptr; - -namespace Common::NtApi { - -void Initialize() { - HMODULE nt_handle = GetModuleHandleA("ntdll.dll"); - - // http://stackoverflow.com/a/31411628/4725495 - NtClose = (NtClose_t)GetProcAddress(nt_handle, "NtClose"); - NtSetInformationFile = - (NtSetInformationFile_t)GetProcAddress(nt_handle, "NtSetInformationFile"); - NtCreateThread = (NtCreateThread_t)GetProcAddress(nt_handle, "NtCreateThread"); - NtTerminateThread = (NtTerminateThread_t)GetProcAddress(nt_handle, "NtTerminateThread"); - NtQueueApcThreadEx = (NtQueueApcThreadEx_t)GetProcAddress(nt_handle, "NtQueueApcThreadEx"); -} - -} // namespace Common::NtApi - -#endif +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#ifdef _WIN32 + +#include "ntapi.h" +#include "logging/log.h" + +NtClose_t NtClose = nullptr; +NtSetInformationFile_t NtSetInformationFile = nullptr; +NtCreateThread_t NtCreateThread = nullptr; +NtTerminateThread_t NtTerminateThread = nullptr; +NtQueueApcThreadEx_t NtQueueApcThreadEx = nullptr; + +namespace Common::NtApi { + +void Initialize() { + HMODULE nt_handle = GetModuleHandleA("ntdll.dll"); + if(nt_handle == NULL){ + LPVOID message_buffer; + DWORD buffer_len = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_HMODULE | FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, + GetLastError(), + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + (LPTSTR) &message_buffer, + 0, NULL ); + if(buffer_len){ + std::string message((LPCSTR)message_buffer, (LPCSTR)message_buffer + buffer_len); + LocalFree(message_buffer); + LOG_WARNING(Common_Ntapi, "{}", message); + } + } + + // http://stackoverflow.com/a/31411628/4725495 + NtClose = (NtClose_t)GetProcAddress(nt_handle, "NtClose"); + if(NtClose == NULL){ + LPVOID message_buffer; + DWORD buffer_len = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, + GetLastError(), + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + (LPTSTR) &message_buffer, + 0, NULL ); + if(buffer_len){ + std::string message((LPCSTR)message_buffer, (LPCSTR)message_buffer + buffer_len); + LocalFree(message_buffer); + LOG_WARNING(Common_Ntapi, "{}", message); + } + } + + NtSetInformationFile = (NtSetInformationFile_t)GetProcAddress(nt_handle, "NtSetInformationFile"); + if(NtSetInformationFile == NULL){ + LPVOID message_buffer; + DWORD buffer_len = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, + GetLastError(), + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + (LPTSTR) &message_buffer, + 0, NULL ); + if(buffer_len){ + std::string message((LPCSTR)message_buffer, (LPCSTR)message_buffer + buffer_len); + LocalFree(message_buffer); + LOG_WARNING(Common_Ntapi, "{}", message); + } + } + + NtCreateThread = (NtCreateThread_t)GetProcAddress(nt_handle, "NtCreateThread"); + if(NtCreateThread == NULL){ + LPVOID message_buffer; + DWORD buffer_len = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, + GetLastError(), + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + (LPTSTR) &message_buffer, + 0, NULL ); + if(buffer_len){ + std::string message((LPCSTR)message_buffer, (LPCSTR)message_buffer + buffer_len); + LocalFree(message_buffer); + LOG_WARNING(Common_Ntapi, "{}", message); + } + } + + NtTerminateThread = (NtTerminateThread_t)GetProcAddress(nt_handle, "NtTerminateThread"); + if(NtTerminateThread == NULL){ + LPVOID message_buffer; + DWORD buffer_len = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, + GetLastError(), + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + (LPTSTR) &message_buffer, + 0, NULL ); + if(buffer_len){ + std::string message((LPCSTR)message_buffer, (LPCSTR)message_buffer + buffer_len); + LocalFree(message_buffer); + LOG_WARNING(Common_Ntapi, "{}", message); + } + } + + NtQueueApcThreadEx = (NtQueueApcThreadEx_t)GetProcAddress(nt_handle, "NtQueueApcThreadEx"); + if(NtQueueApcThreadEx == NULL){ + LPVOID message_buffer; + DWORD buffer_len = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, + GetLastError(), + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + (LPTSTR) &message_buffer, + 0, NULL ); + if(buffer_len){ + std::string message((LPCSTR)message_buffer, (LPCSTR)message_buffer + buffer_len); + LocalFree(message_buffer); + LOG_WARNING(Common_Ntapi, "{}", message); + } + } +} + +} // namespace Common::NtApi + +#endif