mirror of
https://github.com/shadps4-emu/shadPS4.git
synced 2025-07-23 18:45:36 +00:00
Common_Ntapi: Error handling via logs
This commit is contained in:
parent
7b0249d9ca
commit
51270ca175
@ -67,6 +67,7 @@ bool ParseFilterRule(Filter& instance, Iterator begin, Iterator end) {
|
|||||||
CLS(Common) \
|
CLS(Common) \
|
||||||
SUB(Common, Filesystem) \
|
SUB(Common, Filesystem) \
|
||||||
SUB(Common, Memory) \
|
SUB(Common, Memory) \
|
||||||
|
SUB(Common, NtApi) \
|
||||||
CLS(Core) \
|
CLS(Core) \
|
||||||
SUB(Core, Linker) \
|
SUB(Core, Linker) \
|
||||||
SUB(Core, Devices) \
|
SUB(Core, Devices) \
|
||||||
|
@ -33,6 +33,7 @@ enum class Class : u8 {
|
|||||||
Common, ///< Library routines
|
Common, ///< Library routines
|
||||||
Common_Filesystem, ///< Filesystem interface library
|
Common_Filesystem, ///< Filesystem interface library
|
||||||
Common_Memory, ///< Memory mapping and management functions
|
Common_Memory, ///< Memory mapping and management functions
|
||||||
|
Common_Ntapi, ///< Native Windows API
|
||||||
Core, ///< LLE emulation core
|
Core, ///< LLE emulation core
|
||||||
Core_Linker, ///< The module linker
|
Core_Linker, ///< The module linker
|
||||||
Core_Devices, ///< Devices emulation
|
Core_Devices, ///< Devices emulation
|
||||||
|
@ -1,30 +1,118 @@
|
|||||||
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
|
|
||||||
#include "ntapi.h"
|
#include "ntapi.h"
|
||||||
|
#include "logging/log.h"
|
||||||
NtClose_t NtClose = nullptr;
|
|
||||||
NtSetInformationFile_t NtSetInformationFile = nullptr;
|
NtClose_t NtClose = nullptr;
|
||||||
NtCreateThread_t NtCreateThread = nullptr;
|
NtSetInformationFile_t NtSetInformationFile = nullptr;
|
||||||
NtTerminateThread_t NtTerminateThread = nullptr;
|
NtCreateThread_t NtCreateThread = nullptr;
|
||||||
NtQueueApcThreadEx_t NtQueueApcThreadEx = nullptr;
|
NtTerminateThread_t NtTerminateThread = nullptr;
|
||||||
|
NtQueueApcThreadEx_t NtQueueApcThreadEx = nullptr;
|
||||||
namespace Common::NtApi {
|
|
||||||
|
namespace Common::NtApi {
|
||||||
void Initialize() {
|
|
||||||
HMODULE nt_handle = GetModuleHandleA("ntdll.dll");
|
void Initialize() {
|
||||||
|
HMODULE nt_handle = GetModuleHandleA("ntdll.dll");
|
||||||
// http://stackoverflow.com/a/31411628/4725495
|
if(nt_handle == NULL){
|
||||||
NtClose = (NtClose_t)GetProcAddress(nt_handle, "NtClose");
|
LPVOID message_buffer;
|
||||||
NtSetInformationFile =
|
DWORD buffer_len = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_HMODULE | FORMAT_MESSAGE_IGNORE_INSERTS,
|
||||||
(NtSetInformationFile_t)GetProcAddress(nt_handle, "NtSetInformationFile");
|
NULL,
|
||||||
NtCreateThread = (NtCreateThread_t)GetProcAddress(nt_handle, "NtCreateThread");
|
GetLastError(),
|
||||||
NtTerminateThread = (NtTerminateThread_t)GetProcAddress(nt_handle, "NtTerminateThread");
|
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
|
||||||
NtQueueApcThreadEx = (NtQueueApcThreadEx_t)GetProcAddress(nt_handle, "NtQueueApcThreadEx");
|
(LPTSTR) &message_buffer,
|
||||||
}
|
0, NULL );
|
||||||
|
if(buffer_len){
|
||||||
} // namespace Common::NtApi
|
std::string message((LPCSTR)message_buffer, (LPCSTR)message_buffer + buffer_len);
|
||||||
|
LocalFree(message_buffer);
|
||||||
#endif
|
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
|
||||||
|
Loading…
Reference in New Issue
Block a user