// dnlib: See LICENSE.txt for more info using System; using System.Diagnostics; using dnlib.PE; namespace dnlib.IO { /// /// Creates s /// public static unsafe class DataStreamFactory { //TODO: There are other places that use pointers that also need to be updated static bool supportsUnalignedAccesses = CalculateSupportsUnalignedAccesses(); static bool CalculateSupportsUnalignedAccesses() { var machine = ProcessorArchUtils.GetProcessCpuArchitecture(); switch (machine) { case Machine.I386: case Machine.AMD64: return true; case Machine.ARMNT: case Machine.ARM64: return false; default: Debug.Fail($"Unknown CPU arch: {machine}"); return true; } } /// /// Creates a that reads from native memory /// /// Pointer to data /// public static DataStream Create(byte* data) { if (data is null) throw new ArgumentNullException(nameof(data)); if (supportsUnalignedAccesses) return new UnalignedNativeMemoryDataStream(data); return new AlignedNativeMemoryDataStream(data); } /// /// Creates a that reads from a byte array /// /// Data /// public static DataStream Create(byte[] data) { if (data is null) throw new ArgumentNullException(nameof(data)); if (supportsUnalignedAccesses) return new UnalignedByteArrayDataStream(data); return new AlignedByteArrayDataStream(data); } } }