Что нового

Qemu и загрузка с флешки

Tuxzer92

Новичок
Сообщения
65
Репутация
0
Здравствуйте, появилась идея сделать GUI для загрузки с флешки в qemu. В курсе про MobaLiveCD, но там нет настроек.
пока реализовал проверку пути до qemu.exe и проверку подключения флешки.
Не могу понять, как получить порядковый номер флешки. Т.е.: DeviceID=\\.\PHYSICALDRIVE1 или Index.
вот что есть:
Код:
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
#include <Array.au3>

Local $hGui, $msg, $BtnOk, $sText
$exe="\qemu-system-x86_64.exe"

$Title="QFB"
$hGui = GUICreate("QFB", 380, 360, @DesktopWidth / 2 - 190, @DesktopHeight / 2 - 80, -1, $WS_EX_ACCEPTFILES)

GUICtrlCreateLabel("Укажите путь до каталога, где находится Qemu:", 10, 10)
$PathQemu = GUICtrlCreateInput('', 10, 35, 360, 25) ; принимает перетаскиваемые в Input файлы (drag and drop)
GUICtrlSetState(-1, $GUI_DROPACCEPTED)

$BtnPath = GUICtrlCreateButton("Указать путь", 15, 68, 100, 26)

GUICtrlCreateLabel("Укажите букву, под которой определилась флешка:", 10, 110)
$PathFlash = GUICtrlCreateInput('', 10, 135, 360, 25) ; принимает перетаскиваемые в Input файлы (drag and drop)
GUICtrlSetState(-1, $GUI_DROPACCEPTED)

$BtnFlash = GUICtrlCreateButton("Указать флешку", 15, 168, 120, 26)

$BtnOk = GUICtrlCreateButton("OK", (380 - 70) / 2, 330, 70, 26)

GUISetState()

While 1
   $msg = GUIGetMsg()
   Switch $msg
	  Case $GUI_EVENT_CLOSE
			ExitLoop
	  Case $BtnOk
		 $InputText=GUICtrlRead($PathQemu)
		 $InputFlash=GUICtrlRead($PathFlash)
		 If $InputText <> "" And $InputFlash <> "" Then
			ChkPath()
			ChkFlash()
		 ElseIf $InputText = "" Then
			MsgBox(4096,$Title,"Введите путь до Qemu или укажите с помощью кнопки 'Указать путь'")
		 ElseIf $InputFlash="" Then
			MsgBox(4096,$Title,"Введите букву флешки или укажите ее с помощью кнопки 'Указать флешку'")
		 EndIf
	  Case $BtnPath
		 SelectPath()
	  Case $BtnFlash
		 SelectFlash()
   EndSwitch
WEnd

Func ChkPath()
$InputText=GUICtrlRead($PathQemu)
If $InputText <> "" Then
   $QemuExe=$InputText & $exe
   if FileExists($QemuExe)=0 Then
	  MsgBox(4096,$Title,"В указанном каталоге: " & $InputText & " не найден исполняемый файл: " & $exe)
   Else
	  MsgBox(4096,$Title,"Путь до qemu: " & $QemuExe)
   EndIf
EndIf
EndFunc

Func SelectPath()
$Path = FileSelectFolder('Укажите каталог, где установлен Qemu', '', 3, @DesktopDir, $hGui)
if @error = 1 Then
   Exit
EndIf
GUICtrlSetData($PathQemu,$Path)
#cs
$QemuExe=$Path & $exe
if FileExists($QemuExe)=0 Then
   MsgBox(4096,$Title,"В указанном каталоге не найден исполняемый файл: " & $exe)
ElseIf FileExists($QemuExe) Then
   MsgBox(4096,$Title,"Путь до qemu: " & $QemuExe)
EndIf
#ce
EndFunc

Func ChkFlash()
$InputFlash=GUICtrlRead($PathFlash)
If $InputFlash <> "" Then
   $avArray = DriveGetDrive("REMOVABLE")
   If @error Then Exit
   $InputFlash = StringMid($InputFlash, 1, 1)
   $iIndex = _ArraySearch($avArray, $InputFlash, 0, 0, 0, 1)
   If @error Then
	  MsgBox(4096, $Title, "Съемный диск: " & $InputFlash & " не найден")
   Else
	  MsgBox(4096, $Title,  "Съемный диск: " & $InputFlash & " найден")
   EndIf
EndIf
EndFunc

Func SelectFlash()
$Path = FileSelectFolder('Укажите съемное устройство, для загрузки:', '', 3, @DesktopDir, $hGui)
if @error = 1 Then
   Exit
