]> localhost Git - pldh.git/commitdiff
Add POSIX implementation
authormisomosi <[email protected]>
Tue, 7 May 2024 01:54:50 +0000 (21:54 -0400)
committermisomosi <[email protected]>
Tue, 7 May 2024 02:31:32 +0000 (22:31 -0400)
README.md
examples/printf.c [new file with mode: 0644]
examples/writefile.c
pld.h

index 9a5215852ce555be6b23fceece33554a4861f78d..f11cef54f5b25526957410761f540442151e2d5e 100644 (file)
--- a/README.md
+++ b/README.md
@@ -1,2 +1,4 @@
 # pld.h
 Functions and logging generally useful for preloads
+
+
diff --git a/examples/printf.c b/examples/printf.c
new file mode 100644 (file)
index 0000000..7cdb93d
--- /dev/null
@@ -0,0 +1,8 @@
+#include "../pld.h"
+#include <stdio.h>
+PLD("libc.so.6");
+int main(void)
+{
+       PFN(printf)("Hello World! %d\n", 2);
+       return 0;
+}
index 3528609458c7dcbd93ea6c78579d8ac1fd8b7dd8..5f6e4b3eb59d774cf7df8df1fb69da7e52722300 100644 (file)
@@ -1,6 +1,6 @@
 #include "../pld.h"\r
 \r
-PLD(KERNEL32.DLL)\r
+PLD("KERNEL32.DLL")\r
 int main(void) {\r
        DWORD dummy;\r
        PFN(WriteFile)(GetStdHandle(STD_OUTPUT_HANDLE), "Hello World!\n", 13, &dummy, NULL);\r
diff --git a/pld.h b/pld.h
index dd67f0467b5f4c021ad6febfe1b94a01dd7cb616..7c50c95b625f7e91a5fd77ae6696f0d1a2df6024 100644 (file)
--- a/pld.h
+++ b/pld.h
@@ -15,11 +15,12 @@ static int PLD_Private_strlen(const char *s)
        return len - 1;\r
 }\r
 \r
-static void PLD_Private_Log(const char *, const char *, int);\r
 \r
 #ifdef _WIN32\r
 \r
 #include <windows.h>\r
+typedef DWORD PLD_ErrCode;\r
+static void PLD_Private_Log(const char *, const char *, PLD_ErrCode);\r
 \r
 static void PLD_Private_WriteString(const char *s)\r
 {\r
@@ -27,7 +28,7 @@ static void PLD_Private_WriteString(const char *s)
        WriteFile(GetStdHandle(STD_ERROR_HANDLE), s, PLD_Private_strlen(s), &dummy, NULL);\r
 }\r
 \r
-static void PLD_Private_FormatError(int code, char *s, int len)\r
+static void PLD_Private_FormatError(DWORD code, char *s, int len)\r
 {\r
        DWORD_PTR arg = (DWORD_PTR)s;\r
        FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ARGUMENT_ARRAY,\r
@@ -42,12 +43,13 @@ static void PLD_Private_FormatError(int code, char *s, int len)
 static HMODULE PLD_Private_LoadLibrary_wrapper(LPCSTR lpLibFileName)\r
 {\r
        HMODULE hModule = GetModuleHandleA(lpLibFileName);\r
-       if (hModule != NULL)\r
+       if (hModule == NULL)\r
                hModule = LoadLibraryA(lpLibFileName);\r
        if (hModule == NULL)\r
                PLD_Private_Log("Failed to load library!", lpLibFileName, GetLastError());\r
        return hModule;\r
 }\r
+\r
 static FARPROC PLD_Private_GetProcAddress_wrapper(HMODULE hModule, LPCSTR lpProcName)\r
 {\r
        FARPROC lpProc = GetProcAddress(hModule, lpProcName);\r
@@ -59,17 +61,66 @@ static FARPROC PLD_Private_GetProcAddress_wrapper(HMODULE hModule, LPCSTR lpProc
 #define PLD(name) \\r
        static HMODULE PLDH(void) { \\r
                static HMODULE hModule = NULL; \\r
-               if (hModule == NULL) hModule =  PLD_Private_LoadLibrary_wrapper(#name); \\r
+               if (hModule == NULL) hModule =  PLD_Private_LoadLibrary_wrapper(name); \\r
                return hModule; \\r
        } \\r
 \r
-#define PFN(name) ((PLDTYPEOF(name))PLD_Private_GetProcAddress_wrapper(PLDH(), #name))\r
+#define PFN(name) ((PLDTYPEOF(&name))PLD_Private_GetProcAddress_wrapper(PLDH(), #name))\r
 \r
 #else\r
-#error POSIX Unimplemented!\r
+\r
+#define _GNU_SOURCE\r
+#include <unistd.h>\r
+#include <errno.h>\r
+#include <stdint.h>\r
+#include <string.h>\r
+#include <dlfcn.h>\r
+typedef intptr_t PLD_ErrCode;\r
+static void PLD_Private_Log(const char *, const char *, PLD_ErrCode);\r
+\r
+static void PLD_Private_WriteString(const char *s)\r
+{\r
+       write(2, s, PLD_Private_strlen(s));\r
+}\r
+\r
+static void PLD_Private_FormatError(intptr_t code, char *s, int len)\r
+{\r
+       *s = 0;\r
+       strncat(s, (const char *)code, len);\r
+}\r
+\r
+static void *PLD_Private_dlopen_wrapper(const char *name)\r
+{\r
+       if (name == NULL)\r
+               return (void *)RTLD_NEXT;\r
+       void *handle = dlopen(name, RTLD_NOLOAD);\r
+       if (handle == NULL)\r
+               handle = dlopen(name, RTLD_LAZY);\r
+       if (handle == NULL)\r
+               PLD_Private_Log("Failed to load library!", name, (intptr_t)dlerror());\r
+       return handle;\r
+}\r
+\r
+static void *PLD_Private_dlsym_wrapper(void *handle, const char *name)\r
+{\r
+       void *sym = dlsym(handle, name);\r
+       if (sym == NULL)\r
+               PLD_Private_Log("Failed to load procedure!", name, (intptr_t)dlerror());\r
+       return sym;\r
+}\r
+\r
+#define PLD(name) \\r
+       static void *PLDH(void) { \\r
+               static void *handle = NULL; \\r
+               if (handle == NULL) handle = PLD_Private_dlopen_wrapper(name); \\r
+               return handle; \\r
+       } \\r
+\r
+#define PFN(name) ((PLDTYPEOF(&name))PLD_Private_dlsym_wrapper(PLDH(), #name))\r
+\r
 #endif\r
 \r
-static void PLD_Private_Log(const char *message, const char *name, int err)\r
+static void PLD_Private_Log(const char *message, const char *name, PLD_ErrCode err)\r
 {\r
        PLD_Private_WriteString(message);\r
        PLD_Private_WriteString(" ");\r
@@ -82,6 +133,11 @@ static void PLD_Private_Log(const char *message, const char *name, int err)
        char errtext[256];\r
        PLD_Private_FormatError(err, errtext, sizeof(errtext));\r
        PLD_Private_WriteString(errtext);\r
+\r
+       // An extra newline because dlerror doesn't append one\r
+#ifndef _WIN32\r
+       PLD_Private_WriteString("\n");\r
+#endif\r
 }\r
 \r
 #ifndef PLDLOG\r