diff --git a/src/loaddll/loaddll.cpp b/src/loaddll/loaddll.cpp index e62c7db4dd..40f23b34f4 100644 --- a/src/loaddll/loaddll.cpp +++ b/src/loaddll/loaddll.cpp @@ -1,12 +1,32 @@ -#include +#include -wchar_t szLibraryPath[512]; +#include -int main() +static wchar_t szLibraryPath[512]; + +extern "C" +NTSTATUS +NTAPI +RtlGetLastNtStatus( + VOID +); + +#ifdef _WIN64 +#pragma comment(lib, "..\\dbg\\ntdll\\ntdll_x64.lib") +#else +#pragma comment(lib, "..\\dbg\\ntdll\\ntdll_x86.lib") +#endif // _WIN64 + +int WinMain( + HINSTANCE hInstance, + HINSTANCE hPrevInstance, + LPSTR lpCmdLine, + int nShowCmd +) { - wchar_t szName[256]; - wsprintfW(szName, L"Local\\szLibraryName%X", (unsigned int)GetCurrentProcessId()); - HANDLE hMapFile = OpenFileMappingW(FILE_MAP_READ, false, szName); + wchar_t szTemp[256]; + swprintf_s(szTemp, L"Local\\szLibraryName%X", (unsigned int)GetCurrentProcessId()); + HANDLE hMapFile = OpenFileMappingW(FILE_MAP_READ, false, szTemp); if(hMapFile) { const wchar_t* szLibraryPathMapping = (const wchar_t*)MapViewOfFile(hMapFile, FILE_MAP_READ, 0, 0, sizeof(szLibraryPath)); @@ -17,7 +37,25 @@ int main() } CloseHandle(hMapFile); } - if(szLibraryPath[0]) - return (LoadLibraryW(szLibraryPath) != NULL); - return 0; + + if(szLibraryPath[0] == L'\0') + { + // NOTE: No MessageBoxW here on purpose (enables DLL sideloading) + return RtlGetLastNtStatus(); + } + + HINSTANCE hDll = LoadLibraryW(szLibraryPath); + if(hDll == nullptr) + { + auto lastStatus = RtlGetLastNtStatus(); + swprintf_s(szTemp, L"Failed to load DLL", GetLastError()); + MessageBoxW(0, szLibraryPath, szTemp, MB_ICONERROR | MB_SYSTEMMODAL); + return lastStatus; + } + else + { + swprintf_s(szTemp, L"DLL loaded: 0x%p", hDll); + MessageBoxW(0, szLibraryPath, szTemp, MB_ICONINFORMATION | MB_SYSTEMMODAL); + return EXIT_SUCCESS; + } } diff --git a/src/loaddll/loaddll.vcxproj b/src/loaddll/loaddll.vcxproj index bb9ccfddd8..2320b0779e 100644 --- a/src/loaddll/loaddll.vcxproj +++ b/src/loaddll/loaddll.vcxproj @@ -94,12 +94,13 @@ MachineX86 true - Console + Windows true true true + user32.dll @@ -112,11 +113,12 @@ MachineX86 true - Console + Windows true true + user32.dll @@ -128,11 +130,12 @@ true - Console + Windows true true + user32.dll @@ -144,11 +147,12 @@ true - Console + Windows true true + user32.dll