EndIf
GUICtrlSetData($PathFlash,$Path)
EndFunc


формат qemu: qemu.exe -L . -m 724 -boot c -hda \\.\PhysicalDrive1 -localtime -M pc

Спасибо.
 
Автор
T

Tuxzer92

Новичок
Сообщения
65
Репутация
0
Код:
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
#include <Array.au3>

#RequireAdmin

Local $hGui, $msg, $BtnOk, $sText
$exe="\qemu-system-x86_64.exe"

$Title="QFB"
$hGui = GUICreate("QFB", 380, 360, @DesktopWidth / 2 - 190, @DesktopHeight / 2 - 80, -1, $WS_EX_ACCEPTFILES)

GUICtrlCreateLabel("Укажите путь до каталога, где находится Qemu:", 10, 10)
$PathQemu = GUICtrlCreateInput('', 10, 35, 360, 25)

$BtnPath = GUICtrlCreateButton("Указать путь", 15, 68, 100, 26)

GUICtrlCreateLabel("Укажите букву, под которой определилась флешка:", 10, 110)
$PathFlash = GUICtrlCreateInput('', 10, 135, 28, 25)

$BtnFlash = GUICtrlCreateButton("Указать флешку", 15, 168, 120, 26)

GUICtrlCreateLabel("Укажите кол-во ОЗУ, отдаваемое qemu:", 10, 210)
$RAM = GUICtrlCreateInput('', 10, 235, 40, 25)
GUICtrlCreateLabel("МБ", 54, 240)
$BtnOk = GUICtrlCreateButton("OK", (380 - 70) / 2, 330, 70, 26)

GUISetState()

While 1
   $msg = GUIGetMsg()
   Switch $msg
	  Case $GUI_EVENT_CLOSE
			ExitLoop
	  Case $BtnOk
		 $InputText=GUICtrlRead($PathQemu)
		 $InputFlash=GUICtrlRead($PathFlash)
		 If $InputText <> "" And $InputFlash <> "" And $RAM <> "" Then
			$1=ChkPath()
			$2=ChkFlash()
			If ($1 or $2)=0 Then
			   RunQemu()
			Else
			   MsgBox(4096,$Title,"Что-то пошло не так")
			   Exit
			EndIf
		 ElseIf $InputText = "" Then
			MsgBox(4096,$Title,"Введите путь до Qemu или укажите с помощью кнопки 'Указать путь'")
		 ElseIf $InputFlash="" Then
			MsgBox(4096,$Title,"Введите букву флешки или укажите ее с помощью кнопки 'Указать флешку'")
		 ElseIf $RAM="" Then
			MsgBox(4096,$Title,"Укажите кол-во выделяемой памяти")
		 EndIf
	  Case $BtnPath
		 SelectPath()
	  Case $BtnFlash
		 SelectFlash()
   EndSwitch
WEnd

Func ChkPath()
$InputText=GUICtrlRead($PathQemu)
If $InputText <> "" Then
   $QemuExe=$InputText & $exe
   if FileExists($QemuExe)=0 Then
	  MsgBox(4096,$Title,"В указанном каталоге: " & $InputText & " не найден исполняемый файл: " & $exe)
	  Return 1
   Else
	  MsgBox(4096,$Title,"Путь до qemu: " & $QemuExe)
	  Return 0
   EndIf
EndIf
EndFunc

Func SelectPath()
$Path = FileSelectFolder('Укажите каталог, где установлен Qemu', '', 3, @DesktopDir, $hGui)
if @error = 1 Then
   Exit
EndIf
GUICtrlSetData($PathQemu,$Path)
#cs
$QemuExe=$Path & $exe
if FileExists($QemuExe)=0 Then
   MsgBox(4096,$Title,"В указанном каталоге не найден исполняемый файл: " & $exe)
ElseIf FileExists($QemuExe) Then
   MsgBox(4096,$Title,"Путь до qemu: " & $QemuExe)
EndIf
#ce
EndFunc

Func ChkFlash()
$InputFlash=GUICtrlRead($PathFlash)
If $InputFlash <> "" Then
   $avArray = DriveGetDrive("REMOVABLE")
   If @error Then Exit
   $InputFlash = StringMid($InputFlash, 1, 1)
   $iIndex = _ArraySearch($avArray, $InputFlash, 0, 0, 0, 1)
   If @error Then
	  MsgBox(4096, $Title, "Съемный диск: " & $InputFlash & " не найден")
	  Return 1
   Else
	  MsgBox(4096, $Title,  "Съемный диск: " & $InputFlash & " найден")
	  GetFlashPartID()
	  Return 0
   EndIf
