fix payload loading and bootstrap path
This commit is contained in:
1 parent
e908ab2355
commit
82004f6b5e
2 files changed
+11
-16
No files matched your search
@@ -22,7 +22,7 @@ private:
|
|||||||
static bool ExtractPayloadJar(HMODULE hModule, const MinecraftInfo& mcInfo, std::wstring& outJarPath);
|
static bool ExtractPayloadJar(HMODULE hModule, const MinecraftInfo& mcInfo, std::wstring& outJarPath);
|
||||||
static bool AddJarToClassLoader(JNIEnv* env, jobject classLoader, const std::wstring& jarPath);
|
static bool AddJarToClassLoader(JNIEnv* env, jobject classLoader, const std::wstring& jarPath);
|
||||||
static bool DefinePayloadClasses(JNIEnv* env, jobject classLoader, const std::wstring& jarPath);
|
static bool DefinePayloadClasses(JNIEnv* env, jobject classLoader, const std::wstring& jarPath);
|
||||||
static bool LaunchBootstrap(JNIEnv* env, jobject classLoader, const MinecraftInfo& mcInfo, HMODULE hModule);
|
static bool LaunchBootstrap(JNIEnv* env, jobject classLoader, const MinecraftInfo& mcInfo, const std::wstring& jarPath);
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace SlinkyNative
|
} // namespace SlinkyNative
|
||||||
@@ -40,9 +40,6 @@ InjectionStatus PayloadLoader::LoadAndStart(HMODULE hModule, const MinecraftInfo
|
|||||||
// Read and define dev.slinky classes
|
// Read and define dev.slinky classes
|
||||||
DefinePayloadClasses(env, mcInfo.classLoader, jarPath);
|
DefinePayloadClasses(env, mcInfo.classLoader, jarPath);
|
||||||
|
|
||||||
// Delete temporary jar immediately after loading
|
|
||||||
DeleteFileW(jarPath.c_str());
|
|
||||||
|
|
||||||
// Register native bridge methods
|
// Register native bridge methods
|
||||||
if (!NativeBridge::Register(env, mcInfo.classLoader)) {
|
if (!NativeBridge::Register(env, mcInfo.classLoader)) {
|
||||||
Logger::Log(L"FINAL STATUS: FAILED");
|
Logger::Log(L"FINAL STATUS: FAILED");
|
||||||
@@ -50,7 +47,7 @@ InjectionStatus PayloadLoader::LoadAndStart(HMODULE hModule, const MinecraftInfo
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Launch Bootstrap
|
// Launch Bootstrap
|
||||||
if (!LaunchBootstrap(env, mcInfo.classLoader, mcInfo, hModule)) {
|
if (!LaunchBootstrap(env, mcInfo.classLoader, mcInfo, jarPath)) {
|
||||||
Logger::Log(L"bootstrap failed; unloading");
|
Logger::Log(L"bootstrap failed; unloading");
|
||||||
Logger::Log(L"FINAL STATUS: FAILED");
|
Logger::Log(L"FINAL STATUS: FAILED");
|
||||||
return InjectionStatus::Failed;
|
return InjectionStatus::Failed;
|
||||||
@@ -378,7 +375,7 @@ bool PayloadLoader::DefinePayloadClasses(JNIEnv* env, jobject classLoader, const
|
|||||||
jsize byteLen = env->GetArrayLength(classBytesArr);
|
jsize byteLen = env->GetArrayLength(classBytesArr);
|
||||||
jbyte* rawBytes = env->GetByteArrayElements(classBytesArr, nullptr);
|
jbyte* rawBytes = env->GetByteArrayElements(classBytesArr, nullptr);
|
||||||
if (rawBytes) {
|
if (rawBytes) {
|
||||||
jclass definedClass = env->DefineClass(className.c_str(), classLoader, rawBytes, byteLen);
|
jclass definedClass = env->DefineClass(nullptr, classLoader, rawBytes, byteLen);
|
||||||
if (definedClass) {
|
if (definedClass) {
|
||||||
definedCount++;
|
definedCount++;
|
||||||
env->DeleteLocalRef(definedClass);
|
env->DeleteLocalRef(definedClass);
|
||||||
@@ -408,7 +405,7 @@ bool PayloadLoader::DefinePayloadClasses(JNIEnv* env, jobject classLoader, const
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool PayloadLoader::LaunchBootstrap(JNIEnv* env, jobject classLoader, const MinecraftInfo& mcInfo, HMODULE hModule) {
|
bool PayloadLoader::LaunchBootstrap(JNIEnv* env, jobject classLoader, const MinecraftInfo& mcInfo, const std::wstring& jarPath) {
|
||||||
jclass bootstrapClass = nullptr;
|
jclass bootstrapClass = nullptr;
|
||||||
|
|
||||||
if (classLoader) {
|
if (classLoader) {
|
||||||
@@ -440,20 +437,18 @@ bool PayloadLoader::LaunchBootstrap(JNIEnv* env, jobject classLoader, const Mine
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
wchar_t dllPath[MAX_PATH] = { 0 };
|
int u8Len = WideCharToMultiByte(CP_UTF8, 0, jarPath.c_str(), -1, nullptr, 0, nullptr, nullptr);
|
||||||
GetModuleFileNameW(hModule, dllPath, MAX_PATH);
|
std::vector<char> u8JarPath(u8Len);
|
||||||
int u8Len = WideCharToMultiByte(CP_UTF8, 0, dllPath, -1, nullptr, 0, nullptr, nullptr);
|
WideCharToMultiByte(CP_UTF8, 0, jarPath.c_str(), -1, u8JarPath.data(), u8Len, nullptr, nullptr);
|
||||||
std::vector<char> u8DllPath(u8Len);
|
|
||||||
WideCharToMultiByte(CP_UTF8, 0, dllPath, -1, u8DllPath.data(), u8Len, nullptr, nullptr);
|
|
||||||
|
|
||||||
jstring jMapping = env->NewStringUTF(mcInfo.mappingName.c_str());
|
jstring jMapping = env->NewStringUTF(mcInfo.mappingName.c_str());
|
||||||
jstring jDllPath = env->NewStringUTF(u8DllPath.data());
|
jstring jPayloadPath = env->NewStringUTF(u8JarPath.data());
|
||||||
|
|
||||||
Logger::Log(L"Bootstrap.start calling with mapping=%hs", mcInfo.mappingName.c_str());
|
Logger::Log(L"Bootstrap.start calling with mapping=%hs, payload=%ls", mcInfo.mappingName.c_str(), jarPath.c_str());
|
||||||
env->CallStaticVoidMethod(bootstrapClass, startMethod, jMapping, jDllPath);
|
env->CallStaticVoidMethod(bootstrapClass, startMethod, jMapping, jPayloadPath);
|
||||||
|
|
||||||
env->DeleteLocalRef(jMapping);
|
env->DeleteLocalRef(jMapping);
|
||||||
env->DeleteLocalRef(jDllPath);
|
env->DeleteLocalRef(jPayloadPath);
|
||||||
env->DeleteLocalRef(bootstrapClass);
|
env->DeleteLocalRef(bootstrapClass);
|
||||||
|
|
||||||
if (env->ExceptionCheck()) {
|
if (env->ExceptionCheck()) {
|
||||||
|
|||||||
Reference in new issue
Block a user