예제 #1
0
//------------------------------------------------------------------------------------
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;
}
예제 #2
0
//------------------------------------------------------------------------------------
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;
}