|  | @@ -23,39 +23,58 @@ Function Main()
 | 
	
		
			
				|  |  |          $disk = Get-PhysDev
 | 
	
		
			
				|  |  |          $disknum = $disk.Number
 | 
	
		
			
				|  |  |          $diskname = $disk.FriendlyName
 | 
	
		
			
				|  |  | +        $diskserial = $disk.SerialNumber
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        if ((-not $disknum -is [int]) -or $disknum -eq $null){
 | 
	
		
			
				|  |  | +        if ((-not $disknum -is [int]) -or $disknum -eq $null -or $disknum -lt 0){
 | 
	
		
			
				|  |  |              Write-Output "No Disk Selected"
 | 
	
		
			
				|  |  |          } else {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              $dialog = @"
 | 
	
		
			
				|  |  | -Going to Write "${filename}" to Drive "${diskname}" 
 | 
	
		
			
				|  |  | +Going to write Image:
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +"${filename}"
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +to Drive:
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +"${diskname} ${diskserial}" 
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  Would you like to contine?
 | 
	
		
			
				|  |  |  "@ 
 | 
	
		
			
				|  |  | -            $continue = [System.windows.forms.messagebox]::show($dialog, 'Continue','YesNoCancel','Warn')
 | 
	
		
			
				|  |  | +            $continue = Ask-Continue $dialog
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              if ($continue -eq "Yes"){
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |                  Reset-Disk $disknum
 | 
	
		
			
				|  |  | -                sleep 5
 | 
	
		
			
				|  |  | -                WinDD $filename ("\\.\PHYSICALDRIVE{0,1}" -f $disknum)
 | 
	
		
			
				|  |  | +                WinDD $filename ("\\.\PHYSICALDRIVE{0}" -f $disknum)
 | 
	
		
			
				|  |  | +                Fix-CHS $disknum
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |          $dialog = @"
 | 
	
		
			
				|  |  | -Write same image to another Drive?
 | 
	
		
			
				|  |  | +Write image 
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +"${filename}"
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +to another Drive?
 | 
	
		
			
				|  |  |  "@
 | 
	
		
			
				|  |  | -        $continue = [System.windows.forms.messagebox]::show($dialog, 'Continue','YesNoCancel','Info')
 | 
	
		
			
				|  |  | +        $continue = Ask-Continue $dialog
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +Function Ask-Continue($text)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +    [System.Windows.Forms.MessageBox]::Show($text, 'Continue','YesNo','Info')
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  Function Reset-Disk($disknum)
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  | +    $ErrorActionPreference = "Stop"
 | 
	
		
			
				|  |  |      
 | 
	
		
			
				|  |  | -    if ((-not $disknum -is [int]) -or $disknum -eq $null){
 | 
	
		
			
				|  |  | +    if ((-not $disknum -is [int]) -or $disknum -eq $null -or $disknum -lt 0){
 | 
	
		
			
				|  |  |          Break
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |      @"
 | 
	
	
		
			
				|  | @@ -63,7 +82,24 @@ list disk
 | 
	
		
			
				|  |  |  select disk $disknum
 | 
	
		
			
				|  |  |  list partition
 | 
	
		
			
				|  |  |  clean
 | 
	
		
			
				|  |  | -"@ | diskpart
 | 
	
		
			
				|  |  | +"@  | diskpart
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    Write-Output "Sleeping 10s to make sure drive is available..."
 | 
	
		
			
				|  |  | +    sleep 10
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +Function Fix-CHS($disknum){
 | 
	
		
			
				|  |  | +    $ErrorActionPreference = "Stop"
 | 
	
		
			
				|  |  | +    
 | 
	
		
			
				|  |  | +    if ((-not $disknum -is [int]) -or $disknum -eq $null -or $disknum -lt 0){
 | 
	
		
			
				|  |  | +        Break
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    @"
 | 
	
		
			
				|  |  | +y
 | 
	
		
			
				|  |  | +c
 | 
	
		
			
				|  |  | +w
 | 
	
		
			
				|  |  | +y
 | 
	
		
			
				|  |  | +"@  | .\fixparts-windows-1.0.6\fixparts64 ("\\.\PHYSICALDRIVE{0}" -f $disknum)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -72,7 +108,7 @@ Function Get-FileName($initialDirectory = "C:\", $title = "Select File")
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      $OpenFileDialog = New-Object System.Windows.Forms.OpenFileDialog
 | 
	
		
			
				|  |  |      $OpenFileDialog.initialDirectory = $initialDirectory
 | 
	
		
			
				|  |  | -    $OpenFileDialog.filter = "All files (*.*)| *.*"
 | 
	
		
			
				|  |  | +    $OpenFileDialog.filter = "Images (*.img;*.afp;*.usb;*.iso)| *.img;*.afp;*.usb;*.iso|All files (*.*)| *.*"
 | 
	
		
			
				|  |  |      $OpenFileDialog.Title = $title
 | 
	
		
			
				|  |  |      $OpenFileDialog.ShowDialog() | Out-Null
 | 
	
		
			
				|  |  |      $OpenFileDialog.filename
 | 
	
	
		
			
				|  | @@ -81,9 +117,13 @@ Function Get-FileName($initialDirectory = "C:\", $title = "Select File")
 | 
	
		
			
				|  |  |  Function Get-PhysDev()
 | 
	
		
			
				|  |  |  {  
 | 
	
		
			
				|  |  |      $cdisk = Get-Volume -DriveLetter C|Get-Partition|Get-Disk
 | 
	
		
			
				|  |  | -    $disks = Get-Disk
 | 
	
		
			
				|  |  | -    $disks_noc = $disks |Where {$_.Number -ne $cdisk.Number}
 | 
	
		
			
				|  |  | +    $disks = Get-Disk |
 | 
	
		
			
				|  |  | +        Where {$_.Number -ne $cdisk.Number} |
 | 
	
		
			
				|  |  | +        Where {$_.OperationalStatus -ne "No Media"}
 | 
	
		
			
				|  |  | +    SelectDiskDialog $disks
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +Function SelectDiskDialog($disks){
 | 
	
		
			
				|  |  |      $form = New-Object System.Windows.Forms.Form
 | 
	
		
			
				|  |  |      $form.Text = 'Select a Disk to Write to'
 | 
	
		
			
				|  |  |      $form.Size = New-Object System.Drawing.Size(500,275)
 | 
	
	
		
			
				|  | @@ -108,7 +148,7 @@ Function Get-PhysDev()
 | 
	
		
			
				|  |  |      $label = New-Object System.Windows.Forms.Label
 | 
	
		
			
				|  |  |      $label.Location = New-Object System.Drawing.Point(10,20)
 | 
	
		
			
				|  |  |      $label.Size = New-Object System.Drawing.Size(480,20)
 | 
	
		
			
				|  |  | -    $label.Text = 'Please select a Dísk:'
 | 
	
		
			
				|  |  | +    $label.Text = 'Please select a Disk:'
 | 
	
		
			
				|  |  |      $form.Controls.Add($label)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      $listBox = New-Object System.Windows.Forms.ListBox
 | 
	
	
		
			
				|  | @@ -119,7 +159,7 @@ Function Get-PhysDev()
 | 
	
		
			
				|  |  |      $listBox.Height = 150
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      $i = 0
 | 
	
		
			
				|  |  | -    foreach ($d in $disks_noc){
 | 
	
		
			
				|  |  | +    foreach ($d in $disks){
 | 
	
		
			
				|  |  |          if ($d.Size){
 | 
	
		
			
				|  |  |              $size = [math]::Round($d.Size/1Gb, 1)
 | 
	
		
			
				|  |  |          } else {
 | 
	
	
		
			
				|  | @@ -127,7 +167,8 @@ Function Get-PhysDev()
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |          $number = $d.Number.toString()
 | 
	
		
			
				|  |  |          $name = $d.FriendlyName
 | 
	
		
			
				|  |  | -        $label = "{0,3}   {1,-35}    {2,8} GB" -f $number,$name,$size
 | 
	
		
			
				|  |  | +        $serial = $d.SerialNumber
 | 
	
		
			
				|  |  | +        $label = "{0,-3} {1,-25} {2,-20} {3,8} GB" -f $number,$name,$serial,$size
 | 
	
		
			
				|  |  |          [void] $listBox.Items.Add($label)
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -140,29 +181,39 @@ Function Get-PhysDev()
 | 
	
		
			
				|  |  |      if ($result -eq [System.Windows.Forms.DialogResult]::OK)
 | 
	
		
			
				|  |  |      {
 | 
	
		
			
				|  |  |          $x = $listBox.SelectedIndex
 | 
	
		
			
				|  |  | -        $disks_noc[$x]
 | 
	
		
			
				|  |  | +        $disks[$x]
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  } #end function Get-PhysDev
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  Function WinDD($inFileName, $outFileName, $blocksize = 5Mb) {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    Write-Output "Copy $inFileName to $outFileName with blocksize: $blocksize ...."
 | 
	
		
			
				|  |  | +    Write-Output ""
 | 
	
		
			
				|  |  | +    Write-Output "" "Copy $inFileName to $outFileName with blocksize: $blocksize ...."
 | 
	
		
			
				|  |  |      $block = [System.Byte[]]::CreateInstance([System.Byte], $blocksize)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      try{
 | 
	
		
			
				|  |  |          $inFile = [System.IO.File]::Open($inFileName, [System.IO.FileMode]::Open)
 | 
	
		
			
				|  |  |          $outFile = [System.IO.File]::Open($outFileName, [System.IO.FileMode]::Open, [System.IO.FileAccess]::Write)
 | 
	
		
			
				|  |  | -        $outFile.Seek(0,0)
 | 
	
		
			
				|  |  | -        $inFile.Seek(0,0)
 | 
	
		
			
				|  |  | +        $outFile.Seek(0,0) | Out-Null
 | 
	
		
			
				|  |  | +        $inFile.Seek(0,0)  | Out-Null
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          $max =      [math]::Round($inFile.Length/1Mb)
 | 
	
		
			
				|  |  |          while ($outFile.Position -lt $inFile.Length){
 | 
	
		
			
				|  |  | -            $percent = [math]::Round(100 * $outFile.Position / $inFile.Length, 1)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            $remains = ($inFile.Length - $outFile.Position)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            if($remains -lt $blocksize){
 | 
	
		
			
				|  |  | +                $blocksize = $remains
 | 
	
		
			
				|  |  | +                $block = [System.Byte[]]::CreateInstance([System.Byte], $blocksize)
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            $inFile.Read( $block, 0, $blocksize)    | Out-Null
 | 
	
		
			
				|  |  | +            $outFile.Write( $block , 0, $blocksize) | Out-Null
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            $percent = [math]::Min(100,[math]::Round(100 * $outFile.Position / $inFile.Length, 1))
 | 
	
		
			
				|  |  |              $done    = [math]::Round($outFile.Position/1Mb)
 | 
	
		
			
				|  |  | -            $status  = "{0,5}% {1,6}/{2,-6} Mb" -f ($percent,$done,$max)
 | 
	
		
			
				|  |  | +            $status  = "{0,5}% {1,6}/{2} Mb" -f ($percent,$done,$max)
 | 
	
		
			
				|  |  |              Write-Progress -Id 1 -Activity "Writing in Progress" -Status $status -PercentComplete $percent;
 | 
	
		
			
				|  |  | -            $ipos = $inFile.Read( $block, 0, $blocksize)
 | 
	
		
			
				|  |  | -            $opos = $outFile.Write( $block , 0, $blocksize)
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |          Write-Output "Flushing...."
 | 
	
		
			
				|  |  |          $outFile.Flush()
 |