Beispiel #1
0
        public void BinarySerTest()
        {
            var dd = DataDir.Create(DataDirType.Temporary);

            dd.CreateIfNotExists();

            var data = new TestObject
            {
                SomeInt     = 0xc0ffee,
                SomeDouble  = 12345.54321,
                SomeString  = "the quick brown fox jumps over the lazy dog",
                SomeNumbers = new int[] { 1, 2, 3, 4, -10, -20, -30, -40 }
            };

            dd.SerializationFormats.Add(".custom", new MiffTheFox.DataDirs.Serialization.BinarySerializationFormat());
            string filename = DateTime.UtcNow.Ticks.ToString("x") + ".custom";

            dd.WriteObject(filename, data);

            var data2 = dd.ReadObject <TestObject>(filename);

            Assert.AreEqual(data, data2);

            dd.DeleteFile(filename);
        }
Beispiel #2
0
        public void TestOpenFile()
        {
            var contents = BinString.FromTextString("Hello, world!\n", System.Text.Encoding.ASCII);
            var dd       = DataDir.Create(DataDirType.Temporary);

            string filename     = DateTime.Now.Ticks.ToString("x") + ".tmp";
            string fullFilename = Path.Combine(dd.Path, filename);

            Assert.IsFalse(File.Exists(fullFilename));
            Assert.ThrowsException <FileNotFoundException>(() => dd.OpenFile(filename, FileMode.Open, FileAccess.Read));

            using (var stream = dd.OpenFile(filename, FileMode.Create, FileAccess.ReadWrite))
            {
                stream.Write(contents);
                stream.Close();
            }

            Assert.IsTrue(File.Exists(fullFilename));
            Assert.AreEqual(contents, (BinString)File.ReadAllBytes(fullFilename));

            using (var stream = dd.OpenFile(filename, FileMode.Open, FileAccess.Read))
            {
                var read = stream.ReadBinString(contents.Length);
                Assert.AreEqual(contents, read);
            }

            File.Delete(fullFilename);

            Assert.ThrowsException <ArgumentException>(() => dd.OpenFile(null, FileMode.Create, FileAccess.ReadWrite));
            Assert.ThrowsException <ArgumentException>(() => dd.OpenFile(string.Empty, FileMode.Create, FileAccess.ReadWrite));
        }
Beispiel #3
0
        public void ReadObjectWithCreateTest()
        {
            var dd = DataDir.Create(DataDirType.Temporary);

            dd.CreateIfNotExists();

            string filename = dd.GetNewFileName(extension: "json");

            Assert.IsFalse(dd.FileExists(filename));

            var data = new TestObject
            {
                SomeInt     = 12345,
                SomeDouble  = 54.321,
                SomeString  = "ABCD 1234567 abcd",
                SomeNumbers = new int[] { -10, -20, 15, -8 }
            };

            var test1 = dd.ReadObject <TestObject>(filename, () => data);

            Assert.AreEqual(test1, data);

            test1.SomeInt    = -117;
            test1.SomeDouble = -42.5;
            dd.WriteObject(filename, test1);

            var test2 = dd.ReadObject <TestObject>(filename, () => data);

            Assert.AreEqual(test1, test2);
            Assert.AreNotEqual(data, test2);
        }
Beispiel #4
0
        public void TestSubdirectory()
        {
            var    rng      = new Random();
            string basePath = Path.Combine(Path.GetTempPath(), "DataDirTests", "subdir");

            string testPath;

            do
            {
                testPath = $"{basePath}_{DateTime.Now.Ticks:x}_{rng.Next():x}";
            } while (Directory.Exists(testPath));

            var dd = new DataDir(testPath);

            Assert.IsFalse(dd.DirectoryExists);

            dd.CreateIfNotExists();
            Assert.IsTrue(dd.DirectoryExists);
            Assert.IsTrue(Directory.Exists(testPath));

            var subdir = dd.Subdirectory("subdir");

            Assert.IsFalse(subdir.DirectoryExists);
            subdir.CreateIfNotExists();
            Assert.IsTrue(subdir.DirectoryExists);

            Directory.Delete(subdir.Path);
            Directory.Delete(testPath);
            Assert.IsFalse(dd.DirectoryExists);
        }
