private void LoadResourceValues(ResourceReader.ResourceCacheItem[] store) { object obj = this.readerLock; lock (obj) { for (int i = 0; i < this.resourceCount; i++) { ResourceReader.ResourceInfo resourceInfo = this.infos[i]; if (resourceInfo.TypeIndex == -1) { store[i] = new ResourceReader.ResourceCacheItem(resourceInfo.ResourceName, null); } else { this.reader.BaseStream.Seek(resourceInfo.ValuePosition, SeekOrigin.Begin); object value; if (this.resource_ver == 2) { value = this.ReadValueVer2(resourceInfo.TypeIndex); } else { value = this.ReadValueVer1(Type.GetType(this.typeNames[resourceInfo.TypeIndex], true)); } store[i] = new ResourceReader.ResourceCacheItem(resourceInfo.ResourceName, value); } } } }
private void CreateResourceInfo(long position, ref ResourceReader.ResourceInfo info) { long offset = position + this.nameSectionOffset; this.reader.BaseStream.Seek(offset, SeekOrigin.Begin); int num = this.Read7BitEncodedInt(); byte[] array = new byte[num]; this.reader.Read(array, 0, num); string @string = Encoding.Unicode.GetString(array); long offset2 = (long)(this.reader.ReadInt32() + this.dataSectionOffset); this.reader.BaseStream.Seek(offset2, SeekOrigin.Begin); int type_index = this.Read7BitEncodedInt(); info = new ResourceReader.ResourceInfo(@string, this.reader.BaseStream.Position, type_index); }
internal unsafe UnmanagedMemoryStream ResourceValueAsStream(string name, int index) { ResourceReader.ResourceInfo resourceInfo = this.infos[index]; if (resourceInfo.TypeIndex != 33) { throw new InvalidOperationException(string.Format("Resource '{0}' was not a Stream. Use GetObject() instead.", name)); } object obj = this.readerLock; UnmanagedMemoryStream result; lock (obj) { this.reader.BaseStream.Seek(resourceInfo.ValuePosition, SeekOrigin.Begin); long num = (long)this.reader.ReadInt32(); UnmanagedMemoryStream unmanagedMemoryStream = this.reader.BaseStream as UnmanagedMemoryStream; if (unmanagedMemoryStream != null) { result = new UnmanagedMemoryStream(unmanagedMemoryStream.PositionPointer, num); } else { IntPtr ptr = Marshal.AllocHGlobal((int)num); byte * pointer = (byte *)ptr.ToPointer(); UnmanagedMemoryStream unmanagedMemoryStream2 = new UnmanagedMemoryStream(pointer, num, num, FileAccess.ReadWrite); unmanagedMemoryStream2.Closed += delegate(object o, EventArgs e) { Marshal.FreeHGlobal(ptr); }; byte[] array = new byte[(num >= 1024L) ? 1024L : num]; while (num > 0L) { int num2 = this.reader.Read(array, 0, (int)Math.Min((long)array.Length, num)); if (num2 == 0) { throw new FormatException("The resource data is corrupt. Resource stream ended"); } unmanagedMemoryStream2.Write(array, 0, num2); num -= (long)num2; } unmanagedMemoryStream2.Seek(0L, SeekOrigin.Begin); result = unmanagedMemoryStream2; } } return(result); }
private void GetResourceDataAt(int index, out string resourceType, out byte[] data) { ResourceReader.ResourceInfo resourceInfo = this.infos[index]; int typeIndex = resourceInfo.TypeIndex; if (typeIndex == -1) { throw new FormatException("The resource data is corrupt"); } object obj = this.readerLock; lock (obj) { this.reader.BaseStream.Seek(resourceInfo.ValuePosition, SeekOrigin.Begin); long position = this.reader.BaseStream.Position; if (this.resource_ver == 2) { if (typeIndex >= 64) { int num = typeIndex - 64; if (num >= this.typeNames.Length) { throw new FormatException("The resource data is corrupt. Invalid index to types"); } resourceType = this.typeNames[num]; } else { resourceType = "ResourceTypeCode." + (PredefinedResourceType)typeIndex; } this.ReadValueVer2(typeIndex); } else { resourceType = "ResourceTypeCode.Null"; this.ReadValueVer1(Type.GetType(this.typeNames[typeIndex], true)); } int num2 = (int)(this.reader.BaseStream.Position - position); this.reader.BaseStream.Seek((long)(-(long)num2), SeekOrigin.Current); data = new byte[num2]; this.reader.BaseStream.Read(data, 0, num2); } }