From af9395f6874e406ff6d1fa90b129cef536a2c9ab Mon Sep 17 00:00:00 2001 From: zeromus Date: Thu, 10 Sep 2015 16:53:48 -0500 Subject: [PATCH] add tool for clearing NXCOMPAT bit on PE headers --- Build/BizHawk.Build.Tool.exe | Bin 9216 -> 10240 bytes .../BizHawk.Build.Tool.csproj | 4 ++ Build/BizHawk.Build.Tool/Tool.cs | 39 ++++++++++++++++++ 3 files changed, 43 insertions(+) diff --git a/Build/BizHawk.Build.Tool.exe b/Build/BizHawk.Build.Tool.exe index 2bf586054b3dcd83ed19ea64246ca01bfb5f36ed..b8a093b1bc60b29b93c5d34bbba6084a3580d700 100644 GIT binary patch delta 2566 zcmZ`*ZERcB8Gg>WAHKd$?HoJAaa>wEA+2eekd(GGAC1~1q)pqjp>1f2SVL&M#$B+@ zbvn_B)`c$(R zzEmZpqA^lkW`18Pq$JSjkrqw$N~6{r9#}fM(BJlYsP6b=c>Ek zZ0FG2Gv;SS1A8cAnar)S9bH2{P+ifu3*2gm4p*F8=2s0zbfG&IIaR;a3oPOn{w8ZN z$R=m)|8oXlQ9BE|%J`*OwZO{h0?wMEOj|3LZqwVeUS=#7Ei{oCF(8aWvt*_)R(2lE z-6Dg8A_Oe{QqeX7{l!cgjw6eWC;PCxKxD zXfcWJn{+bSBLz9p89LoRlm4N7SWDYZ|ES+K)Za_@PBPYV_d|PCtbt65qQeHz$wwDm zR1HD5A&@NI#SYOqf1W+YOnk&H5&F2qTX+LE(aEK^N8x}{4l15j_+5oB@uw;Byh6YB z1@TRq%-TuVh%rsRG^R9JZI;l+W$pKx2}A!_3u4=lp3;NJ>)#-pCp7V;E< zD5LnK!V?N-6rNT1Q-yCUysF|&)BQN`o8t1DXp)%22WXoS*p3rBkW`9J3aS`vL*{Emz=rU~dV~4Q; zf5wQ>&Hh4J+nApf>)1Xf*e{H`$S4^j#9uWIvlx?ljQznlLO5@9BgsA`Y{S2dkec5~ zb~CFmA7--LBgDhzqttZV`~mS*rkv}5{si-@=9=kwInSC=j|$$5I5gf%U-^CLd3$I=cKGYaX+k-=OcGnvU{AzefL z*~!+8IC8!2C8`nI9dBgxO&lwXqrW#($ma^9_fkh5O(T~d>CdL`KQ=m%nLG|Eck4O~ zjyi?XJ5`_YO0gTm=)oQgV33}&{qF10x(Tg?-Zo8i?Dmti7u#?-l-; zq0@i=bmnB~rdT)Y(7{+RkkDCB92Y0V)U=skEIjpnoo=?4fR8R)8uT@72ZL5H7(N!B zde|49I_;)wUkE?G_`6G<`R651%q6S&lb!C4_?vDb`C=)!{7Zws-dPfLe`RwmzW)L! C&&s<1 delta 1688 zcmZuyZETZO6n^e~Keo18+q;f+UyOY*I>un^!`X=h=AzUQ?3|OJWMqT|O6EFVs^Wqa zBcPG6Y+il{Ka7wV9VY%*lO+;dG9Vf>F+y;OF-|ZhXiOCOLHxkQb8p)bjcwlNea>^v zbMEQwecQv)!<)umuO8TYybqbz4RGdR9-x$j+_X3xo;dfkw=fKBRl){JSQAwNS;cm^ z6D6cn(p4(oU=6HXPO}xPTF$fT$|xDsYZF}@7LJ5~aX-K)b_2G&TG5n>@?Az$Rk#2F zUUb^cgCSbp_So?vs>{n=)s*W@ag2n56gK*Dor{Y>UPECpC*-4QG`Neh3@c^1-BEOn z%D6K}==`7@Wn_1*$sxOg|H9?__MIFP7dVhF^If(44wq3^&~^*Uxu<9uE09mPiscd4 z1BDd^*=cG!;1+I&$Vh0F{K6GZHd4z#o}l+wEV%7-AYbG=tyG+@Q41<5v|5oI%zFb~ z2ybW&g}^+0W<0n-ZHCjixPVXiG7C^q(E){@(XO2LjR&*F@vJe^VbSQEqfC6Q^mwY1 z|MpI2y)#+w6=2azoSU(-KciC}fW1h_rE@-Ud<=jRKSJ@7Y zU0R81zFp&}#z}sPDyKBUxJ`VGpn)VdI{0)9_;ba&wvK z#cuN{!mkKz{AQ|BVJX~hsYZJ&`F8#%Nwb!Q#st1cBfMzJM7QYJ`LQb#-K8g7plf-$ zash1!;BY1q>>(_{L3&<+W5p$`6ZGuSbGwWVB165#WCY=Zcp z=5dV)ojsuW%No;7)7dmnYW+1`8D|1&m=eNnR1ro|ua&iE;8obD^$3y?z63oO;(M?S zNBMII<4sD(FvDNKK77tc3Fr7LSc~symwQlPxT&Vz7$c?Cm>}L~oFqMFe1KEB=^30f zE|GplVRt<}w&2l4xjaC~CvBmP~5j)vU?6e~6CyZEI zh>u#mwC<}`-7^%7kvU8g?O-mwz-sz_lWa9=@FigxK4o&wU&{vN-~KS0k?kUs8W4V# z8ZCI(Tp1tP5g8ub_x!+6Eb$T|!-VCU+z9J{ns~7t_a;tb(MEAd2#87-gTLO19hhQ!}3r?DUXIHstV=V ViVG=k<)0QG38zHeuWX_z=N}bpELQ*k diff --git a/Build/BizHawk.Build.Tool/BizHawk.Build.Tool.csproj b/Build/BizHawk.Build.Tool/BizHawk.Build.Tool.csproj index 8c7ef94d06..226d9220fc 100644 --- a/Build/BizHawk.Build.Tool/BizHawk.Build.Tool.csproj +++ b/Build/BizHawk.Build.Tool/BizHawk.Build.Tool.csproj @@ -36,10 +36,14 @@ AnyCPU ..\ + false + false AnyCPU ..\ + false + false diff --git a/Build/BizHawk.Build.Tool/Tool.cs b/Build/BizHawk.Build.Tool/Tool.cs index 8a8c7894ab..1218d0c7ce 100644 --- a/Build/BizHawk.Build.Tool/Tool.cs +++ b/Build/BizHawk.Build.Tool/Tool.cs @@ -16,6 +16,7 @@ namespace BizHawk.Build.Tool { case "SVN_REV": SVN_REV(true,cmdArgs); break; case "GIT_REV": SVN_REV(false,cmdArgs); break; + case "NXCOMPAT": NXCOMPAT(cmdArgs); break; } } @@ -66,6 +67,44 @@ namespace BizHawk.Build.Tool File.WriteAllText(path, content); } + //sets NXCOMPAT bit in PE header + static void NXCOMPAT(string[] args) + { + string target = null, strValue = "0"; + int idx = 0; + while (idx < args.Length) + { + string a = args[idx++]; + string au = a.ToUpperInvariant(); + if (au == "--TARGET") + target = args[idx++]; + if (au == "--VALUE") + strValue = args[idx++]; + } + if (target == null) + { + Console.WriteLine("NXCOMPAT: No target EXE specified"); + return; + } + + //we're going to skip around through the file and edit only the minimum required bytes (to speed things up by avoiding loading and rewriting the entire exe) + using(var fs = new FileStream(target,FileMode.Open,FileAccess.ReadWrite,FileShare.Read)) + { + var br = new BinaryReader(fs); + fs.Position = 0x3C; + fs.Position = br.ReadUInt16(); //move to NT_HEADERS + fs.Position += 0x18; //move to OPTIONAL_HEADER + fs.Position += 0x46; //move to DllCharacteristics + var dllCharacteristics = br.ReadUInt16(); + dllCharacteristics &= unchecked((ushort)~0x100); + if (strValue == "1") dllCharacteristics |= 0x100; + fs.Position -= 2; //move back to DllCharacteristics + var bw = new BinaryWriter(fs); + bw.Write(dllCharacteristics); + bw.Flush(); + } + } + //gets the working copy version. use this command: //BizHawk.Build.Tool.exe SCM_REV --wc c:\path\to\wcdir --template c:\path\to\templatefile --out c:\path\to\outputfile.cs //if the required tools aren't found