コード例 #1
0
        /// <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)));
        }
コード例 #2
0
ファイル: ApplicationIcon.cs プロジェクト: manojdjoshi/dnSpy
		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;
		}
コード例 #3
0
        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);
        }
コード例 #4
0
        /// <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));
        }