# # Frida - The Full Retail ISO Download Application # Copyright © 2019 Pete Batard # ConvertTo-ImageSource: Copyright © 2016 Chris Carter # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # Parameters param( # (Optional) Name of a pipe the download URL should be sent to. # If not provided, a browser window is opened instead. [string]$PipeName, # (Optional) Name of the perferred locale to use for the UI (e.g. "en-US", "fr-FR") # If not provided, the current Windows UI locale is used. [string]$Locale = [System.Globalization.CultureInfo]::CurrentUICulture.Name, # (Optional) Path to the file that should be used for the UI icon. [string]$Icon, # (Optional) The title to display on the application window [string]$AppTitle = "Frida - Full Retail ISO Downloads" ) # Custom Assembly Types $code = @" [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true, BestFitMapping = false, ThrowOnUnmappableChar = true)] internal static extern IntPtr LoadLibrary(string lpLibFileName); [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true, BestFitMapping = false, ThrowOnUnmappableChar = true)] internal static extern int LoadString(IntPtr hInstance, uint wID, StringBuilder lpBuffer, int nBufferMax); [DllImport("Shell32.dll", CharSet = CharSet.Auto, SetLastError = true, BestFitMapping = false, ThrowOnUnmappableChar = true)] internal static extern int ExtractIconEx(string sFile, int iIndex, out IntPtr piLargeVersion, out IntPtr piSmallVersion, int amountIcons); // Returns a localized MUI string from the specified DLL public static string GetMuiString(string dll, uint index) { int MAX_PATH = 255; string muiPath = Environment.SystemDirectory + @"\" + CultureInfo.CurrentUICulture.Name + @"\" + dll + ".mui"; if (!File.Exists(muiPath)) muiPath = Environment.SystemDirectory + @"\en-US\" + dll + ".mui"; IntPtr hMui = LoadLibrary(muiPath); if (hMui == null) return ""; StringBuilder szString = new StringBuilder(MAX_PATH); LoadString(hMui, (uint)index, szString, MAX_PATH); return szString.ToString(); } // Extract an icon from a DLL public static Icon ExtractIcon(string file, int number, bool largeIcon) { IntPtr large, small; ExtractIconEx(file, number, out large, out small, 1); try { return Icon.FromHandle(largeIcon ? large : small); } catch { return null; } } "@ Add-Type -MemberDefinition $code -Namespace Gui -UsingNamespace "System.IO", "System.Text", "System.Drawing", "System.Globalization" -ReferencedAssemblies System.Drawing -Name Utils -ErrorAction Stop Add-Type -AssemblyName PresentationFramework # Data $WindowsVersions = @( @( "Windows 10", @( "1809 R2", @("Windows 10 Home/Pro", 1060), @("Windows 10 Education", 1056) ), @( "1809 R1", @("Windows 10 Home/Pro", 1019), @("Windows 10 Education", 1021) ), @( "1803", @("Windows 10 Home/Pro", 651), @("Windows 10 Education", 655), @("Windows 10 Enterprise Eval", 629) ) ), @( "Windows 8.1", @( "Full", @("Windows 8.1/Windows 8.1 Pro", 52), @("Windows 8.1 Single Language", 48) ), @( "N", @("Windows 8.1/Windows 8.1 Pro N", 55) ) ), @( "Windows 7", @( "SP1", @("Windows 7 Ultimate", 8), @("Windows 7 Pro", 4), @("Windows 7 Home Premium", 6), @("Windows 7 Home Basic", 2) ) ) ) # Functions function Add-Title([string]$Name) { $Title = New-Object System.Windows.Controls.TextBlock $Title.FontSize = $WindowsVersionTitle.FontSize $Title.Height = $WindowsVersionTitle.Height; $Title.Width = $WindowsVersionTitle.Width; $Title.HorizontalAlignment = "Left" $Title.VerticalAlignment = "Top" $Margin = $WindowsVersionTitle.Margin $Margin.Top += $script:Stage * $script:dh $Title.Margin = $Margin $Title.Text = $Name return $Title } function Add-Combo { $Combo = New-Object System.Windows.Controls.ComboBox $Combo.FontSize = $WindowsVersion.FontSize $Combo.Height = $WindowsVersion.Height; $Combo.Width = $WindowsVersion.Width; $Combo.HorizontalAlignment = "Left" $Combo.VerticalAlignment = "Top" $Margin = $WindowsVersion.Margin $Margin.Top += $script:Stage * $script:dh $Combo.Margin = $Margin $Combo.SelectedIndex = 0 return $Combo } function Send-Message([string]$PipeName, [string]$Message) { [System.Text.Encoding]$Encoding = [System.Text.Encoding]::UTF8 $Pipe = New-Object -TypeName System.IO.Pipes.NamedPipeClientStream -ArgumentList ".", $PipeName, ([System.IO.Pipes.PipeDirection]::Out), ([System.IO.Pipes.PipeOptions]::None), ([System.Security.Principal.TokenImpersonationLevel]::Impersonation) try { $Pipe.Connect(1000) } catch { Write-Host $_.Exception.Message } $bRequest = $Encoding.GetBytes($Message) $cbRequest = $bRequest.Length; $Pipe.Write($bRequest, 0, $cbRequest); $Pipe.Dispose() } # From https://www.powershellgallery.com/packages/IconForGUI/1.5.2 # Copyright © 2016 Chris Carter. All rights reserved. # License: https://creativecommons.org/licenses/by-sa/4.0/ function ConvertTo-ImageSource { [CmdletBinding()] Param( [Parameter(Mandatory=$true,ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true)] [System.Drawing.Icon]$Icon ) Process { foreach ($i in $Icon) { [System.Windows.Interop.Imaging]::CreateBitmapSourceFromHIcon( $i.Handle, (New-Object System.Windows.Int32Rect -Args 0,0,$i.Width, $i.Height), [System.Windows.Media.Imaging.BitmapSizeOptions]::FromEmptyOptions() ) } } } function Exit-App([int]$ExitCode) { $script:ExitCode = $ExitCode Get-Process -Id $pid | Foreach-Object { $_.CloseMainWindow() | Out-Null } } # XAML Form # TODO: Add FlowDirection = "RightToLeft" to for RTL mode [xml]$Form = @"