bobomb Posted December 19, 2021 Share Posted December 19, 2021 (edited) EDIT: I just found this issue reported in the copy UDF thread as well. It seems archived at this point.. Is anyone able to look at the pointer call to see if this is the DLL or not? Same program I was getting help with (BurnTool) GUI, Progress etc.. But this issue is unrelated, only the program itself is the same, so I thought it prudent to open a thread for this specific issue.. As the title states, I can compile this as x86 and it works fine.. Once compiled x64 the copy GUI opens and then crashes before anything starts to copy.. (Works x64 on Win7 but NOT on Win10 or Win11) This uses @Yashied's Copy UDF: https://www.autoitscript.com/forum/topic/121833-copy-udf/ (This is where the DLL's and UDF came from but if you dont want to use what I provided in the 7z you can get them yourself they are located here) Copy.dll is present for x86 during execution... Copy_x64.dll is present for x64 during execution... Subfolder Copy\Images\ is used for simple GUI... A 7z is attached with test files and a test ISO. The TestISO.ISO file appears to contain data however ALL files with the exception of the autorun.ico file are really just TEXT files filled with the words testtesttest repeatedly.. So bootmgr.exe is a renamed text file you can see with a text editor or by renaming it back. This is done for the purpose of not pissing off MS (or anyone else ) and still having something to test with for anyone willing to help.. If you are going to try and Run the software this is a USB or Fixed drive burning tool.. Be aware that it does format drives you tell it to, and then it copies files from the ISO to the USB/Fixed drive you choose. You will need a blank USB to test (or one you are willing to format). If you drop the extracted files into C:\bobomb\ you will not have to alter the code to run the initial x86 vs x64 testing (paths are hardcoded for copy UDF and GUI files) .. Script posted for visibility but included in the attached 7z expandcollapse popup#NoTrayIcon #RequireAdmin #Tidy_Parameters=/sf #Region #### autoit udfs #### #include <Array.au3> #include <ColorConstants.au3> #include <File.au3> #include <GUIConstantsEx.au3> #include <GuiTreeView.au3> #include <WinAPIFiles.au3> #include <WinAPIInternals.au3> #include <WindowsConstants.au3> #EndRegion #### autoit udfs #### #Region #### user udfs #### #include 'C:\Bobomb\Copy\UDF\Copy.au3' #EndRegion #### user udfs #### #Region #### globals #### Global Const _ ; GUI_SwitchGUI $GA_DELETEOLDGUINO = 0, _ $GA_DELETEOLDGUIYES = 1, _ $GA_DISABLEOLDGUINO = 0, _ $GA_DISABLEOLDGUIYES = 1, _ $GA_HIDEOLDGUINO = 0, _ $GA_HIDEOLDGUIYES = 1, _ $GA_ONEVENTMODENO = 0, _ $GA_ONEVENTMODEYES = 1 Global $h_MainGUI = 0 ; main gui for GUI_SwitchGUI function Global _ $id_DiskList = 0, _ $id_BurnBtn = 0 Global _ $s_BootDrive = '', _ $s_DataDrive = '', _ $s_MountedDrive = '' #EndRegion #### globals #### Opt("GUIOnEventMode", 1) Initialise() ; _ run program pre checks GUI_CreateGUI() ; _ create the main program gui Func BootWim_Check() ; check for the boot wim file If Not FileExists($s_MountedDrive & '\sources\boot.wim') Then MsgBox( _ $MB_ICONERROR, _ "Notice: ", _ "BOOT.WIM NOT DETECTED!!!" & @CRLF & "This tool is designed for SE" & @CRLF & "and XPE projects only.") GUI_CloseGUI() EndIf EndFunc ;==>BootWim_Check Func BootWim_GetSize() ; get the boot wim size and add 200 megabytes for headroom on boot partition Return Round((FileGetSize($s_MountedDrive & '\sources\boot.wim') + 209715200) / 1048576) EndFunc ;==>BootWim_GetSize Func BurnPressed() ; start the burn process Local $s_DiskNumber = StringRegExp(GUICtrlRead($id_DiskList, $GUI_READ_EXTENDED), '(?<=Disk\s)[0-9]+', $STR_REGEXPARRAYMATCH) If $s_DiskNumber = "" Then MsgBox( _ $MB_ICONERROR, _ ; it is possible to bug the GUI and make the buttons appear by pressing + or - on tree then refresh "Attention: ", _ "No disk is selected!") Buttons_Disable() Else Local $s_DiskNumber = StringRegExp(GUICtrlRead($id_DiskList, $GUI_READ_EXTENDED), '(?<=Disk\s)[0-9]+', $STR_REGEXPARRAYMATCH)[0] If @error Then MsgBox( _ $MB_ICONERROR, _ "Notice: ", _ "An error occured retrieving the disk number") Else If MsgBox( _ BitOR($MB_TOPMOST, $MB_ICONWARNING, $MB_YESNO, $MB_DEFBUTTON2), _ 'This will FORMAT Disk ' & $s_DiskNumber, _ 'ALL DATA WILL BE ERASED FROM DISK ' & $s_DiskNumber & @CRLF & 'Are you sure you want to proceed?') = $IDYES Then GUISetState(@SW_HIDE) ProgressOn("BurnTool (XPE/SE) v2.0", "Creating Bootable Media...", "0%") Format_Prepare($s_DiskNumber) ProgressSet(5 & "%", "Formatting Disk " & $s_DiskNumber) Format_Run() ProgressSet(100, "Format Complete", "Begin Filecopy...") ProgressOff() MsgBox(1, "", $s_MountedDrive & " - " & $s_BootDrive & ':') Copy_PartitionFiles($s_MountedDrive, $s_BootDrive & ':') Copy_PartitionFiles($s_MountedDrive, $s_DataDrive & ':', "Data") MsgBox( _ $MB_ICONINFORMATION, _ "Process Complete", _ " Enjoy! ") GUI_CloseGUI() EndIf EndIf EndIf EndFunc ;==>BurnPressed Func Buttons_Disable() ; disable the gui buttons GUICtrlSetState($id_BurnBtn, $GUI_DISABLE) EndFunc ;==>Buttons_Disable Func Buttons_Enable() ; enable the gui buttons GUICtrlSetState($id_BurnBtn, $GUI_ENABLE) EndFunc ;==>Buttons_Enable Func CacheFolder_DeleteFiles() ; remove the cache folder and exit program if specified If FileExists(CacheFolder_GetPath()) Then DirRemove(CacheFolder_GetPath(), $DIR_REMOVE) EndFunc ;==>CacheFolder_DeleteFiles Func CacheFolder_GetPath() ; get the path to the cache folder, returns with trailing '\' Local Static $s_CachePath = IniRead(@WorkingDir & '\USBTool.ini', "Settings", "CachePath", @WorkingDir & '\cache') & '\' Return $s_CachePath EndFunc ;==>CacheFolder_GetPath Func Copy_FilesFolders($s_Title, ByRef $as_Files, $s_Source, $s_Destination, $h_OldGui, $b_RemoveRO = False) ; copy the required files to the selected partition Local _ $i_Error = 0, _ $i_Extended = 0 Local $v_Return = '' If $s_Source <> '' And $s_Destination <> '' Then ; check for an array of files and folders If IsArray($as_Files) Then $s_Destination = StringRegExpReplace($s_Destination, '\\+$', '') ; check for destinaation and create if missing If Not FileExists($s_Destination) Then DirCreate($s_Destination) ; check if the destination exists If FileExists($s_Destination) Then ; make sure there's no trailing '\' then add one $s_Source = StringRegExpReplace($s_Source, '\\+$', '') & '\' $s_Destination = StringRegExpReplace($s_Destination, '\\+$', '') & '\' ; the dll file(s) need to be in the same dir as the script. ; if you dont want this, then use fileinstall to install it ; where you have write access x64 = Copy_x64.dll, x86 = Copy.dll If _Copy_OpenDll() Then #Region #### create gui #### Local _ $i_FontSize = 16, _ $i_FontWeight = 800, _ $i_PbarWidth = 400 Local _ $s_FontName = 'Trebuchet MS', _ $s_FontColour = $COLOR_WHITE, _ $s_BkColour = $GUI_BKCOLOR_TRANSPARENT Local $h_CopyGUI = GUICreate('Copy GUI', 634, 176, 1344, 367, $WS_POPUP, $WS_EX_LAYERED) GUICtrlCreatePic('C:\Bobomb\Copy\Images\GUIBack.bmp', 0, 0, 633, 175) GUICtrlSetState(-1, $GUI_DISABLE) GUICtrlCreatePic('C:\Bobomb\Copy\Images\GUIBanner.bmp', 0, 0, 633, 32) GUICtrlSetState(-1, $GUI_DISABLE) GUICtrlCreateLabel($s_Title, 5, 5, 561, 25) GUICtrlSetBkColor(-1, $s_BkColour) GUICtrlSetColor(-1, $s_FontColour) GUICtrlSetFont(-1, $i_FontSize, $i_FontWeight, $GUI_FONTNORMAL, $s_FontName) $i_FontSize = 10 $s_FontName = 'MS Sans Serif' GUICtrlCreateLabel('Source :', 10, 45, 85, 17) GUICtrlSetBkColor(-1, $s_BkColour) GUICtrlSetColor(-1, $s_FontColour) GUICtrlSetFont(-1, $i_FontSize, $i_FontWeight, $GUI_FONTNORMAL, $s_FontName) Local $id_Source_lbl = GUICtrlCreateLabel('', 100, 45, 520, 17, $DT_END_ELLIPSIS) GUICtrlSetBkColor(-1, $s_BkColour) GUICtrlSetColor(-1, $s_FontColour) GUICtrlSetFont(-1, $i_FontSize, $i_FontWeight, $GUI_FONTNORMAL, $s_FontName) GUICtrlCreateLabel('Destination:', 10, 69, 85, 17) GUICtrlSetBkColor(-1, $s_BkColour) GUICtrlSetColor(-1, $s_FontColour) GUICtrlSetFont(-1, $i_FontSize, $i_FontWeight, $GUI_FONTNORMAL, $s_FontName) Local $id_Destination_lbl = GUICtrlCreateLabel('', 100, 69, 520, 17, $DT_END_ELLIPSIS) GUICtrlSetBkColor(-1, $s_BkColour) GUICtrlSetColor(-1, $s_FontColour) GUICtrlSetFont(-1, $i_FontSize, $i_FontWeight, $GUI_FONTNORMAL, $s_FontName) $i_FontSize = 8 Local $id_Action_lbl = GUICtrlCreateLabel('', 72, 110, 72, 17) GUICtrlSetBkColor(-1, $s_BkColour) GUICtrlSetColor(-1, $s_FontColour) GUICtrlSetFont(-1, $i_FontSize, $i_FontWeight, $GUI_FONTNORMAL, $s_FontName) Local $id_Info_lbl = GUICtrlCreateLabel('', 148, 110, 335, 17) GUICtrlSetBkColor(-1, $s_BkColour) GUICtrlSetColor(-1, $s_FontColour) GUICtrlSetFont(-1, $i_FontSize, $i_FontWeight, $GUI_FONTNORMAL, $s_FontName) GUICtrlCreateLabel('File', 72, 129, 35, 17) GUICtrlSetBkColor(-1, $s_BkColour) GUICtrlSetColor(-1, $s_FontColour) GUICtrlSetFont(-1, $i_FontSize, $i_FontWeight, $GUI_FONTNORMAL, $s_FontName) GUICtrlCreatePic('C:\Bobomb\Copy\Images\CopyGUI_PbarBack.bmp', 115, 130, 403, 14) GUICtrlSetState(-1, $GUI_DISABLE) Local $id_CopyProgBar = GUICtrlCreatePic('C:\Bobomb\Copy\Images\CopyGUI_Pbar.bmp', 116, 133, 1, 8) Local $id_FileSize_lbl = GUICtrlCreateLabel('23', 522, 129, 100, 14) GUICtrlSetBkColor(-1, $s_BkColour) GUICtrlSetColor(-1, $s_FontColour) GUICtrlSetFont(-1, $i_FontSize, $i_FontWeight, $GUI_FONTNORMAL, $s_FontName) GUICtrlCreateLabel('Total', 72, 149, 35, 17) GUICtrlSetBkColor(-1, $s_BkColour) GUICtrlSetColor(-1, $s_FontColour) GUICtrlSetFont(-1, $i_FontSize, $i_FontWeight, $GUI_FONTNORMAL, $s_FontName) GUICtrlCreatePic('C:\Bobomb\Copy\Images\CopyGUI_PbarBack.bmp', 115, 150, 403, 14) GUICtrlSetState(-1, $GUI_DISABLE) Local $id_totalProgBar = GUICtrlCreatePic('C:\Bobomb\Copy\Images\CopyGUI_Pbar.bmp', 116, 153, 1, 8) Local $id_TotalFileCount_lbl = GUICtrlCreateLabel('0/' & $as_Files[0], 522, 150, 100, 14) GUICtrlSetBkColor(-1, $s_BkColour) GUICtrlSetColor(-1, $s_FontColour) GUICtrlSetFont(-1, $i_FontSize, $i_FontWeight, $GUI_FONTNORMAL, $s_FontName) ; set the GUI transparency ;_WinAPI_SetLayeredWindowAttributes($h_CopyGUI, 0x010101, 200) #EndRegion #### create gui #### ; change the gui GUI_SwitchGUI($h_CopyGUI, $h_OldGui, Default, $GA_DISABLEOLDGUIYES, $GA_HIDEOLDGUIYES) GUI_CentreGUI($h_OldGui, $h_CopyGUI) GUISetState(@SW_SHOW, $h_CopyGUI) Local $ai_State = 0 ; loop through the files and copy them For $i = 1 To $as_Files[0] ; check if file or dir and change copy mode If _WinAPI_PathIsDirectory($s_Source & $as_Files[$i]) Then _Copy_CopyDir($s_Source & $as_Files[$i], $s_Destination & $as_Files[$i], $COPY_FILE_NO_BUFFERING, $COPY_OVERWRITE_YES) Else _Copy_CopyFile($s_Source & $as_Files[$i], $s_Destination & $as_Files[$i], $COPY_FILE_NO_BUFFERING) EndIf GUICtrlSetData($id_Action_lbl, Copy_GetStatus()) ; status While 1 $ai_State = _Copy_GetState() If $ai_State[0] Then If GUICtrlRead($id_Source_lbl) <> $ai_State[6] Then GUICtrlSetData($id_Source_lbl, $ai_State[6]) If GUICtrlRead($id_Destination_lbl) <> $ai_State[7] Then GUICtrlSetData($id_Destination_lbl, $ai_State[7]) Copy_SetFileProgress($h_CopyGUI, $id_CopyProgBar, $ai_State[3], $ai_State[4]) ; file copy progress bar GUICtrlSetData($id_FileSize_lbl, _WinAPI_StrFormatByteSize($ai_State[3]) & '/' & _WinAPI_StrFormatByteSize($ai_State[4])) ; file copy transferred Else Switch $ai_State[5] Case 0 ; all OK Case 1235 ; ERROR_REQUEST_ABORTED ;~ Case Else ; add the error file\dir and error code to the array $i_Error = 7 $i_Extended += 1 Copy_UpdateErrorArray($ai_State[6], $ai_State[5]) EndSwitch Copy_SetFileProgress($h_CopyGUI, $id_CopyProgBar, 100, 100) ; _ set file copy progress bar Copy_SetTotalProgress($h_CopyGUI, $id_totalProgBar, $i, $as_Files[0]) ;_ set total progress bar GUICtrlSetData($id_TotalFileCount_lbl, $i & '/' & $as_Files[0]) ; set total copy count ExitLoop EndIf Sleep(80) WEnd Next ; reset the controls GUICtrlSetData($id_Source_lbl, '') GUICtrlSetData($id_Destination_lbl, '') GUICtrlSetData($id_Action_lbl, '') Copy_SetFileProgress($h_CopyGUI, $id_CopyProgBar) Copy_SetFileProgress($h_CopyGUI, $id_totalProgBar) GUICtrlSetData($id_FileSize_lbl, '') GUICtrlSetData($id_TotalFileCount_lbl, '') If $b_RemoveRO Then ; remove read only attributes from the destination GUICtrlSetData($id_Action_lbl, 'Removing') GUICtrlSetData($id_Info_lbl, 'Read Only attributes on ' & $s_Destination) FileSetAttrib($s_Destination, '-R', $FT_RECURSIVE) EndIf GUI_SwitchGUI($h_OldGui, $h_CopyGUI, Default, Default, $GA_DELETEOLDGUIYES) If Not _Copy_CloseDll() Then ; error closing the copy dll $i_Error = 6 $v_Return = 'Unable to close the dll file: ' & Copy_GetDllName() EndIf Else ; unable to open copy dll $i_Error = 4 $v_Return = 'Unable to find the dll file: ' & Copy_GetDllName() EndIf Else ; unable to create destination $i_Error = 3 $v_Return = 'Unable to create destination: ' & $s_Destination EndIf Else ; array not valid $i_Error = 2 $v_Return = '$as_Files is not an array. No files\folders to copy' EndIf Else $i_Error = 1 $v_Return = 'Missing Source or Destination values' EndIf Return SetError($i_Error, $i_Extended, $v_Return) EndFunc ;==>Copy_FilesFolders Func Copy_GetDllName() ; get the dll name for Copy_FilesFolders Return (@AutoItX64 = 0) ? ('Copy.dll') : ('Copy_x64.dll') EndFunc ;==>Copy_GetDllName Func Copy_GetStatus() ; get the file\folder current action for Copy_FilesFolders Return (_Copy_GetAction() = 0) ? ('Copying File') : ('Moving File') EndFunc ;==>Copy_GetStatus Func Copy_PartitionFiles($s_Source, $s_Destination, $s_Partition = 'Boot') ; set the required files and partition for Copy_FilesFolders Local $s_BootList = 'boot;efi;sources;bootmgr;bootmgr.efi;bootmgr.exe;menu.lst' Local $s_Mask = $s_BootList If $s_Partition = 'Data' Then $s_Mask = '*|' & $s_BootList ; search the source for specified files only Local $as_Files = _FileListToArrayRec($s_Source, $s_Mask, $FLTAR_FILESFOLDERS, $FLTAR_NORECUR, $FLTAR_SORT) Local $v_Ret = Copy_FilesFolders('Copying ' & $s_Partition & ' Files', $as_Files, $s_Source, $s_Destination, $h_MainGUI) If @error Then If @extended Then If MsgBox( _ BitOR($MB_ICONERROR, $MB_YESNO, $MB_DEFBUTTON2), _ 'Copy Error(s): ' & @extended, _ 'Error(s) Occurred during the copy process ' & @CRLF & ' Do you want to view the file names?') = $IDYES Then _ _ArrayDisplay(Copy_UpdateErrorArray(), 'Copy Errors', '', $ARRAYDISPLAY_COLALIGNLEFT, Default, 'Path|ErrorCode') Else MsgBox( _ $MB_ICONERROR, _ 'Error occured', _ $v_Ret) EndIf Else MsgBox( _ $MB_ICONINFORMATION, _ $s_Partition & ' Partition', _ 'All ' & $s_Partition & ' files were successfully copied to :- ' & @CRLF & $s_Destination) EndIf EndFunc ;==>Copy_PartitionFiles Func Copy_SetFileProgress($h_Gui, $id_Ctrl, $i_Current = 0, $i_Total = 0) ; set the file copy progress bar for Copy_FilesFolders Local $ai_Pos = ControlGetPos($h_Gui, '', $id_Ctrl) Local $i_Value = 0 If $i_Current <> 0 Then $i_Value = (Round($i_Current / $i_Total * 100) * 4) GUICtrlSetPos($id_Ctrl, $ai_Pos[0], $ai_Pos[1], $i_Value, $ai_Pos[3]) EndFunc ;==>Copy_SetFileProgress Func Copy_SetTotalProgress($h_Gui, $id_Ctrl, $i_Current = 0, $i_Total = 0) ; set the total progress bar for Copy_FilesFolders Local $ai_Pos = ControlGetPos($h_Gui, '', $id_Ctrl) Local $i_Value = 0 If $i_Current <> 0 Then $i_Value = (Round($i_Current / $i_Total * 100) * 4) GUICtrlSetPos($id_Ctrl, $ai_Pos[0], $ai_Pos[1], $i_Value, $ai_Pos[3]) EndFunc ;==>Copy_SetTotalProgress Func Copy_UpdateErrorArray($s_Path = '', $i_ErrorCode = 0) Local Static $as_Error[1][2] = [[0, '']] If $s_Path <> '' Then $as_Error[0][0] = _ArrayAdd($as_Error, $s_Path & '|' & _WinAPI_GetErrorMessage($i_ErrorCode)) Else Return $as_Error EndIf EndFunc ;==>Copy_UpdateErrorArray Func DiskList_GetDrives() ; get the system drives Local Const $WBEMFLAGRETURNIMMEDIATELY = 0x10 Local Enum _ $Unknown, _ $NoRootDirectory, _ $RemovableDisk, _ $LocalDisk, _ $NetworkDrive, _ $CompactDisk, _ $RAMDisk Local $o_WMIService = ObjGet("winmgmts:\\" & @ComputerName & "\root\cimv2") If IsObj($o_WMIService) Then Local $s_Query = "SELECT * FROM Win32_DiskDrive" Local $o_DiskDrives = $o_WMIService.ExecQuery($s_Query, "WQL", $WBEMFLAGRETURNIMMEDIATELY) If IsObj($o_DiskDrives) Then Local $o_Partitions = 0 Local $o_LogicalDisks = 0 For $o_DiskDrive In $o_DiskDrives $h_Parent = GUICtrlCreateTreeViewItem("Disk " & $o_DiskDrive.Index & " [" & $o_DiskDrive.Model & "]", $id_DiskList) GUICtrlSetOnEvent(-1, 'Buttons_Enable') _GUICtrlTreeView_SetIcon($id_DiskList, $h_Parent, "shell32.dll", 15) $s_Query = "ASSOCIATORS OF {Win32_DiskDrive.DeviceID='" & $o_DiskDrive.DeviceId & "'} WHERE AssocClass = Win32_DiskDriveToDiskPartition" $o_Partitions = $o_WMIService.ExecQuery($s_Query) If IsObj($o_Partitions) Then For $o_Partition In $o_Partitions $s_Query = "ASSOCIATORS OF {Win32_DiskPartition.DeviceID='" & $o_Partition.DeviceId & "'} WHERE AssocClass = Win32_LogicalDiskToPartition" $o_LogicalDisks = $o_WMIService.ExecQuery($s_Query) For $o_LogicalDisk In $o_LogicalDisks If $o_LogicalDisk.drivetype = $RemovableDisk Or $o_LogicalDisk.drivetype = $LocalDisk Then GUICtrlCreateTreeViewItem('(' & $o_LogicalDisk.DeviceId & '\) ' & $o_LogicalDisk.Volumename, $h_Parent) GUICtrlSetOnEvent(-1, 'Buttons_Disable') _GUICtrlTreeView_SetIcon($id_DiskList, -1, "shell32.dll", 7) EndIf Next Next Else ; add error info here EndIf Next Else ; add error info here EndIf Else ; add error info here EndIf EndFunc ;==>DiskList_GetDrives Func DiskList_Load() ; load the system drives _GUICtrlTreeView_BeginUpdate($id_DiskList) _GUICtrlTreeView_DeleteAll($id_DiskList) DiskList_GetDrives() If _GUICtrlTreeView_GetCount($id_DiskList) > 2 Then _GUICtrlTreeView_Sort($id_DiskList) _GUICtrlTreeView_Expand($id_DiskList) _GUICtrlTreeView_EndUpdate($id_DiskList) Buttons_Disable() EndFunc ;==>DiskList_Load Func Diskpart_CreateScriptFile($s_File, $s_Data) ; create the diskpart script file Local $h_CacheFile = FileOpen(CacheFolder_GetPath() & $s_File, $FO_OVERWRITE) FileWrite($h_CacheFile, $s_Data) FileClose($h_CacheFile) EndFunc ;==>Diskpart_CreateScriptFile Func DriveLetters_GetAvailable() ; get the available system drive letters Local $as_DriveList = DriveGetDrive($DT_ALL) Local _ $s_DriveLetters = "CDEFGHIJKLMNOPQRSTUVWXYZ", _ $s_AvailableDriveLetters If @error Then ; An error occurred when retrieving the drives. MsgBox( _ BitOR($MB_ICONERROR, $MB_SYSTEMMODAL), _ "", _ "An Error Occurred! Unable to retrieve available drive letters! Exiting Program...") GUI_CloseGUI() Else ; loop through the enumerated drives and remove those in use Local $s_DriveLetter = '' For $i = 1 To $as_DriveList[0] $s_DriveLetter = StringLeft(StringUpper($as_DriveList[$i]), 1) $s_DriveLetters = StringReplace($s_DriveLetters, $s_DriveLetter, "") Next EndIf ; get an array of available drive letters $s_AvailableDriveLetters = StringSplit($s_DriveLetters, "") $s_BootDrive = $s_AvailableDriveLetters[1] ; Get first available letter (returns without ':\', needed for DiskPart assign letter) $s_DataDrive = $s_AvailableDriveLetters[2] ; Get second available letter (returns without ':\', needed for DiskPart assign letter) ;$s_DataDrive = $s_AvailableDriveLetters[1] ; Get second available letter EndFunc ;==>DriveLetters_GetAvailable Func Format_Prepare($s_Drive) ; prepare the diskpart script files DriveLetters_GetAvailable() Diskpart_CreateScriptFile('clean.dat', 'Sel Dis ' & $s_Drive & @CRLF & 'clean' & @CRLF & 'Exit') Diskpart_CreateScriptFile('attrib.dat', 'Sel Dis ' & $s_Drive & @CRLF & 'attribute disk clear readonly' & @CRLF & 'Exit') Diskpart_CreateScriptFile('scrubber.dat', 'Sel Dis ' & $s_Drive & @CRLF & 'cre par pri' & @CRLF & 'format quick fs=NTFS label=scrubber' & @CRLF & 'Exit') Diskpart_CreateScriptFile('convert.dat', 'Sel Dis ' & $s_Drive & @CRLF & 'convert mbr' & @CRLF & 'Exit') Diskpart_CreateScriptFile('initdata.dat', 'Sel Dis ' & $s_Drive & @CRLF & 'cre par pri' & @CRLF & 'shrink minimum=' & BootWim_GetSize() & @CRLF & 'format quick fs=ntfs label="WinPE Data"' & @CRLF & 'assign letter=' & $s_DataDrive & @CRLF & 'Exit') Diskpart_CreateScriptFile('initboot.dat', 'Sel Dis ' & $s_Drive & @CRLF & 'cre par pri' & @CRLF & 'format quick fs=fat32 label="BOOTFILES"' & @CRLF & 'assign letter=' & $s_BootDrive & @CRLF & 'Active' & @CRLF & 'Exit') EndFunc ;==>Format_Prepare Func Format_Run() ; format the selected drive Local $as_DiskPart[8][2] = [ _ [7, 0], _ ["Cleaning Drive", 'clean.dat'], _ ["Cleaning Drive", 'scrub.dat'], _ ["Cleaning Drive", 'clean.dat'], _ ["Resetting Disk Attributes", 'attrib.dat'], _ ["Converting Layout to MBR", 'convert.dat'], _ ["Creating Data Partition", 'initdata.dat'], _ ["Creating Boot Partition", 'initboot.dat'] _ ] Local $s_Program = @ComSpec & ' /c diskpart /s ' & '"' & CacheFolder_GetPath() For $i = 1 To $as_DiskPart[0][0] ProgressSet($i * 13 & "%", $as_DiskPart[$i][0]) RunWait($s_Program & $as_DiskPart[$i][1] & '"', @WorkingDir, @SW_HIDE) Sleep(750) Next EndFunc ;==>Format_Run ; #FUNCTION# ==================================================================================================================== ; Name ..........: GUI_CentreGUI ; Description ...: Centre a child gui to it's parent using the parent's co-ordinates ; Syntax ........: GUI_CentreGUI($h_OldGui, $h_Child) ; Parameters ....: $h_OldGui - a handle value. Handle of the parent gui ; $h_Child - a handle value. Handle of the child gui ; Return values .: None ; Author ........: Benners ; Modified ......: ; =============================================================================================================================== Func GUI_CentreGUI($h_OldGui, $h_Child) ; centre a child gui to it's parent Local _ $ai_ParentPos = WinGetPos($h_OldGui, ''), _ ; _ get the position of the parent gui $ai_ChildSize = WinGetClientSize($h_Child, '') ; _ get the size of the viewer gui Local _ $i_Xcord = $ai_ParentPos[0] + ($ai_ParentPos[2] / 2) - ($ai_ChildSize[0] / 2), _ $i_Ycord = $ai_ParentPos[1] + ($ai_ParentPos[3] / 2) - ($ai_ChildSize[1] / 2) WinMove($h_Child, '', $i_Xcord, $i_Ycord) ; move the child gui to the centre of the parent gui EndFunc ;==>GUI_CentreGUI Func GUI_CloseGUI() ; close the gui ISO_Unmount() CacheFolder_DeleteFiles() Exit EndFunc ;==>GUI_CloseGUI Func GUI_CreateGUI() ; draw the gui $h_MainGUI = GUICreate('BurnTool (XPE/SE) v2.0', 300, 287) GUISetOnEvent($GUI_EVENT_CLOSE, "GUI_CloseGUI") GUISetIcon(@WorkingDir & '\USBTool.ico', 1) GUISetBkColor(0x797979) GUICtrlCreateLabel('Select a disk to use...', 20, 10, 280) $id_DiskList = GUICtrlCreateTreeView(10, 30, 280, 150) DiskList_Load() GUICtrlCreateButton('Refresh List', 110, 187, 80, 25) GUICtrlSetOnEvent(-1, "DiskList_Load") GUICtrlSetState(-1, $GUI_FOCUS) GUICtrlCreateLabel('________________________________________', 30, 210, 280, 30) $id_BurnBtn = GUICtrlCreateButton('Burn', 90, 232, 120, 40) GUICtrlSetOnEvent(-1, "BurnPressed") GUICtrlSetState(-1, $GUI_DISABLE) GUISetState() ; Just idle around While 1 Sleep(10) WEnd EndFunc ;==>GUI_CreateGUI ; #FUNCTION# ==================================================================================================================== ; Name ..........: GUI_SwitchGUI ; Description ...: Switches the current active window to be associated with running GUI functions. ; Syntax ........: GUI_SwitchGUI($h_NewGui, $h_OldGui[, $i_EventMode = Default[, $i_DisableOldGui = Default[, $i_HideOldGui = Default[, ; $i_DeleteOldGui = Default]]]]) ; Parameters ....: $h_NewGui - The handle of the gui that is to be the current window ; $h_OldGui - The handle of the gui that is to relinquish control ; $i_EventMode - [optional] an integer value. Sets the Opt("GUIOnEventMode") for notifications (enable\disable) ; Default is disabled ($GA_ONEVENTMODENO) ; $i_DisableOldGui - [optional] an integer value. Changes the state of the $h_OldGui window (enable\disable) ; Default is enabled ($GA_DISABLEOLDGUINO) ; $i_HideOldGui - [optional] an integer value. Hide the old gui ; $i_DeleteOldGui - [optional] an integer value. Deletes the $h_OldGui window and all controls that it contains (yes\no) ; Default is no ($GA_DELETEOLDGUINO) ; Return values .: None ; Author ........: Benners ; Modified ......: ; Remarks .......: ; =============================================================================================================================== Func GUI_SwitchGUI($h_NewGui, $h_OldGui, $i_EventMode = Default, $i_DisableOldGui = Default, $i_HideOldGui = Default, $i_DeleteOldGui = Default) If $i_EventMode = Default Then $i_EventMode = $GA_ONEVENTMODENO If $i_DisableOldGui = Default Then $i_DisableOldGui = $GA_DISABLEOLDGUINO If $i_HideOldGui = Default Then $i_HideOldGui = $GA_HIDEOLDGUINO If $i_DeleteOldGui = Default Then $i_DeleteOldGui = $GA_DELETEOLDGUINO Opt("GUIOnEventMode", $i_EventMode) ;_ set on event mode (disabled or enabled) GUISwitch($h_NewGui) ;_ switch control to the new GUI. GUISetState(@SW_ENABLE, $h_NewGui) ;_ enable the new gui GUISetState(@SW_RESTORE, $h_NewGui) ;_ undo a window minimization GUISetState(@SW_SHOW, $h_NewGui) ;_ show the gui If $i_DisableOldGui Then GUISetState(@SW_DISABLE, $h_OldGui) ;_ disable the old GUI. If $i_HideOldGui Then GUISetState(@SW_HIDE, $h_OldGui) ; _ hide the old gui If $i_DeleteOldGui Then GUIDelete($i_DeleteOldGui) ;_ destroy the old gui EndFunc ;==>GUI_SwitchGUI Func Initialise() ; run pre checks before program starts ISO_CheckWasDropped() ; _ check for a cmdline argument (iso file was dropped on the exe) ISO_Mount() ; _ mount the dropped iso $s_MountedDrive = ISO_GetDriveLetter() ; _ get the drive letter for the mounted iso, returns without trailing '\' BootWim_Check() ; _ check for the bootwim file on the mounted drive CacheFolder_DeleteFiles() ; _ delete the cache folder DirCreate(CacheFolder_GetPath()) ; _ create the cache folder EndFunc ;==>Initialise Func ISO_CheckWasDropped() ; check that an iso was dropped on to the exe If $CmdLine[0] = 0 Then ; no file was dropped or passed via the command line MsgBox( _ $MB_ICONERROR, _ "Attention: ", _ "This program cannot be run directly!" & @CRLF & "Please drag an ISO onto the program to begin...") GUI_CloseGUI() EndIf EndFunc ;==>ISO_CheckWasDropped Func ISO_GetDriveLetter() ; get the drive letter of the mounted iso, returns with trailing '\' Local $s_MarkerFile = 'BOOTMGR' Local $s_IsoDrive = '' Local $as_CDROM = DriveGetDrive($DT_CDROM) For $i = 1 To $as_CDROM[0] If FileExists($as_CDROM[$i] & '\' & $s_MarkerFile) Then If Not _WinAPI_IsWritable($as_CDROM[$i]) Then $s_IsoDrive = $as_CDROM[$i] EndIf Next If $s_IsoDrive = "" Then MsgBox( _ $MB_ICONERROR, _ "Attention: ", _ $s_MarkerFile & " NOT DETECTED!!!" & @CRLF & "This tool is designed for XPE" & @CRLF & "and SE projects only.") GUI_CloseGUI() EndIf Return StringUpper($s_IsoDrive) EndFunc ;==>ISO_GetDriveLetter Func ISO_Mount() ; mount the droppped iso RunWait('cmd /c powershell.exe ' & '"Mount-DiskImage "' & '"' & $CmdLine[1] & '"' & '"' & '"' & ' >nul', @WorkingDir, @SW_HIDE) EndFunc ;==>ISO_Mount Func ISO_Unmount() ; unmount the dropped iso ; check for mounted drive and unmount if required If $s_MountedDrive <> '' Then RunWait('cmd /c powershell.exe ' & '"Dismount-DiskImage "' & '"' & $CmdLine[1] & '"' & '"' & '"' & ' >nul', @WorkingDir, @SW_HIDE) EndFunc ;==>ISO_Unmount bobomb-test.7z Edited December 19, 2021 by bobomb Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now