Beispiel #5
0
        protected ExecutorBase CreateExecutor()
        {
            try
            {
#if NET40 || NET45
                return(new AppDomainExecutor(
                           Assembly.Value(),
                           DataDir.Value(),
                           Config.Value(),
                           RootNamespace.Value(),
                           Language.Value()));
#elif NETCOREAPP
                return(new ReflectionExecutor(
                           Assembly.Value(),
                           DataDir.Value(),
                           Config.Value(),
                           RootNamespace.Value(),
                           Language.Value()));
#else
#error Unexpected target framework
#endif
            }
            catch (FileNotFoundException ex)
                when(new AssemblyName(ex.FileName).Name == "EntityFramework")
                {
                    throw new CommandException(
                              string.Format(
                                  MyResources.EntityFrameworkNotFound,
                                  Path.GetFileNameWithoutExtension(Assembly.Value())),
                              ex);
                }
        }
Beispiel #6
0
        public void AutomaticNameTest()
        {
            string title = Assembly.GetExecutingAssembly().GetCustomAttributes <AssemblyTitleAttribute>().Select(attr => attr.Title).FirstOrDefault();

            var tempDirectory = DataDir.Create(DataDirType.Temporary);

            Assert.AreEqual(title, Path.GetFileName(tempDirectory.Path));
        }
Beispiel #7
0
        public void TestDelete()
        {
            var    dd         = DataDir.Create(DataDirType.Temporary);
            string filename   = "DeleteMe-" + DateTime.Now.Ticks.ToString("x") + ".txt";
            string stringData = "This file should be deleted.\n";

            dd.WriteAllText(filename, stringData, Encoding.ASCII);
            Assert.AreEqual(stringData, dd.ReadAllText(filename, Encoding.ASCII));

            dd.DeleteFile(filename);
            Assert.ThrowsException <FileNotFoundException>(() => dd.ReadAllText(filename, Encoding.ASCII));
        }
Beispiel #8
0
        public void TestSimpleReadWrite()
        {
            string stringData = "Hello, world! This is a string.\n";
            var    binData    = BinString.FromBytes("09F911029D74E35BD84156C5635688C0");

            var dd = DataDir.Create(DataDirType.Temporary);

            dd.WriteAllText("test.txt", stringData, System.Text.Encoding.ASCII);
            Assert.AreEqual(stringData, dd.ReadAllText("test.txt", Encoding.ASCII));

            dd.WriteAllBytes("test.bin", binData);
            Assert.AreEqual(binData, dd.ReadAllBytes("test.bin"));
        }
Beispiel #9
0
        public void FailedSerTest()
        {
            var dd = DataDir.Create(DataDirType.Temporary);

            dd.CreateIfNotExists();
            string filename = "notfound-" + DateTime.UtcNow.Ticks.ToString("x") + ".json";

            Assert.ThrowsException <FileNotFoundException>(() => dd.ReadObject <TestObject>(filename));
            Assert.ThrowsException <MiffTheFox.DataDirs.Serialization.UnknownSerializationFormatException>(() => dd.WriteObject("invalid.xyz", 42));

            filename = "invalid-" + DateTime.UtcNow.Ticks.ToString("x") + ".json";
            dd.WriteAllText(filename, "}{}!{$%{!%#()%(!@#%}!@#{$!}#%", System.Text.Encoding.Unicode);
            Assert.ThrowsException <MiffTheFox.DataDirs.Serialization.SerializationFailException>(() => dd.ReadObject <TestObject>(filename));
        }
Beispiel #10
0
        public void TestGetNewFileName()
        {
            const string testHint = "Test Hint";
            var          dd       = DataDir.Create(DataDirType.Temporary);

            string f1 = dd.GetNewFileName(testHint, "tmp");

            Assert.IsFalse(dd.FileExists(f1));

            dd.WriteAllBytes(f1, BinString.Empty);
            Assert.IsTrue(dd.FileExists(f1));

            string f2 = dd.GetNewFileName(testHint, "tmp");

            Assert.AreNotEqual(f1, f2);
            Assert.IsFalse(dd.FileExists(f2));
        }
