From cd99f65ebf8eb4e49667aeafb4a4edd2ff4b6ee5 Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Fri, 2 Sep 2016 02:58:13 +0100 Subject: [PATCH] Added code for handling resource forks when they are in the data fork without headers (not Macbinary, neither AppleDouble, are supported). --- .gitignore | 40 ++ Claunia.RsrcFork.CLI/ChangeLog | 8 + .../Claunia.RsrcFork.CLI.csproj | 59 +++ Claunia.RsrcFork.CLI/Program.cs | 152 +++++++ .../Properties/AssemblyInfo.cs | 52 +++ Claunia.RsrcFork.Test/ChangeLog | 12 + .../Claunia.RsrcFork.Test.csproj | 78 ++++ Claunia.RsrcFork.Test/Samples/DiskCopy42.rsrc | Bin 0 -> 389 bytes Claunia.RsrcFork.Test/Samples/DiskCopy6.rsrc | Bin 0 -> 706 bytes .../Samples/SelfMountingImage.rsrc | Bin 0 -> 179179 bytes Claunia.RsrcFork.Test/Samples/UDIF.rsrc | Bin 0 -> 2431 bytes Claunia.RsrcFork.Test/Test.cs | 193 ++++++++ Claunia.RsrcFork.Test/packages.config | 4 + Claunia.RsrcFork.sln | 38 ++ Claunia.RsrcFork/ChangeLog | 11 + Claunia.RsrcFork/Claunia.RsrcFork.csproj | 62 +++ Claunia.RsrcFork/Properties/AssemblyInfo.cs | 54 +++ Claunia.RsrcFork/Resource.cs | 167 +++++++ Claunia.RsrcFork/ResourceFork.cs | 188 ++++++++ Claunia.RsrcFork/Structs.cs | 121 +++++ Claunia.RsrcFork/Types.cs | 419 ++++++++++++++++++ LICENSE | 19 + README.md | 6 + 23 files changed, 1683 insertions(+) create mode 100644 .gitignore create mode 100644 Claunia.RsrcFork.CLI/ChangeLog create mode 100644 Claunia.RsrcFork.CLI/Claunia.RsrcFork.CLI.csproj create mode 100644 Claunia.RsrcFork.CLI/Program.cs create mode 100644 Claunia.RsrcFork.CLI/Properties/AssemblyInfo.cs create mode 100644 Claunia.RsrcFork.Test/ChangeLog create mode 100644 Claunia.RsrcFork.Test/Claunia.RsrcFork.Test.csproj create mode 100755 Claunia.RsrcFork.Test/Samples/DiskCopy42.rsrc create mode 100755 Claunia.RsrcFork.Test/Samples/DiskCopy6.rsrc create mode 100755 Claunia.RsrcFork.Test/Samples/SelfMountingImage.rsrc create mode 100644 Claunia.RsrcFork.Test/Samples/UDIF.rsrc create mode 100644 Claunia.RsrcFork.Test/Test.cs create mode 100644 Claunia.RsrcFork.Test/packages.config create mode 100644 Claunia.RsrcFork.sln create mode 100644 Claunia.RsrcFork/ChangeLog create mode 100644 Claunia.RsrcFork/Claunia.RsrcFork.csproj create mode 100644 Claunia.RsrcFork/Properties/AssemblyInfo.cs create mode 100644 Claunia.RsrcFork/Resource.cs create mode 100644 Claunia.RsrcFork/ResourceFork.cs create mode 100644 Claunia.RsrcFork/Structs.cs create mode 100644 Claunia.RsrcFork/Types.cs create mode 100644 LICENSE create mode 100644 README.md diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7bbcfed --- /dev/null +++ b/.gitignore @@ -0,0 +1,40 @@ +#Autosave files +*~ + +#build +[Oo]bj/ +[Bb]in/ +packages/ +TestResults/ + +# globs +Makefile.in +*.DS_Store +*.sln.cache +*.suo +*.cache +*.pidb +*.userprefs +*.usertasks +config.log +config.make +config.status +aclocal.m4 +install-sh +autom4te.cache/ +*.user +*.tar.gz +tarballs/ +test-results/ +Thumbs.db + +#Mac bundle stuff +*.dmg +*.app + +#resharper +*_Resharper.* +*.Resharper + +#dotCover +*.dotCover diff --git a/Claunia.RsrcFork.CLI/ChangeLog b/Claunia.RsrcFork.CLI/ChangeLog new file mode 100644 index 0000000..f3cb708 --- /dev/null +++ b/Claunia.RsrcFork.CLI/ChangeLog @@ -0,0 +1,8 @@ +2016-09-02 Natalia Portillo + + * Program.cs: + * AssemblyInfo.cs: + * Claunia.RsrcFork.CLI.csproj: Added code for handling + resource forks when they are in the data fork without headers + (not Macbinary, neither AppleDouble, are supported). + diff --git a/Claunia.RsrcFork.CLI/Claunia.RsrcFork.CLI.csproj b/Claunia.RsrcFork.CLI/Claunia.RsrcFork.CLI.csproj new file mode 100644 index 0000000..2a8e903 --- /dev/null +++ b/Claunia.RsrcFork.CLI/Claunia.RsrcFork.CLI.csproj @@ -0,0 +1,59 @@ + + + + Debug + AnyCPU + {38A6F05E-8900-44E4-83A5-7A215175F78B} + Exe + Claunia.RsrcFork.CLI + Claunia.RsrcFork.CLI + v4.5 + + + true + full + false + bin\Debug + DEBUG; + prompt + 4 + true + + + true + bin\Release + prompt + 4 + true + + + + + + + + + + + {CA231ED3-0C78-496C-AAFE-D085F6E9BEC6} + Claunia.RsrcFork + + + + + LICENSE + PreserveNewest + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Claunia.RsrcFork.CLI/Program.cs b/Claunia.RsrcFork.CLI/Program.cs new file mode 100644 index 0000000..88abfd7 --- /dev/null +++ b/Claunia.RsrcFork.CLI/Program.cs @@ -0,0 +1,152 @@ +// +// Program.cs +// +// Author: +// Natalia Portillo +// +// Copyright (c) 2016 © Claunia.com +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +using System; +using System.IO; +using System.Text; +using System.Linq; + +namespace Claunia.RsrcFork.CLI +{ + class MainClass + { + public static void Main (string [] args) + { + Console.WriteLine("Claunia.RsrcFork.CLI"); + Console.WriteLine("© 2016 Natalia Portillo"); + Console.WriteLine(); + + if(args.Length != 2 && args.Length != 4) + { + Usage(); + return; + } + + if(args.Length == 2) + { + if(args[0] != "-l") + { + Usage(); + return; + } + + if(!File.Exists(args[1])) + { + Console.WriteLine("Specified file does not exist."); + return; + } + + FileStream rsrcStream = new FileStream(args[1], FileMode.Open, FileAccess.Read); + + ResourceFork rsrc = new ResourceFork(rsrcStream); + + foreach(uint type in rsrc.GetTypes()) + { + byte[] typeBytes = BitConverter.GetBytes(type); + typeBytes = typeBytes.Reverse().ToArray(); + string typeName = Types.GetName(type); + if(typeName != null) + Console.WriteLine("\"{0}\" (0x{1:X8}) - {2}", Encoding.ASCII.GetString(typeBytes), type, typeName); + else + Console.WriteLine("\"{0}\" (0x{1:X8})", Encoding.ASCII.GetString(typeBytes), type); + + Resource rez = rsrc.GetResource(type); + Console.WriteLine("{0,6}{1,8}\t{2}", "ID", "Length", "Name"); + Console.WriteLine("{0,6}{1,8}--{2}", "------", "--------", "----------------"); + foreach(short id in rez.GetIds()) + { + if(rez.GetName(id) != null) + Console.WriteLine("{0,6}{1,8}\t\"{2}\"", id, rez.GetLength(id), rez.GetName(id)); + else + Console.WriteLine("{0,6}{1,8}", id, rez.GetLength(id)); + } + + Console.WriteLine(); + } + + return; + } + + if(args.Length == 4) + { + if(args[0] != "-x") + { + Usage(); + return; + } + + if(args[1] != "-o") + { + Usage(); + return; + } + + if(Directory.Exists(args[2])) + { + Console.WriteLine("Output directory exists, not proceeding"); + return; + } + + if(!File.Exists(args[3])) + { + Console.WriteLine("Specified file does not exist."); + return; + } + + FileStream rsrcStream = new FileStream(args[3], FileMode.Open, FileAccess.Read); + FileStream outStream; + + ResourceFork rsrc = new ResourceFork(rsrcStream); + + foreach(uint type in rsrc.GetTypes()) + { + byte[] typeBytes = BitConverter.GetBytes(type); + typeBytes = typeBytes.Reverse().ToArray(); + + Directory.CreateDirectory(Path.Combine(args[2], Encoding.ASCII.GetString(typeBytes))); + + Resource rez = rsrc.GetResource(type); + foreach(short id in rez.GetIds()) + { + outStream = new FileStream(Path.Combine(args[2], Encoding.ASCII.GetString(typeBytes), string.Format("{0}", id)), FileMode.Create, FileAccess.ReadWrite); + byte[] rez_b = rez.GetResource(id); + outStream.Write(rez_b, 0, rez_b.Length); + outStream.Close(); + } + } + + return; + } + } + + public static void Usage() + { + Console.WriteLine("Usage:"); + Console.WriteLine("\tClaunia.RsrcFork.CLI.exe -l resourcefork.bin - Lists resources in resource fork file"); + Console.WriteLine("\t\tor"); + Console.WriteLine("\tClaunia.RsrcFork.CLI.EXE -x -o output.dir resourcefork.bin - Extracts all resources to output.dir"); + } + } +} diff --git a/Claunia.RsrcFork.CLI/Properties/AssemblyInfo.cs b/Claunia.RsrcFork.CLI/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..1c49cde --- /dev/null +++ b/Claunia.RsrcFork.CLI/Properties/AssemblyInfo.cs @@ -0,0 +1,52 @@ +// +// AssemblyInfo.cs +// +// Author: +// Natalia Portillo +// +// Copyright (c) 2016 © Claunia.com +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +using System.Reflection; +using System.Runtime.CompilerServices; + +// Information about this assembly is defined by the following attributes. +// Change them to the values specific to your project. + +[assembly: AssemblyTitle ("Claunia.RsrcFork.CLI")] +[assembly: AssemblyDescription ("")] +[assembly: AssemblyConfiguration ("")] +[assembly: AssemblyCompany ("Claunia.com")] +[assembly: AssemblyProduct ("")] +[assembly: AssemblyCopyright ("© Claunia.com")] +[assembly: AssemblyTrademark ("")] +[assembly: AssemblyCulture ("")] + +// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}". +// The form "{Major}.{Minor}.*" will automatically update the build and revision, +// and "{Major}.{Minor}.{Build}.*" will update just the revision. + +[assembly: AssemblyVersion ("1.0.*")] + +// The following attributes are used to specify the signing key for the assembly, +// if desired. See the Mono documentation for more information about signing. + +//[assembly: AssemblyDelaySign(false)] +//[assembly: AssemblyKeyFile("")] + diff --git a/Claunia.RsrcFork.Test/ChangeLog b/Claunia.RsrcFork.Test/ChangeLog new file mode 100644 index 0000000..e7717cf --- /dev/null +++ b/Claunia.RsrcFork.Test/ChangeLog @@ -0,0 +1,12 @@ +2016-09-02 Natalia Portillo + + * Test.cs: + * packages.config: + * UDIF.rsrc: + * DiskCopy6.rsrc: + * DiskCopy42.rsrc: + * Claunia.RsrcFork.Test.csproj: + * SelfMountingImage.rsrc: Added code for handling resource + forks when they are in the data fork without headers (not + Macbinary, neither AppleDouble, are supported). + diff --git a/Claunia.RsrcFork.Test/Claunia.RsrcFork.Test.csproj b/Claunia.RsrcFork.Test/Claunia.RsrcFork.Test.csproj new file mode 100644 index 0000000..4c8111c --- /dev/null +++ b/Claunia.RsrcFork.Test/Claunia.RsrcFork.Test.csproj @@ -0,0 +1,78 @@ + + + + Debug + AnyCPU + {D204981A-84C2-454D-AE41-7B16E9265339} + Library + Claunia.RsrcFork.Test + Claunia.RsrcFork.Test + v4.5 + + + true + full + false + bin\Debug + DEBUG; + prompt + 4 + false + + + true + bin\Release + prompt + 4 + false + + + + + ..\packages\NUnit.2.6.4\lib\nunit.framework.dll + + + + + + + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + + + + + + {CA231ED3-0C78-496C-AAFE-D085F6E9BEC6} + Claunia.RsrcFork + + + + + LICENSE + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Claunia.RsrcFork.Test/Samples/DiskCopy42.rsrc b/Claunia.RsrcFork.Test/Samples/DiskCopy42.rsrc new file mode 100755 index 0000000000000000000000000000000000000000..8d50b1d676c8ed6ccb65c7f7729b63661f098d53 GIT binary patch literal 389 zcmZQzU}RumV60|SFlS!z)+0|SHH X{xARkGcYh1^3`PSVPFKa!NCmx_IV!v literal 0 HcmV?d00001 diff --git a/Claunia.RsrcFork.Test/Samples/DiskCopy6.rsrc b/Claunia.RsrcFork.Test/Samples/DiskCopy6.rsrc new file mode 100755 index 0000000000000000000000000000000000000000..e0d0461c06891b9a1feb37ffe8da38d496cf5192 GIT binary patch literal 706 zcmZQzU}RumUemess(1|gJ0~9$Bg&-zNGXnz$ z0|VpUWeiL#%?yl3moYFNjAmeAX=Y$)E}UavU}9k4l?Mxf z30{T&U>ZVjak^v{XDc}87gRDZFgUR}G%zqQ@S5qFD8R*aeG`*cDfkB~c(?^C7@Aoa zcq^oU^kn8Hrl;~c2RR#ASShF&m>U@yyE&OdyoX3r!Tv!Z4A&SM7-Sgo7?^`Yf)p4S z7?hHdQ*#*@81#~obCnqw7_7=ti;5W-7~J-M`Trkc0s{j>1BlHa19m8c4Q4Vhg2Wm5 J_zJ)80RWoXMpgg- literal 0 HcmV?d00001 diff --git a/Claunia.RsrcFork.Test/Samples/SelfMountingImage.rsrc b/Claunia.RsrcFork.Test/Samples/SelfMountingImage.rsrc new file mode 100755 index 0000000000000000000000000000000000000000..5bfcbef39d3aeda7bec580c9120efc543a10c432 GIT binary patch literal 179179 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 literal 0 HcmV?d00001 diff --git a/Claunia.RsrcFork.Test/Samples/UDIF.rsrc b/Claunia.RsrcFork.Test/Samples/UDIF.rsrc new file mode 100644 index 0000000000000000000000000000000000000000..7c0ad3277e56a3dcd1fd97a503c7a38d8a916dc2 GIT binary patch literal 2431 zcmZQzU}Rum;FMut;E-WpU`S>dae#>@H?uf{0TK{MzUNgyaF{@Wgy3Sbm>3us6c)2T zIo$x3W07HCcMxFUDBCcBAz;J)|34WRI0Fqpc#8bxiv9n8g5{>jUtaV7|NsABEes5d z`~Uye+5i7n00T$W0jL;+;;3j~U|^8}nKwn=2c$m%WEPmOyuD!m|DOpe3`{Ky3=A9~ zg%C~1B*=NleBHaK>R|FPTK6tQHM%+$h%f_8UGy%90J=Ihh%j7T=X8hwx;hSsFkIdC z5{Ll0IxdJXT;0<^hyc1e9*8glBP8w^h4ml;l4p^^nSp@;Ic^~;5F{H11K1vXY7nYN zS;H>`m>9w7n=!x_*>AiG;TicksR}NsWtqvT$TBdtV?jYqYJ5aQ1WW)c&8xtmz#xEC zYE+QsA%I#A(A>IF3x;$EfU148wviYE1A`2M8v|ofPId(Y1A|aOPBEy~k^^}(07QWC Z|Nj9DOyFEDgIsJVXut~z1uF#uO#riQVC(<@ literal 0 HcmV?d00001 diff --git a/Claunia.RsrcFork.Test/Test.cs b/Claunia.RsrcFork.Test/Test.cs new file mode 100644 index 0000000..f01d2de --- /dev/null +++ b/Claunia.RsrcFork.Test/Test.cs @@ -0,0 +1,193 @@ +// +// Test.cs +// +// Author: +// Natalia Portillo +// +// Copyright (c) 2016 © Claunia.com +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +using System.IO; +using NUnit.Framework; + +namespace Claunia.RsrcFork.Test +{ + [TestFixture] + public class Test + { + readonly byte[] DC42_Vers = { 0x06, 0x40, 0x80, 0x00, 0x00, 0x00, 0x09, 0x44, 0x69, 0x73, 0x6B, 0x20, 0x43, 0x6F, 0x70, 0x79, 0x1C, 0x34, 0x2E, 0x32, 0x2C, + 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6B, 0x73, 0x75, 0x6D, 0x3D, 0x24, 0x41, 0x35, 0x31, 0x34, 0x37, 0x46, 0x37, 0x45 }; + readonly byte[] DC42_Str = { 0x09, 0x44, 0x69, 0x73, 0x6B, 0x20, 0x43, 0x6F, 0x70, 0x79 }; + + [Test] + public void TestDC42() + { + FileStream dc42Stream = new FileStream("Samples/DiskCopy42.rsrc", FileMode.Open, FileAccess.Read); + ResourceFork rsrc = new ResourceFork(dc42Stream); + + uint[] types = rsrc.GetTypes(); + Assert.AreEqual(0x53545220, types[0]); + Assert.AreEqual(0x76657273, types[1]); + + Resource str_ = rsrc.GetResource(0x53545220); + Assert.IsNotNull(str_); + + short[] str_Ids = str_.GetIds(); + Assert.AreEqual(-16396, str_Ids[0]); + Assert.AreEqual(10, str_.GetLength(-16396)); + + byte[] str1 = str_.GetResource(-16396); + Assert.AreEqual(DC42_Str, str1); + + string strStr = str_.GetName(-16396); + Assert.IsNull(strStr); + + Resource vers = rsrc.GetResource(0x76657273); + Assert.IsNotNull(vers); + short[] versIds = vers.GetIds(); + Assert.AreEqual(1, versIds[0]); + Assert.AreEqual(45, vers.GetLength(1)); + + byte[] vers1 = vers.GetResource(1); + Assert.AreEqual(DC42_Vers, vers1); + + string versStr = vers.GetName(1); + Assert.IsNull(versStr); + } + + [Test] + public void TestDC6() + { + FileStream dc6Stream = new FileStream("Samples/DiskCopy6.rsrc", FileMode.Open, FileAccess.Read); + ResourceFork rsrc = new ResourceFork(dc6Stream); + + uint[] types = rsrc.GetTypes(); + Assert.AreEqual(0x53545220, types[0]); + Assert.AreEqual(0x6263656D, types[1]); + Assert.AreEqual(0x62636D23, types[2]); + Assert.AreEqual(0x76657273, types[3]); + + Resource str_ = rsrc.GetResource(0x53545220); + Assert.IsNotNull(str_); + + short[] str_Ids = str_.GetIds(); + Assert.AreEqual(-16396, str_Ids[0]); + Assert.AreEqual(10, str_.GetLength(-16396)); + + byte[] str1 = str_.GetResource(-16396); + Assert.AreEqual(DC42_Str, str1); + + string strStr = str_.GetName(-16396); + Assert.IsNull(strStr); + + Resource vers = rsrc.GetResource(0x76657273); + Assert.IsNotNull(vers); + short[] versIds = vers.GetIds(); + Assert.AreEqual(1, versIds[0]); + Assert.AreEqual(66, vers.GetLength(1)); + + string versStr = vers.GetName(1); + Assert.IsNull(versStr); + + Resource bcem = rsrc.GetResource(0x6263656D); + Assert.IsNotNull(bcem); + short[] bcemIds = bcem.GetIds(); + Assert.AreEqual(128, bcemIds[0]); + Assert.AreEqual(224, bcem.GetLength(128)); + string bcemStr = bcem.GetName(128); + Assert.IsNull(bcemStr); + + Resource bceS = rsrc.GetResource(0x6263656D); + Assert.IsNotNull(bceS); + short[] bceSIds = bceS.GetIds(); + Assert.AreEqual(128, bceSIds[0]); + Assert.AreEqual(224, bcem.GetLength(128)); + string bceSStr = bceS.GetName(128); + Assert.IsNull(bceSStr); + } + + [Test] + public void TestSMI() + { + FileStream smiStream = new FileStream("Samples/SelfMountingImage.rsrc", FileMode.Open, FileAccess.Read); + ResourceFork rsrc = new ResourceFork(smiStream); + + uint[] types = rsrc.GetTypes(); + Assert.AreEqual(29, types.Length); + Assert.AreEqual(0x424E444C, types[0]); + Assert.AreEqual(0x434F4445, types[1]); + Assert.AreEqual(0x44415441, types[2]); + Assert.AreEqual(0x4449544C, types[3]); + Assert.AreEqual(0x444C4F47, types[4]); + Assert.AreEqual(0x44525652, types[5]); + Assert.AreEqual(0x46524546, types[6]); + Assert.AreEqual(0x49434E23, types[7]); + Assert.AreEqual(0x4D505352, types[8]); + Assert.AreEqual(0x4D574242, types[9]); + Assert.AreEqual(0x50415420, types[10]); + + Resource code = rsrc.GetResource(0x434F4445); + Assert.IsNotNull(code); + short[] codeIds = code.GetIds(); + Assert.AreEqual(0, codeIds[0]); + Assert.AreEqual(1, codeIds[1]); + Assert.AreEqual(35130, code.GetLength(1)); + string codeStr = code.GetName(1); + Assert.AreEqual("First Segment", codeStr); //"First Segment" + + Resource bndl = rsrc.GetResource(0x424E444C); + Assert.IsNotNull(bndl); + short[] bndlIds = bndl.GetIds(); + Assert.AreEqual(128, bndlIds[0]); + Assert.AreEqual(28, bndl.GetLength(128)); + string bndlStr = bndl.GetName(128); + Assert.IsNull(bndlStr); + } + + [Test] + public void TestUDIF() + { + FileStream udifStream = new FileStream("Samples/UDIF.rsrc", FileMode.Open, FileAccess.Read); + ResourceFork rsrc = new ResourceFork(udifStream); + + uint[] types = rsrc.GetTypes(); + Assert.AreEqual(2, types.Length); + Assert.AreEqual(0x626C6B78, types[0]); + Assert.AreEqual(0x706C7374, types[1]); + + Resource blkx = rsrc.GetResource(0x626C6B78); + Assert.IsNotNull(blkx); + short[] blkxIds = blkx.GetIds(); + Assert.AreEqual(0, blkxIds[0]); + Assert.AreEqual(524, blkx.GetLength(0)); + string blkxStr = blkx.GetName(0); + Assert.AreEqual("Whole Device (Apple_XXX : 0)", blkxStr); //"First Segment" + + Resource plst = rsrc.GetResource(0x706C7374); + Assert.IsNotNull(plst); + short[] plstIds = plst.GetIds(); + Assert.AreEqual(0, plstIds[0]); + Assert.AreEqual(1544, plst.GetLength(0)); + string plstStr = plst.GetName(0); + Assert.IsNull(plstStr); + } + } +} + diff --git a/Claunia.RsrcFork.Test/packages.config b/Claunia.RsrcFork.Test/packages.config new file mode 100644 index 0000000..c714ef3 --- /dev/null +++ b/Claunia.RsrcFork.Test/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/Claunia.RsrcFork.sln b/Claunia.RsrcFork.sln new file mode 100644 index 0000000..078f56c --- /dev/null +++ b/Claunia.RsrcFork.sln @@ -0,0 +1,38 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2012 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Claunia.RsrcFork", "Claunia.RsrcFork\Claunia.RsrcFork.csproj", "{CA231ED3-0C78-496C-AAFE-D085F6E9BEC6}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Claunia.RsrcFork.Test", "Claunia.RsrcFork.Test\Claunia.RsrcFork.Test.csproj", "{D204981A-84C2-454D-AE41-7B16E9265339}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Claunia.RsrcFork.CLI", "Claunia.RsrcFork.CLI\Claunia.RsrcFork.CLI.csproj", "{38A6F05E-8900-44E4-83A5-7A215175F78B}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {CA231ED3-0C78-496C-AAFE-D085F6E9BEC6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CA231ED3-0C78-496C-AAFE-D085F6E9BEC6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CA231ED3-0C78-496C-AAFE-D085F6E9BEC6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CA231ED3-0C78-496C-AAFE-D085F6E9BEC6}.Release|Any CPU.Build.0 = Release|Any CPU + {D204981A-84C2-454D-AE41-7B16E9265339}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D204981A-84C2-454D-AE41-7B16E9265339}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D204981A-84C2-454D-AE41-7B16E9265339}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D204981A-84C2-454D-AE41-7B16E9265339}.Release|Any CPU.Build.0 = Release|Any CPU + {38A6F05E-8900-44E4-83A5-7A215175F78B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {38A6F05E-8900-44E4-83A5-7A215175F78B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {38A6F05E-8900-44E4-83A5-7A215175F78B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {38A6F05E-8900-44E4-83A5-7A215175F78B}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(MonoDevelopProperties) = preSolution + Policies = $0 + $0.DotNetNamingPolicy = $1 + $1.DirectoryNamespaceAssociation = Hierarchical + $1.ResourceNamePolicy = MSBuild + $0.StandardHeader = $2 + $2.Text = @\n${FileName}\n \nAuthor:\n ${AuthorName} <${AuthorEmail}>\n\nCopyright (c) ${Year} ${CopyrightHolder}\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the "Software"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE. + $2.IncludeInNewFiles = True + EndGlobalSection +EndGlobal diff --git a/Claunia.RsrcFork/ChangeLog b/Claunia.RsrcFork/ChangeLog new file mode 100644 index 0000000..04c3174 --- /dev/null +++ b/Claunia.RsrcFork/ChangeLog @@ -0,0 +1,11 @@ +2016-09-02 Natalia Portillo + + * Types.cs: + * Structs.cs: + * Resource.cs: + * ResourceFork.cs: + * Claunia.RsrcFork.csproj: + * AssemblyInfo.cs: Added code for handling resource forks when + they are in the data fork without headers (not Macbinary, + neither AppleDouble, are supported). + diff --git a/Claunia.RsrcFork/Claunia.RsrcFork.csproj b/Claunia.RsrcFork/Claunia.RsrcFork.csproj new file mode 100644 index 0000000..d953100 --- /dev/null +++ b/Claunia.RsrcFork/Claunia.RsrcFork.csproj @@ -0,0 +1,62 @@ + + + + Debug + AnyCPU + {CA231ED3-0C78-496C-AAFE-D085F6E9BEC6} + Library + Claunia.RsrcFork + Claunia.RsrcFork + v4.5 + + + true + full + false + bin\Debug + DEBUG; + prompt + 4 + false + + + true + bin\Release + prompt + 4 + false + + + + + + + + + + + + + + README.md + PreserveNewest + + + + + LICENSE + PreserveNewest + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Claunia.RsrcFork/Properties/AssemblyInfo.cs b/Claunia.RsrcFork/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..ee3735b --- /dev/null +++ b/Claunia.RsrcFork/Properties/AssemblyInfo.cs @@ -0,0 +1,54 @@ +// +// Author: +// Natalia Portillo claunia@claunia.com +// +// Copyright (c) 2016, © Claunia.com +// +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in +// the documentation and/or other materials provided with the distribution. +// * Neither the name of the [ORGANIZATION] nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +using System.Reflection; +using System.Runtime.CompilerServices; + +// Information about this assembly is defined by the following attributes. +// Change them to the values specific to your project. + +[assembly: AssemblyTitle ("Claunia.RsrcFork")] +[assembly: AssemblyDescription ("")] +[assembly: AssemblyConfiguration ("")] +[assembly: AssemblyCompany ("Claunia.com")] +[assembly: AssemblyProduct ("")] +[assembly: AssemblyCopyright ("© Claunia.com")] +[assembly: AssemblyTrademark ("")] +[assembly: AssemblyCulture ("")] + +// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}". +// The form "{Major}.{Minor}.*" will automatically update the build and revision, +// and "{Major}.{Minor}.{Build}.*" will update just the revision. + +[assembly: AssemblyVersion ("1.0.*")] + +// The following attributes are used to specify the signing key for the assembly, +// if desired. See the Mono documentation for more information about signing. + +//[assembly: AssemblyDelaySign(false)] +//[assembly: AssemblyKeyFile("")] + diff --git a/Claunia.RsrcFork/Resource.cs b/Claunia.RsrcFork/Resource.cs new file mode 100644 index 0000000..3866ae4 --- /dev/null +++ b/Claunia.RsrcFork/Resource.cs @@ -0,0 +1,167 @@ +// +// Resource.cs +// +// Author: +// Natalia Portillo +// +// Copyright (c) 2016 © Claunia.com +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; + +namespace Claunia.RsrcFork +{ + public class Resource + { + readonly Dictionary resourceNames; + readonly Dictionary resources; + readonly Dictionary resourceCache; + readonly Stream rsrcStream; + readonly List ids; + + struct ResourceData + { + public long offset; + public long length; + } + + /// + /// Initializates the specified resource type + /// + /// Stream where the resources of this reside. + /// How many resource of this type are. + /// Offset from start of stream to reference list for this type. + /// Offset from start of stream to resource name list. + /// Offset from start of stream to resource data. + /// Resource type. + internal Resource(Stream stream, ushort resources, long referenceListOff, long resourceNameOffset, long resourceDataOffset, uint OSType) + { + rsrcStream = stream; + Dictionary referenceLists = new Dictionary(); + resourceNames = new Dictionary(); + this.resources = new Dictionary(); + ids = new List(); + byte[] tmp; + + rsrcStream.Seek(referenceListOff + 2, SeekOrigin.Begin); + for(int i = 0; i < resources; i++) + { + ResourceTypeReferenceListItem item = new ResourceTypeReferenceListItem(); + tmp = new byte[2]; + rsrcStream.Read(tmp, 0, 2); + item.id = BitConverter.ToInt16(tmp.Reverse().ToArray(), 0); + rsrcStream.Read(tmp, 0, 2); + item.nameOff = BitConverter.ToInt16(tmp.Reverse().ToArray(), 0); + tmp = new byte[4]; + rsrcStream.Read(tmp, 0, 4); + item.attributes = tmp[0]; + tmp[0] = 0; + item.dataOff = BitConverter.ToInt32(tmp.Reverse().ToArray(), 0); + rsrcStream.Read(tmp, 0, 4); + item.handle = BitConverter.ToUInt32(tmp.Reverse().ToArray(), 0); + + referenceLists.Add(item.id, item); + ids.Add(item.id); + } + + foreach(ResourceTypeReferenceListItem item in referenceLists.Values) + { + string name; + ResourceData data = new ResourceData(); + + if(item.nameOff == -1) + name = null; + else + { + rsrcStream.Seek(resourceNameOffset + item.nameOff, SeekOrigin.Begin); + byte nameLen = (byte)rsrcStream.ReadByte(); + byte[] nameBytes = new byte[nameLen]; + rsrcStream.Read(nameBytes, 0, nameLen); + // TODO: Use MacRoman + name = Encoding.ASCII.GetString(nameBytes); + } + + rsrcStream.Seek(resourceDataOffset + item.dataOff, SeekOrigin.Begin); + tmp = new byte[4]; + rsrcStream.Read(tmp, 0, 4); + data.offset = rsrcStream.Position; + data.length = BitConverter.ToUInt32(tmp.Reverse().ToArray(), 0); + + resourceNames.Add(item.id, name); + this.resources.Add(item.id, data); + } + + resourceCache = new Dictionary(); + } + + /// + /// Gets the name of the specified resource id, or null if there is no name + /// + /// The name. + /// Identifier. + public string GetName(short id) + { + string name; + return resourceNames.TryGetValue(id, out name) ? name : null; + } + + /// + /// Gets the resource contents + /// + /// The resource. + /// Identifier. + public byte[] GetResource(short id) + { + byte[] resource; + + if(resourceCache.TryGetValue(id, out resource)) + return resource; + + ResourceData data; + + if(!resources.TryGetValue(id, out data)) + return null; + + resource = new byte[data.length]; + rsrcStream.Seek(data.offset, SeekOrigin.Begin); + rsrcStream.Read(resource, 0, resource.Length); + + resourceCache.Add(id, resource); + + return resource; + } + + public long GetLength(short id) + { + ResourceData data; + return !resources.TryGetValue(id, out data) ? 0 : data.length; + } + + public short[] GetIds() + { + return ids.ToArray(); + } + } +} + diff --git a/Claunia.RsrcFork/ResourceFork.cs b/Claunia.RsrcFork/ResourceFork.cs new file mode 100644 index 0000000..4464391 --- /dev/null +++ b/Claunia.RsrcFork/ResourceFork.cs @@ -0,0 +1,188 @@ +// +// ResourceFork.cs +// +// Author: +// Natalia Portillo +// +// Copyright (c) 2016 © Claunia.com +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; + +namespace Claunia.RsrcFork +{ + public class ResourceFork + { + Stream rsrcStream; + ResourceHeader header; + ResourceMap map; + Dictionary resourceTypeList; + Dictionary resourceCache; + List osTypes; + + /// + /// Initializates a resource fork using a byte array as backend + /// + /// Buffer. + public ResourceFork(byte[] buffer) + { + rsrcStream = new MemoryStream(buffer, false); + Init(); + } + + /// + /// Initializates a resource fork using a stream as backed + /// + /// Stream. + public ResourceFork(Stream stream) + { + rsrcStream = stream; + Init(); + } + + ~ResourceFork() + { + if(rsrcStream != null) + rsrcStream.Close(); + } + + public void Init() + { + header = new ResourceHeader(); + byte[] tmp = new byte[4]; + rsrcStream.Seek(0, SeekOrigin.Begin); + rsrcStream.Read(tmp, 0, 4); + header.resourceDataOff = BitConverter.ToInt32(tmp.Reverse().ToArray(), 0); + rsrcStream.Read(tmp, 0, 4); + header.resourceMapOff = BitConverter.ToInt32(tmp.Reverse().ToArray(), 0); + rsrcStream.Read(tmp, 0, 4); + header.resourceDataLen = BitConverter.ToInt32(tmp.Reverse().ToArray(), 0); + rsrcStream.Read(tmp, 0, 4); + header.resourceMapLen = BitConverter.ToInt32(tmp.Reverse().ToArray(), 0); + + if(header.resourceDataOff <= 0 || header.resourceDataOff <= 0 || header.resourceDataLen <= 0 || header.resourceMapLen <= 0) + throw new InvalidCastException("Not a resource fork"); + + if(header.resourceDataOff + header.resourceDataLen > rsrcStream.Length || + header.resourceMapOff + header.resourceMapLen > rsrcStream.Length) + throw new InvalidCastException("Not a resource fork"); + + map = new ResourceMap(); + map.header = new ResourceHeader(); + rsrcStream.Seek(header.resourceMapOff, SeekOrigin.Begin); + rsrcStream.Read(tmp, 0, 4); + map.header.resourceDataOff = BitConverter.ToInt32(tmp.Reverse().ToArray(), 0); + rsrcStream.Read(tmp, 0, 4); + map.header.resourceMapOff = BitConverter.ToInt32(tmp.Reverse().ToArray(), 0); + rsrcStream.Read(tmp, 0, 4); + map.header.resourceDataLen = BitConverter.ToInt32(tmp.Reverse().ToArray(), 0); + rsrcStream.Read(tmp, 0, 4); + map.header.resourceMapLen = BitConverter.ToInt32(tmp.Reverse().ToArray(), 0); + + if(map.header.resourceDataOff != header.resourceDataOff || + map.header.resourceDataLen != header.resourceDataLen || + map.header.resourceMapOff != header.resourceMapOff || + map.header.resourceMapLen != header.resourceMapLen) + throw new InvalidCastException("Header copy is not same as header."); + + rsrcStream.Read(tmp, 0, 4); + map.handleToNextMap = BitConverter.ToUInt32(tmp.Reverse().ToArray(), 0); + tmp = new byte[2]; + rsrcStream.Read(tmp, 0, 2); + map.fileRefNo = BitConverter.ToUInt16(tmp.Reverse().ToArray(), 0); + rsrcStream.Read(tmp, 0, 2); + map.attributes = BitConverter.ToUInt16(tmp.Reverse().ToArray(), 0); + rsrcStream.Read(tmp, 0, 2); + map.typeListOff = BitConverter.ToInt16(tmp.Reverse().ToArray(), 0); + rsrcStream.Read(tmp, 0, 2); + map.nameListOff = BitConverter.ToInt16(tmp.Reverse().ToArray(), 0); + + // Number of types is part of the resource type list not of the map + + rsrcStream.Seek(header.resourceMapOff + map.typeListOff, SeekOrigin.Begin); + rsrcStream.Read(tmp, 0, 2); + map.numberOfTypes = BitConverter.ToUInt16(tmp.Reverse().ToArray(), 0); + + resourceTypeList = new Dictionary(); + osTypes = new List(); + + for(int i = 0; i <= map.numberOfTypes; i++) { + ResourceTypeListItem typeList = new ResourceTypeListItem(); + tmp = new byte[4]; + rsrcStream.Read(tmp, 0, 4); + typeList.type = BitConverter.ToUInt32(tmp.Reverse().ToArray(), 0); + tmp = new byte[2]; + rsrcStream.Read(tmp, 0, 2); + typeList.resources = BitConverter.ToUInt16(tmp.Reverse().ToArray(), 0); + rsrcStream.Read(tmp, 0, 2); + typeList.referenceOff = BitConverter.ToInt16(tmp.Reverse().ToArray(), 0); + + resourceTypeList.Add(typeList.type, typeList); + osTypes.Add(typeList.type); + } + + resourceCache = new Dictionary(); + } + + /// + /// Gets the resources with indicated type + /// + /// The resource. + /// OSType. + public Resource GetResource(uint OSType) + { + Resource rsrc; + + if(resourceCache.TryGetValue(OSType, out rsrc)) + return rsrc; + + ResourceTypeListItem typeList; + if(!resourceTypeList.TryGetValue(OSType, out typeList)) + return null; + + rsrc = new Resource(rsrcStream, (ushort)(typeList.resources + 1), header.resourceMapOff + map.typeListOff + typeList.referenceOff - 2, header.resourceMapOff + map.nameListOff, header.resourceDataOff, OSType); + + resourceCache.Add(OSType, rsrc); + + return rsrc; + } + + /// + /// Gets all OSTypes stored in this resource fork + /// + /// The types. + public uint[] GetTypes() + { + return osTypes.ToArray(); + } + + /// + /// Returns true if the specified OSType is present in this resource fork. + /// + /// OSType. + public bool ContainsKey(uint OSType) + { + return resourceTypeList.ContainsKey(OSType); + } + } +} + diff --git a/Claunia.RsrcFork/Structs.cs b/Claunia.RsrcFork/Structs.cs new file mode 100644 index 0000000..19a1fec --- /dev/null +++ b/Claunia.RsrcFork/Structs.cs @@ -0,0 +1,121 @@ +// +// Structs.cs +// +// Author: +// Natalia Portillo +// +// Copyright (c) 2016 © Claunia.com +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +namespace Claunia.RsrcFork +{ + struct ResourceHeader + { + /// + /// Offset from start of resource fork to resource data + /// + public int resourceDataOff; + /// + /// Offset from start of resource fork to resource map + /// + public int resourceMapOff; + /// + /// Length of resource data + /// + public int resourceDataLen; + /// + /// Length of resource map + /// + public int resourceMapLen; + } + + struct ResourceMap + { + /// + /// Copy of the resource fork header + /// + public ResourceHeader header; + /// + /// Reserved for handle to next resource map + /// + public uint handleToNextMap; + /// + /// Reserved for file reference number + /// + public ushort fileRefNo; + /// + /// Resource fork attributes + /// + public ushort attributes; + /// + /// Offset from start of resource map to resource type list + /// + public short typeListOff; + /// + /// Offset from start of resource map to resource name list + /// + public short nameListOff; + /// + /// Number of types in the map minus 1 + /// + public ushort numberOfTypes; + } + + struct ResourceTypeListItem + { + /// + /// Resource type + /// + public uint type; + /// + /// Number of resources of this type minus 1 + /// + public ushort resources; + /// + /// Offset from beginning of resource type list to reference list + /// + public short referenceOff; + } + + struct ResourceTypeReferenceListItem + { + /// + /// Resource ID + /// + public short id; + /// + /// Offset from beginning of resource name list to resource name. -1 if it does not have a name + /// + public short nameOff; + /// + /// Resource attributes + /// + public byte attributes; + /// + /// Offset from beginning of resource data to resource. First byte is . + /// + public int dataOff; + /// + /// Reserved for handle to resource + /// + public uint handle; + } +} + diff --git a/Claunia.RsrcFork/Types.cs b/Claunia.RsrcFork/Types.cs new file mode 100644 index 0000000..249697c --- /dev/null +++ b/Claunia.RsrcFork/Types.cs @@ -0,0 +1,419 @@ +// +// Types.cs +// +// Author: +// Natalia Portillo +// +// Copyright (c) 2016 © Claunia.com +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +using System; +using System.Text; +using System.Linq; + +namespace Claunia.RsrcFork +{ + public static class Types + { + public static string GetName(uint OSType) + { + switch(OSType) { + case 0x61637462: // "actb" + return "Alert colour table"; + case 0x61637572: // "acur" + return "Animated cursor"; + case 0x41444253: // "ADBS" + return "Apple Desktop Bus service routine"; + case 0x616C6973: // "alis" + return "Alias"; + case 0x414C5254: // "ALRT" + return "Alert template"; + case 0x4150504C: // "APPL" + return "Application list (Desktop file)"; + case 0x6174706C: // "atpl" + return "AppleTalk resource"; + case 0x626C6B78: // "blkx" + return "UDIF block chunks"; + case 0x626D6170: // "bmap" + return "Bitmap graphic"; + case 0x424E444C: // "BNDL" + return "Bundle linking FREF and ICN# to provide correct icon on Desktop"; + case 0x424E444E: // "BNDN" + return "Data configured in big-endian form"; + case 0x424F4F4C: // "BOOL" + return "Boolean word"; + case 0x626F6F74: // "boot" + return "Copy of boot blocks"; + case 0x43414348: // "CACH" + return "RAM cache control code"; + case 0x63637462: // "cctb" + return "Control colour table"; + case 0x43444546: // "CDEF" + return "Control definition"; + case 0x63646576: // "cdev" + return "Control device code (control panel)"; + case 0x63667267: // "cfrg" + return "Code fragment dictionary for PowerPC code"; + case 0x43484152: // "CHAR" + return "ASCII character"; + case 0x6369636E: // "cicn" + return "Large screen icon, colour"; + case 0x434C5554: // "CLUT" + return "Color look-up table"; + case 0x636C7574: // "clut" + return "Color look-up table"; + case 0x434E544C: // "CNTL" + return "Control template"; + case 0x434D444F: // "CMDO" + return "MPW or A/UX Comando data"; + case 0x434D4E55: // "CMNU" + return "Menu with command ID numbers"; + case 0x636D6E75: // "cmnu" + return "MacApp temporary menu resource"; + case 0x434F4445: // "CODE" + return "Application code segment"; + case 0x434F4C52: // "COLR" + return "QuickDraw RGB colour template"; + case 0x63727372: // "crsr" + return "Cursor, colour"; + case 0x63746162: // "ctag" + return "Cache table containing list of possible cache sizes"; + case 0x43545923: // "CTY#" + return "City list"; + case 0x43555253: // "CURS" + return "Cursor, black & white with mask"; + case 0x44415441: // "DATA" + return "Data"; + case 0x44415445: // "DATE" + return "System date and time"; + case 0x64637462: // "dctb" + return "Dialog colour table"; + case 0x4449434C: // "DICL" + return "Used by MacWorkstation"; + case 0x4449544C: // "DITL" + return "Dialog item list"; + case 0x444C4F47: // "DLOG" + return "Dialog template"; + case 0x44525652: // "DRVR" + return "Driver"; + case 0x44534154: // "DSAT" + return "Default startup alert table"; + case 0x65727273: // "errs" + return "MacApp error string"; + case 0x4642544E: // "FBTN" + return "MiniFinder button"; + case 0x46434D54: // "FCMT" + return "Finder comment"; + case 0x66637462: // "fctb" + return "Font colour table"; + case 0x46444952: // "FDIR" + return "MiniFinder button directory ID"; + case 0x66696E66: // "finf" + return "Font information"; + case 0x464B4559: // "FKEY" + return "Function Key code"; + case 0x666C6423: // "fld#" + return "Folder names list"; + case 0x464C5452: // "FLTR" + return "Declare Filtered Template with comment"; + case 0x666D6E75: // "fmnu" + return "Finder menu"; + case 0x464D5452: // "FMTR" + return "Format record"; + case 0x464F424A: // "FOBJ" + return "Folder information"; + case 0x464F4E44: // "FOND" + return "Font family descriptor"; + case 0x464F4E54: // "FONT" + return "Font description, bitmap"; + case 0x66505254: // "fPRT" + return "Print Catalogue defaults for Finder"; + case 0x46524546: // "FREF" + return "File reference for BNDL used to identify correct icon"; + case 0x46525356: // "FRSV" + return "ROM font resources"; + case 0x46574944: // "FWID" + return "Font width table"; + case 0x67616D61: // "gama" + return "Gamma table giving color correction for screen"; + case 0x474E524C: // "GNRL" + return "NBP timeout and retry info for AppleTalk"; + case 0x68646C67: // "hdlg" + return "Balloon Help for dialog box items"; + case 0x68666472: // "hfdr" + return "Balloon Help for application icon in Finder"; + case 0x686D6E75: // "hmnu" + return "Balloon Help for menus in application"; + case 0x686F7672: // "hovr" + return "Balloon Help that overrides Finder help"; + case 0x68726374: // "hrct" + return "Balloon Help for rectangles in windows"; + case 0x6877696E: // "hwin" + return "Bundles together the hrct and hdlg resources for a window"; + case 0x69636C34: // "icl4" + return "Large Desktop icon, 4-bit colour"; + case 0x69636C38: // "icl8" + return "Large Desktop icon, 8-bit colour"; + case 0x69636D74: // "icmt" + return "Installer comment"; + case 0x69636E73: // "icns" + return "Universal icon, all sizes"; + case 0x49434E23: // "ICN#" + return "Large Desktop icon, black & white with mask"; + case 0x49434F4E: // "ICON" + return "Large application icon, black & white"; + case 0x69637334: // "ics4" + return "Small Desktop icon, 4-bit colour"; + case 0x69637338: // "ics8" + return "Small Desktop icon, 8-bit colour"; + case 0x69637323: // "ics#" + return "Small Desktop icon, black and white with mask"; + case 0x69637462: // "ictb" + return "Dialog items colour table"; + case 0x696E6262: // "inbb" + return "Installer boot block"; + case 0x696E646D: // "indm" + return "Installer default map"; + case 0x696E6661: // "infa" + return "Installer file atom"; + case 0x696E6673: // "infs" + return "Installer file spec"; + case 0x696E706B: // "inpk" + return "Installer package"; + case 0x696E7261: // "inra" + return "Installer resource atom"; + case 0x696E7363: // "insc" + return "Installer script"; + case 0x494E4954: // "INIT" + return "Startup resource (extension, control panel or System file)"; + case 0x69746C30: // "itl0" + return "International date and time format, now obsolete (INTL ID=0)"; + case 0x49544C31: // "ITL1" + return "International long date format"; + case 0x69746C31: // "itl1" + return "International names of days and months (INTL ID=1)"; + case 0x69746C32: // "itl2" + return "International Utilities string comparison hooks"; + case 0x69746C34: // "itl4" + return "International Tokenise tables & Localisation code"; + case 0x69746C35: // "itl5" + return "International Character Set encoding"; + case 0x69746C62: // "itlb" + return "International Utilities Package Script bundles"; + case 0x69746C63: // "itlc" + return "International Script Manager configuration"; + case 0x69746C6D: // "itlm" + return "Sorting order for Script, language and region"; + case 0x69746C6B: // "itlk" + return "International exception dictionary for KCHR"; + case 0x494E544C: // "INTL" + return "International formatting information"; + case 0x4B434150: // "KCAP" + return "Physical keyboard layout used by Keycaps DA"; + case 0x4B434852: // "KCHR" + return "Keyboard character software ASCII mapping"; + case 0x4B455943: // "KEYC" + return "Old keyboard layout"; + case 0x6B696E64: // "kind" + return "File description"; + case 0x4B4D4150: // "KMAP" + return "Hardware keyboard mapping"; + case 0x6B73636E: // "kscn" + return "Keyboard and script system icon"; + case 0x4B535750: // "KSWP" + return "Keyboard script swapping table"; + case 0x4C41594F: // "LAYO" + return "Layout resource"; + case 0x4C444546: // "LDEF" + return "List definition"; + case 0x6C6D656D: // "lmem" + return "Finder low memory globals"; + case 0x4C4E444E: // "LNDN" + return "Data in little-endian format"; + case 0x4C4E4743: // "LNGC" + return "Mac OS language code"; + case 0x6D616368: // "mach" + return "Matches machine to CDEV control panel (control panel)"; + case 0x4D414353: // "MACS" + return "Version number for System and Finder files"; + case 0x4D424446: // "MBDF" + return "Default menu definition"; + case 0x4D424152: // "MBAR" + return "Menu bar, contains set of MENU IDs"; + case 0x6D636B79: // "mcky" + return "Mouse tracking speed presets for Mouse control panel"; + case 0x6D636F64: // "mcod" + return "MacroMaker information"; + case 0x6D637462: // "mctb" + return "Menu colour table"; + case 0x4D444154: // "MDAT" + return "Modification date and time"; + case 0x6D646374: // "mdct" + return "MacroMaker information"; + case 0x4D444546: // "MDEF" + return "Menu definition"; + case 0x6D656D21: // "mem!" + return "MacApp memory usage"; + case 0x4D454E55: // "MENU" + return "Menu contents & style"; + case 0x6D696E66: // "minf" + return "Macro info for MacroMaker"; + case 0x6D697471: // "mitq" + return "Internal memory needs for colour Make Inverse Table"; + case 0x6D6E7462: // "mntb" + return "MacApp menu table, relating command number to menu item"; + case 0x4D6F6F56: // "MooV" + return "Movie"; + case 0x6D707063: // "mppc" + return "MPP configuration resource"; + case 0x6D737472: // "mstr" + return "Finder substitute file storing Open and Quit strings"; + case 0x4E425043: // "NBPC" + return "AppleTalk NBP configuration"; + case 0x4E464E54: // "NFNT" + return "New Font Numbering Table bitmap font, indexed via Font & Style menus"; + case 0x6E637473: // "ncts" + return "List of constants"; + case 0x6E726374: // "nrct" + return "Rectangle position list"; + case 0x6F70656E: // "open" + return "Openable file types"; + case 0x5041434B: // "PACK" + return "High-level software packages"; + case 0x50415041: // "PAPA" + return "Printer name, type and zone"; + case 0x50415420: // "PAT " + return "Black & white QuickDraw pattern, 8 by 8 pixels"; + case 0x50415423: // "PAT#" + return "Black & white QuickDraw pattern list"; + case 0x50444546: // "PDEF" + return "Printer definition"; + case 0x50494354: // "PICT" + return "Picture"; + case 0x706C7374: // "plst" + return "UDIF partition list"; + case 0x706C7474: // "pltt" + return "Colour palette"; + case 0x706E6F74: // "pnot" + return "Preview notification"; + case 0x504E5420: // "PNT " + return "QuickDraw Point"; + case 0x504F5354: // "POST" + return "PostScript data"; + case 0x70706174: // "ppat" + return "Colour pixel pattern"; + case 0x70706363: // "ppcc" + return "PPC browser communications"; + case 0x70707423: // "ppt#" + return "List of ppat patterns"; + case 0x50524546: // "PREF" + return "Preferences"; + case 0x50524330: // "PRC0" + return "Default printer page setup defaults"; + case 0x50524333: // "PRC3" + return "Print record"; + case 0x50524543: // "PREC" + return "Printer driver's private data"; + case 0x50534150: // "PSAP" + return "String"; + case 0x50544348: // "PTCH" + return "ROM patch code"; + case 0x71727363: // "qrsc" + return "Query resource used in Sytem 7.0"; + case 0x52454354: // "RECT" + return "QuickDraw rectangle"; + case 0x7265736C: // "resl" + return "Resident MacApp segments"; + case 0x52474E43: // "RGNC" + return "Mac OS System Region Code"; + case 0x524F7623: // "ROv#" + return "List of ROM resource overrides"; + case 0x52534944: // "RSID" + return "Signed resource ID integer"; + case 0x53435043: // "SCPC" + return "MacOS system script code"; + case 0x7363726E: // "scrn" + return "Screen configuration for Monitors control panel"; + case 0x73656721: // "seg!" + return "MacApp memory management"; + case 0x53455244: // "SERD" + return "RAMSerial Driver"; + case 0x73666E23: // "sfn#" + return "System Font list"; + case 0x73666E74: // "sfnt" + return "Spline or scalable font"; + case 0x5349434E: // "SICN" + return "Small application icon, black & white"; + case 0x53495A45: // "SIZE" + return "Finder size information"; + case 0x736E6420: // "snd " + return "Sound"; + case 0x736E7468: // "snth" + return "Sound synthesiser resource"; + case 0x53545220: // "STR " + return "String in Pascal format"; + case 0x53545223: // "STR#" + return "String list in Pascal format"; + case 0x7374796C: // "styl" + return "Style information for text used by TextEdit"; + case 0x7379737A: // "sysz" + return "System Heap request"; + case 0x54455854: // "TEXT" + return "Unlabelled text string"; + case 0x746C7374: // "tlst" + return "Title list"; + case 0x544D504C: // "TMPL" + return "ResEdit template"; + case 0x544E414D: // "TNAM" + return "Type name"; + case 0x76696577: // "view" + return "MacApp view resource"; + case 0x76657273: // "vers" + return "Version"; + case 0x77637462: // "wctb" + return "Window colour table"; + case 0x57444546: // "WDEF" + return "Window definition"; + case 0x57494E44: // "WIND" + return "Window template"; + case 0x77737472: // "wstr" + return "String used by qrsc"; + case 0x58434D44: // "XCMD" + return "HyperCard external command"; + case 0x5846434E: // "XFCN" + return "HyperCard external function"; + default: + return null; + } + } + + public static string GetName(string OSType) + { + if(OSType.Length != 4) + return null; + + byte[] typB = Encoding.ASCII.GetBytes(OSType); + uint type = BitConverter.ToUInt32(typB.Reverse().ToArray(), 0); + + return GetName(type); + } + } +} + diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..98dc1fd --- /dev/null +++ b/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2015-2016 Natalia Portillo + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..d880918 --- /dev/null +++ b/README.md @@ -0,0 +1,6 @@ +Claunia.RsrcFork +================ + +Copyright © 2011-2016 Natalia Portillo + +Library and command line application for handling resource forks. \ No newline at end of file