icecoldduke Posted February 22, 2021 (edited) Using a custom pipeline process, I created PDB files(debug symbols) for Quake 4 and Prey. It looks like the process captured 45% of the Quake 4 functions and 70% of the Prey functions. I created these PDB's by creating function signatures in Doom 3 vanilla using the GPL code, and the ETQW demo pdb files that Splash Damage released with the demo. If anyone is interested, I posted a bit more about it here along with the links to the generated PDB files: http://www.doom3world.com/index.php?threads/quake-4-and-prey-pdb.96/ Edited April 9, 2021 by icecoldduke 1 Quote Share this post Link to post
Tetzlaff Posted February 23, 2021 (edited) I don't really understand what you can do with these files, but thanks for keeping us updated! Edited April 10, 2021 by Tetzlaff 0 Quote Share this post Link to post
icecoldduke Posted February 23, 2021 8 hours ago, Tetzlaff said: I don't really understand what you can do with this files, but thanks for keeping us updated! If someone is developing a quake 4 or prey mod, and they want to do code injections to add graphical features or debug a engine side crash, instead of navigating a sea of addresses, they have function names that match the addresses. so this resolves 0x440022 which doesn’t mean much to anyone to a function name like R_RenderSomethingCool 0 Quote Share this post Link to post
icecoldduke Posted April 3, 2021 The Quake 4 Mac OS version actually contains debug symbols(they weren't stripped out). Using that I was able to figure out most of the interface bits to Quake 4 toolsx86.dll. http://www.doom3world.com/index.php?threads/quake-4-toolsx86-dll-interface.105/ class rvToolsInterface { public: rvToolsInterface::~rvToolsInterface() = 0; virtual void GetInstance(void) = 0; virtual HWND GetParentWindow(void) = 0; virtual HDC GetDC(void) = 0; virtual bool IsParentWindowVisible(void) = 0; virtual void InitTool(int,idDict const*) = 0; virtual void ShutdownTool(int) = 0; virtual bool IsToolActive(int) = 0; virtual void Frame(void) = 0; virtual void Shutdown(void) = 0; virtual void HandleToolPrint(char const*) = 0; virtual void HandleMapChange(void) = 0; virtual void StartLevelLoad(void) = 0; virtual void EndLevelLoad(void) = 0; virtual int GetSourceControl(void) = 0; virtual void MakeGameCurrent(void) = 0; virtual void SetDefaultState(void) = 0; virtual void Set2D(int,int) = 0; virtual void DoRBFDialog(char const*) = 0; virtual void PlaybackEditorRefresh(void) = 0; virtual void ModViewShutdown(char const*) = 0; virtual void ModViewRun(void) = 0; virtual void ModViewGetJointStatus(int) = 0; virtual bool ModViewIsSurfaceSelected(char const*) = 0; virtual bool ModViewIsSurfaceHidden(char const*) = 0; virtual int ModViewGetBgrndColor(void) = 0; virtual bool FXEditorIsActive(void) = 0; virtual void FXEditorRefreshEffects(void) = 0; virtual void FXEditorPlayEffect(bool) = 0; virtual void FXEditorStopEffect(void) = 0; virtual void FXEditorRefreshMaterials(void) = 0; // Unknown return class! virtual void *GEAllocateWindowWrapper(idWindow *) = 0; virtual void GEDeallocateWindowWrapper(idWindow *) = 0; virtual void GEFinish(idWindow *) = 0; virtual void GEAddScript(idWindow *,char const*,char const*) = 0; virtual void GEVariableDictSet(idWindow *,char const*,char const*) = 0; virtual int GESetStateKey(idWindow *,char const*,char const*,bool) = 0; virtual void GEMessage(char const*,...) = 0; virtual void DebuggerPrint(char const*) = 0; virtual void DebuggerCheckBreakpoint(idInterpreter *,idProgram *,int) = 0; virtual void DmapCleanupOptimizedShadowTris(int,srfTriangles_s *) = 0; virtual void DmapSuperOptimizeOccluders(SOOData_s *,idVec4 *,int *,int,idPlane,idVec3) = 0; virtual void DmapOutputString(char const*) = 0; virtual void SetListenerArea(int) = 0; virtual int GetListenerArea(void) = 0; virtual void PhonemeGen(idCmdArgs const&) = 0; virtual void ShakesGen(idCmdArgs const&) = 0; virtual void RoQFileEncode(idCmdArgs const&) = 0; virtual void Renderbump(idCmdArgs const&) = 0; virtual void RenderbumpFlat(idCmdArgs const&) = 0; virtual void Dmap(idCmdArgs const&) = 0; virtual void RunAAS(idCmdArgs const&) = 0; virtual void RunAASDir(idCmdArgs const&) = 0; virtual void RunReach(idCmdArgs const&) = 0; virtual void RunCluster(idCmdArgs const&) = 0; virtual void RunAASTactical(idCmdArgs const&) = 0; virtual void LocaliseGuis(idCmdArgs const&) = 0; virtual void LocaliseLipsyncs(idCmdArgs const&) = 0; virtual void LocaliseMaps(idCmdArgs const&) = 0; virtual void LocaliseValidateLipsyncs(idCmdArgs const&) = 0; virtual void LocaliseValidateStrings(idCmdArgs const&) = 0; }; struct rvToolsImport_t { int version; int unknown; HWND hwnd; HDC hdc; HGLRC hglrc; PIXELFORMATDESCRIPTOR *pfd; idSys *sys; idCommon *common; idCmdSystem *cmdSystem; idFileSystem *fileSystem; idRenderSystem *renderSystem; idSoundSystem *soundSystem; idRenderModelManager *renderModelManager; idUserInterfaceManager *userInterfaceManager; idDeclManager *declManager; void *off_103FCAA0; idCollisionModelManager *collisionModelManager; idGameEdit *gameEdit; void *off_103174C8; void *off_1031B6B8; void *off_1030FFB0; void *off_10310698; void *off_103FC49C; void *off_10310040; void *off_103FC344[0]; void *off_103FC428; idSession *session; idImageManager *globalImages; idGameLocal *game; }; rvToolsInterface *GetToolsAPI(rvToolsImport_t *api, operator new, operator delete, int *(GetHeapSize)(void *unknown)); 1 Quote Share this post Link to post
icecoldduke Posted April 9, 2021 I have been perfecting my function map hashing process. Using the Quake Wars 1.0 demo PDB file(yes the PDB debug file was accidently included in the 1.0 demo), I was able to match 10,000 out of 11,500 functions in the Quake Wars 1.5 retail SDK executable. The PDB file I created can be loaded in visual studio. https://github.com/jmarshall23/Quake4BSE/tree/master/quakewars/sdk15 0 Quote Share this post Link to post
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.