Beispiel #11
0
 private void _read()
 {
     _exportTable         = new DataDir(m_io, this, m_root);
     _importTable         = new DataDir(m_io, this, m_root);
     _resourceTable       = new DataDir(m_io, this, m_root);
     _exceptionTable      = new DataDir(m_io, this, m_root);
     _certificateTable    = new DataDir(m_io, this, m_root);
     _baseRelocationTable = new DataDir(m_io, this, m_root);
     _debug                 = new DataDir(m_io, this, m_root);
     _architecture          = new DataDir(m_io, this, m_root);
     _globalPtr             = new DataDir(m_io, this, m_root);
     _tlsTable              = new DataDir(m_io, this, m_root);
     _loadConfigTable       = new DataDir(m_io, this, m_root);
     _boundImport           = new DataDir(m_io, this, m_root);
     _iat                   = new DataDir(m_io, this, m_root);
     _delayImportDescriptor = new DataDir(m_io, this, m_root);
     _clrRuntimeHeader      = new DataDir(m_io, this, m_root);
 }
Beispiel #12
0
        public void TestGetPath()
        {
            var    data     = BinString.FromBytes("C0FFEEC0FFEEC0FFEEC0FFEE");
            var    dd       = DataDir.Create(DataDirType.Temporary);
            string filename = DateTime.Now.Ticks.ToString("x") + ".tmp";
            string fullPath = dd.GetFullPath(filename);

            Assert.IsFalse(File.Exists(fullPath));
            dd.WriteAllBytes(filename, data);
            Assert.AreEqual(data, (BinString)File.ReadAllBytes(fullPath));

            data = BinString.FromTextString("ABCDEFGHIJKLMNOPQRSTUVWXYZ", Encoding.ASCII);
            File.WriteAllBytes(fullPath, data);
            Assert.AreEqual(data, dd.ReadAllBytes(filename));

            Assert.IsTrue(File.Exists(fullPath));
            dd.DeleteFile(filename);
            Assert.IsFalse(File.Exists(fullPath));
        }
Beispiel #13
0
        public void LocationCreateTests()
        {
            var    l = new List <DataDir>();
            string fakeApplicationName = $"DataDir/Test {DateTime.Now:F}";

            l.Add(DataDir.Create(fakeApplicationName, type: DataDirType.RoamingUser));
            l.Add(DataDir.Create(fakeApplicationName, type: DataDirType.LocalUser));
            l.Add(DataDir.Create(fakeApplicationName, type: DataDirType.SystemWide));
            l.Add(DataDir.Create(fakeApplicationName, type: DataDirType.Temporary));
            l.Add(DataDir.Create(fakeApplicationName, type: DataDirType.SavedGameData));

            foreach (var d in l)
            {
                // DataDir.Create should create the directory on disk
                Assert.IsTrue(d.DirectoryExists);

                // clean up
                Directory.Delete(d.Path);
                Assert.IsFalse(d.DirectoryExists);
            }
        }
Beispiel #14
0
        public void TestCreation()
        {
            string testPath = Path.Combine(Path.GetTempPath(), "DataDirTests", "creation");

            var d1 = new DataDir(testPath);

            Assert.AreEqual(testPath, d1.Path);
            Assert.AreEqual(testPath, d1.ToString());

            var d2 = new DataDir(testPath);

            Assert.IsTrue(d1.Equals(d2));
            Assert.IsTrue(d2.Equals(d1));

            var d3 = new DataDir(Path.Combine(Path.GetTempPath(), "DataDirTests", "other"));

            Assert.IsFalse(d1.Equals(d3));
            Assert.IsFalse(d3.Equals(d1));

            Assert.ThrowsException <ArgumentException>(() => new DataDir(null));
            Assert.ThrowsException <ArgumentException>(() => new DataDir(string.Empty));
            Assert.ThrowsException <ArgumentException>(() => new DataDir(testPath + Path.GetInvalidPathChars()[0]));
        }
Beispiel #15
0
        static AuditManager()
        {
            ScanAssembly(Assembly.GetExecutingAssembly());
            if (Assembly.GetEntryAssembly() != Assembly.GetExecutingAssembly())
            {
                ScanAssembly(Assembly.GetEntryAssembly());
            }

            FileInfo[] configs = DataDir.GetFiles("config.xml");
            if (configs.Length == 1)
            {
                config = XmlUtils.LoadXml(configs[0]);
            }
            else
            {
                config = new XmlDocument();
                XmlElement conf = config.CreateElement("config", AUDIT_NS);
                config.AppendChild(conf);
                conf.SetAttribute("version", "0");
                conf.SetAttribute("id", Guid.NewGuid().ToString());
                FlushConfig();
            }
        }
