18 const int RT_ICON = 3;
19 const int RT_GROUP_ICON = 14;
20 const int RT_VERSION = 16;
21 const int RT_MANIFEST = 24;
40 throw new ArgumentNullException(nameof(other));
54 internal void AddVersionInfo(
ByteBuffer versionInfo)
64 internal void AddIcon(
byte[] iconFile)
66 var br =
new BinaryReader(
new MemoryStream(iconFile));
67 var idReserved = br.ReadUInt16();
68 var idType = br.ReadUInt16();
69 var idCount = br.ReadUInt16();
70 if (idReserved != 0 || idType != 1)
71 throw new ArgumentException(
"The supplied byte array is not a valid .ico file.");
74 group.Write(idReserved);
77 for (
int i = 0; i < idCount; i++)
79 var bWidth = br.ReadByte();
80 var bHeight = br.ReadByte();
81 var bColorCount = br.ReadByte();
82 var bReserved = br.ReadByte();
83 var wPlanes = br.ReadUInt16();
84 var wBitCount = br.ReadUInt16();
85 var dwBytesInRes = br.ReadUInt32();
86 var dwImageOffset = br.ReadUInt32();
89 var
id = (ushort)(2 + i);
93 group.Write(bColorCount);
94 group.Write(bReserved);
96 group.Write(wBitCount);
97 group.Write(dwBytesInRes);
100 var icon =
new byte[dwBytesInRes];
101 Buffer.BlockCopy(iconFile, (
int)dwImageOffset, icon, 0, icon.Length);
113 internal void AddManifest(
byte[] manifest, ushort resourceID)
122 internal void ImportWin32ResourceFile(
byte[] buf)
125 while (br.Length >= 32)
128 var hdr =
new RESOURCEHEADER(br);
129 if (hdr.DataSize != 0)
130 root[hdr.TYPE][hdr.NAME][
new OrdinalOrName(hdr.LanguageId)].data = ByteBuffer.Wrap(br.ReadBytes(hdr.DataSize));
135 protected override void Serialize(BlobBuilder builder, SectionLocation location)
138 var linkOffsets =
new List<int>();
139 root.Write(bb, linkOffsets);
141 foreach (
int offset
in linkOffsets)
143 bb.Position = offset;
144 bb.Write(bb.GetInt32AtCurrentPosition() + (
int)location.RelativeVirtualAddress);
147 builder.WriteBytes(bb.ToArray());