summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTannin <devnull@localhost>2013-03-18 20:03:46 +0100
committerTannin <devnull@localhost>2013-03-18 20:03:46 +0100
commit8b31996525de06bcb0ff519be42a732c85f532c9 (patch)
treeddf491f435d282c687376ba4c13e99e7cc5dd7b0 /src
parentb3d0fcb2083143dc21c751adafd2523c3555e5d2 (diff)
- bugfix: invalid ini file name when creating profile for oblivion from default settings
- bugfix: archives.txt file was potentially not generated if there were no bsas - bugfix: static __declspec(thread) declaration causes crashes in windows versions before vista - logger class in hook.dll now tries alternative names for the log file if it can't access the regular file - path-environment variable for mo-spawned processes now contains the path to MO, in case the hook.dll needs to find the msvc-dlls - stack-search in ini-limit hack now starts searching on local stack. This should find the right stack position for the hack more reliable
Diffstat (limited to 'src')
-rw-r--r--src/mainwindow.cpp5
-rw-r--r--src/mainwindow.h1
-rw-r--r--src/shared/inject.cpp1
-rw-r--r--src/shared/oblivioninfo.cpp1
-rw-r--r--src/shared/skyriminfo.cpp4
-rw-r--r--src/spawn.cpp23
6 files changed, 30 insertions, 5 deletions
diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp
index 2d00580e..5bc339d3 100644
--- a/src/mainwindow.cpp
+++ b/src/mainwindow.cpp
@@ -528,6 +528,11 @@ bool MainWindow::saveCurrentLists()
reportError(tr("failed to save load order: %1").arg(e.what()));
}
+ // ensure the archive list exists
+ if (!QFile::exists(m_CurrentProfile->getArchivesFileName())) {
+ saveArchiveList();
+ }
+
return true;
}
diff --git a/src/mainwindow.h b/src/mainwindow.h
index 075c6247..89e29685 100644
--- a/src/mainwindow.h
+++ b/src/mainwindow.h
@@ -171,6 +171,7 @@ private:
void installMod(const QString &fileName);
void installMod();
bool modifyExecutablesDialog();
+ void modOpenNext();
void displayModInformation(ModInfo::Ptr modInfo, unsigned int index, int tab);
void displayModInformation(int row, int tab = 0);
void testExtractBSA(int modIndex);
diff --git a/src/shared/inject.cpp b/src/shared/inject.cpp
index 9fea7fc8..5a111c4a 100644
--- a/src/shared/inject.cpp
+++ b/src/shared/inject.cpp
@@ -136,6 +136,7 @@ void injectDLL(HANDLE processHandle, HANDLE threadHandle, const std::string &dll
(written != sizeof(stubLocal))) {
throw windows_error("failed to write stub to target process");
}
+
// finally, make the stub the new next thing for the thread to execute
threadContext.Eip = (ULONG)stubRemote;
if (::SetThreadContext(threadHandle, &threadContext) == 0) {
diff --git a/src/shared/oblivioninfo.cpp b/src/shared/oblivioninfo.cpp
index 1c714072..73e841a7 100644
--- a/src/shared/oblivioninfo.cpp
+++ b/src/shared/oblivioninfo.cpp
@@ -134,7 +134,6 @@ void OblivionInfo::createProfile(const std::wstring &directory, bool useDefaults
if (!FileExists(target.str())) {
std::wostringstream source;
- source << getMyGamesDirectory() << L"\\Oblivion\\oblivion.ini";
if (useDefaults) {
source << getGameDirectory() << L"\\oblivion_default.ini";
} else {
diff --git a/src/shared/skyriminfo.cpp b/src/shared/skyriminfo.cpp
index 26395e67..1c13effb 100644
--- a/src/shared/skyriminfo.cpp
+++ b/src/shared/skyriminfo.cpp
@@ -264,10 +264,6 @@ bool SkyrimInfo::rerouteToProfile(const wchar_t *fileName, const wchar_t *fullPa
}
}
-if (_wcsicmp(fileName, L"plugins.txt") == 0) {
- log("plugins.txt expected in \"%ls\", got \"%ls\"", m_AppData.c_str(), fullPath);
-}
-
if ((_wcsicmp(fileName, L"plugins.txt") == 0) &&
(m_AppData.empty() || (StrStrIW(fullPath, m_AppData.c_str()) != NULL))) {
return true;
diff --git a/src/spawn.cpp b/src/spawn.cpp
index 39bd2af9..e83c8e21 100644
--- a/src/spawn.cpp
+++ b/src/spawn.cpp
@@ -20,6 +20,7 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
#include "spawn.h"
#include "report.h"
#include "utility.h"
+#include <boost/scoped_array.hpp>
#include <gameinfo.h>
#include <inject.h>
#include <appconfig.h>
@@ -31,6 +32,8 @@ using namespace MOBase;
using namespace MOShared;
+static const int BUFSIZE = 4096;
+
bool spawn(LPCWSTR binary, LPCWSTR arguments, LPCWSTR currentDirectory, bool suspended, HANDLE& processHandle, HANDLE& threadHandle)
{
STARTUPINFO si;
@@ -44,7 +47,25 @@ bool spawn(LPCWSTR binary, LPCWSTR arguments, LPCWSTR currentDirectory, bool sus
} else {
commandLine = new wchar_t[length];
_snwprintf(commandLine, length, L"\"%ls\"", binary);
+ }
+ QString moPath = QCoreApplication::applicationDirPath();
+
+ boost::scoped_array<TCHAR> oldPath(new TCHAR[BUFSIZE]);
+ DWORD offset = ::GetEnvironmentVariable(TEXT("PATH"), oldPath.get(), BUFSIZE);
+ if (offset > BUFSIZE) {
+ oldPath.reset(new TCHAR[offset]);
+ ::GetEnvironmentVariable(TEXT("PATH"), oldPath.get(), offset);
+ }
+
+ {
+ boost::scoped_array<TCHAR> newPath(new TCHAR[offset + moPath.length() + 2]);
+ _tcsncpy(newPath.get(), oldPath.get(), offset - 1);
+ newPath.get()[offset - 1] = L'\0';
+ _tcsncat(newPath.get(), TEXT(";"), 1);
+ _tcsncat(newPath.get(), ToWString(QDir::toNativeSeparators(moPath)).c_str(), moPath.length());
+
+ ::SetEnvironmentVariable(TEXT("PATH"), newPath.get());
}
PROCESS_INFORMATION pi;
@@ -58,6 +79,8 @@ bool spawn(LPCWSTR binary, LPCWSTR arguments, LPCWSTR currentDirectory, bool sus
&si, &pi // startup and process information
);
+ ::SetEnvironmentVariable(TEXT("PATH"), oldPath.get());
+
delete [] commandLine;
if (!success) {