/* ================= Sys_LoadGameDll Used to load a development dll instead of a virtual machine ================= */ void *Sys_LoadGameDll(const char *name, intptr_t (QDECL **entryPoint)(int, ...), intptr_t (*systemcalls)(intptr_t, ...)) { void *libHandle; void (*dllEntry)(intptr_t (*syscallptr)(intptr_t, ...)); assert(name); if(!Sys_DllExtension(name)) { Com_Printf("Refusing to attempt to load library \"%s\": Extension not allowed.\n", name); return NULL; } Com_DPrintf( "Loading DLL file: %s\n", name); libHandle = Sys_LoadLibrary(name); if(!libHandle) { Com_Printf("Sys_LoadGameDll(%s) failed:\n\"%s\"\n", name, Sys_LibraryError()); return NULL; } dllEntry = Sys_LoadFunction( libHandle, "dllEntry" ); *entryPoint = Sys_LoadFunction( libHandle, "vmMain" ); if ( !*entryPoint || !dllEntry ) { Com_Printf ( "Sys_LoadGameDll(%s) failed to find vmMain function:\n\"%s\" !\n", name, Sys_LibraryError( ) ); Sys_UnloadLibrary(libHandle); return NULL; } Com_DPrintf ( "Sys_LoadGameDll(%s) found vmMain function at %p\n", name, *entryPoint ); dllEntry( systemcalls ); return libHandle; }
void *Sys_LoadGameDll( const char *name, GetModuleAPIProc **moduleAPI ) { void *libHandle = NULL; char filename[MAX_OSPATH]; Com_sprintf (filename, sizeof(filename), "%s" ARCH_STRING DLL_EXT, name); if (!Sys_UnpackDLL(filename)) { Com_DPrintf( "Sys_LoadGameDll: Failed to unpack %s from PK3.\n", filename ); return NULL; } #if defined(MACOS_X) && !defined(_JK2EXE) //First, look for the old-style mac .bundle that's inside a pk3 //It's actually zipped, and the zipfile has the same name as 'name' libHandle = Sys_LoadMachOBundle( name ); #endif if (!libHandle) { char *basepath = Cvar_VariableString( "fs_basepath" ); char *homepath = Cvar_VariableString( "fs_homepath" ); char *cdpath = Cvar_VariableString( "fs_cdpath" ); char *gamedir = Cvar_VariableString( "fs_game" ); #ifdef MACOS_X char *apppath = Cvar_VariableString( "fs_apppath" ); #endif const char *searchPaths[] = { homepath, #ifdef MACOS_X apppath, #endif basepath, cdpath, }; size_t numPaths = ARRAY_LEN( searchPaths ); libHandle = Sys_LoadDllFromPaths( filename, gamedir, searchPaths, numPaths, SEARCH_PATH_BASE | SEARCH_PATH_MOD, __FUNCTION__ ); if ( !libHandle ) return NULL; } *moduleAPI = (GetModuleAPIProc *)Sys_LoadFunction( libHandle, "GetModuleAPI" ); if ( !*moduleAPI ) { Com_DPrintf ( "Sys_LoadGameDll(%s) failed to find GetModuleAPI function:\n...%s!\n", name, Sys_LibraryError() ); Sys_UnloadLibrary( libHandle ); return NULL; } return libHandle; }
/* ================= GPA ================= */ static void *GPA(char *str) { void *rv; rv = Sys_LoadFunction(cURLLib, str); if(!rv) { Com_Printf("Can't load symbol %s\n", str); clc.curl.cURLEnabled = qfalse; return NULL; } else { Com_DPrintf("Loaded symbol %s (0x%p)\n", str, rv); return rv; } }
/* ======================================================================================================================================= GPA ======================================================================================================================================= */ static void *GPA(char *str) { void *rv; rv = Sys_LoadFunction(OpenALLib, str); if (!rv) { Com_Printf(" Can't load symbol %s\n", str); alinit_fail = qtrue; return NULL; } else { Com_DPrintf(" Loaded symbol %s (%p)\n", str, rv); return rv; } }
qboolean CL_InitCGameVM( void *gameLibrary ) { typedef intptr_t SyscallProc( intptr_t, ... ); typedef void DllEntryProc( SyscallProc * ); DllEntryProc *dllEntry = (DllEntryProc *)Sys_LoadFunction( gameLibrary, "dllEntry" ); cgvm.entryPoint = (intptr_t (*)(int,...))Sys_LoadFunction( gameLibrary, "vmMain" ); if ( !cgvm.entryPoint || !dllEntry ) { #ifdef JK2_MODE const char *gamename = "jospgame"; #else const char *gamename = "jagame"; #endif Com_Printf( "CL_InitCGameVM: client game entry point not found in %s" ARCH_STRING DLL_EXT ": %s\n", gamename, Sys_LibraryError() ); return qfalse; } dllEntry( VM_DllSyscall ); return qtrue; }
/* ================= Sys_UnloadDll ================= */ void Sys_UnloadDll(void *dllHandle) { #ifdef __MORPHOS__ void (*morphos_so_deinit)(void); #endif if (!dllHandle) { Com_Printf("Sys_UnloadDll(NULL)\n"); return; } #ifdef __MORPHOS__ morphos_so_deinit = Sys_LoadFunction(dllHandle, "morphos_so_deinit"); if (morphos_so_deinit) { morphos_so_deinit(); } #endif Sys_UnloadLibrary(dllHandle); }
void *Sys_GetGameAPI (void *parms) { void *(*GetGameAPI) (void *); const char *basepath; const char *cdpath; const char *gamedir; const char *homepath; #ifdef MACOS_X const char *apppath; #endif const char *fn; #ifdef JK2_MODE const char *gamename = "jospgame" ARCH_STRING DLL_EXT; #else const char *gamename = "jagame" ARCH_STRING DLL_EXT; #endif if (game_library) Com_Error (ERR_FATAL, "Sys_GetGameAPI without calling Sys_UnloadGame"); // check the current debug directory first for development purposes homepath = Cvar_VariableString( "fs_homepath" ); basepath = Cvar_VariableString( "fs_basepath" ); cdpath = Cvar_VariableString( "fs_cdpath" ); gamedir = Cvar_VariableString( "fs_game" ); #ifdef MACOS_X apppath = Cvar_VariableString( "fs_apppath" ); #endif fn = FS_BuildOSPath( basepath, gamedir, gamename ); game_library = Sys_LoadLibrary( fn ); //First try in mod directories. basepath -> homepath -> cdpath if (!game_library) { if (homepath[0]) { Com_Printf( "Sys_GetGameAPI(%s) failed: \"%s\"\n", fn, Sys_LibraryError() ); fn = FS_BuildOSPath( homepath, gamedir, gamename); game_library = Sys_LoadLibrary( fn ); } } #ifdef MACOS_X if (!game_library) { if( apppath[0] ) { Com_Printf( "Sys_GetGameAPI(%s) failed: \"%s\"\n", fn, Sys_LibraryError() ); fn = FS_BuildOSPath( apppath, gamedir, gamename ); game_library = Sys_LoadLibrary( fn ); } } #endif if (!game_library) { if( cdpath[0] ) { Com_Printf( "Sys_GetGameAPI(%s) failed: \"%s\"\n", fn, Sys_LibraryError() ); fn = FS_BuildOSPath( cdpath, gamedir, gamename ); game_library = Sys_LoadLibrary( fn ); } } //Now try in base. basepath -> homepath -> cdpath if (!game_library) { Com_Printf( "Sys_GetGameAPI(%s) failed: \"%s\"\n", fn, Sys_LibraryError() ); fn = FS_BuildOSPath( basepath, BASEGAME, gamename); game_library = Sys_LoadLibrary( fn ); } if (!game_library) { if ( homepath[0] ) { Com_Printf( "Sys_GetGameAPI(%s) failed: \"%s\"\n", fn, Sys_LibraryError() ); fn = FS_BuildOSPath( homepath, BASEGAME, gamename); game_library = Sys_LoadLibrary( fn ); } } #ifdef MACOS_X if (!game_library) { if( apppath[0] ) { Com_Printf( "Sys_GetGameAPI(%s) failed: \"%s\"\n", fn, Sys_LibraryError() ); fn = FS_BuildOSPath( apppath, BASEGAME, gamename ); game_library = Sys_LoadLibrary( fn ); } } #endif if (!game_library) { if( cdpath[0] ) { Com_Printf( "Sys_GetGameAPI(%s) failed: \"%s\"\n", fn, Sys_LibraryError() ); fn = FS_BuildOSPath( cdpath, BASEGAME, gamename ); game_library = Sys_LoadLibrary( fn ); } } //Still couldn't find it. if (!game_library) { Com_Printf( "Sys_GetGameAPI(%s) failed: \"%s\"\n", fn, Sys_LibraryError() ); Com_Error( ERR_FATAL, "Couldn't load game" ); } Com_Printf ( "Sys_GetGameAPI(%s): succeeded ...\n", fn ); GetGameAPI = (void *(*)(void *))Sys_LoadFunction (game_library, "GetGameAPI"); if (!GetGameAPI) { Sys_UnloadGame (); return NULL; } return GetGameAPI (parms); }
/** * @brief Loads a mod library. * #1 look in fs_homepath * #2 look in fs_basepath * #3 try to revert to the default mod library */ void *Sys_LoadGameDll(const char *name, intptr_t(**entryPoint) (int, ...), intptr_t (*systemcalls)(intptr_t, ...)) { void *libHandle; void (*dllEntry)(intptr_t (*syscallptr)(intptr_t, ...)); char fname[MAX_OSPATH]; char *basepath; char *homepath; char *gamedir; assert(name); Com_sprintf(fname, sizeof(fname), Sys_GetDLLName("%s"), name); // TODO: use fs_searchpaths from files.c basepath = Cvar_VariableString("fs_basepath"); homepath = Cvar_VariableString("fs_homepath"); gamedir = Cvar_VariableString("fs_game"); #ifndef DEDICATED // if the server is pure, extract the dlls from the mod_bin.pk3 so // that they can be referenced if (Cvar_VariableValue("sv_pure") && Q_stricmp(name, "qagame")) { Com_Printf("Sys_LoadGameDll -> FS_CL_ExtractFromPakFile(%s, %s, %s)\n", homepath, gamedir, fname); FS_CL_ExtractFromPakFile(homepath, gamedir, fname); } #endif libHandle = Sys_TryLibraryLoad(homepath, gamedir, fname); if (!libHandle && basepath) { libHandle = Sys_TryLibraryLoad(basepath, gamedir, fname); } #ifndef DEDICATED // According to the code above, if the server is not pure, then the // lib must either already be in the homepath, or in the basepath, // without being in a pak. For a pure server, it always grabs the lib // from within a pak. This means there must be two copies of the lib! // // So now, if connecting to an impure server, and the lib was not // loaded from homepath or the basepath, let's pull it out of the pak. // This means we only *need* the copy that's in the pak, and will use // it if another copy isn't found first. if (!libHandle && !Cvar_VariableValue("sv_pure") && Q_stricmp(name, "qagame")) { Com_Printf("Sys_LoadGameDll -> FS_CL_ExtractFromPakFile(%s, %s, %s)\n", homepath, gamedir, fname); FS_CL_ExtractFromPakFile(homepath, gamedir, fname); libHandle = Sys_TryLibraryLoad(homepath, gamedir, fname); } #endif // HACK: sometimes a library is loaded from the mod dir when it shouldn't. Why? if (!libHandle && strcmp(gamedir, DEFAULT_MODGAME)) { Com_Printf("Sys_LoadDll: failed to load the mod library. Trying to revert to the default one.\n"); libHandle = Sys_TryLibraryLoad(basepath, DEFAULT_MODGAME, fname); } if (!libHandle) { Com_Printf("Sys_LoadDll(%s) failed to load library\n", name); return NULL; } dllEntry = (void (QDECL *)(intptr_t (QDECL *)(intptr_t, ...)))Sys_LoadFunction(libHandle, "dllEntry"); *entryPoint = (intptr_t (QDECL *)(int, ...))Sys_LoadFunction(libHandle, "vmMain"); if (!*entryPoint || !dllEntry) { Com_Printf("Sys_LoadDll(%s) failed to find vmMain function:\n\"%s\" !\n", name, Sys_LibraryError()); Sys_UnloadLibrary(libHandle); return NULL; } Com_Printf("Sys_LoadDll(%s) found vmMain function at %p\n", name, *entryPoint); dllEntry(systemcalls); return libHandle; }
void CL_InitRef( void ) { refexport_t *ret; refimport_t rit; char dllName[MAX_OSPATH]; GetRefAPI_t GetRefAPI; Com_Printf( "----- Initializing Renderer ----\n" ); cl_renderer = Cvar_Get( "cl_renderer", DEFAULT_RENDER_LIBRARY, CVAR_ARCHIVE|CVAR_LATCH ); Com_sprintf( dllName, sizeof( dllName ), "%s_" ARCH_STRING DLL_EXT, cl_renderer->string ); if( !(rendererLib = Sys_LoadDll( dllName, qfalse )) && strcmp( cl_renderer->string, cl_renderer->resetString ) ) { Com_Printf( "failed: trying to load fallback renderer\n" ); Cvar_ForceReset( "cl_renderer" ); Com_sprintf( dllName, sizeof( dllName ), DEFAULT_RENDER_LIBRARY "_" ARCH_STRING DLL_EXT ); rendererLib = Sys_LoadDll( dllName, qfalse ); } if ( !rendererLib ) { Com_Error( ERR_FATAL, "Failed to load renderer" ); } GetRefAPI = (GetRefAPI_t)Sys_LoadFunction( rendererLib, "GetRefAPI" ); if ( !GetRefAPI ) Com_Error( ERR_FATAL, "Can't load symbol GetRefAPI: '%s'", Sys_LibraryError() ); #define RIT(y) rit.y = y RIT(CIN_PlayCinematic); RIT(CIN_RunCinematic); RIT(CIN_UploadCinematic); RIT(CL_IsRunningInGameCinematic); RIT(Cmd_AddCommand); RIT(Cmd_Argc); RIT(Cmd_ArgsBuffer); RIT(Cmd_Argv); RIT(Cmd_ExecuteString); RIT(Cmd_RemoveCommand); RIT(CM_ClusterPVS); RIT(CM_CullWorldBox); RIT(CM_DeleteCachedMap); RIT(CM_DrawDebugSurface); RIT(CM_PointContents); RIT(CM_RegisterTerrain); RIT(CM_ShutdownTerrain); RIT(CM_TerrainPatchIterate); RIT(Cvar_Get); RIT(Cvar_Set); RIT(Cvar_SetValue); RIT(Cvar_VariableIntegerValue); RIT(Cvar_VariableString); RIT(Cvar_VariableStringBuffer); RIT(Cvar_VariableValue); RIT(FS_FCloseFile); RIT(FS_FileIsInPAK); RIT(FS_FOpenFileByMode); RIT(FS_FOpenFileRead); RIT(FS_FOpenFileWrite); RIT(FS_FreeFile); RIT(FS_FreeFileList); RIT(FS_ListFiles); RIT(FS_Read); RIT(FS_ReadFile); RIT(FS_Write); RIT(FS_WriteFile); RIT(Hunk_ClearToMark); RIT(SG_Append); RIT(SND_RegisterAudio_LevelLoadEnd); RIT(SV_GetConfigstring); //RIT(SV_PointContents); RIT(SV_SetConfigstring); RIT(SV_Trace); RIT(S_RestartMusic); RIT(Z_Free); RIT(Z_Malloc); RIT(Z_MemSize); RIT(Z_MorphMallocTag); RIT(Hunk_ClearToMark); #ifndef _WIN32 RIT(IN_Init); RIT(IN_Shutdown); RIT(IN_Restart); #endif // Not-so-nice usage / doesn't go along with my epic macro rit.Error = Com_Error; rit.FS_FileExists = S_FileExists; rit.GetG2VertSpaceServer = GetG2VertSpaceServer; #ifdef _WIN32 rit.GetWinVars = GetWindowsVariables; #endif rit.LowPhysicalMemory = Sys_LowPhysicalMemory; rit.Milliseconds = Sys_Milliseconds; rit.Printf = CL_RefPrintf; rit.SE_GetString = String_GetStringValue; rit.CM_ShaderTableCleanup = ShaderTableCleanup; rit.SV_Trace = SV_Trace; rit.gpvCachedMapDiskImage = get_gpvCachedMapDiskImage; rit.gsCachedMapDiskImage = get_gsCachedMapDiskImage; rit.gbUsingCachedMapDataRightNow = get_gbUsingCachedMapDataRightNow; rit.gbAlreadyDoingLoad = get_gbAlreadyDoingLoad; rit.com_frameTime = get_com_frameTime; rit.SV_PointContents = SV_PointContents; ret = GetRefAPI( REF_API_VERSION, &rit ); if ( !ret ) { Com_Error (ERR_FATAL, "Couldn't initialize refresh" ); } re = *ret; Com_Printf( "-------------------------------\n"); // unpause so the cgame definately gets a snapshot and renders a frame Cvar_Set( "cl_paused", "0" ); }
/** * @brief Loads a mod library. * #1 look in fs_homepath * #2 look in fs_basepath * #3 try to revert to the default mod library */ void *Sys_LoadGameDll(const char *name, qboolean extract, intptr_t(**entryPoint) (int, ...), intptr_t (*systemcalls)(intptr_t, ...)) { void *libHandle; void (*dllEntry)(intptr_t (*syscallptr)(intptr_t, ...)); char fname[MAX_OSPATH]; char *basepath; char *homepath; char *gamedir; assert(name); Com_sprintf(fname, sizeof(fname), Sys_GetDLLName("%s"), name); // TODO: use fs_searchpaths from files.c basepath = Cvar_VariableString("fs_basepath"); homepath = Cvar_VariableString("fs_homepath"); gamedir = Cvar_VariableString("fs_game"); // STORY TIME // //When doing an debug build just load the mod lib from the basepath as that will have the debug pointers // // Now the code always just unpacks new libraries from the packs on release builds. // So the libraryfiles in the homepath are always refreshed with latest from the packs. // This fixes many issues with clients loading old libraries from the mod paths. // // The way it used to work is described under (or in debug mode).. // // if the server is pure, extract the dlls from the mod_bin.pk3 so // that they can be referenced // // If the server is not pure, then the // lib must either already be in the homepath, or in the basepath, // without being in a pak. For a pure server, it always grabs the lib // from within a pak. This means there must be two copies of the lib! // // So now, if connecting to an impure server, and the lib was not // loaded from homepath or the basepath, let's pull it out of the pak. // This means we only *need* the copy that's in the pak, and will use // it if another copy isn't found first. #ifdef LEGACY_DEBUG #define SEARCHPATH1 basepath #define SEARCHPATH2 homepath #define LIB_DO_UNPACK Cvar_VariableIntegerValue("sv_pure") #else #define LIB_DO_UNPACK qtrue #define SEARCHPATH1 homepath #define SEARCHPATH2 basepath #endif #ifndef DEDICATED if (LIB_DO_UNPACK && extract) { Com_Printf("Sys_LoadGameDll -> FS_CL_ExtractFromPakFile(%s, %s, %s)\n", homepath, gamedir, fname); FS_CL_ExtractFromPakFile(homepath, gamedir, fname); } #endif libHandle = Sys_TryLibraryLoad(SEARCHPATH1, gamedir, fname); if (!libHandle && SEARCHPATH2) { libHandle = Sys_TryLibraryLoad(SEARCHPATH2, gamedir, fname); } #ifndef DEDICATED if (!libHandle && !LIB_DO_UNPACK && extract) { Com_Printf("Sys_LoadGameDll -> FS_CL_ExtractFromPakFile(%s, %s, %s)\n", homepath, gamedir, fname); FS_CL_ExtractFromPakFile(homepath, gamedir, fname); libHandle = Sys_TryLibraryLoad(homepath, gamedir, fname); } #endif if (!libHandle) { Com_Printf("Sys_LoadDll(%s/%s) failed to load library\n", gamedir, name); return NULL; } dllEntry = (void (QDECL *)(intptr_t (QDECL *)(intptr_t, ...)))Sys_LoadFunction(libHandle, "dllEntry"); *entryPoint = (intptr_t (QDECL *)(int, ...))Sys_LoadFunction(libHandle, "vmMain"); if (!*entryPoint || !dllEntry) { Com_Printf("Sys_LoadDll(%s/%s) failed to find vmMain function:\n\"%s\" !\n", gamedir, name, Sys_LibraryError()); Sys_UnloadLibrary(libHandle); return NULL; } Com_Printf("Sys_LoadDll(%s/%s) found vmMain function at %p\n", gamedir, name, *entryPoint); dllEntry(systemcalls); return libHandle; }
/** * @brief Loads a mod library. * #1 look in fs_homepath * #2 look in fs_basepath * #3 try to revert to the default mod library */ void *Sys_LoadDll(const char *name, intptr_t(**entryPoint) (int, ...), intptr_t (*systemcalls)(intptr_t, ...)) { void *libHandle; void (*dllEntry)(intptr_t (*syscallptr)(intptr_t, ...)); char fname[MAX_OSPATH]; char *basepath; char *homepath; char *gamedir; assert(name); Com_sprintf(fname, sizeof(fname), Sys_GetDLLName("%s"), name); // TODO: use fs_searchpaths from files.c basepath = Cvar_VariableString("fs_basepath"); homepath = Cvar_VariableString("fs_homepath"); gamedir = Cvar_VariableString("fs_game"); #ifndef DEDICATED // if the server is pure, extract the dlls from the mp_bin.pk3 so // that they can be referenced if (Cvar_VariableValue("sv_pure") && Q_stricmp(name, "qagame")) { FS_CL_ExtractFromPakFile(homepath, gamedir, fname); } #endif libHandle = Sys_TryLibraryLoad(homepath, gamedir, fname); if (!libHandle && basepath) { libHandle = Sys_TryLibraryLoad(basepath, gamedir, fname); } // HACK: sometimes a library is loaded from the mod dir when it shouldn't. Why? if (!libHandle && strcmp(gamedir, DEFAULT_MODGAME)) { Com_Printf("Sys_LoadDll: failed to load the mod library. Trying to revert to the default one.\n"); libHandle = Sys_TryLibraryLoad(basepath, DEFAULT_MODGAME, fname); } if (!libHandle) { Com_Printf("Sys_LoadDll(%s) failed to load library\n", name); return NULL; } dllEntry = (void (QDECL *)(intptr_t (QDECL *)(intptr_t, ...)))Sys_LoadFunction(libHandle, "dllEntry"); *entryPoint = (intptr_t (QDECL *)(int, ...))Sys_LoadFunction(libHandle, "vmMain"); if (!*entryPoint || !dllEntry) { Com_Printf("Sys_LoadDll(%s) failed to find vmMain function:\n\"%s\" !\n", name, Sys_LibraryError()); Sys_UnloadLibrary(libHandle); return NULL; } Com_Printf("Sys_LoadDll(%s) found vmMain function at %p\n", name, *entryPoint); dllEntry(systemcalls); return libHandle; }
void *Sys_GetGameAPI (void *parms) { void *(*GetGameAPI) (void *); const char *basepath; const char *cdpath; const char *gamedir; const char *homepath; const char *fn; const char *gamename; if(Cvar_VariableIntegerValue("com_jk2")) { gamename = "jk2game" ARCH_STRING DLL_EXT; } else { gamename = "jagame" ARCH_STRING DLL_EXT; } if (game_library) Com_Error (ERR_FATAL, "Sys_GetGameAPI without Sys_UnloadingGame"); // check the current debug directory first for development purposes homepath = Cvar_VariableString( "fs_homepath" ); basepath = Cvar_VariableString( "fs_basepath" ); cdpath = Cvar_VariableString( "fs_cdpath" ); gamedir = Cvar_VariableString( "fs_game" ); if(!gamedir || !gamedir[0]) gamedir = BASEGAME; fn = FS_BuildOSPath( basepath, gamedir, gamename ); game_library = Sys_LoadLibrary( fn ); //First try in mod directories. basepath -> homepath -> cdpath if (!game_library) { if (homepath[0]) { Com_Printf( "Sys_GetGameAPI(%s) failed: \"%s\"\n", fn, Sys_LibraryError() ); fn = FS_BuildOSPath( homepath, gamedir, gamename); game_library = Sys_LoadLibrary( fn ); } } if (!game_library) { if( cdpath[0] ) { Com_Printf( "Sys_GetGameAPI(%s) failed: \"%s\"\n", fn, Sys_LibraryError() ); fn = FS_BuildOSPath( cdpath, gamedir, gamename ); game_library = Sys_LoadLibrary( fn ); } } //Now try in base. basepath -> homepath -> cdpath if (!game_library) { Com_Printf( "Sys_GetGameAPI(%s) failed: \"%s\"\n", fn, Sys_LibraryError() ); fn = FS_BuildOSPath( basepath, BASEGAME, gamename); game_library = Sys_LoadLibrary( fn ); } if (!game_library) { if ( homepath[0] ) { Com_Printf( "Sys_GetGameAPI(%s) failed: \"%s\"\n", fn, Sys_LibraryError() ); fn = FS_BuildOSPath( homepath, BASEGAME, gamename); game_library = Sys_LoadLibrary( fn ); } } if (!game_library) { if( cdpath[0] ) { Com_Printf( "Sys_GetGameAPI(%s) failed: \"%s\"\n", fn, Sys_LibraryError() ); fn = FS_BuildOSPath( cdpath, BASEGAME, gamename ); game_library = Sys_LoadLibrary( fn ); } } //Still couldn't find it. if (!game_library) { Com_Printf( "Sys_GetGameAPI(%s) failed: \"%s\"\n", fn, Sys_LibraryError() ); Com_Error( ERR_FATAL, "Couldn't load game" ); } Com_Printf ( "Sys_GetGameAPI(%s): succeeded ...\n", fn ); GetGameAPI = (void *(*)(void *))Sys_LoadFunction (game_library, "GetGameAPI"); if (!GetGameAPI) { Sys_UnloadGame (); return NULL; } return GetGameAPI (parms); }
void CL_InitRef( void ) { refexport_t *ret; static refimport_t rit; char dllName[MAX_OSPATH]; GetRefAPI_t GetRefAPI; Com_Printf( "----- Initializing Renderer ----\n" ); cl_renderer = Cvar_Get( "cl_renderer", DEFAULT_RENDER_LIBRARY, CVAR_ARCHIVE|CVAR_LATCH|CVAR_PROTECTED ); Com_sprintf( dllName, sizeof( dllName ), "%s_" ARCH_STRING DLL_EXT, cl_renderer->string ); if( !(rendererLib = Sys_LoadDll( dllName, qfalse )) && strcmp( cl_renderer->string, cl_renderer->resetString ) ) { Com_Printf( "failed: trying to load fallback renderer\n" ); Cvar_ForceReset( "cl_renderer" ); Com_sprintf( dllName, sizeof( dllName ), DEFAULT_RENDER_LIBRARY "_" ARCH_STRING DLL_EXT ); rendererLib = Sys_LoadDll( dllName, qfalse ); } if ( !rendererLib ) { Com_Error( ERR_FATAL, "Failed to load renderer\n" ); } memset( &rit, 0, sizeof( rit ) ); GetRefAPI = (GetRefAPI_t)Sys_LoadFunction( rendererLib, "GetRefAPI" ); if ( !GetRefAPI ) Com_Error( ERR_FATAL, "Can't load symbol GetRefAPI: '%s'", Sys_LibraryError() ); #define RIT(y) rit.y = y RIT(CIN_PlayCinematic); RIT(CIN_RunCinematic); RIT(CIN_UploadCinematic); RIT(CL_IsRunningInGameCinematic); RIT(Cmd_AddCommand); RIT(Cmd_Argc); RIT(Cmd_ArgsBuffer); RIT(Cmd_Argv); RIT(Cmd_ExecuteString); RIT(Cmd_RemoveCommand); RIT(CM_ClusterPVS); RIT(CM_CullWorldBox); RIT(CM_DeleteCachedMap); RIT(CM_DrawDebugSurface); RIT(CM_PointContents); RIT(Cvar_Get); RIT(Cvar_Set); RIT(Cvar_SetValue); RIT(Cvar_CheckRange); RIT(Cvar_VariableIntegerValue); RIT(Cvar_VariableString); RIT(Cvar_VariableStringBuffer); RIT(Cvar_VariableValue); RIT(FS_FCloseFile); RIT(FS_FileIsInPAK); RIT(FS_FOpenFileByMode); RIT(FS_FOpenFileRead); RIT(FS_FOpenFileWrite); RIT(FS_FreeFile); RIT(FS_FreeFileList); RIT(FS_ListFiles); RIT(FS_Read); RIT(FS_ReadFile); RIT(FS_Write); RIT(FS_WriteFile); RIT(Hunk_ClearToMark); RIT(SND_RegisterAudio_LevelLoadEnd); //RIT(SV_PointContents); RIT(SV_Trace); RIT(S_RestartMusic); RIT(Z_Free); rit.Malloc=CL_Malloc; RIT(Z_MemSize); RIT(Z_MorphMallocTag); RIT(Hunk_ClearToMark); rit.WIN_Init = WIN_Init; rit.WIN_SetGamma = WIN_SetGamma; rit.WIN_Shutdown = WIN_Shutdown; rit.WIN_Present = WIN_Present; rit.GL_GetProcAddress = WIN_GL_GetProcAddress; rit.GL_ExtensionSupported = WIN_GL_ExtensionSupported; rit.PD_Load = PD_Load; rit.PD_Store = PD_Store; rit.Error = Com_Error; rit.FS_FileExists = S_FileExists; rit.GetG2VertSpaceServer = GetG2VertSpaceServer; rit.LowPhysicalMemory = Sys_LowPhysicalMemory; rit.Milliseconds = Sys_Milliseconds2; rit.Printf = CL_RefPrintf; rit.SE_GetString = String_GetStringValue; rit.SV_Trace = SV_Trace; rit.gpvCachedMapDiskImage = get_gpvCachedMapDiskImage; rit.gsCachedMapDiskImage = get_gsCachedMapDiskImage; rit.gbUsingCachedMapDataRightNow = get_gbUsingCachedMapDataRightNow; rit.gbAlreadyDoingLoad = get_gbAlreadyDoingLoad; rit.com_frameTime = get_com_frameTime; rit.SV_PointContents = SV_PointContents; rit.saved_game = &ojk::SavedGame::get_instance(); ret = GetRefAPI( REF_API_VERSION, &rit ); if ( !ret ) { Com_Error (ERR_FATAL, "Couldn't initialize refresh" ); } re = *ret; Com_Printf( "-------------------------------\n"); // unpause so the cgame definately gets a snapshot and renders a frame Cvar_Set( "cl_paused", "0" ); }
/* ================= Sys_LoadDll Used to load a development dll instead of a virtual machine #1 look in fs_homepath #2 look in fs_basepath #4 look in fs_libpath under FreeBSD ================= */ void *QDECL Sys_LoadDll( const char *name, char *fqpath, intptr_t (QDECL **entryPoint)(int, ...), intptr_t (QDECL *systemcalls)(intptr_t, ...) ) { void *libHandle = NULL, (QDECL *dllEntry)( intptr_t (QDECL *syscallptr)(intptr_t, ...) ); char fname[MAX_QPATH], *basepath, *homepath, *gamedir, *libpath; assert( name ); //Q_snprintf (fname, sizeof(fname), Sys_GetDLLName( "%s" ), name); Q_strncpyz(fname, Sys_GetDLLName(name), sizeof(fname)); // TODO: use fs_searchpaths from files.c basepath = Cvar_VariableString( "fs_basepath" ); homepath = Cvar_VariableString( "fs_homepath" ); gamedir = Cvar_VariableString( "fs_game" ); libpath = Cvar_VariableString( "fs_libpath" ); #ifndef DEDICATED // if the server is pure, extract the dlls from the mp_bin.pk3 so // that they can be referenced if ( Cvar_VariableValue( "sv_pure" ) && Q_stricmp( name, "qagame" ) ) { FS_CL_ExtractFromPakFile( homepath, gamedir, fname ); } #endif libHandle = Sys_TryLibraryLoad(homepath, gamedir, fname, fqpath); if (!libHandle && libpath && libpath[0]) { libHandle = Sys_TryLibraryLoad(libpath, gamedir, fname, fqpath); } if(!libHandle && basepath) { libHandle = Sys_TryLibraryLoad(basepath, gamedir, fname, fqpath); } if(!libHandle) { Com_Printf( "Sys_LoadDll(%s) could not find it\n", fname ); return NULL; } if(!libHandle) { Com_Printf( "Sys_LoadDll(%s) failed:\n\"%s\"\n", name, Sys_LibraryError() ); return NULL; } // Try to load the dllEntry and vmMain function. dllEntry = ( void ( QDECL * )( intptr_t ( QDECL * )( intptr_t, ... ) ) )Sys_LoadFunction( libHandle, "dllEntry" ); *entryPoint = ( intptr_t ( QDECL * )( int,... ) )Sys_LoadFunction( libHandle, "vmMain" ); if ( !*entryPoint || !dllEntry ) { #ifndef NDEBUG if (!dllEntry) { Com_Error ( ERR_FATAL, "Sys_LoadDll(%s) failed SDL_LoadFunction(dllEntry):\n\"%p\" !\n", name, Sys_LibraryError() ); } else { Com_Error ( ERR_FATAL, "Sys_LoadDll(%s) failed SDL_LoadFunction(vmMain):\n\"%p\" !\n", name, Sys_LibraryError() ); } #else if (!dllEntry) { Com_Printf ( "Sys_LoadDll(%s) failed SDL_LoadFunction(dllEntry):\n\"%p\" !\n", name, Sys_LibraryError() ); } else { Com_Printf ( "Sys_LoadDll(%s) failed SDL_LoadFunction(vmMain):\n\"%p\" !\n", name, Sys_LibraryError() ); } #endif Sys_UnloadLibrary(libHandle); return NULL; } Com_Printf ( "Sys_LoadDll(%s) found vmMain function at %p\n", name, *entryPoint ); dllEntry( systemcalls ); Com_Printf ( "Sys_LoadDll(%s) succeeded!\n", name ); // Copy the fname to fqpath. Q_strncpyz ( fqpath , fname , MAX_QPATH ) ; return libHandle; }
void *Sys_LoadLegacyGameDll( const char *name, VMMainProc **vmMain, SystemCallProc *systemcalls ) { void *libHandle = NULL; char filename[MAX_OSPATH]; Com_sprintf (filename, sizeof(filename), "%s" ARCH_STRING DLL_EXT, name); #if defined(_DEBUG) libHandle = Sys_LoadLibrary( filename ); if ( !libHandle ) #endif { UnpackDLLResult unpackResult = Sys_UnpackDLL(filename); if ( !unpackResult.succeeded ) { if ( Sys_DLLNeedsUnpacking() ) { FreeUnpackDLLResult(&unpackResult); Com_DPrintf( "Sys_LoadLegacyGameDll: Failed to unpack %s from PK3.\n", filename ); return NULL; } } else { libHandle = Sys_LoadLibrary(unpackResult.tempDLLPath); } FreeUnpackDLLResult(&unpackResult); if ( !libHandle ) { #if defined(MACOS_X) && !defined(_JK2EXE) //First, look for the old-style mac .bundle that's inside a pk3 //It's actually zipped, and the zipfile has the same name as 'name' libHandle = Sys_LoadMachOBundle( name ); #endif if (!libHandle) { char *basepath = Cvar_VariableString( "fs_basepath" ); char *homepath = Cvar_VariableString( "fs_homepath" ); char *cdpath = Cvar_VariableString( "fs_cdpath" ); char *gamedir = Cvar_VariableString( "fs_game" ); #ifdef MACOS_X char *apppath = Cvar_VariableString( "fs_apppath" ); #endif const char *searchPaths[] = { homepath, #ifdef MACOS_X apppath, #endif basepath, cdpath, }; size_t numPaths = ARRAY_LEN( searchPaths ); libHandle = Sys_LoadDllFromPaths( filename, gamedir, searchPaths, numPaths, SEARCH_PATH_BASE | SEARCH_PATH_MOD, __FUNCTION__ ); if ( !libHandle ) return NULL; } } } typedef void QDECL DllEntryProc( SystemCallProc *syscallptr ); DllEntryProc *dllEntry = (DllEntryProc *)Sys_LoadFunction( libHandle, "dllEntry" ); *vmMain = (VMMainProc *)Sys_LoadFunction( libHandle, "vmMain" ); if ( !*vmMain || !dllEntry ) { Com_DPrintf ( "Sys_LoadLegacyGameDll(%s) failed to find vmMain function:\n...%s!\n", name, Sys_LibraryError() ); Sys_UnloadLibrary( libHandle ); return NULL; } Com_DPrintf ( "Sys_LoadLegacyGameDll(%s) found vmMain function at 0x%" PRIxPTR "\n", name, *vmMain ); dllEntry( systemcalls ); return libHandle; }