From a2d10a9195323e53e801c50e854ebf60b6570660 Mon Sep 17 00:00:00 2001 From: Bluzume <39113159+KuromeSan@users.noreply.github.com> Date: Thu, 12 Aug 2021 03:11:05 +1200 Subject: [PATCH] i really gotta goto slepes now so bye. --- .vs/AppInfoParser/v16/.suo | Bin 67584 -> 79872 bytes AppInfoCli/CXMLBuilder.cs | 101 ++++++++++++++++++++++++++ AppInfoCli/CXMLCli.csproj | 4 +- AppInfoCli/{CXML.cs => CXMLReader.cs} | 7 +- AppInfoCli/GimConv.cs | 62 ++++++++++++++++ AppInfoCli/Program.cs | 17 +++-- 6 files changed, 183 insertions(+), 8 deletions(-) create mode 100644 AppInfoCli/CXMLBuilder.cs rename AppInfoCli/{CXML.cs => CXMLReader.cs} (99%) create mode 100644 AppInfoCli/GimConv.cs diff --git a/.vs/AppInfoParser/v16/.suo b/.vs/AppInfoParser/v16/.suo index 9f6ecbecf994673de689c3e79a0bfa40a69a50a9..f4f1e0e48d46fe8ce1afdbd846786152f7dc1623 100644 GIT binary patch delta 5163 zcmeI0e^6A{702Iw`-5dcTz)JI%c2q}0cFXuKS7Pa?kYjCx@gszk|z9E5;7o&tW}8Y zs%bUV7~n+F{z{5XV*g5X8-K;<`Xk1sD$O7LF`c9#sj(9$>6la;A(8F(Zgy1=HO(}g zOec5ev+um~?tS;Xd(Sz0-uk+vzDv?BLxw1Xn@SK;AxgkVFc{=oF6;KV(!{ud7f!r; zeCwZ?1)4w^wTtcIBt}=nPT2C7n6@*XV;= zhMEC#9?*b%U;@)XE|?0^K@{LNTmx3fHn5W3(axhBSr;4Wu1=&gGM%ae>c_!auny2w z))u!gZU2Yd(n(O<&C)0%OC!A^jcucHMOu0+h9m$P;8XK98S)h1rgaJp+fF+b`=#H* zIW3N!8O?31$4PUyE0YdK$ErOz2@S*755sb2w<}HN#fgs!w22Ketdbl=0R@N#N)Q8L z!2}QoCIS_R2MHh%Bmp%@1{#n8Qh^qv0UbyO+^&&5)f-t~tVm|9>VG@wUe#q$6yO~R zoyi$2f-omDxi;)m$I%x7y`rKGw?aM21WpPbAE@tx;F8K zC3GeETr78W?u@t^B$p+NE>HHcCFGgnWs7ML-;2nT;boQn!Hggi8J;(@lcka;E66nD z`HnX>8G{voH(Iei*Poj`Pn0jk*}iCM&lzSa^5kw{6*QFF!PMlL>Xm2U;-@occxpRK zAkQ=}i}w#s^NR9kp?@ou+Vh8HKY^&AHTQMMHbGkAAJTL%mgM&oco|zygGMh~M;_B= zzU`#a=EP4#uaH0BG59f&d!ZsFtfe~b+d9{nF5JH(L#Qh4;iMKQR)AKp60`yOLt0A8 z%@NoMWn@&JRqQj1YMvYT^6?hg(aqg1&HY<&;VIA!o(5f@7ld{d$7g^RWP`0>2iOUI z3gFniEGIG(KSpl-UvQR;yE=>iTEhlOc?AqXpoLP!!a>cTNv6rWm~XQ0d-+hmYUt30 zi+Luy>)DGN76kq^_$K7HKPcQ+cKMGDCwZS|&TaHmu3h?)-eec(cf~de6em$qNnQ+3 zK>V&~v}dk{bY+vMq+~vwEiqA`B!yPY(2}txBRk;zDBU+!Xj2w{-l4iInQhkRa#N8*fe)w-)W1=@cJ|!^93@nJ{0d z5GnXEE3;RWbB~JjvI`!eL1-MeUkvY$t4-+LEG!pR`OD@wWPRTi zsc){6x}H=}`=%`a@R}~k-o!$}qoMJx^JJI0MD zc_^X;8ZH?A28EJY?8_5#c?hkC_1wp~9BDi`a|LA4MawFBKe|A(LXC1o+Gh3LI{UZ$*x75~g5s zo`v184R>oa+VtikcY(gfQf<{6-KOg5qPiN3*;FGHwlU{)13n%0**4>BtIf188dVVr z{j7R-k-4bG>ekn|O-8-hZ8Jc!n)GgCp}VfWuAsWM+9tboyg#s~MA36N;XgOC>MNOP zDRS4;7g=DYsm8507h3D|g@x5-eSNK|w$5m?6xLd6VJ5x&T3ys54NbMp%U4lp|1@$O z>18{heN^7+uC8;pawXdd#RC+0ZSj}u`e;;*r=c-CnErYspL~H5T5-fi#Ybo1C1T8+ zQkmeqMQK%*H8eS3RetSCrY>!1DPLaS>}YJLy0e-}kIzZw z&9AV3VJV*_^`=?A+$GGGM-K*cF}16k8oxQuoQda+`Wl~kPBJfrBkf@b{EgH}d}Fc2 z2Kq3tDxQ}$k;Y4*e1FR^4NFD{U2nY1;P0Q#u?|-}fvR~_yItX4kh_Ez zVxcxQ&;Xei#=LTjSm43$NEIr!)pYEHNsS{iL?d*(QXBYZFo=qdicb}h?_{ddAn*@w z6n{FM0w>iJJf)_Kr;>YKzfatOl=J#V+C4pm7M!Y}Pfusjz<~DKMY`J}1x_uYS-;Pg ztQM^P;y2bwXtd%3sRWM03vcBNp{emkK2jaz+4(JOW+HY(CcFa2vyf{bl`fr^#@vYL zxs*RJlk1|wI_?*VGZdU4T-IdsRD+SIh7?pcxo!!sIo17iw7TuDM2G1t$3cSzAb+!bzD`o<9 zpEXkZxmoNL-v8!X^K5*JQW43%rwJt3 zENzl?RSQ0$S9?h9h_r0drUhJuEz4T3o2ID>O(RX({>ZXSVpG?xRjY*zXj*ozA;O8+ zA#Q0phnH}HgJAmPViOpEiHBCun=yb(@~w4`CHT)TaU zMrg{|qfp;USVOQ8$_V9z5<)3KtgR#YG06&&m4qFHYW%IdMHZuI(S8&9#N5}k7E?Bj zog{pjP(;94@F%fjFLsLUT1fG)wyRSi3vK!w7{n%hPOg?*QVC-HwIoR_)G46!5OC7!33`k|4Q97Sv|KoH>&+dWNqhVU%m z4B;%{9N{a3=LlGwZCPArXSO20EHo#xThm1h9tQp;`vYxEIntIlW|WHm+iOgi?nu%k zQ6O~?p29#{P}@WMlW{KPqX*Q`gEJXH=?cSR=0WL4EOM6wq+uY7qtR)##(#(id;GiT z3z`U-CBFWM^QI-d%NeTN&qe;O2;(18MK*?!v;#|o9q+_5on6QopFR#V<(tb$6Kv@t> zk(sifln^HUEgkmT=e4J(E8~ex1KI)V?T^f@830I&1j>T|eK?~Ap%(*=uZ~qqW0ewo zGT!zwjPx8H>yX0E>Q6^1|cMzs|gAb<|(Jbmh8f?#k(RMgRO; zX9K%W9r%IGQBP(}RjupXfewG5*Sj@bpN_xUW=%JeUd$sNA@gbvv}1a`6+`vS*!zf8 z_gG+u*Kgkyc4y*m>Wk6k&LVXds_s;(cZ?at24vBUNN98AV7EI3qiz>|&z){ns%t)P zJ+w4Ko9AfTliudGE^0fyU4Hw%Ci}iVZ|@$j-{0Q#WVqo~!>hlPn!ZF;XBYnTwE?W& zej5O@8uKN;<-!w<(rQ5mH#^9h*`pZ53z5T5n{{K4Nhm!x7P&Q9AWdAYg^9g>X=R=r zSdnMi7|-GeR7H!#6G$sQ(};7229}A}gg;Zu@lJ7QnSi!|6)BbwqZq^a^7(jfg-a|E zi**`^V+N5S!fJ_V2PZm0n$M0mcDz5&(l>11=1Fi^M(dZ)3uSh z+md{t_9v@Q`n@I6dS_aLy+dD&+EmlSc$rb;+* z&8~yR9KiDFvb1B&!+PnO>0*A?&SW|nhEKh>CH!GeqMfN!*c7^Mt5_@E_(d8jlC15d z+slL9?`>2x35D? zVdr^R$G-(ohG*{a(cNI@t^&w850=rtK^;73LV4DJOHLM@zq`Am&+ZweYQU2>KnV}# zfq_ryq0`(fb{%_4qaKnegoe@kp7`f`D*vMaPMQlAjbg3%A0gfw9$eF=b02Je)b8nn z)NMUIOyNvWdW4bOK->+LmFz}EOGC1fVE449h zL9w{Zc+?1+q&2`lG{RZwdEobqaGdVa8#~i@k`Yw=U0pJNGZB&`h4CCSl)RJ<`?=W+ zrIVpdn3f?Ca~pG|EldQhcJ(d#N0mnV)UXMmct-Xd@9c;j8y_l!N&fvJx{{TTEBT=U zsO696fx8LmqhsV+8v-x~Al{TkC zQEgwSsHwIcaaQ|$6>7OxZL9o@j-OsSMrHnr9&G$v9!zDdnA?ji%+H6LYgf$a324}? z&~M;kvcnVlxS!^3{#G8;>X#CH@l6(QvD9Aw&r>@_VP3969xc+M z!XqN%IXYmg?%?%RVw7K3p@v5lD8_=*nXrmOIlRt8Wf0=7TqykCq}`-Tg?9nY;rRKC ze><|9!{H7|mu$1b0)M9x&hbO}F!p~N_qbqqUUEW__MxxC)Ua#PWrZl* z?}aqDJDiFoMJ8UL!dla}t0dEvqkn2mo*hs8L&L(elO{V{f(L9a+l7C;7Y|j@nVS^o KS#EH+UHLn7|IK0m diff --git a/AppInfoCli/CXMLBuilder.cs b/AppInfoCli/CXMLBuilder.cs new file mode 100644 index 0000000..6c82350 --- /dev/null +++ b/AppInfoCli/CXMLBuilder.cs @@ -0,0 +1,101 @@ +using General; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Xml; + +namespace CXMLDecompiler +{ + class CXMLBuilder + { + String MainDir = ""; + String XMLFilename = ""; + String CXMLFilename = ""; + String MagicNumber = ""; + + FileStream InfoFile; + + MemoryStream TreeTable; + MemoryStream StringIDTable; + MemoryStream IntIDTable; + MemoryStream StringTable; + MemoryStream CharTable; + MemoryStream HashIDTable; + MemoryStream IntArrayTable; + MemoryStream FloatArrayTable; + MemoryStream FileTable; + + Boolean IsInitalized = false; + + BinaryWriter bInfoFile; + BinaryWriter bTreeTable; + BinaryWriter bIntIDTable; + BinaryWriter bFloatArrayTable; + BinaryWriter bIntArrayTable; + BinaryWriter bHashIDTable; + BinaryWriter bStringIDTable; + + XmlReader XMLFile; + + public void Init(string XMLFile, string CxmlFile, string Magic) + { + MagicNumber = Magic; + InfoFile = File.Open(CxmlFile, FileMode.CreateNew, FileAccess.ReadWrite); + + TreeTable = new MemoryStream(); + StringIDTable = new MemoryStream(); + IntIDTable = new MemoryStream(); + StringTable = new MemoryStream(); + CharTable = new MemoryStream(); + HashIDTable = new MemoryStream(); + IntArrayTable = new MemoryStream(); + FloatArrayTable = new MemoryStream(); + FileTable = new MemoryStream(); + + bInfoFile = new BinaryWriter(InfoFile); + bTreeTable = new BinaryWriter(TreeTable); + bIntIDTable = new BinaryWriter(IntIDTable); + bFloatArrayTable = new BinaryWriter(FloatArrayTable); + bIntArrayTable = new BinaryWriter(IntArrayTable); + bHashIDTable = new BinaryWriter(HashIDTable); + bStringIDTable = new BinaryWriter(StringIDTable); + + CXMLFilename = CxmlFile; + XMLFilename = XMLFile; + MainDir = Path.GetDirectoryName(XMLFilename); + + IsInitalized = true; + + return; + } + public string DetectMagic(string XmlFileName) + { + string SearchFor = " "; + string xmlData = File.ReadAllText(XmlFileName); + int ind1 = xmlData.IndexOf(SearchFor); + xmlData = xmlData.Substring(ind1+ SearchFor.Length); + int ind2 = xmlData.IndexOf(SearchFor2); + xmlData = xmlData.Substring(0, ind2); + return xmlData; + } + public void BuildCXML(string XmlFile, string CxmlFile) + { + string Magic = DetectMagic(XmlFile); + Console.WriteLine("Magic Number: " + Magic); + if (!IsInitalized) + Init(XmlFile, XmlFile, "RCOF"); + + XmlReaderSettings XMLSettings = new XmlReaderSettings(); + string XMLPath = Path.Combine(MainDir, XMLFilename); + XMLFile = XmlReader.Create(XMLPath, XMLSettings); + + Tools.WriteStringToStream(InfoFile, Magic); + bInfoFile.Write((UInt32)0x0110); + + } + } +} diff --git a/AppInfoCli/CXMLCli.csproj b/AppInfoCli/CXMLCli.csproj index ee95b5b..5ec3ec2 100644 --- a/AppInfoCli/CXMLCli.csproj +++ b/AppInfoCli/CXMLCli.csproj @@ -90,7 +90,9 @@ - + + + diff --git a/AppInfoCli/CXML.cs b/AppInfoCli/CXMLReader.cs similarity index 99% rename from AppInfoCli/CXML.cs rename to AppInfoCli/CXMLReader.cs index 18b461e..21a6d14 100644 --- a/AppInfoCli/CXML.cs +++ b/AppInfoCli/CXMLReader.cs @@ -337,6 +337,10 @@ namespace CXML InfoFile.Read(FileTable, 0x00, DataLength); return FileTable; } + public int ReadVersion() + { + return Tools.ReadIntAt(InfoFile, 0x4); + } public void DecompileCXML(String CXMLFile, bool force = false) { @@ -355,7 +359,8 @@ namespace CXML string XMLPath = Path.Combine(MainDir, XMLFilename); XMLFile = XmlWriter.Create(XMLPath, XMLSettings); XMLFile.WriteStartDocument(); - XMLFile.WriteComment("Decompiled with CXML Decompiler v6 By SilicaAndPina (Magic: \"" + MagicNumber + "\")"); + XMLFile.WriteComment("Decompiled with CXML Decompiler v6 By SilicaAndPina (Magic: \"" + MagicNumber + "\", Version: \""+ ReadVersion()+"\")"); + ReadElements(); XMLFile.WriteEndDocument(); diff --git a/AppInfoCli/GimConv.cs b/AppInfoCli/GimConv.cs new file mode 100644 index 0000000..6de1b9e --- /dev/null +++ b/AppInfoCli/GimConv.cs @@ -0,0 +1,62 @@ +using Ionic.Zip; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net; +using System.Text; +using System.Threading.Tasks; + +namespace CXMLDecompiler +{ + class GimConv + { + + static WebClient wc = new WebClient(); + static bool DownloadCompleted = true; + public static void DownloadGimConv() + { + wc.DownloadProgressChanged += Wc_DownloadProgressChanged; + wc.DownloadDataCompleted += Wc_DownloadDataCompleted; + wc.DownloadDataAsync(new Uri("http://e1.dl.playstation.net/e1/downloads/ps3/themes/370/PS3_Custom_Theme_v200.zip")); // Thanks Sony :3 + while (wc.IsBusy || !DownloadCompleted) { }; + } + + private static void Wc_DownloadDataCompleted(object sender, DownloadDataCompletedEventArgs e) + { + Console.Write("\r\n"); + MemoryStream zipStream = new MemoryStream(e.Result); + ZipFile zip = ZipFile.Read(zipStream); + foreach(ZipEntry zEntry in zip.Entries) + { + string filename = Path.GetFileName(zEntry.FileName); + if (filename == "msvcp71.dll" || filename == "msvcr71.dll" || zEntry.FileName.Contains("GimConv")) + { + string outputFilename = zEntry.FileName; + if (outputFilename.Contains("GimConv")) + outputFilename = outputFilename.Substring(outputFilename.IndexOf("GimConv")); + else + outputFilename = Path.Combine("GimConv", filename); + outputFilename = outputFilename.Replace("/", "\\"); + Console.WriteLine("Extracting: " + outputFilename); + if (zEntry.IsDirectory) + { + Directory.CreateDirectory(outputFilename); + continue; + } + + FileStream fs = File.Open(outputFilename, FileMode.CreateNew, FileAccess.ReadWrite); + zEntry.Extract(fs); + fs.Close(); + } + } + DownloadCompleted = true; + } + + private static void Wc_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e) + { + DownloadCompleted = false; + Console.Write("\rDownloading GimConv Directly from Sony " + e.BytesReceived + "/" + e.TotalBytesToReceive + " - " + e.ProgressPercentage.ToString() + "%"); + } + } +} diff --git a/AppInfoCli/Program.cs b/AppInfoCli/Program.cs index d3a5749..578b671 100644 --- a/AppInfoCli/Program.cs +++ b/AppInfoCli/Program.cs @@ -1,4 +1,5 @@ -using General; +using CXMLDecompiler; +using General; using System; using System.IO; using System.Reflection; @@ -7,9 +8,12 @@ namespace CXMLCli { class Program { - static void Main(string[] args) + static int Main(string[] args) { - //args = "src20.vag -iv".Split(' '); + + // Do you have gimconv? + if (!File.Exists(Path.Combine("GimConv", "GimConv.exe"))) + GimConv.DownloadGimConv(); // Politely ask sony to give it to us. bool Check = true; @@ -37,7 +41,7 @@ namespace CXMLCli Console.WriteLine("\t-d --decompile Decompile CXML."); Console.WriteLine("Example: " + Path.GetFileName(Assembly.GetEntryAssembly().Location) + " app.info -f -s -t -f -d"); Console.WriteLine("Default functonality is to Decompile,\nThis is canceled if any other arguments passed."); - return; + return 0; } String ArgsFull = String.Join(" ", args); @@ -50,7 +54,7 @@ namespace CXMLCli string FileName = Path.GetFileNameWithoutExtension(path) + "-" + VAG.VAGAudio.GetFilename(path) + ".wav"; Console.WriteLine("Writing "+FileName); File.WriteAllBytes(FileName, WaveData); - return; + return 0; } CXML.CXMLParser cxmlParser = new CXML.CXMLParser(); cxmlParser.Init(path, Check); @@ -139,7 +143,7 @@ namespace CXMLCli cxmlParser.WaitExit = true; } - if (ArgsFull.Contains("-d") || ArgsFull.Contains("--decompile")) + if (ArgsFull.Contains("-d") || ArgsFull.Contains("--decompile") && !ArgsFull.Contains("-dt")) { Console.WriteLine("Decompiling."); cxmlParser.DecompileCXML(path, Check); @@ -147,6 +151,7 @@ namespace CXMLCli if(cxmlParser.WaitExit) Console.ReadKey(); } + return 0; } }