From b4a96dc7e5b35cba295fb547413da80bc111f473 Mon Sep 17 00:00:00 2001 From: zeromus Date: Sun, 14 Feb 2016 16:41:07 -0600 Subject: [PATCH] add LARGEADDRESS command to BizHawk.Build.Tool --- Build/BizHawk.Build.Tool.exe | Bin 10240 -> 10752 bytes Build/BizHawk.Build.Tool/Tool.cs | 47 +++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/Build/BizHawk.Build.Tool.exe b/Build/BizHawk.Build.Tool.exe index b8a093b1bc60b29b93c5d34bbba6084a3580d700..f21ed4e001c201abffb6803d7c3b883b81aaa207 100644 GIT binary patch delta 2628 zcmZ`*dvH|M9sZsB-rZ!Av%BsqA=xBAF2s-x7$AV;F^MDwN=yJDVV46ZykV z-PkFur9&o}qn#=0Fgi{v=u8>6qkSUNxt|?ShQY04|M8`bi5>UzCW!4iZ`7d|kFU ztnJYYlTZRgoV56{pq6kkycM$Yal}$?5sEz{7db=ZXw$hlLuEW= z#pc+2Iw!ABW?hexwDwap#Y&|T6Rj|#CUJ9Og=7}D@@*iQ!j>_j(#Ym-Uqv`PS$OI< z?9aF3F71^v#V$Fxz0i>v?*E?(-@R60Nq&{A6WPDBT<8W_$l*@rcUOsapN~3r!JGNN zHFBpua|fK<^h+f7?01t2{zZ#TyAiqZ5>0*qVXoKHEZsylY^AeqD%dSXUd^4~*W*9gv7|)We^FYSkPVrixv#<`!i&k)ar*ny2 z$D)!D7t6>(yX2qoz&U2m5fp0%NntRkZO4tR$`;TnMHraiXH3u#er2_u0?cepq~PGAci)a5(zs4lBL z0u0h+{Ssm##y|8hZQEva7-9Olu^;$nphdPRLz@-uF=e4cia((6h{A^z9#{B`!cP^( zEE&IAJXZOuLUu9MNVD`lwc^>ntz`WHr?Hx5O4cWo#=CcXi61#f9TcT!N)~6$bR7*e z`@T9@ar&|ATg_}eCFm6X_Yi$6*~WS)1;(fYXO~fz!~zZAruhbKQI3&o?vgG;HM+H| zYxFh64=X&Pywi#cg?>%n>+^?|?khe%rm_l$87F^cZET1dz=vs>Qrf9UYrrv(`XKGr zuA^J%8`@WB7d@igL!I;#yg9m{9ioHuo^~Jbvi1PA)5qAnTgcUei0RU&q1>#`f`3(i z2zo((n!c}UK29g~vjsSw*Utja=~Z-sGR6g2kfQKmOc0;Ncu~;6RR*vj3xJ?)0_gnNNL8|vu2nXyM#T-l zfCdhjG$)F~>mEHGz&Nj~ywzo&qR=1BL9-&?WnV}eL6`k?+6cr7a*Svurb5gLOfk0+ z^-BqGbY7)51ST@k{QRiCJQ1Ok;Yy3Rzz~WtYUO(R?I#4}|1gow zwCt(wnHI0*hs-eX@iXRhV)OfEu4XdL-ij=r>=ibj?WxOtS2Td*>6Xb%8%ck(jt_e3 z6LZ8kUWVV1-kk0ORtC$kPh+qXBbHQ1(Yb;cFyXU&z0Fn2yy1N%aH06+7m z2EZV(&Y3K;Ax{JW^M`gBxNj`RSit@QQ>u zEF;>$pZ6Bd5t$DX|DHz6(LqyxQGBpyxf)e{(62s&IDx3cT~&nUX#$_pM4?{E z2PAHjI4p6m#P=kADREN9>%7B1p2(k$bA(a21{L6g#VPALo|8=2nzC*~9zFt|E^#97 zK`mJDR?1?e6sCb%>iF`=Jitd4K3@QKOjSl_q5r`D$e! z>bCL`ye(@Ufp?UPs2`U&rug9)Sn3rxmVl6Y1C6kH2R?-k)kDN!0=v{Ka$Yuf9=5CP za2|F`Jf!BLep2E^#7i>f68xkVApb)xMl`fi@;#Jj7vVBgYQ>}tnl%&JV2M@>KSGbT zfc%VEi-?;fipVm;$cNf0G?H2m^0V4=BuIoFB;RT45ht_-5Fxh^>)|iWFXuN%W)iRd z1`*|UBG1xyW78phKk^y6m}`f6kho=YmAGHVNF@}5msUau6xxEX)mCVs9{zDwNO_SQ z;ooM}lkueAY9PrK*>9>`4Kk~%t#6>Z4%V+5=;@4a?j7ij_a$qBOBB98zm=C4v{0ow z*;i0Q@I~7D!nw6dB)ISc|LePczcoCVJXyGkWT|07OeG8kUZyY%-V{EEn>Y137TffM i;Nj6ofF5q-WsynVAK8=i72Vb7XN^e~{gsSX8UFz7PGScD diff --git a/Build/BizHawk.Build.Tool/Tool.cs b/Build/BizHawk.Build.Tool/Tool.cs index 1218d0c7ce..ad1016f38f 100644 --- a/Build/BizHawk.Build.Tool/Tool.cs +++ b/Build/BizHawk.Build.Tool/Tool.cs @@ -17,6 +17,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; + case "LARGEADDRESS": LARGEADDRESS(cmdArgs); break; } } @@ -67,6 +68,52 @@ namespace BizHawk.Build.Tool File.WriteAllText(path, content); } + static void LARGEADDRESS(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("LARGEADDRESS: No target EXE specified"); + return; + } + + //http://stackoverflow.com/questions/9054469/how-to-check-if-exe-is-set-as-largeaddressaware + using (var fs = new FileStream(target, FileMode.Open, FileAccess.ReadWrite, FileShare.Read)) + { + var br = new BinaryReader(fs); + + if (br.ReadInt16() != 0x5A4D) //No MZ Header + return; + + br.BaseStream.Position = 0x3C; + var peloc = br.ReadInt32(); //Get the PE header location. + + br.BaseStream.Position = peloc; + if (br.ReadInt32() != 0x4550) //No PE header + return; + + br.BaseStream.Position += 0x12; + var characteristics = br.ReadUInt16(); + characteristics &= unchecked((ushort)~0x20); //IMAGE_FILE_LARGE_ADDRESS_AWARE + if (strValue == "1") characteristics |= 0x20; + fs.Position -= 2; //move back to characteristics + var bw = new BinaryWriter(fs); + bw.Write(characteristics); + bw.Flush(); + } + } + + //sets NXCOMPAT bit in PE header static void NXCOMPAT(string[] args) {