Skip to content

Commit 4dfe8b1

Browse files
committed
hotfix: Titanfall_alt.exe not being updated by installer + mitigation applying failure error being displayed for non-CET CPUs
1 parent 011c41d commit 4dfe8b1

File tree

4 files changed

+49
-5
lines changed

4 files changed

+49
-5
lines changed

bme_version.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1b11
1+
1b12

installer/installer_simple2.iss

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ Source: "source\bme\crashpad_wer.dll"; DestDir: "{app}\bme"; Flags: ignoreversio
7979
Source: "source\r1\media\fov_video_15ms_480x400.bik"; DestDir: "{app}\r1\media"; Flags: ignoreversion onlyifdoesntexist
8080
Source: "{app}\bin\x64_retail\launcher.dll"; DestDir: "{app}\bin\x64_retail"; DestName: "launcher.org.dll"; Flags: external skipifsourcedoesntexist onlyifdoesntexist uninsneveruninstall
8181
Source: "source\bin\x64_retail\launcher.dll"; DestDir: "{app}\bin\x64_retail"; Flags: ignoreversion uninsneveruninstall
82-
Source: "source\Titanfall_alt.exe"; DestDir: "{app}"; Flags: ignoreversion onlyifdoesntexist
82+
Source: "source\Titanfall_alt.exe"; DestDir: "{app}"; Flags: ignoreversion
8383

8484
[InstallDelete]
8585
; old loaders from beta

loader_launcher_exe/main.cpp

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,11 @@
33

44
#include <wtypes.h>
55
#include <stdio.h>
6+
#include <Shlwapi.h>
67

78
#include <string>
89
#include <system_error>
9-
#include <Shlwapi.h>
10+
#include <unordered_map>
1011

1112
#define ERROR_MESSAGE_CAPTION "BME Launcher EXE error"
1213

@@ -52,6 +53,23 @@ bool IsAnyIMEInstalled()
5253
return false;
5354
}
5455

56+
bool DoesCpuSupportCetShadowStack()
57+
{
58+
int cpuInfo[4] = { 0, 0, 0, 0 };
59+
__cpuidex(cpuInfo, 7, 0);
60+
return (cpuInfo[2] & (1 << 7)) != 0; // Check bit 7 in ECX (cpuInfo[2])
61+
}
62+
63+
std::unordered_map<PROCESS_MITIGATION_POLICY, const char*> g_mitigationPolicyNames = {
64+
{ ProcessASLRPolicy, "ProcessASLRPolicy" },
65+
{ ProcessDynamicCodePolicy, "ProcessDynamicCodePolicy" },
66+
{ ProcessExtensionPointDisablePolicy, "ProcessExtensionPointDisablePolicy" },
67+
{ ProcessControlFlowGuardPolicy, "ProcessControlFlowGuardPolicy" },
68+
{ ProcessSignaturePolicy, "ProcessSignaturePolicy" },
69+
{ ProcessImageLoadPolicy, "ProcessImageLoadPolicy" },
70+
{ ProcessUserShadowStackPolicy, "ProcessUserShadowStackPolicy" },
71+
};
72+
5573
void SetMitigationPolicies()
5674
{
5775
auto kernel32 = GetModuleHandleW(L"kernel32.dll");
@@ -66,8 +84,12 @@ void SetMitigationPolicies()
6684
bool result = SetProcessMitigationPolicy(MitigationPolicy, lpBuffer, dwLength);
6785
if (!result)
6886
{
87+
if (MitigationPolicy == ProcessUserShadowStackPolicy && !DoesCpuSupportCetShadowStack())
88+
return;
6989
auto lastError = GetLastError();
70-
MessageBoxA(0, ("Failed mitigation: " + std::to_string(MitigationPolicy) + ", error: " + std::to_string(lastError)).c_str(),
90+
MessageBoxA(0, ("Failed mitigation: "
91+
+ (g_mitigationPolicyNames.contains(MitigationPolicy) ? g_mitigationPolicyNames[MitigationPolicy] : std::to_string(MitigationPolicy))
92+
+ ", error: " + std::to_string(lastError) + "\n\nThis is a non-fatal error.").c_str(),
7193
"BME: SetProcessMitigationPolicy failed", 0);
7294
}
7395
};

loader_launcher_proxy/dllmain.cpp

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
#include <string>
77
#include <system_error>
8+
#include <unordered_map>
89

910
#define ERROR_MESSAGE_CAPTION "BME Launcher DLL Error"
1011

@@ -81,6 +82,23 @@ bool IsAnyIMEInstalled()
8182
return false;
8283
}
8384

85+
bool DoesCpuSupportCetShadowStack()
86+
{
87+
int cpuInfo[4] = { 0, 0, 0, 0 };
88+
__cpuidex(cpuInfo, 7, 0);
89+
return (cpuInfo[2] & (1 << 7)) != 0; // Check bit 7 in ECX (cpuInfo[2])
90+
}
91+
92+
std::unordered_map<PROCESS_MITIGATION_POLICY, const char*> g_mitigationPolicyNames = {
93+
{ ProcessASLRPolicy, "ProcessASLRPolicy" },
94+
{ ProcessDynamicCodePolicy, "ProcessDynamicCodePolicy" },
95+
{ ProcessExtensionPointDisablePolicy, "ProcessExtensionPointDisablePolicy" },
96+
{ ProcessControlFlowGuardPolicy, "ProcessControlFlowGuardPolicy" },
97+
{ ProcessSignaturePolicy, "ProcessSignaturePolicy" },
98+
{ ProcessImageLoadPolicy, "ProcessImageLoadPolicy" },
99+
{ ProcessUserShadowStackPolicy, "ProcessUserShadowStackPolicy" },
100+
};
101+
84102
void SetMitigationPolicies()
85103
{
86104
auto kernel32 = GetModuleHandleW(L"kernel32.dll");
@@ -95,8 +113,12 @@ void SetMitigationPolicies()
95113
bool result = SetProcessMitigationPolicy(MitigationPolicy, lpBuffer, dwLength);
96114
if (!result)
97115
{
116+
if (MitigationPolicy == ProcessUserShadowStackPolicy && !DoesCpuSupportCetShadowStack())
117+
return;
98118
auto lastError = GetLastError();
99-
MessageBoxA(0, ("Failed mitigation: " + std::to_string(MitigationPolicy) + ", error: " + std::to_string(lastError)).c_str(),
119+
MessageBoxA(0, ("Failed mitigation: "
120+
+ (g_mitigationPolicyNames.contains(MitigationPolicy) ? g_mitigationPolicyNames[MitigationPolicy] : std::to_string(MitigationPolicy))
121+
+ ", error: " + std::to_string(lastError) + "\n\nThis is a non-fatal error.").c_str(),
100122
"BME: SetProcessMitigationPolicy failed", 0);
101123
}
102124
};

0 commit comments

Comments
 (0)