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 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 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 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 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 Share this post Link to post