/// <summary> /// Read an icon resource from a previously loaded module. /// </summary> /// <param name="hModule">Module handle.</param> /// <param name="lpRes">Pointer to a directory entry in the hardware-independent icon resource.</param> /// <returns>Pointer to the end of the icon resource.</returns> internal override IntPtr Read(IntPtr hModule, IntPtr lpRes) { _header = (GrpIconDirEntry)Marshal.PtrToStructure(lpRes, typeof(GrpIconDirEntry)); var hIconInfo = Kernel32.FindResourceEx(hModule, _type.Id, (IntPtr)_header.nID, _language); if (hIconInfo == IntPtr.Zero) { throw new Win32Exception(Marshal.GetLastWin32Error()); } var hIconRes = Kernel32.LoadResource(hModule, hIconInfo); if (hIconRes == IntPtr.Zero) { throw new Win32Exception(Marshal.GetLastWin32Error()); } var dibBits = Kernel32.LockResource(hIconRes); if (dibBits == IntPtr.Zero) { throw new Win32Exception(Marshal.GetLastWin32Error()); } ReadImage(dibBits, (UInt32)Kernel32.SizeofResource(hModule, hIconInfo)); return(new IntPtr(lpRes.ToInt32() + Marshal.SizeOf(_header))); }
static byte[] TryCreateIcon(IBinaryReader reader, ResourceDirectory iconDir) { try { reader.Position = 0; var outStream = new MemoryStream(); var writer = new BinaryWriter(outStream); // Write GRPICONDIR writer.Write(reader.ReadUInt16()); writer.Write(reader.ReadUInt16()); ushort numImages; writer.Write(numImages = reader.ReadUInt16()); var entries = new List<GrpIconDirEntry>(); for (int i = 0; i < numImages; i++) { var e = new GrpIconDirEntry(); entries.Add(e); e.bWidth = reader.ReadByte(); e.bHeight = reader.ReadByte(); e.bColorCount = reader.ReadByte(); e.bReserved = reader.ReadByte(); e.wPlanes = reader.ReadUInt16(); e.wBitCount = reader.ReadUInt16(); e.dwBytesInRes = reader.ReadUInt32(); e.nID = reader.ReadUInt16(); } uint dataOffset = 2 * 3 + (uint)entries.Count * 0x10; foreach (var e in entries) { writer.Write(e.bWidth); writer.Write(e.bHeight); writer.Write(e.bColorCount); writer.Write(e.bReserved); writer.Write(e.wPlanes); writer.Write(e.wBitCount); writer.Write(e.dwBytesInRes); writer.Write(dataOffset); dataOffset += e.dwBytesInRes; } foreach (var e in entries) { var d = iconDir.Directories.FirstOrDefault(a => a.Name == new ResourceName(e.nID)); if (d == null || d.Data.Count == 0) return null; var r = d.Data[0].Data; Debug.Assert(r.Length == e.dwBytesInRes); if (r.Length < e.dwBytesInRes) return null; r.Position = 0; writer.Write(r.ReadBytes((int)e.dwBytesInRes), 0, (int)e.dwBytesInRes); } return outStream.ToArray(); } catch (IOException) { } return null; }
static byte[] TryCreateIcon(IBinaryReader reader, ResourceDirectory iconDir) { try { reader.Position = 0; var outStream = new MemoryStream(); var writer = new BinaryWriter(outStream); // Write GRPICONDIR writer.Write(reader.ReadUInt16()); writer.Write(reader.ReadUInt16()); ushort numImages; writer.Write(numImages = reader.ReadUInt16()); var entries = new List <GrpIconDirEntry>(); for (int i = 0; i < numImages; i++) { var e = new GrpIconDirEntry(); entries.Add(e); e.bWidth = reader.ReadByte(); e.bHeight = reader.ReadByte(); e.bColorCount = reader.ReadByte(); e.bReserved = reader.ReadByte(); e.wPlanes = reader.ReadUInt16(); e.wBitCount = reader.ReadUInt16(); e.dwBytesInRes = reader.ReadUInt32(); e.nID = reader.ReadUInt16(); } uint dataOffset = 2 * 3 + (uint)entries.Count * 0x10; foreach (var e in entries) { writer.Write(e.bWidth); writer.Write(e.bHeight); writer.Write(e.bColorCount); writer.Write(e.bReserved); writer.Write(e.wPlanes); writer.Write(e.wBitCount); writer.Write(e.dwBytesInRes); writer.Write(dataOffset); dataOffset += e.dwBytesInRes; } foreach (var e in entries) { var d = iconDir.Directories.FirstOrDefault(a => a.Name == new ResourceName(e.nID)); if (d == null || d.Data.Count == 0) { return(null); } var r = d.Data[0].Data; Debug.Assert(r.Length == e.dwBytesInRes); if (r.Length < e.dwBytesInRes) { return(null); } r.Position = 0; writer.Write(r.ReadBytes((int)e.dwBytesInRes), 0, (int)e.dwBytesInRes); } return(outStream.ToArray()); } catch (IOException) { } return(null); }
/// <summary> /// Read an icon resource from a previously loaded module. /// </summary> /// <param name="hModule">Module handle.</param> /// <param name="lpRes">Pointer to a directory entry in the hardware-independent icon resource.</param> /// <returns>Pointer to the end of the icon resource.</returns> internal override IntPtr Read(IntPtr hModule, IntPtr lpRes) { _header = (GrpIconDirEntry)Marshal.PtrToStructure(lpRes, typeof (GrpIconDirEntry)); var hIconInfo = Kernel32.FindResourceEx(hModule, _type.Id, (IntPtr)_header.nID, _language); if (hIconInfo == IntPtr.Zero) { throw new Win32Exception(Marshal.GetLastWin32Error()); } var hIconRes = Kernel32.LoadResource(hModule, hIconInfo); if (hIconRes == IntPtr.Zero) { throw new Win32Exception(Marshal.GetLastWin32Error()); } var dibBits = Kernel32.LockResource(hIconRes); if (dibBits == IntPtr.Zero) { throw new Win32Exception(Marshal.GetLastWin32Error()); } ReadImage(dibBits, (UInt32)Kernel32.SizeofResource(hModule, hIconInfo)); return new IntPtr(lpRes.ToInt32() + Marshal.SizeOf(_header)); }