add system to whack all MOTW attributes in dll directory recursively before booting bizhawk apps, to eliminate the cant-boot-without-copying-dlls-to-bizhawk-rootdir problem (?)
This commit is contained in:
parent
921c34dd17
commit
1d0aeff4d1
|
@ -1,5 +1,6 @@
|
||||||
using System;
|
using System;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
|
using System.Collections.Generic;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
|
@ -20,7 +21,13 @@ namespace BizHawk.MultiClient
|
||||||
//http://www.codeproject.com/Articles/310675/AppDomain-AssemblyResolve-Event-Tips
|
//http://www.codeproject.com/Articles/310675/AppDomain-AssemblyResolve-Event-Tips
|
||||||
#if WINDOWS
|
#if WINDOWS
|
||||||
// this will look in subdirectory "dll" to load pinvoked stuff
|
// this will look in subdirectory "dll" to load pinvoked stuff
|
||||||
SetDllDirectory(System.IO.Path.Combine(PathManager.GetExeDirectoryAbsolute(), "dll"));
|
string dllDir = System.IO.Path.Combine(PathManager.GetExeDirectoryAbsolute(), "dll");
|
||||||
|
SetDllDirectory(dllDir);
|
||||||
|
|
||||||
|
//but before we even try doing that, whack the MOTW from everything in that directory (thats a dll)
|
||||||
|
//otherwise, some people will have crashes at boot-up due to .net security disliking MOTW.
|
||||||
|
//some people are getting MOTW through a combination of browser used to download bizhawk, and program used to dearchive it
|
||||||
|
WhackAllMOTW(dllDir);
|
||||||
|
|
||||||
//in case assembly resolution fails, such as if we moved them into the dll subdiretory, this event handler can reroute to them
|
//in case assembly resolution fails, such as if we moved them into the dll subdiretory, this event handler can reroute to them
|
||||||
AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
|
AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
|
||||||
|
@ -122,6 +129,45 @@ namespace BizHawk.MultiClient
|
||||||
#if WINDOWS
|
#if WINDOWS
|
||||||
[DllImport("kernel32.dll", SetLastError = true)]
|
[DllImport("kernel32.dll", SetLastError = true)]
|
||||||
static extern bool SetDllDirectory(string lpPathName);
|
static extern bool SetDllDirectory(string lpPathName);
|
||||||
|
|
||||||
|
[DllImport("kernel32.dll", EntryPoint = "DeleteFileW", SetLastError = true, CharSet = CharSet.Unicode, ExactSpelling = true)]
|
||||||
|
static extern bool DeleteFileW([MarshalAs(UnmanagedType.LPWStr)]string lpFileName);
|
||||||
|
static void RemoveMOTW(string path)
|
||||||
|
{
|
||||||
|
DeleteFileW(path + ":Zone.Identifier");
|
||||||
|
}
|
||||||
|
|
||||||
|
//for debugging purposes, this is provided. when we're satisfied everyone understands whats going on, we'll get rid of this
|
||||||
|
[DllImportAttribute("kernel32.dll", EntryPoint = "CreateFileW")]
|
||||||
|
public static extern System.IntPtr CreateFileW([InAttribute()] [MarshalAsAttribute(UnmanagedType.LPWStr)] string lpFileName, int dwDesiredAccess, int dwShareMode, [InAttribute()] int lpSecurityAttributes, int dwCreationDisposition, int dwFlagsAndAttributes, [InAttribute()] int hTemplateFile);
|
||||||
|
static void ApplyMOTW(string path)
|
||||||
|
{
|
||||||
|
int generic_write = 0x40000000;
|
||||||
|
int file_share_write = 2;
|
||||||
|
int create_always = 2;
|
||||||
|
var adsHandle = CreateFileW(path + ":Zone.Identifier", generic_write, file_share_write, 0, create_always, 0, 0);
|
||||||
|
using (var sfh = new Microsoft.Win32.SafeHandles.SafeFileHandle(adsHandle, true))
|
||||||
|
{
|
||||||
|
var adsStream = new System.IO.FileStream(sfh, FileAccess.Write);
|
||||||
|
StreamWriter sw = new StreamWriter(adsStream);
|
||||||
|
sw.Write("[ZoneTransfer]\r\nZoneId=3");
|
||||||
|
sw.Flush();
|
||||||
|
adsStream.Close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void WhackAllMOTW(string dllDir)
|
||||||
|
{
|
||||||
|
var todo = new Queue<DirectoryInfo>(new[] { new DirectoryInfo(dllDir) });
|
||||||
|
while (todo.Count > 0)
|
||||||
|
{
|
||||||
|
var di = todo.Dequeue();
|
||||||
|
foreach (var disub in di.GetDirectories()) todo.Enqueue(disub);
|
||||||
|
foreach (var fi in di.GetFiles("*.dll"))
|
||||||
|
RemoveMOTW(fi.FullName);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -32,6 +32,9 @@ namespace BizHawk
|
||||||
string directory = System.IO.Path.Combine(GetExeDirectoryAbsolute(), "dll");
|
string directory = System.IO.Path.Combine(GetExeDirectoryAbsolute(), "dll");
|
||||||
string fname = Path.Combine(directory, dllname);
|
string fname = Path.Combine(directory, dllname);
|
||||||
if (!File.Exists(fname)) return null;
|
if (!File.Exists(fname)) return null;
|
||||||
|
|
||||||
|
ApplyMOTW(fname);
|
||||||
|
|
||||||
//it is important that we use LoadFile here and not load from a byte array; otherwise mixed (managed/unamanged) assemblies can't load
|
//it is important that we use LoadFile here and not load from a byte array; otherwise mixed (managed/unamanged) assemblies can't load
|
||||||
return Assembly.LoadFile(fname);
|
return Assembly.LoadFile(fname);
|
||||||
}
|
}
|
||||||
|
@ -40,14 +43,60 @@ namespace BizHawk
|
||||||
#if WINDOWS
|
#if WINDOWS
|
||||||
[DllImport("kernel32.dll", SetLastError = true)]
|
[DllImport("kernel32.dll", SetLastError = true)]
|
||||||
static extern bool SetDllDirectory(string lpPathName);
|
static extern bool SetDllDirectory(string lpPathName);
|
||||||
|
|
||||||
|
[DllImport("kernel32.dll", EntryPoint = "DeleteFileW", SetLastError = true, CharSet = CharSet.Unicode, ExactSpelling = true)]
|
||||||
|
static extern bool DeleteFileW([MarshalAs(UnmanagedType.LPWStr)]string lpFileName);
|
||||||
|
static void RemoveMOTW(string path)
|
||||||
|
{
|
||||||
|
DeleteFileW(path + ":Zone.Identifier");
|
||||||
|
}
|
||||||
|
|
||||||
|
//for debugging purposes, this is provided. when we're satisfied everyone understands whats going on, we'll get rid of this
|
||||||
|
[DllImportAttribute("kernel32.dll", EntryPoint = "CreateFileW")]
|
||||||
|
public static extern System.IntPtr CreateFileW([InAttribute()] [MarshalAsAttribute(UnmanagedType.LPWStr)] string lpFileName, int dwDesiredAccess, int dwShareMode, [InAttribute()] int lpSecurityAttributes, int dwCreationDisposition, int dwFlagsAndAttributes, [InAttribute()] int hTemplateFile);
|
||||||
|
static void ApplyMOTW(string path)
|
||||||
|
{
|
||||||
|
int generic_write = 0x40000000;
|
||||||
|
int file_share_write = 2;
|
||||||
|
int create_always = 2;
|
||||||
|
var adsHandle = CreateFileW(path + ":Zone.Identifier", generic_write, file_share_write, 0, create_always, 0, 0);
|
||||||
|
using (var sfh = new Microsoft.Win32.SafeHandles.SafeFileHandle(adsHandle, true))
|
||||||
|
{
|
||||||
|
var adsStream = new System.IO.FileStream(sfh, FileAccess.Write);
|
||||||
|
StreamWriter sw = new StreamWriter(adsStream);
|
||||||
|
sw.Write("[ZoneTransfer]\r\nZoneId=3");
|
||||||
|
sw.Flush();
|
||||||
|
adsStream.Close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void WhackAllMOTW(string dllDir)
|
||||||
|
{
|
||||||
|
var todo = new Queue<DirectoryInfo>(new[] { new DirectoryInfo(dllDir) });
|
||||||
|
while (todo.Count > 0)
|
||||||
|
{
|
||||||
|
var di = todo.Dequeue();
|
||||||
|
foreach (var disub in di.GetDirectories()) todo.Enqueue(disub);
|
||||||
|
foreach (var fi in di.GetFiles("*.dll"))
|
||||||
|
RemoveMOTW(fi.FullName);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
[STAThread]
|
[STAThread]
|
||||||
static void Main(string[] args)
|
static void Main(string[] args)
|
||||||
{
|
{
|
||||||
|
|
||||||
#if WINDOWS
|
#if WINDOWS
|
||||||
// this will look in subdirectory "dll" to load pinvoked stuff
|
// this will look in subdirectory "dll" to load pinvoked stuff
|
||||||
SetDllDirectory(System.IO.Path.Combine(GetExeDirectoryAbsolute(), "dll"));
|
string dllDir = System.IO.Path.Combine(GetExeDirectoryAbsolute(), "dll");
|
||||||
|
SetDllDirectory(dllDir);
|
||||||
|
|
||||||
|
//but before we even try doing that, whack the MOTW from everything in that directory (thats a dll)
|
||||||
|
//otherwise, some people will have crashes at boot-up due to .net security disliking MOTW.
|
||||||
|
//some people are getting MOTW through a combination of browser used to download bizhawk, and program used to dearchive it
|
||||||
|
WhackAllMOTW(dllDir);
|
||||||
|
|
||||||
//in case assembly resolution fails, such as if we moved them into the dll subdiretory, this event handler can reroute to them
|
//in case assembly resolution fails, such as if we moved them into the dll subdiretory, this event handler can reroute to them
|
||||||
AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
|
AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
|
||||||
|
|
Loading…
Reference in New Issue