//------------------------------------------------------------------------------------ PSModData _stdcall CreateModule(HMODULE hDllMod) { if(ModInfo)return ModInfo; Logger::LogProc = DEFLOGPROC; Logger::MsgProc = ModWriteLogFile; ModInfo = new SModData(); ModInfo->ThisLibBase = hDllMod; ModInfo->DefHeapHandle = GetProcessHeap(); ModInfo->ExeModuleBase = GetModuleHandle(NULL); GetModuleFileName(hDllMod,(LPSTR)&ModInfo->CurrentDir,sizeof(ModInfo->CurrentDir)); // DLL path GetModuleFileName(ModInfo->ExeModuleBase,(LPSTR)&ModInfo->GameCurDir,sizeof(ModInfo->GameCurDir)); // EXE path TrimFilePath((LPSTR)&ModInfo->CurrentDir); TrimFilePath((LPSTR)&ModInfo->GameCurDir); if(lstrcmpi((LPSTR)&ModInfo->CurrentDir,(LPSTR)&ModInfo->GameCurDir)==0)lstrcat((LPSTR)&ModInfo->CurrentDir,"mge3\\"); // Work with MGE lstrcpy((LPSTR)&ModInfo->CfgFilePath, (LPSTR)&ModInfo->CurrentDir); lstrcat((LPSTR)&ModInfo->CfgFilePath, CONFIGINIFILE); LoadConfiguration((LPSTR)&ModInfo->CfgFilePath); LogMsg("Main EXE module loaded at %08X.", (DWORD)ModInfo->ExeModuleBase); if(GetProcAddress(ModInfo->ExeModuleBase,MLDRPROCNAME)){ModInfo->ModuleLoader=true;return NULL;} // Just if the function present LogMsg("Starting %s...",MOD_NAME); ModInfo->PatchBase = (PBYTE)ModInfo->ExeModuleBase; UINT result = 0; result += InitDialogEngine(); result += FixLoadBsa(); result += InitMWKeyboard(); if(ModInfo->EnableConsole)result += InitConsole(); if(result)LogMsg("Errors while initializing: %u", result); return ModInfo; }
//------------------------------------------------------------------------------------ PSModData _stdcall CreateModule(HMODULE hDllMod) { if(ModInfo)return ModInfo; Logger::LogProc = DEFLOGPROC; Logger::MsgProc = ModWriteLogFile; DWORD Index; DWORD Result; ModInfo = new SModData(); ModInfo->ThisLibBase = hDllMod; ModInfo->hDefHeap = GetProcessHeap(); ModInfo->ExeModuleBase = GetModuleHandle(NULL); PBYTE PatchBase = (PBYTE)ModInfo->ExeModuleBase; GetModuleFileName(ModInfo->ThisLibBase,(LPSTR)&ModInfo->CurrentDir,sizeof(ModInfo->CurrentDir)); GetModuleFileName(ModInfo->ExeModuleBase,(LPSTR)&ModInfo->GameCurDir,sizeof(ModInfo->GameCurDir)); // EXE path TrimFilePath((LPSTR)&ModInfo->CurrentDir); TrimFilePath((LPSTR)&ModInfo->GameCurDir); if(lstrcmpi((LPSTR)&ModInfo->CurrentDir,(LPSTR)&ModInfo->GameCurDir)==0)lstrcat((LPSTR)&ModInfo->CurrentDir,"mge3\\"); // Work with MGE lstrcpy((LPSTR)&ModInfo->CfgFilePath, (LPSTR)&ModInfo->CurrentDir); lstrcat((LPSTR)&ModInfo->CfgFilePath, CONFIGINIFILE); lstrcpy((LPSTR)&ModInfo->SpeechDirectory, (LPSTR)&ModInfo->GameCurDir); lstrcat((LPSTR)&ModInfo->SpeechDirectory, "Data Files\\Speech\\"); LoadConfiguration((LPSTR)&ModInfo->CfgFilePath); LogMsg("Main EXE module loaded at %08X.", (DWORD)ModInfo->ExeModuleBase); if(GetProcAddress(ModInfo->ExeModuleBase,MLDRPROCNAME)){ModInfo->ModuleLoader=true;return NULL;} // Just if the function present LogMsg("Starting %s...",MOD_NAME); Result = Index = 0; PatchBase = (PBYTE)ModInfo->ExeModuleBase; //================================================================================ // TODO: Place hooks into a linked list // For making a hook chains in modiles, better DO NOT USE 'SetCmdValue' ans 'SetAddressInVFT'. TODO: Make fast chaining hooks for 'CALL XXXX' instead of directly setting address LogMsg("Setting hook on checking 'MouseLookDisabled' flag."); Result += ModInfo->CodeHooks[Index++].SetCodeHook(&PatchBase[0x00169264],GetAddress<CODEHOOK32::CODEHOOKPROC32>(__CamLookDisabling),"8A85B20500"); //------------------------------------------------------------------- LogMsg("Setting hook on camera`s vertical delta writing."); Result += ModInfo->CodeHooks[Index++].SetCodeHook(&PatchBase[0x00169148],GetAddress<CODEHOOK32::CODEHOOKPROC32>(__CamLookVertDelta),"84C0895C24"); //------------------------------------------------------------------- LogMsg("Setting hook on camera`s horizontal delta writing."); Result += ModInfo->CodeHooks[Index++].SetCodeHook(&PatchBase[0x00169120],GetAddress<CODEHOOK32::CODEHOOKPROC32>(__CamLookHortDelta),"894C241C8B"); //------------------------------------------------------------------- LogMsg("Setting hook on locking Player`s sneaking in menu mode."); Result += ModInfo->CodeHooks[Index++].SetCodeHook(&PatchBase[0x00169781],GetAddress<CODEHOOK32::CODEHOOKPROC32>(__PlayerSneakLocking),"8A85B00500"); //------------------------------------------------------------------- LogMsg("Setting hook on checking 'GoToJail'."); Result += ModInfo->CodeHooks[Index++].SetCmdValue(&PatchBase[0x00167F9D],GetAddress<PVOID>(&CObjMACP::__GoToJailChecking),"E87E260000"); //------------------------------------------------------------------- LogMsg("Setting hook on 'AIDoActorAttack' - suspend hostile NPCs while PC in dialogue."); Result += ModInfo->CodeHooks[Index++].SetCmdValue(&PatchBase[0x0012EDF8],GetAddress<PVOID>(&CObjMACH::__AIDoActorAttack),"E823A30200"); //------------------------------------------------------------------- LogMsg("Setting hook for enabling hints in inventory when no an object focused."); Result += ModInfo->CodeHooks[Index++].SetCmdValue(&PatchBase[0x0001B3D6],GetAddress<PVOID>(&CRenderer::__ProcessPlayerUseAction),"E875160000"); //------------------------------------------------------------------- LogMsg("Setting hook on exiting from menu mode."); Result += ModInfo->CodeHooks[Index++].SetCodeHook(&PatchBase[0x001951AB],GetAddress<CODEHOOK32::CODEHOOKPROC32>(__ExitMenuMode),"E8A0020000"); // 0x001951B0 patched by the 'Text.dll' //------------------------------------------------------------------- LogMsg("Setting hook on AI action changing."); Result += ModInfo->CodeHooks[Index++].SetCodeHook(&PatchBase[0x0012EAB5],GetAddress<CODEHOOK32::CODEHOOKPROC32>(__ActorAiActionChanging),"8B86C80000"); //------------------------------------------------------------------- LogMsg("Setting hook to changing voice pitch."); Result += ModInfo->CodeHooks[Index++].SetCmdValue(&PatchBase[0x0008C6B6],GetAddress<PVOID>(&CSoundBase::__SetDSBufFrequency),"E8A563F7FF"); //------------------------------------------------------------------- LogMsg("Setting hook for pausing water riffles in menu mode."); Result += ModInfo->CodeHooks[Index++].SetCodeHook(&PatchBase[0x0011C896],GetAddress<CODEHOOK32::CODEHOOKPROC32>(__MenuFreezingWaterRiffles),"8A88D60000"); //------------------------------------------------------------------- LogMsg("Setting hook for pausing doors moving in menu mode."); Result += ModInfo->CodeHooks[Index++].SetCodeHook(&PatchBase[0x000E721C],GetAddress<CODEHOOK32::CODEHOOKPROC32>(__MenuFreezingDoors),"8A88D60000"); //------------------------------------------------------------------- LogMsg("Setting hook for pausing shadows in menu mode."); Result += ModInfo->CodeHooks[Index++].SetCodeHook(&PatchBase[0x000388D0],GetAddress<CODEHOOK32::CODEHOOKPROC32>(__MenuFreezingShadows),"8A88D60000"); //------------------------------------------------------------------- LogMsg("Setting hook for pausing compass in menu mode."); Result += ModInfo->CodeHooks[Index++].SetCodeHook(&PatchBase[0x001EB7BC],GetAddress<CODEHOOK32::CODEHOOKPROC32>(__MenuFreezingCompass),"8A88D60000"); //------------------------------------------------------------------- LogMsg("Setting hook for pausing an active objects in menu mode."); // WATCH FOR IT! Result += ModInfo->CodeHooks[Index++].SetCodeHook(&PatchBase[0x0000F68D],GetAddress<CODEHOOK32::CODEHOOKPROC32>(__MenuFreezingActiveObjects),"8A86D60000"); //------------------------------------------------------------------- LogMsg("Setting hook for allowing head tracking in menu mode."); Result += ModInfo->CodeHooks[Index++].SetCodeHook(&PatchBase[0x0006F420],GetAddress<CODEHOOK32::CODEHOOKPROC32>(__DlgAllowingHeadTrack),"8A81D60000"); //------------------------------------------------------------------- LogMsg("Setting hook for DIALOGS and JOURNAL."); Result += ModInfo->CodeHooks[Index++].SetCmdValue(&PatchBase[0x0000BE32],GetAddress<PVOID>(&CTESFont::__PrepareTextDlgJnl),"E8C9F6FFFF"); //------------------------------------------------------------------- LogMsg("Setting hook for opening books."); Result += ModInfo->CodeHooks[Index++].SetCmdValue(&PatchBase[0x000A2A15],GetAddress<PVOID>(__OpenBook),"E886981000"); //------------------------------------------------------------------- LogMsg("Setting hook for opening documents."); Result += ModInfo->CodeHooks[Index++].SetCmdValue(&PatchBase[0x002138FB],GetAddress<PVOID>(__OpenDocument),"E860F7FFFF"); //------------------------------------------------------------------- LogMsg("Setting hook for book page changing."); Result += ModInfo->CodeHooks[Index++].SetCmdValue(&PatchBase[0x001AC36B],GetAddress<PVOID>(__ChangeBookPageForward),"6870C95A00"); Result += ModInfo->CodeHooks[Index++].SetCmdValue(&PatchBase[0x001ABE9C],GetAddress<PVOID>(__ChangeBookPageForward),"6870C95A00"); Result += ModInfo->CodeHooks[Index++].SetCmdValue(&PatchBase[0x001AC358],GetAddress<PVOID>(__ChangeBookPageBackward),"68C0C85A00"); Result += ModInfo->CodeHooks[Index++].SetCmdValue(&PatchBase[0x001ABCBF],GetAddress<PVOID>(__ChangeBookPageBackward),"68C0C85A00"); //------------------------------------------------------------------- LogMsg("Setting hook on 'SendTextLine' for documents."); Result += ModInfo->CodeHooks[Index++].SetCmdValue(&PatchBase[0x0021375E],GetAddress<PVOID>(&CWindow::__DrawTextLine),"E87D54F7FF"); Result += ModInfo->CodeHooks[Index++].SetCmdValue(&PatchBase[0x0021378C],GetAddress<PVOID>(&CWindow::__DrawTextLine),"E84F54F7FF"); //------------------------------------------------------------------- LogMsg("Setting hook for parsing book lines (Hook 'DrawTextLine')."); Result += ModInfo->CodeHooks[Index++].SetCmdValue(&PatchBase[0x001AD9AF],GetAddress<PVOID>(&CWindow::__DrawTextLine),"E82CB2FDFF"); Result += ModInfo->CodeHooks[Index++].SetCmdValue(&PatchBase[0x001ADAB3],GetAddress<PVOID>(&CWindow::__DrawTextLine),"E828B1FDFF"); //------------------------------------------------------------------- LogMsg("Setting hook for finishing journal page."); Result += ModInfo->CodeHooks[Index++].SetCmdValue(&PatchBase[0x001D644E],GetAddress<PVOID>(__MakeJournalPage),"6860725D00"); Result += ModInfo->CodeHooks[Index++].SetCmdValue(&PatchBase[0x001D6377],GetAddress<PVOID>(__MakeJournalPage),"6860725D00"); // Possible this is do not used! //------------------------------------------------------------------- LogMsg("Setting hook for Menu mode animation freezing control."); Result += ModInfo->CodeHooks[Index++].SetCodeHook(&PatchBase[0x0001B3AF],GetAddress<CODEHOOK32::CODEHOOKPROC32>(__MenuModeAnimationFreezing),"8A81D60000"); //------------------------------------------------------------------- LogMsg("Setting hook on dialogue begin."); Result += ModInfo->CodeHooks[Index++].SetCodeHook(&PatchBase[0x0012935A],GetAddress<CODEHOOK32::CODEHOOKPROC32>(__StartDialogue),"668B154234"); //------------------------------------------------------------------- LogMsg("Setting hook to loading voice file."); Result += ModInfo->CodeHooks[Index++].SetCmdValue(&PatchBase[0x0008C369],GetAddress<PVOID>(&CSoundBase::__OpenVoiceFile),"E8425AF7FF"); // See 'vadefs.h' (Variable argument lists) for more useful code examples //------------------------------------------------------------------- LogMsg("Setting hook on head tracking of NPC."); Result += ModInfo->CodeHooks[Index++].SetCmdValue(&PatchBase[0x0016F68B],GetAddress<PVOID>(&CAnimation::__HeadTrack),"E88002F0FF"); //------------------------------------------------------------------- LogMsg("Setting hook on AI state check."); Result += ModInfo->CodeHooks[Index++].SetCodeHook(&PatchBase[0x00121D83],GetAddress<CODEHOOK32::CODEHOOKPROC32>(__ControlCurDlgActorAI),"F641240874"); //------------------------------------------------------------------- LogMsg("Setting hook on changing view mode (1st - 3rd Person switch)."); Result += ModInfo->CodeHooks[Index++].SetCmdValue(&PatchBase[0x00143A17],GetAddress<PVOID>(&CCamera::__SwitchViewMode),"E854EBFFFF"); //------------------------------------------------------------------- LogMsg("Setting hook on changing dialogue topic."); Result += ModInfo->CodeHooks[Index++].SetCodeHook(&PatchBase[0x001C03F9],GetAddress<CODEHOOK32::CODEHOOKPROC32>(__ChangeDlgTopic),"75108B4770"); //------------------------------------------------------------------- LogMsg("Setting hook on open_close any text document."); Result += ModInfo->CodeHooks[Index++].SetFuncHook(&PatchBase[0x001AD630],GetAddress<CODEHOOK32::FUNCHOOKPROC32>(__OpenCloseBookAndDoc),"8B0D??????"); //------------------------------------------------------------------- LogMsg("Setting hook on 'ToggleGodMode'."); Result += ModInfo->CodeHooks[Index++].SetCodeHook(&PatchBase[0x00103D66],GetAddress<CODEHOOK32::CODEHOOKPROC32>(__ToggleGM),"8B89E40200"); //------------------------------------------------------------------- LogMsg("Setting hook on journal key press checking."); Result += ModInfo->CodeHooks[Index++].SetCodeHook(&PatchBase[0x0001AECB],GetAddress<CODEHOOK32::CODEHOOKPROC32>(__IsJournalAllowed),"85C00F84BA"); //------------------------------------------------------------------- //LogMsg("Setting hook on changing anim group."); // NO USE FOR THIS ! //Result += ModInfo->CodeHooks[Index++].SetCmdValue(&PatchBase[0x00140EF9],GetAddress<PVOID>(&CAnimation::__ChangeAnimGroup),"E8E2FBF2FF"); //------------------------------------------------------------------- LogMsg("Setting hook on Player`s scene updating."); Result += SetAddressInVFT(&PatchBase[0x0034AE30],1,&CCamera::__UpdatePlayerPositions); //================================================================================ if(Result) { MessageBox(NULL,(ModInfo->Config.LangIndex)?(SINGERRORMSGEN):SINGERRORMSGRU,THISMODNAME,MB_ICONSTOP|MB_SYSTEMMODAL|MB_OK); FreeLibraryAndExitThread(ModInfo->ThisLibBase, 0); // Finish process } //================================================================================ if(!(ModInfo->hWorkerThread = CreateThread(NULL,0,&WorkerThread,NULL,CREATE_SUSPENDED,&ModInfo->WorkerThreadID))){LogMsg("Failed to create worker thread!");return false;} LogMsg("Worker thread are created successfully."); ResumeThread(ModInfo->hWorkerThread); return ModInfo; }