Beispiel #16
0
        public Form1()
        {
            InitializeComponent();

            _analysis = new Analysis(DataDir.AllPiecesFiles().Take(1).ToArray());

            _view = new View
            {
                Mode            = ViewMode.Batch,
                BatchMode       = BatchViewMode.Corner,
                BatchIndex      = 0,
                ComparisonIndex = 0
            };

            _options = new Analysis.Options
            {
                ContourThreshold = 175,
            };

            cornerThresholdTextBox.Text = "0.012";

            Recalculate();
        }
Beispiel #17
0
        public void XmlSerTest()
        {
            var dd = DataDir.Create(DataDirType.Temporary);

            dd.CreateIfNotExists();

            string filename = DateTime.UtcNow.Ticks.ToString("x") + ".xml";
            var    data     = new TestObject
            {
                SomeInt     = 123,
                SomeDouble  = 45.6,
                SomeString  = "Ξεσκεπάζω τὴν ψυχοφθόρα βδελυγμία",
                SomeNumbers = new int[] { 12, 11, 10 }
            };

            dd.WriteObject(filename, data);

            var data2 = dd.ReadObject <TestObject>(filename);

            Assert.AreEqual(data, data2);

            dd.DeleteFile(filename);
        }
Beispiel #18
0
        public void JsonSerTest()
        {
            var dd = DataDir.Create(DataDirType.Temporary);

            dd.CreateIfNotExists();

            string filename = DateTime.UtcNow.Ticks.ToString("x") + ".json";
            var    data     = new TestObject
            {
                SomeInt     = 42,
                SomeDouble  = 3.14,
                SomeString  = "asdfghjkl",
                SomeNumbers = new int[] { 1, 2, 3, 4, 5 }
            };

            dd.WriteObject(filename, data);

            var data2 = dd.ReadObject <TestObject>(filename);

            Assert.AreEqual(data, data2);

            dd.DeleteFile(filename);
        }
Beispiel #19
0
 private void _read()
 {
     _baseRelocationTable = new DataDir(m_io, this, m_root);
     _debug = new DataDir(m_io, this, m_root);
 }
Beispiel #20
0
 private void button1_Click(object sender, EventArgs e)
 {
     imageBox1.Image.Save(DataDir.Contours("SavedFromForms.bmp"), ImageFormat.Bmp);
 }
