public async Task <DialogBase> GetDialogAsync(ResourceLanguage language) { var buffer = await GetBytesAsync(language).ConfigureAwait(false); using (var mem = new MemoryStream(buffer)) { try { var version = await mem.ReadUInt16Async().ConfigureAwait(false); var signature = await mem.ReadUInt16Async().ConfigureAwait(false); var isExtended = (version == 1 && signature == 0xFFFF); DialogBase dialog; mem.Seek(0, SeekOrigin.Begin); if (!isExtended) { dialog = new Dialog(this, language); } else { dialog = await DialogEx.CreateAsync(this, language, mem).ConfigureAwait(false); } return(dialog); } catch (Exception ex) { throw new PortableExecutableImageException(Image, "Could not read dialog from stream.", ex); } } }
internal static async Task <DialogEx> CreateAsync(DialogResource resource, uint language, Stream stream) { var version = await stream.ReadUInt16Async().ConfigureAwait(false); var signature = await stream.ReadUInt16Async().ConfigureAwait(false); var helpId = await stream.ReadUInt32Async().ConfigureAwait(false); var exStyles = await stream.ReadUInt32Async().ConfigureAwait(false); var styles = await stream.ReadUInt32Async().ConfigureAwait(false); var itemCount = await stream.ReadUInt16Async().ConfigureAwait(false); var x = await stream.ReadInt16Async().ConfigureAwait(false); var y = await stream.ReadInt16Async().ConfigureAwait(false); var position = new Point(x, y); var cx = await stream.ReadInt16Async().ConfigureAwait(false); var cy = await stream.ReadInt16Async().ConfigureAwait(false); var size = new Size(cx, cy); var menuId = await ResourceUtils.OrdOrSzAsync(stream).ConfigureAwait(false); ResourceId menu; if (menuId.Item1 > 0) { menu = menuId.Item1; } else { menu = menuId.Item2; } var classId = await ResourceUtils.OrdOrSzAsync(stream).ConfigureAwait(false); ResourceId cls; if (classId.Item1 > 0) { cls = classId.Item1; } else { cls = classId.Item2; } var title = await stream.ReadUnicodeStringAsync().ConfigureAwait(false); var dialogStyles = (DialogStyle)styles; Font font = null; var charSet = CharacterSet.ANSI; if ((dialogStyles & DialogStyle.DS_SETFONT) == DialogStyle.DS_SETFONT || (dialogStyles & DialogStyle.DS_SHELLFONT) == DialogStyle.DS_SHELLFONT) { var pointSize = await stream.ReadUInt16Async().ConfigureAwait(false); var weight = await stream.ReadUInt16Async().ConfigureAwait(false); var italic = await stream.ReadByteAsync().ConfigureAwait(false); var fontStyle = (italic > 0 ? FontStyle.Italic : FontStyle.Regular); charSet = (CharacterSet)await stream.ReadByteAsync().ConfigureAwait(false); var typeFace = await stream.ReadUnicodeStringAsync().ConfigureAwait(false); font = new Font(typeFace, pointSize, fontStyle); } else { font = null; } var items = new List <DialogItemEx>(itemCount); for (var i = 0; i < itemCount; i++) { while (stream.Position % 4 != 0) { await stream.ReadByteAsync().ConfigureAwait(false); } var item = await DialogItemEx.CreateAsync(stream).ConfigureAwait(false); items.Add(item); } var dialog = new DialogEx(resource, language, items.ToArray()) { HelpId = helpId, ExtendedStyles = exStyles, Styles = styles, Position = position, Size = size, Menu = menu, Class = cls, Title = title, Font = font, CharSet = charSet }; return(dialog); }