X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Usermode%2FLibraries%2Fld-acess.so_src%2Floadlib.c;h=b6637c227773c8f13cc93e2069853426d2726f3a;hb=40b3565d79c0fd55f83e6470a458945efa21f6da;hp=88297d5f17ad7ccd9279ace490fbd2ccb736d418;hpb=5114cd4c1f8e36f62744a8efa346d619c99bdaf6;p=tpg%2Facess2.git diff --git a/Usermode/Libraries/ld-acess.so_src/loadlib.c b/Usermode/Libraries/ld-acess.so_src/loadlib.c index 88297d5f..b6637c22 100644 --- a/Usermode/Libraries/ld-acess.so_src/loadlib.c +++ b/Usermode/Libraries/ld-acess.so_src/loadlib.c @@ -3,6 +3,7 @@ By thePowersGang */ #include "common.h" +#include #define DEBUG 0 @@ -13,7 +14,7 @@ #endif // === PROTOTYPES === -void *IsFileLoaded(char *file); +void *IsFileLoaded(const char *file); int GetSymbolFromBase(void *base, const char *name, void **ret); // === IMPORTS === @@ -30,7 +31,7 @@ char *gsNextAvailString = gsLoadedStrings; //tLoadLib *gpLoadedLibraries = NULL; // === CODE === -char *FindLibrary(char *DestBuf, char *SoName, char *ExtraSearchDir) +const char *FindLibrary(char *DestBuf, const char *SoName, const char *ExtraSearchDir) { // -- #1: Executable Specified if(ExtraSearchDir) @@ -54,43 +55,44 @@ char *FindLibrary(char *DestBuf, char *SoName, char *ExtraSearchDir) /** */ -void *LoadLibrary(char *SoName, char *SearchDir, char **envp) +void *LoadLibrary(const char *SoName, const char *SearchDir, char **envp) { char sTmpName[1024]; - char *filename; + const char *filename; void *base; void (*fEntry)(void *, int, char *[], char**); - DEBUGS("LoadLibrary: (filename='%s', envp=0x%x)\n", filename, envp); + DEBUGS("LoadLibrary: (SoName='%s', SearchDir='%s', envp=%p)", SoName, SearchDir, envp); // Create Temp Name filename = FindLibrary(sTmpName, SoName, SearchDir); if(filename == NULL) { - DEBUGS("LoadLibrary: RETURN 0\n"); + DEBUGS("LoadLibrary: RETURN 0"); return 0; } - DEBUGS(" LoadLibrary: filename='%s'\n", filename); + DEBUGS(" LoadLibrary: filename='%s'", filename); if( (base = IsFileLoaded(filename)) ) return base; - + + DEBUGS(" LoadLibrary: SysLoadBin()"); // Load Library base = SysLoadBin(filename, (void**)&fEntry); if(!base) { - DEBUGS("LoadLibrary: RETURN 0\n"); + DEBUGS("LoadLibrary: RETURN 0"); return 0; } - DEBUGS(" LoadLibrary: iArg=%p, iEntry=0x%x\n", base, fEntry); + DEBUGS(" LoadLibrary: iArg=%p, fEntry=%p", base, fEntry); // Load Symbols fEntry = DoRelocate( base, envp, filename ); // Call Entrypoint - DEBUGS(" LoadLibrary: '%s' Entry 0x%x\n", SoName, fEntry); + DEBUGS(" LoadLibrary: '%s' Entry %p", SoName, fEntry); fEntry(base, 0, NULL, envp); - DEBUGS("LoadLibrary: RETURN 1\n"); + DEBUGS("LoadLibrary: RETURN 1"); return base; } @@ -98,7 +100,7 @@ void *LoadLibrary(char *SoName, char *SearchDir, char **envp) * \fn Uint IsFileLoaded(char *file) * \brief Determine if a file is already loaded */ -void *IsFileLoaded(char *file) +void *IsFileLoaded(const char *file) { int i; DEBUGS("IsFileLoaded: (file='%s')", file); @@ -107,7 +109,7 @@ void *IsFileLoaded(char *file) if(gLoadedLibraries[i].Base == 0) break; // Last entry has Base set to NULL DEBUGS(" strcmp('%s', '%s')", gLoadedLibraries[i].Name, file); if(strcmp(gLoadedLibraries[i].Name, file) == 0) { - DEBUGS("IsFileLoaded: Found %i (0x%x)", i, gLoadedLibraries[i].Base); + DEBUGS("IsFileLoaded: Found %i (%p)", i, gLoadedLibraries[i].Base); return gLoadedLibraries[i].Base; } } @@ -119,12 +121,12 @@ void *IsFileLoaded(char *file) * \fn void AddLoaded(char *File, Uint base) * \brief Add a file to the loaded list */ -void AddLoaded(char *File, void *base) +void AddLoaded(const char *File, void *base) { int i, length; char *name = gsNextAvailString; - DEBUGS("AddLoaded: (File='%s', base=0x%x)", File, base); + DEBUGS("AddLoaded: (File='%s', base=%p)", File, base); // Find a free slot for( i = 0; i < MAX_LOADED_LIBRARIES; i ++ ) @@ -148,7 +150,7 @@ void AddLoaded(char *File, void *base) strcpy(name, File); gLoadedLibraries[i].Name = name; gsNextAvailString = &name[length+1]; - DEBUGS("'%s' (0x%x) loaded as %i\n", name, base, i); + DEBUGS("'%s' (%p) loaded as %i", name, base, i); return; } @@ -226,11 +228,13 @@ void *GetSymbol(const char *name) */ int GetSymbolFromBase(void *base, const char *name, void **ret) { - if(*(Uint32*)base == (0x7F|('E'<<8)|('L'<<16)|('F'<<24))) + uint8_t *hdr = base; + if(hdr[0] == 0x7F && hdr[1] == 'E' && hdr[2] == 'L' && hdr[3] == 'F') return ElfGetSymbol(base, name, ret); - if(*(Uint16*)base == ('M'|('Z'<<8))) + if(hdr[0] == 'M' && hdr[1] == 'Z') return PE_GetSymbol(base, name, ret); - SysDebug("Unknown type at %p", base); + SysDebug("Unknown type at %p (%02x %02x %02x %02x)", base, + hdr[0], hdr[1], hdr[2], hdr[3]); return 0; }