Beispiel #21
0
        public Setup Statistics(bool opt, decimal share)
        {
            if (trades.Count == 0)
            {
                return(null);
            }

            var groupTrades = trades.GroupBy(t => t.ExitTime.Value.Date).ToDictionary(x => x.Key, y => y.ToList());
            var countr      = groupTrades.ToDictionary(x => x.Key, y => y.Value.Count);
            var cumsum      = new Dictionary <DateTime, decimal>();

            if (trade == null)
            {
                trade = trades.LastOrDefault();
            }

            if (trade.AssetClass != "BMF.FUT")
            {
                trades.ForEach(t =>
                {
                    t.GetNetResult(t.ExitValue);
                    t.Cost     += t.BkrFixComm / countr[t.ExitTime.Value.Date];
                    t.NetResult = t.NetResult * share - 100 * t.BkrFixComm / t.EntryValue / t.Qnty / countr[t.ExitTime.Value.Date];
                });
            }
            else
            {
                trades.ForEach(t =>
                {
                    t.GetNetResult(t.ExitValue);
                    t.NetResult = t.Capital * t.Result * t.Unit - t.Cost;
                });
            }

            trades[0].CumResult = trades[0].NetResult;
            for (var i = 1; i < trades.Count; i++)
            {
                trades[i].CumResult = trades[i - 1].CumResult + trades[i].NetResult;
            }

            var dailyr = trades.GroupBy(t => t.ExitTime.Value.Date).ToDictionary(x => x.Key, y => y.Sum(z => z.NetResult.Value));

            #region Calculate DrawnDown
            var max  = 0.0m;
            var mdd  = 0.0m;
            var esum = 0.0m;

            foreach (var pair in dailyr)
            {
                esum += pair.Value;
                max   = Math.Max(max, esum);
                mdd   = Math.Max(mdd, (max - esum));
                cumsum.Add(pair.Key, esum);
            }
            #endregion

            var months = (decimal)(trades.Last().ExitTime.Value - trades.First().EntryTime).TotalDays / 30.4368499m;

            this.action               = 0;
            this.setup.MaxDrawndown   = mdd;
            this.setup.TotalNetProfit = esum;
            this.setup.DailyNetProfit = esum / months;
            this.setup.TradesCount    = trades.Count();
            this.setup.TotalCosts     = trades.Sum(t => t.Cost) / months;
            this.setup.SharpeRatio    = GetSharpeRation(dailyr.Values);
            this.setup.SharpeRatio    = this.setup.SharpeRatio * GetRSquared(cumsum);
            this.setup.PositiveTrades = 100 * trades.Count(t => t.NetResult > 0) / trades.Count;
            this.setup.Description    =
                trades.First().EntryTime.ToShortDateString() + " " +
                trades.Last().ExitTime.Value.ToShortDateString() + "\t";

            var nonnulltrades = trades.FindAll(t => t.NetResult.HasValue);
            this.setup.WinLossRatio = this.setup.PositiveTrades == 0 || this.setup.PositiveTrades == 100 ? 0 : -
                                      nonnulltrades.Where(t => t.NetResult.Value > 0).Average(t => t.NetResult.Value) /
                                      nonnulltrades.Where(t => t.NetResult.Value < 0).Average(t => t.NetResult.Value);

            var resultsDic = new Dictionary <string, string>();

            var firstofthismonth = trade.ExitTime.Value.AddDays(1 - trade.ExitTime.Value.Day);
            var lastofthismonth  = firstofthismonth.AddMonths(1).AddDays(-1);
            resultsDic.Add("Mês", Return(firstofthismonth, lastofthismonth));

            var firstofthisyear = new DateTime(trade.ExitTime.Value.Year, 1, 1);
            resultsDic.Add("Ano", Return(firstofthisyear, lastofthismonth));

            var startlast06months = trade.ExitTime.Value.AddMonths(-6);
            resultsDic.Add("6 meses", Return(startlast06months, lastofthismonth));

            var startlast12months = trade.ExitTime.Value.AddMonths(-12);
            resultsDic.Add("12 meses", Return(startlast12months, lastofthismonth));

            var startlast24months = trade.ExitTime.Value.AddMonths(-24);
            resultsDic.Add("24 meses", Return(startlast24months, lastofthismonth));

            for (var i = 1; i <= 12; i++)
            {
                resultsDic.Add(firstofthismonth.AddMonths(-i).ToString(@"MMM/yy"),
                               Return(firstofthismonth.AddMonths(-i), lastofthismonth.AddMonths(-i)));
            }

            this.setup.Description += string.Join(";", resultsDic.Keys) + "\r\n;" + string.Join(";", resultsDic.Values);

            if (opt)
            {
                if (esum > mdd)
                {
                    OnStatusChanged(setup.ToString());
                }

                var _file = String.Format(DataDir.Replace(@"\Data\", @"\Backtest\") + "{0:ID_000}_{1:yyMMddHHmm}.csv", setup.SetupId, DateTime.Now);
                if (File.Exists(_file))
                {
                    File.Delete(_file);
                }

                File.AppendAllText(_file, this.setup.ToString() + "\r\n", System.Text.Encoding.UTF8);
                foreach (var pair in countr)
                {
                    File.AppendAllText(_file, "\r\n" +
                                       pair.Key.ToShortDateString() + ";" + pair.Value + ";" + dailyr[pair.Key] + ";" + cumsum[pair.Key]);
                }

                _file = _file.Replace(".csv", "_trades.csv");
                if (File.Exists(_file))
                {
                    File.Delete(_file);
                }
                for (var i = 0; i < trades.Count; i++)
                {
                    File.AppendAllText(_file, trades[i].ToString() + "\r\n");
                }
            }

            this.trades.RemoveAll(t => t.EntryTime.Date != trade.EntryTime.Date);

            return(this.setup);
        }
Beispiel #22
0
 private static void RealMain(Options options)
 {
     try {
         using var file   = File.OpenRead(options.InputFile);
         using var reader = new BinaryReader(file);
         var header           = reader.ReadStruct <DosHeader>();
         var ntheader_address = header.AddressOfNewExeHeader;
         file.Seek(ntheader_address, SeekOrigin.Begin);
         var ntheader = reader.ReadStruct <NtHeader>();
         if (ntheader.Signature != 0x4550)
         {
             Console.WriteLine("Failed to parse nt header");
             return;
         }
         if (ntheader.FileHeader.Machine != 0x8664)
         {
             Console.WriteLine("Failed to parse nt header: only accept AMD64 architect: {0:X}", ntheader.FileHeader.Machine);
             return;
         }
         if (ntheader.OptionalHeader.Magic != 0x20B)
         {
             Console.WriteLine("Failed to parse nt optional header: only accept AMD64 architect: magic {0:X}", ntheader.OptionalHeader.Magic);
             return;
         }
         var imagesize = ntheader.OptionalHeader.SizeOfImage;
         Console.WriteLine("Image Size: {0:X}", imagesize);
         var dirs = new DataDir[16];
         for (var i = 0; i < 16; i++)
         {
             var dir = reader.ReadStruct <DataDir>();
             Console.WriteLine("Data dir: {0:X8} {1:X8} ({2})", dir.VirtualAddress, dir.Size, DataDirName[i]);
             dirs[i] = dir;
         }
         var resolver = new AddressResolver(ntheader.FileHeader.NumberOfSections);
         for (uint i = 0; i < ntheader.FileHeader.NumberOfSections; i++)
         {
             var secheader = reader.ReadStruct <SectionHeader>();
             Console.WriteLine("{0, 8}\n\t{1:X8}(Virtual Size)\n\t{2:X8}(Virtual Address)\n\t{3:X8}(Raw Data Size)\n\t{4:X8}(Raw Data Offset)\n\t{5:X8}(Diff)\n\tBITMAP: {6:X8}",
                               secheader.GetName(),
                               secheader.Misc.VirtualSize,
                               secheader.VirtualAddress,
                               secheader.SizeOfRawData,
                               secheader.PointerToRawData,
                               secheader.VirtualAddress - secheader.PointerToRawData,
                               secheader.Characteristics);
             resolver.Put(secheader);
         }
         // Export table
         if (dirs[0].VirtualAddress != 0)
         {
             file.SeekRVA(resolver, dirs[0].VirtualAddress);
             var exp = reader.ReadStruct <ExportDir>();
             file.SeekRVA(resolver, exp.Name);
             Console.WriteLine("Dll Name: {0}", reader.ReadByteString());
             file.SeekRVA(resolver, exp.AddressOfFunctions);
             var addrs = new uint[exp.NumberOfFunctions];
             for (uint i = 0; i < exp.NumberOfFunctions; i++)
             {
                 addrs[i] = reader.ReadStruct <RVA>().Value;
             }
             file.SeekRVA(resolver, exp.AddressOfOrdinals);
             var ords = new ushort[exp.NumberOfNames];
             for (uint i = 0; i < exp.NumberOfNames; i++)
             {
                 ords[i] = reader.ReadStruct <Ordinal>().Value;
             }
             var names = new string[exp.NumberOfNames];
             for (uint i = 0; i < exp.NumberOfNames; i++)
             {
                 file.SeekRVA(resolver, exp.AddressOfNames + i * sizeof(uint));
                 file.SeekRVA(resolver, reader.ReadStruct <RVA>().Value);
                 names[i] = reader.ReadByteString();
                 Console.WriteLine("export: {2:X8} <- {1:X4}:{0}", names[i], ords[i], addrs[ords[i]]);
             }
         }
         // Import table
         if (dirs[1].VirtualAddress != 0)
         {
             var pos = resolver.Resolve(dirs[1].VirtualAddress);
             for (uint i = 0; ; i++)
             {
                 file.Seek(pos, SeekOrigin.Begin);
                 var imp = reader.ReadStruct <ImportDir>();
                 pos = (uint)file.Position;
                 if (imp.Name == 0)
                 {
                     break;
                 }
                 file.SeekRVA(resolver, imp.Name);
                 Console.WriteLine("import from {0}", reader.ReadByteString());
                 var pos2 = resolver.Resolve(imp.FirstThunk);
                 for (uint j = 0; ; j++)
                 {
                     file.Seek(pos2, SeekOrigin.Begin);
                     var thunk = reader.ReadStruct <ImportDirThunk>();
                     pos2 = (uint)file.Position;
                     if (thunk.IsEmpty())
                     {
                         break;
                     }
                     if (thunk.TryGetOrdinal(out var ord))
                     {
                         Console.WriteLine("#{0}", ord);
                     }
                     else
                     {
                         file.SeekRVA(resolver, (uint)thunk.Value);
                         var hint = reader.ReadStruct <ImportDirThunkHint>().Hint;
                         Console.WriteLine("\t{0:X4}:{1}", hint, reader.ReadByteString());
                     }
                 }
             }
         }
     } catch (Exception e) {
         Console.WriteLine(e.ToString());
     }
 }