public RSDS(string targetFile, ulong offset) { try { _targetFile = targetFile; _offset = offset; using (FileStream stream = new FileStream(_targetFile, FileMode.Open, FileAccess.Read)) using (BinaryReader reader = new BinaryReader(stream)) { stream.Seek((long)_offset, SeekOrigin.Begin); RSDS_HEADER rsds = FromBinaryReader <RSDS_HEADER>(reader); char c = (char)reader.ReadByte(); while (c != (char)0 && c != -1) { _filename += c; c = (char)reader.ReadByte(); } _signature = System.Text.Encoding.UTF8.GetString(rsds.Signature); _guid = new Guid(rsds.Guid); _age = rsds.Age; } } catch (Exception ex) { throw new ArgumentException("Error Creating RSDS: " + ex.Message); } }
public RSDS(DataProviderBase dataProvider, ulong offset) { try { ulong alignedAddress = offset & 0xfffffffff000; byte[] buffer = dataProvider.ReadMemory(alignedAddress, 2); GCHandle pinnedPacket = GCHandle.Alloc(buffer, GCHandleType.Pinned); RSDS_HEADER rsds = (RSDS_HEADER)Marshal.PtrToStructure(Marshal.UnsafeAddrOfPinnedArrayElement(buffer, (int)(offset - alignedAddress)), typeof(RSDS_HEADER)); pinnedPacket.Free(); _signature = System.Text.Encoding.UTF8.GetString(rsds.Signature); _guid = new Guid(rsds.Guid); _age = rsds.Age; int marker = 24 + (int)(offset - alignedAddress); char c = (char)buffer[marker]; while (c != 0 && marker < 0x2000) { _filename += c; c = (char)buffer[++marker]; } } catch (Exception ex) { throw new ArgumentException("Error Creating RSDS: " + ex.Message); } }