EndIf
EndFunc

Func SelectFlash()
$Path = FileSelectFolder('Укажите съемное устройство, для загрузки:', '', 3, @DesktopDir, $hGui)
if @error = 1 Then
   Exit
EndIf
GUICtrlSetData($PathFlash,$Path)
EndFunc

Func GetFlashPartID()
$InputFlash=$InputFlash & ":"

Local $objWMI, $objCollection, $objItem, $objWSNet
Local $objLogicalDisks, $objLD, $objPartitions, $objPart
Local $strComputer
Global $strTemp

$ObjWMI = ObjGet("winmgmts:\\" & @ComputerName & "\root\CIMV2")
$ObjCollection = $ObjWMI.ExecQuery("SELECT * FROM Win32_LogicalDisk where Name = '" & $InputFlash & "'", "WQL", 0x30)
$n = 0
Local $ObjItem, $i = 0
For $ObjItem In $ObjCollection
   $objLogicalDisks = $objWMI.ExecQuery("ASSOCIATORS OF {Win32_LogicalDisk.DeviceID=""" & $objItem.DeviceID & """} WHERE AssocClass=Win32_LogicalDiskToPartition")
   For $objLD In $objLogicalDisks
	  $objPartitions = $objWMI.ExecQuery("ASSOCIATORS OF {Win32_DiskPartition.DeviceID=""" & $objLD.DeviceID & """} WHERE AssocClass=Win32_DiskDriveToDiskPartition")
	  For $objPart In $objPartitions
		 $strTemp = $strTemp & " "& $objPart.Name & ""
	  Next
	  $objPart = Null
	  $objPartitions = Null
   Next
   $objLD = Null
   $objLogicalDisks = Null
Next
$objItem = Null
$objCollection = Null
$objWMI = Null
If $strTemp = "" Then
   $strTemp = "Произошла ошибка!."
EndIf
EndFunc

Func RunQemu()
EnvSet("SDL_VIDEODRIVER", "windib")
EnvSet("SDL_AUDIODRIVER", "dsound")
EnvSet("SET QEMU_AUDIO_DRV", "dsound")
EnvSet("SET QEMU_AUDIO_LOG_TO_MONITOR", "0")

$InputRAM=GUICtrlRead($RAM)

$QemuExe=$InputText & $exe
RunWait($QemuExe & " -L . " & "-m " & $InputRAM & " -boot c " & "-hda " & $strTemp & " -localtime " & "-M pc")
EndFunc
 
A

Alofa

Гость
Пример:
Код:
#RequireAdmin
#include <ComboConstants.au3>
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
#include <Array.au3>

Local $hGui, $msg, $BtnOk, $sText
$exe = "\qemu-system-x86_64.exe"

$Title = "QFB"
$hGui = GUICreate("QFB", 380, 360, @DesktopWidth / 2 - 190, @DesktopHeight / 2 - 80, -1, $WS_EX_ACCEPTFILES)
GUICtrlCreateLabel("Укажите путь до каталога, где находится Qemu:", 10, 10)
$PathQemu = GUICtrlCreateInput('', 10, 35, 360, 25)
$BtnPath = GUICtrlCreateButton("Указать путь", 15, 68, 100, 26)

GUICtrlCreateLabel("Укажите букву, под которой определилась флешка:", 10, 110)
;~ $PathFlash = GUICtrlCreateInput('', 10, 135, 28, 25)
$PathFlash = GUICtrlCreateCombo('', 10, 135, 50, 25, BitOR($CBS_DROPDOWNLIST, $CBS_SORT))
$aGetDrive = DriveGetDrive('REMOVABLE')
If @error Then
	GUICtrlSetState(-1, $GUI_DISABLE)
Else
	For $i = 1 To $aGetDrive[0]
		GUICtrlSetData($PathFlash, StringUpper($aGetDrive[$i]) & '|')
	Next
EndIf

$BtnFlash = GUICtrlCreateButton("Указать флешку", 15, 168, 120, 26)
GUICtrlCreateLabel("Укажите кол-во ОЗУ, отдаваемое qemu:", 10, 210)
$RAM = GUICtrlCreateInput('', 10, 235, 40, 25)
GUICtrlCreateLabel("МБ", 54, 240)
$BtnOk = GUICtrlCreateButton("OK", (380 - 70) / 2, 330, 70, 26)
GUISetState()

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			ExitLoop
		Case $BtnOk
			$InputFlash = GUICtrlRead($PathFlash)
			MsgBox(262144, Default, $InputFlash)
	EndSwitch
WEnd
 
Верх