diff --git a/.gitignore b/.gitignore index 874cf38..427dbe5 100644 --- a/.gitignore +++ b/.gitignore @@ -31,6 +31,8 @@ mono_crash.* #[Oo]bj/ #[Ll]og/ #[Ll]ogs/ +Debug.zip +Release.zip # Visual Studio 2015/2017 cache/options directory .vs/ diff --git a/FlashpointSecurePlayer/CustomSecurityManager.cs b/FlashpointSecurePlayer/CustomSecurityManager.cs index 60dda3c..a0f0783 100644 --- a/FlashpointSecurePlayer/CustomSecurityManager.cs +++ b/FlashpointSecurePlayer/CustomSecurityManager.cs @@ -62,8 +62,9 @@ int InternetInterfaces.IInternetSecurityManager.GetSecuritySite(out IntPtr pSite } int InternetInterfaces.IInternetSecurityManager.MapUrlToZone([MarshalAs(UnmanagedType.LPWStr)] string pwszUrl, ref uint pdwZone, uint dwFlags) { - pdwZone = 0; - return INET_E_DEFAULT_ACTION; + // behave like local intranet + pdwZone = 1; + return S_OK; } int InternetInterfaces.IInternetSecurityManager.GetSecurityId([MarshalAs(UnmanagedType.LPWStr)] string pwszUrl, [MarshalAs(UnmanagedType.LPArray)] byte[] pbSecurityId, ref uint pcbSecurityId, uint dwReserved) { @@ -77,7 +78,6 @@ int InternetInterfaces.IInternetSecurityManager.ProcessUrlAction([MarshalAs(Unma dwAction == URLACTION_HTML_MIXED_CONTENT || // block HTTPS content on HTTP websites for Flashpoint Proxy dwAction == URLACTION_CLIENT_CERT_PROMPT || // don't allow invalid certificates dwAction == URLACTION_AUTOMATIC_ACTIVEX_UI || // do not display the install dialog for ActiveX Controls - dwAction == URLACTION_ALLOW_RESTRICTEDPROTOCOLS || // use same settings for every protocol dwAction == URLACTION_ALLOW_APEVALUATION || // the phishing filter is not applicable to this application dwAction == URLACTION_LOWRIGHTS || // turn off Protected Mode dwAction == URLACTION_ALLOW_ACTIVEX_FILTERING) { // don't allow ActiveX filtering @@ -90,6 +90,12 @@ int InternetInterfaces.IInternetSecurityManager.ProcessUrlAction([MarshalAs(Unma return S_OK; } + pPolicy = 0x00010000; + + if (dwAction == 0x00002007) { // undocumented action: permissions for components with manifests + return S_OK; + } + pPolicy = URLPOLICY_ALLOW; if ((dwAction >= URLACTION_DOWNLOAD_MIN && dwAction <= URLACTION_DOWNLOAD_MAX) || // allow downloading ActiveX Controls, scripts, etc. @@ -97,7 +103,7 @@ int InternetInterfaces.IInternetSecurityManager.ProcessUrlAction([MarshalAs(Unma (dwAction >= URLACTION_SCRIPT_MIN && dwAction <= URLACTION_SCRIPT_MAX) || // allow scripts (dwAction >= URLACTION_HTML_MIN && dwAction <= URLACTION_HTML_MAX) || // allow forms, fonts, meta elements, etc. (dwAction >= URLACTION_JAVA_MIN && dwAction <= URLACTION_JAVA_MAX) || // allow Java applets - dwAction == URLACTION_COOKIES || // allow all cookies, which are not in fact dangerous and are in fact harmless plaintext files that don't have any code in them + dwAction == URLACTION_COOKIES || // allow all cookies dwAction == URLACTION_COOKIES_SESSION || dwAction == URLACTION_COOKIES_THIRD_PARTY || dwAction == URLACTION_COOKIES_SESSION_THIRD_PARTY || @@ -108,6 +114,7 @@ int InternetInterfaces.IInternetSecurityManager.ProcessUrlAction([MarshalAs(Unma dwAction == URLACTION_DOTNET_USERCONTROLS || // allow .NET user controls dwAction == URLACTION_FEATURE_DATA_BINDING || // allow databinding dwAction == URLACTION_FEATURE_CROSSDOMAIN_FOCUS_CHANGE || // allow crossdomain + dwAction == URLACTION_ALLOW_RESTRICTEDPROTOCOLS || // allow active content regardless of if the protocol is restricted dwAction == URLACTION_ALLOW_AUDIO_VIDEO || // allow audio and video always dwAction == URLACTION_ALLOW_AUDIO_VIDEO_PLUGINS || dwAction == URLACTION_ALLOW_CROSSDOMAIN_DROP_WITHIN_WINDOW || // allow crossdomain, again diff --git a/FlashpointSecurePlayer/EnvironmentVariables.cs b/FlashpointSecurePlayer/EnvironmentVariables.cs index c8fee62..f620d87 100644 --- a/FlashpointSecurePlayer/EnvironmentVariables.cs +++ b/FlashpointSecurePlayer/EnvironmentVariables.cs @@ -13,9 +13,11 @@ namespace FlashpointSecurePlayer { class EnvironmentVariables : Modifications { + const string COMPATIBILITY_LAYER = "__COMPAT_LAYER"; + public EnvironmentVariables(Form Form) : base(Form) { } - new public void Activate(string name) { + public void Activate(string name, string server, string applicationMutexName) { base.Activate(name); ModificationsElement modificationsElement = GetModificationsElement(true, Name); EnvironmentVariablesElement environmentVariablesElement = null; @@ -27,15 +29,28 @@ public EnvironmentVariables(Form Form) : base(Form) { } throw new EnvironmentVariablesFailedException(); } + string compatibilityLayer = null; + try { - Environment.SetEnvironmentVariable(environmentVariablesElement.Name, RemoveVariablesFromValue(environmentVariablesElement.Value) as string); - } catch (ArgumentNullException) { + compatibilityLayer = Environment.GetEnvironmentVariable(COMPATIBILITY_LAYER); + } catch (ArgumentException) { throw new EnvironmentVariablesFailedException(); + } catch (SecurityException) { + throw new TaskRequiresElevationException(); + } + + try { + Environment.SetEnvironmentVariable(environmentVariablesElement.Name, RemoveVariablesFromValue(environmentVariablesElement.Value) as string); } catch (ArgumentException) { throw new EnvironmentVariablesFailedException(); } catch (SecurityException) { throw new TaskRequiresElevationException(); } + + if (environmentVariablesElement.Name == COMPATIBILITY_LAYER && String.IsNullOrEmpty(compatibilityLayer) && !String.IsNullOrEmpty(server)) { + RestartApplication(false, Form, applicationMutexName); + throw new InvalidModificationException(); + } } } @@ -58,8 +73,6 @@ public EnvironmentVariables(Form Form) : base(Form) { } try { Environment.SetEnvironmentVariable(environmentVariablesElement.Name, null); - } catch (ArgumentNullException) { - throw new EnvironmentVariablesFailedException(); } catch (ArgumentException) { throw new EnvironmentVariablesFailedException(); } catch (SecurityException) { diff --git a/FlashpointSecurePlayer/FlashpointSecurePlayer.cs b/FlashpointSecurePlayer/FlashpointSecurePlayer.cs index 946e8e2..a32bf2e 100644 --- a/FlashpointSecurePlayer/FlashpointSecurePlayer.cs +++ b/FlashpointSecurePlayer/FlashpointSecurePlayer.cs @@ -25,7 +25,7 @@ public partial class FlashpointSecurePlayer : Form { private readonly ModeTemplates ModeTemplates; private readonly EnvironmentVariables EnvironmentVariables; private readonly DownloadsBefore DownloadsBefore; - private readonly RegistryBackup RegistryBackup; + private readonly RegistryBackups RegistryBackup; private readonly SingleInstance SingleInstance; string ModificationsName = ACTIVE_EXE_CONFIGURATION_NAME; bool RunAsAdministratorModification = false; @@ -42,7 +42,7 @@ public FlashpointSecurePlayer() { ModeTemplates = new ModeTemplates(this); EnvironmentVariables = new EnvironmentVariables(this); DownloadsBefore = new DownloadsBefore(this); - RegistryBackup = new RegistryBackup(this); + RegistryBackup = new RegistryBackups(this); SingleInstance = new SingleInstance(this); } @@ -181,7 +181,7 @@ private async Task ActivateModificationsAsync(string commandLine, ErrorDelegate if (modificationsElement.EnvironmentVariables.Count > 0) { try { - EnvironmentVariables.Activate(ModificationsName); + EnvironmentVariables.Activate(ModificationsName, Server, APPLICATION_MUTEX_NAME); } catch (EnvironmentVariablesFailedException) { errorDelegate(Properties.Resources.EnvironmentVariablesFailed); } catch (System.Configuration.ConfigurationErrorsException) { diff --git a/FlashpointSecurePlayer/FlashpointSecurePlayer.csproj b/FlashpointSecurePlayer/FlashpointSecurePlayer.csproj index fc07641..46f95ee 100644 --- a/FlashpointSecurePlayer/FlashpointSecurePlayer.csproj +++ b/FlashpointSecurePlayer/FlashpointSecurePlayer.csproj @@ -92,7 +92,7 @@ - + Form diff --git a/FlashpointSecurePlayer/FlashpointSecurePlayerConfigs/activex.abcisland.abcisland.dll.config b/FlashpointSecurePlayer/FlashpointSecurePlayerConfigs/activex.abcisland.abcisland.dll.config index 465d81e..53d093b 100644 --- a/FlashpointSecurePlayer/FlashpointSecurePlayerConfigs/activex.abcisland.abcisland.dll.config +++ b/FlashpointSecurePlayer/FlashpointSecurePlayerConfigs/activex.abcisland.abcisland.dll.config @@ -6,6 +6,9 @@ + + + diff --git a/FlashpointSecurePlayer/FlashpointSecurePlayerConfigs/activex.mjolauncher2.mjolauncher.dll.config b/FlashpointSecurePlayer/FlashpointSecurePlayerConfigs/activex.mjolauncher2.mjolauncher.dll.config index 4e2dc7a..465d035 100644 --- a/FlashpointSecurePlayer/FlashpointSecurePlayerConfigs/activex.mjolauncher2.mjolauncher.dll.config +++ b/FlashpointSecurePlayer/FlashpointSecurePlayerConfigs/activex.mjolauncher2.mjolauncher.dll.config @@ -6,6 +6,9 @@ + + + diff --git a/FlashpointSecurePlayer/FlashpointSecurePlayerConfigs/activex.raptisoftgameloader.rsgameloader.dll.config b/FlashpointSecurePlayer/FlashpointSecurePlayerConfigs/activex.raptisoftgameloader.rsgameloader.dll.config index 9239ba9..cbfbb11 100644 --- a/FlashpointSecurePlayer/FlashpointSecurePlayerConfigs/activex.raptisoftgameloader.rsgameloader.dll.config +++ b/FlashpointSecurePlayer/FlashpointSecurePlayerConfigs/activex.raptisoftgameloader.rsgameloader.dll.config @@ -6,6 +6,9 @@ + + + diff --git a/FlashpointSecurePlayer/FlashpointSecurePlayerConfigs/java.config b/FlashpointSecurePlayer/FlashpointSecurePlayerConfigs/java.config index 0892be8..9d957dc 100644 --- a/FlashpointSecurePlayer/FlashpointSecurePlayerConfigs/java.config +++ b/FlashpointSecurePlayer/FlashpointSecurePlayerConfigs/java.config @@ -10,7 +10,7 @@ - + diff --git a/FlashpointSecurePlayer/Program.cs b/FlashpointSecurePlayer/Program.cs index 62ce80a..422734f 100644 --- a/FlashpointSecurePlayer/Program.cs +++ b/FlashpointSecurePlayer/Program.cs @@ -546,10 +546,10 @@ public DownloadBeforeElementCollection DownloadsBefore { public class RegistryBackupElementCollection : ModificationsConfigurationElementCollection { public class RegistryBackupElement : ConfigurationElement { - [ConfigurationProperty("type", DefaultValue = RegistryBackup.TYPE.KEY, IsRequired = false)] - public RegistryBackup.TYPE Type { + [ConfigurationProperty("type", DefaultValue = global::FlashpointSecurePlayer.RegistryBackups.TYPE.KEY, IsRequired = false)] + public RegistryBackups.TYPE Type { get { - return (RegistryBackup.TYPE)base["type"]; + return (RegistryBackups.TYPE)base["type"]; } set { diff --git a/FlashpointSecurePlayer/Properties/AssemblyInfo.cs b/FlashpointSecurePlayer/Properties/AssemblyInfo.cs index bd2bbd8..59592a2 100644 --- a/FlashpointSecurePlayer/Properties/AssemblyInfo.cs +++ b/FlashpointSecurePlayer/Properties/AssemblyInfo.cs @@ -33,7 +33,7 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.1.0")] -[assembly: AssemblyFileVersion("1.0.1.0")] +[assembly: AssemblyVersion("1.0.2.0")] +[assembly: AssemblyFileVersion("1.0.2.0")] [assembly: NeutralResourcesLanguage("en")] diff --git a/FlashpointSecurePlayer/README.md b/FlashpointSecurePlayer/README.md index 6102bca..6df07a7 100644 --- a/FlashpointSecurePlayer/README.md +++ b/FlashpointSecurePlayer/README.md @@ -1,4 +1,4 @@ -# Flashpoint Secure Player 1.0.1 +# Flashpoint Secure Player 1.0.2 This application attempts to solve common compatibility or portability issues posed by browser plugins on Windows for the purpose of playback in BlueMaxima's Flashpoint. It is compatible with Windows 7, Windows 8, Windows 8.1 and Windows 10, and requires .NET Framework 4.5. If you are on Windows 8.1 or Windows 10, or if you are on Windows 7/8 and have updates enabled, you already have .NET Framework 4.5. Otherwise, you may [download .NET Framework 4.5.](http://www.microsoft.com/en-us/download/details.aspx?id=30653) @@ -9,7 +9,7 @@ It is driven by a model consisting of two concepts: Modes and Modifications. The Presently, there are three Modes (ActiveX Mode, Server Mode, and Software Mode) and six Modifications (Run As Administrator, Mode Templates, Environment Variables, Downloads Before, Registry Backups, and Single Instance.) -This application has bugs. Help me find them! See the [Known Issues](#known-issues) below, and if you've found a bug that isn't listed, report anything unusual as an issue. +This application has bugs. Help me find them! If you've found a bug, report anything unusual as an issue. # Modes The Mode determines what action Flashpoint Secure Player will perform after all of the Modifications are made. For example, the end goal may be to open a browser, or a specific software. The Mode to use is not optional. If it is not set, an error will occur. Modes are exclusive - there may only be one set at a time. @@ -154,7 +154,7 @@ With the "Miniclip" Modification Name specified, all URLs passed into Server Mod The Software Mode Template works identically to the Server Mode Template in that it provides the ability to replace the command line passed in with regexes. The Software Mode Template also has an additional attribute, `hideWindow`, which causes the window of the software to be hidden. This is ideal for hiding console windows for softwares that have them. -For example, a practical use of the Software Mode Template would be to create a `modification` element that always ensures the use of important Java options. +For example, a practical use of the Software Mode Template would be to create a `modification` element that always ensures the use of important Java options. Note that this example is simplified from the real Java configuration file for the purpose of demonstration. ``` @@ -354,9 +354,6 @@ You may notice that because the Flashpoint Secure Player is effectively capable - Generally speaking, more specific error reporting would be nice. - Old CPU Simulator integration? -# Known Issues - - The compatibility layers have no effect when using Server Mode. - # Questions And Answers **Is there is Linux version?** diff --git a/FlashpointSecurePlayer/RegistryBackup.cs b/FlashpointSecurePlayer/RegistryBackups.cs similarity index 96% rename from FlashpointSecurePlayer/RegistryBackup.cs rename to FlashpointSecurePlayer/RegistryBackups.cs index c97581f..81fbeb2 100644 --- a/FlashpointSecurePlayer/RegistryBackup.cs +++ b/FlashpointSecurePlayer/RegistryBackups.cs @@ -23,7 +23,7 @@ using static FlashpointSecurePlayer.Shared.FlashpointSecurePlayerSection.ModificationsElementCollection.ModificationsElement.RegistryBackupElementCollection; namespace FlashpointSecurePlayer { - public class RegistryBackup : Modifications { + public class RegistryBackups : Modifications { // https://social.msdn.microsoft.com/Forums/vstudio/en-US/0f3557ee-16bd-4a36-a4f3-00efbeae9b0d/app-config-multiple-sections-in-sectiongroup-with-same-name?forum=csharpgeneral private class WOW64Key { @@ -179,9 +179,9 @@ private Dictionary> WOW64KeyLists { } } - public RegistryBackup(Form Form) : base(Form) { } + public RegistryBackups(Form Form) : base(Form) { } - ~RegistryBackup() { + ~RegistryBackups() { if (ImportStarted) { try { StopImport(); @@ -559,7 +559,30 @@ private void DeleteValueInRegistryView(string keyName, string valueName, Registr // this function deals with this utter trashfire // https://docs.microsoft.com/en-us/windows/win32/winprog64/shared-registry-keys#redirected-shared-and-reflected-keys-under-wow64 - private string GetRedirectedKeyValueName(string keyValueName) { + private string GetRedirectedKeyValueName(string keyValueName, BINARY_TYPE binaryType) { + // does our OS use WOW64? + string windowsVersionName = GetWindowsVersionName(false, false, true); + + if (windowsVersionName != "Windows Vista 64-bit" && + windowsVersionName != "Windows Server 2008 64-bit" && + windowsVersionName != "Windows 7 64-bit" && + windowsVersionName != "Windows Server 2008 R2 64-bit" && + windowsVersionName != "Windows 8 64-bit" && + windowsVersionName != "Windows Server 2012 64-bit" && + windowsVersionName != "Windows 8.1 64-bit" && + windowsVersionName != "Windows Server 2012 R2 64-bit" && + windowsVersionName != "Windows 10 64-bit" && + windowsVersionName != "Windows Server 2016 64-bit") { + // no + return keyValueName; + } + + // is the binary 32-bit? + if (binaryType == BINARY_TYPE.SCS_64BIT_BINARY) { + // no + return keyValueName; + } + // can be empty for default value, but not null if (keyValueName == null) { return keyValueName; @@ -578,7 +601,7 @@ private string GetRedirectedKeyValueName(string keyValueName) { List wow64KeyList = WOW64KeyLists[keyValueNameSplit[0]]; WOW64Key.EFFECT effect = WOW64Key.EFFECT.SHARED; List effectExceptionValueNames = new List(); - string windowsVersionName = GetWindowsVersionName(false, false, false); + windowsVersionName = GetWindowsVersionName(false, false, false); bool removeWOW64Subkey = false; for (int i = 0;i < wow64KeyList.Count;i++) { @@ -1123,11 +1146,7 @@ private void ModificationAdded(RegistryTraceData registryTraceData) { if (safeKeyHandle == 0) { // we don't need to queue it, we can just add the key right here - registryBackupElement.KeyName = GetKeyValueNameFromKernelRegistryString(registryBackupElement.KeyName); - - if (modificationsElement.RegistryBackups.BinaryType != BINARY_TYPE.SCS_64BIT_BINARY) { - registryBackupElement.KeyName = GetRedirectedKeyValueName(registryBackupElement.KeyName); - } + registryBackupElement.KeyName = GetRedirectedKeyValueName(GetKeyValueNameFromKernelRegistryString(registryBackupElement.KeyName), modificationsElement.RegistryBackups.BinaryType); registryBackupElement.ValueKind = GetValueKindInRegistryView(registryBackupElement.KeyName, registryBackupElement.ValueName, registryView); value = null; @@ -1167,11 +1186,7 @@ private void ModificationAdded(RegistryTraceData registryTraceData) { // need to deal with KCB // well, we already know the base key name from before, so we can wrap this up now if (KCBModificationKeyNames.ContainsKey(safeKeyHandle)) { - registryBackupElement.KeyName = GetKeyValueNameFromKernelRegistryString(KCBModificationKeyNames[safeKeyHandle] + "\\" + registryBackupElement.KeyName); - - if (modificationsElement.RegistryBackups.BinaryType != BINARY_TYPE.SCS_64BIT_BINARY) { - registryBackupElement.KeyName = GetRedirectedKeyValueName(registryBackupElement.KeyName); - } + registryBackupElement.KeyName = GetRedirectedKeyValueName(GetKeyValueNameFromKernelRegistryString(KCBModificationKeyNames[safeKeyHandle] + "\\" + registryBackupElement.KeyName), modificationsElement.RegistryBackups.BinaryType); registryBackupElement.ValueKind = GetValueKindInRegistryView(registryBackupElement.KeyName, registryBackupElement.ValueName, registryView); value = null; @@ -1249,11 +1264,7 @@ private void ModificationRemoved(RegistryTraceData registryTraceData) { ulong safeKeyHandle = registryTraceData.KeyHandle & 0x00000000FFFFFFFF; if (safeKeyHandle == 0) { - registryBackupElement.KeyName = GetKeyValueNameFromKernelRegistryString(registryBackupElement.KeyName); - - if (modificationsElement.RegistryBackups.BinaryType != BINARY_TYPE.SCS_64BIT_BINARY) { - registryBackupElement.KeyName = GetRedirectedKeyValueName(registryBackupElement.KeyName); - } + registryBackupElement.KeyName = GetRedirectedKeyValueName(GetKeyValueNameFromKernelRegistryString(registryBackupElement.KeyName), modificationsElement.RegistryBackups.BinaryType); // key was deleted - don't need to find its value, just enough info for the name modificationsElement.RegistryBackups.Remove(registryBackupElement.Name); @@ -1263,11 +1274,7 @@ private void ModificationRemoved(RegistryTraceData registryTraceData) { if (KCBModificationKeyNames.ContainsKey(safeKeyHandle)) { // we have info from the handle already to get the name - registryBackupElement.KeyName = GetKeyValueNameFromKernelRegistryString(KCBModificationKeyNames[safeKeyHandle] + "\\" + registryBackupElement.KeyName); - - if (modificationsElement.RegistryBackups.BinaryType != BINARY_TYPE.SCS_64BIT_BINARY) { - registryBackupElement.KeyName = GetRedirectedKeyValueName(registryBackupElement.KeyName); - } + registryBackupElement.KeyName = GetRedirectedKeyValueName(GetKeyValueNameFromKernelRegistryString(KCBModificationKeyNames[safeKeyHandle] + "\\" + registryBackupElement.KeyName), modificationsElement.RegistryBackups.BinaryType); modificationsElement.RegistryBackups.Remove(registryBackupElement.Name); //SetModificationsElement(modificationsElement, Name); @@ -1347,12 +1354,7 @@ private void KCBStopped(RegistryTraceData registryTraceData) { // add its BaseKeyName registryBackupElement = queuedModification.Value; - registryBackupElement.KeyName = GetKeyValueNameFromKernelRegistryString(registryTraceData.KeyName + "\\" + registryBackupElement.KeyName); - - if (modificationsElement.RegistryBackups.BinaryType != BINARY_TYPE.SCS_64BIT_BINARY) { - registryBackupElement.KeyName = GetRedirectedKeyValueName(registryBackupElement.KeyName); - } - + registryBackupElement.KeyName = GetRedirectedKeyValueName(GetKeyValueNameFromKernelRegistryString(registryTraceData.KeyName + "\\" + registryBackupElement.KeyName), modificationsElement.RegistryBackups.BinaryType); registryBackupElement.ValueKind = GetValueKindInRegistryView(registryBackupElement.KeyName, registryBackupElement.ValueName, registryView); value = null; diff --git a/FlashpointSecurePlayer/bin/Debug/FlashpointSecurePlayer.exe b/FlashpointSecurePlayer/bin/Debug/FlashpointSecurePlayer.exe index a208e73..601bca7 100644 Binary files a/FlashpointSecurePlayer/bin/Debug/FlashpointSecurePlayer.exe and b/FlashpointSecurePlayer/bin/Debug/FlashpointSecurePlayer.exe differ diff --git a/FlashpointSecurePlayer/bin/Release/FlashpointSecurePlayer.exe b/FlashpointSecurePlayer/bin/Release/FlashpointSecurePlayer.exe index ac14daa..b50cbe0 100644 Binary files a/FlashpointSecurePlayer/bin/Release/FlashpointSecurePlayer.exe and b/FlashpointSecurePlayer/bin/Release/FlashpointSecurePlayer.exe differ diff --git a/FlashpointSecurePlayer/obj/Debug/FlashpointSecurePlayer.exe b/FlashpointSecurePlayer/obj/Debug/FlashpointSecurePlayer.exe index f679f9d..201dd20 100644 Binary files a/FlashpointSecurePlayer/obj/Debug/FlashpointSecurePlayer.exe and b/FlashpointSecurePlayer/obj/Debug/FlashpointSecurePlayer.exe differ diff --git a/FlashpointSecurePlayer/obj/Release/FlashpointSecurePlayer.exe b/FlashpointSecurePlayer/obj/Release/FlashpointSecurePlayer.exe index 05d7402..29859ba 100644 Binary files a/FlashpointSecurePlayer/obj/Release/FlashpointSecurePlayer.exe and b/FlashpointSecurePlayer/obj/Release/FlashpointSecurePlayer.exe differ