Keketoco00 Posted Wednesday at 03:02 AM Posted Wednesday at 03:02 AM Hello everyone! I'm creating a tool that automates the installation of Windows and I need to mount an ISO image to load the .wim. I've looked everywhere to see how I can mount it. In Windows 10, you can mount it using Windows Explorer, but I haven't found any command that does this. I don't want to use third-party programs that need to be installed. If there is no command in AutoIT that does this, I would like someone to help me use Imdisk without installing it on the machine. If possible, using the dll. I'm using the translator, sorry for the spelling mistakes!
argumentum Posted Wednesday at 03:33 AM Posted Wednesday at 03:33 AM this guy here ( https://github.com/christitustech/winutil ) does it. Look at the code and copy the parts that you need. Follow the link to my code contribution ( and other things too ). FAQ - Please Read Before Posting.
UEZ Posted Wednesday at 11:30 AM Posted Wednesday at 11:30 AM (edited) Try this: expandcollapse popup;Coded by UEZ build 2025-06-13 beta ;Mount ISO and let system assign drive letter. Sometimes drive letter is not assigned for unknown reason to me. ^^ #AutoIt3Wrapper_UseX64=y #include <WinAPIHObj.au3> #include <WinAPIFiles.au3> Global Const $MAX_PATH = 260 Global Const $VIRTUAL_STORAGE_TYPE_VENDOR_MICROSOFT = '{EC984AEC-A0F9-47E9-901F-71415A66345B}' Global Const $VIRTUAL_STORAGE_TYPE_VENDOR_UNKNOWN = '{00000000-0000-0000-0000-000000000000}' ;VIRTUAL_STORAGE_TYPE -> https://learn.microsoft.com/en-us/windows/win32/api/virtdisk/ns-virtdisk-virtual_storage_type Global Enum $VIRTUAL_STORAGE_TYPE_DEVICE_UNKNOWN = 0, $VIRTUAL_STORAGE_TYPE_DEVICE_ISO, $VIRTUAL_STORAGE_TYPE_DEVICE_VHD, $VIRTUAL_STORAGE_TYPE_DEVICE_VHDX ;VIRTUAL_DISK_ACCESS_MASK -> https://learn.microsoft.com/en-us/windows/win32/api/virtdisk/ne-virtdisk-virtual_disk_access_mask-r1 Global Enum $VIRTUAL_DISK_ACCESS_NONE = 0, $VIRTUAL_DISK_ACCESS_ATTACH_RO = 0x00010000, $VIRTUAL_DISK_ACCESS_ATTACH_RW = 0x00020000, $VIRTUAL_DISK_ACCESS_DETACH = 0x00040000, _ $VIRTUAL_DISK_ACCESS_GET_INFO = 0x00080000, $VIRTUAL_DISK_ACCESS_CREATE = 0x00100000, $VIRTUAL_DISK_ACCESS_METAOPS = 0x00200000, $VIRTUAL_DISK_ACCESS_READ = 0x000D0000, _ $VIRTUAL_DISK_ACCESS_ALL = 0x003F0000, $VIRTUAL_DISK_ACCESS_WRITABLE = 0x00320000 ;OPEN_VIRTUAL_DISK_FLAG -> https://learn.microsoft.com/en-us/windows/win32/api/virtdisk/ne-virtdisk-open_virtual_disk_flag Global Enum $OPEN_VIRTUAL_DISK_FLAG_NONE = 0x00000000, $OPEN_VIRTUAL_DISK_FLAG_NO_PARENTS = 0x00000001, $OPEN_VIRTUAL_DISK_FLAG_BLANK_FILE = 0x00000002, $OPEN_VIRTUAL_DISK_FLAG_BOOT_DRIVE = 0x00000004, _ $OPEN_VIRTUAL_DISK_FLAG_CACHED_IO = 0x00000008, $OPEN_VIRTUAL_DISK_FLAG_CUSTOM_DIFF_CHAIN = 0x00000010, $OPEN_VIRTUAL_DISK_FLAG_PARENT_CACHED_IO = 0x00000020, $OPEN_VIRTUAL_DISK_FLAG_VHDSET_FILE_ONLY = 0x00000040, _ $OPEN_VIRTUAL_DISK_FLAG_IGNORE_RELATIVE_PARENT_LOCATOR = 0x00000080, $OPEN_VIRTUAL_DISK_FLAG_NO_WRITE_HARDENING = 0x00000100, $OPEN_VIRTUAL_DISK_FLAG_SUPPORT_COMPRESSED_VOLUMES, _ $OPEN_VIRTUAL_DISK_FLAG_SUPPORT_SPARSE_FILES_ANY_FS, $OPEN_VIRTUAL_DISK_FLAG_SUPPORT_ENCRYPTED_FILES ;ATTACH_VIRTUAL_DISK_FLAG -> https://learn.microsoft.com/en-us/windows/win32/api/virtdisk/ne-virtdisk-attach_virtual_disk_flag Global Enum $ATTACH_VIRTUAL_DISK_FLAG_NONE = 0x00000000, $ATTACH_VIRTUAL_DISK_FLAG_READ_ONLY = 0x00000001, $ATTACH_VIRTUAL_DISK_FLAG_NO_DRIVE_LETTER = 0x00000002, $ATTACH_VIRTUAL_DISK_FLAG_PERMANENT_LIFETIME = 0x00000004, _ $ATTACH_VIRTUAL_DISK_FLAG_NO_LOCAL_HOST = 0x00000008, $ATTACH_VIRTUAL_DISK_FLAG_NO_SECURITY_DESCRIPTOR = 0x00000010, $ATTACH_VIRTUAL_DISK_FLAG_BYPASS_DEFAULT_ENCRYPTION_POLICY = 0x00000020, _ $ATTACH_VIRTUAL_DISK_FLAG_NON_PNP, $ATTACH_VIRTUAL_DISK_FLAG_RESTRICTED_RANGE, $ATTACH_VIRTUAL_DISK_FLAG_SINGLE_PARTITION, $ATTACH_VIRTUAL_DISK_FLAG_REGISTER_VOLUME, $ATTACH_VIRTUAL_DISK_FLAG_AT_BOOT ;OPEN_VIRTUAL_DISK_VERSION -> https://learn.microsoft.com/en-us/windows/win32/api/virtdisk/ne-virtdisk-open_virtual_disk_version Global Enum $OPEN_VIRTUAL_DISK_VERSION_UNSPECIFIED = 0, $OPEN_VIRTUAL_DISK_VERSION_1, $OPEN_VIRTUAL_DISK_VERSION_2, $OPEN_VIRTUAL_DISK_VERSION_3 Global Enum $DETACH_VIRTUAL_DISK_FLAG_NONE = 0x00000000 ;ATTACH_VIRTUAL_DISK_VERSION -> https://learn.microsoft.com/en-us/windows/win32/api/virtdisk/ne-virtdisk-attach_virtual_disk_version Global Enum $ATTACH_VIRTUAL_DISK_VERSION_UNSPECIFIED = 0, $ATTACH_VIRTUAL_DISK_VERSION_1 = 1, $ATTACH_VIRTUAL_DISK_VERSION_2 Global Enum $GET_VIRTUAL_DISK_INFO_UNSPECIFIED = 0, $GET_VIRTUAL_DISK_INFO_SIZE, $GET_VIRTUAL_DISK_INFO_IDENTIFIER, $GET_VIRTUAL_DISK_INFO_PARENT_LOCATION, $GET_VIRTUAL_DISK_INFO_PARENT_IDENTIFIER, _ $GET_VIRTUAL_DISK_INFO_PARENT_TIMESTAMP, $GET_VIRTUAL_DISK_INFO_VIRTUAL_STORAGE_TYPE, $GET_VIRTUAL_DISK_INFO_PROVIDER_SUBTYPE, $GET_VIRTUAL_DISK_INFO_IS_4K_ALIGNED, $GET_VIRTUAL_DISK_INFO_PHYSICAL_DISK, _ $GET_VIRTUAL_DISK_INFO_VHD_PHYSICAL_SECTOR_SIZE, $GET_VIRTUAL_DISK_INFO_SMALLEST_SAFE_VIRTUAL_SIZE, $GET_VIRTUAL_DISK_INFO_FRAGMENTATION, $GET_VIRTUAL_DISK_INFO_IS_LOADED, _ $GET_VIRTUAL_DISK_INFO_VIRTUAL_DISK_ID, $GET_VIRTUAL_DISK_INFO_CHANGE_TRACKING_STATE ;DETACH_VIRTUAL_DISK_FLAG -> https://learn.microsoft.com/en-us/windows/win32/api/virtdisk/ne-virtdisk-detach_virtual_disk_flag Global Const $tagOPEN_VIRTUAL_DISK_PARAMETERS = "dword Version;dword RWDepth" ;"ulong Data1;ushort Data2;ushort Data3;ubyte Data4[8]" ;https://learn.microsoft.com/en-us/windows/win32/api/virtdisk/ns-virtdisk-virtual_storage_type Global Const $tagVIRTUAL_STORAGE_TYPE = "ulong DeviceId;byte VendorId[16]" ;https://learn.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-security_descriptor Global Const $tagSECURITY_DESCRIPTOR = "byte Revision;byte Sbz1;ushort Control;ptr Owner;ptr Group;ptr Sacl;ptr Dacl;" ;https://learn.microsoft.com/en-us/windows/win32/api/virtdisk/ns-virtdisk-attach_virtual_disk_parameters Global Const $tagATTACH_VIRTUAL_DISK_PARAMETERS = "dword Version;" & _ ; ATTACH_VIRTUAL_DISK_VERSION enum "ulong Reserved;" & _ ; Nur bei Version1 "uint64 RestrictedOffset;" & _ ; Nur bei Version2 "uint64 RestrictedLength;" ; Nur bei Version2 Global Const $tagGET_VIRTUAL_DISK_INFO_SIZE = "dword Version;" & _ "uint64 VirtualSize;" & _ "uint64 PhysicalSize;" & _ "dword BlockSize;" & _ "dword SectorSize;" Global Const $tagGET_VIRTUAL_DISK_INFO_IDENTIFIER = "dword Version;byte Identifier[16];" ; GUID = 16 Bytes Global Const $tagGET_VIRTUAL_DISK_INFO_PARENT_LOCATION = "dword Version;bool ParentResolved;wchar ParentLocationBuffer[" & $MAX_PATH & "]" ;https://learn.microsoft.com/en-us/windows/win32/api/virtdisk/nf-virtdisk-openvirtualdisk Func _WinAPI_OpenVirtualDisk($tVIRTUAL_STORAGE_TYPE, $sPath, $VIRTUAL_DISK_ACCESS_MASK = 0, $OPEN_VIRTUAL_DISK_FLAG = 0, $tOPEN_VIRTUAL_DISK_PARAMETERS = 0) If Not FileExists($sPath) Then SetError(1, 0, 0) Local $aReturn = DllCall("VirtDisk.dll", "dword", "OpenVirtualDisk", "struct*", $tVIRTUAL_STORAGE_TYPE, "wstr", $sPath, "ulong", $VIRTUAL_DISK_ACCESS_MASK, "ulong", $OPEN_VIRTUAL_DISK_FLAG, "struct*", $tOPEN_VIRTUAL_DISK_PARAMETERS, "handle*", 0) If @error Then Return SetError(2, 0, 0) Return $aReturn[6] EndFunc ;https://learn.microsoft.com/en-us/windows/win32/api/virtdisk/nf-virtdisk-attachvirtualdisk Func _WinAPI_AttachVirtualDisk($hVD, $tSECURITY_DESCRIPTOR, $ATTACH_VIRTUAL_DISK_FLAG, $ProviderSpecificFlags, $tATTACH_VIRTUAL_DISK_PARAMETERS = Null, $tOVERLAPPED = Null) If Not $hVD Then Return SetError(1, 0, 0) Local $aReturn = DllCall("VirtDisk.dll", "dword", "AttachVirtualDisk", "handle", $hVD, "struct*", $tSECURITY_DESCRIPTOR, "ulong", $ATTACH_VIRTUAL_DISK_FLAG, "ulong", $ProviderSpecificFlags, "struct*", $tATTACH_VIRTUAL_DISK_PARAMETERS, "struct*", $tOVERLAPPED) If @error Then Return SetError(2, 0, 0) Return 1 EndFunc ;https://learn.microsoft.com/en-us/windows/win32/api/virtdisk/nf-virtdisk-detachvirtualdisk Func _WinAPI_DetachVirtualDisk($hVD, $iFlags = $DETACH_VIRTUAL_DISK_FLAG_NONE, $ProviderSpecificFlags = 0) Local $aCall = DllCall("VirtDisk.dll", "dword", "DetachVirtualDisk", "handle", $hVD, "long", $iFlags, "ulong", $ProviderSpecificFlags) If @error Then Return SetError(1, 0, 0) If $aCall[0] <> 0 Then Return SetError(2, $aCall[0], 0) Return 1 EndFunc ;https://learn.microsoft.com/de-de/windows/win32/api/virtdisk/nf-virtdisk-getvirtualdiskphysicalpath Func _WinAPI_GetVirtualDiskPhysicalPath($hVD) If Not $hVD Then Return SetError(1, 0, 0) Local $tPhysicalDrive = DllStructCreate("wchar physicalDrive[" & $MAX_PATH & "]") Local $aReturn = DllCall("VirtDisk.dll", "dword", "GetVirtualDiskPhysicalPath", "handle", $hVD, "ulong*", DllStructGetSize($tPhysicalDrive), "struct*", $tPhysicalDrive) If @error Then Return SetError(2, 0, 0) Return $tPhysicalDrive.physicalDrive EndFunc ;https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-getvolumepathnamesforvolumenamew Func _WinAPI_GetMountPointFromVolumeGUID($sGUID) Local $tBuffer = DllStructCreate("wchar path[" & $MAX_PATH & "]") Local $aRet = DllCall("kernel32.dll", "bool", "GetVolumePathNamesForVolumeNameW", "wstr", $sGUID, "struct*", $tBuffer, "dword", $MAX_PATH, "dword*", 0) If @error Or Not $aRet[0] Then Return SetError(1, 0, "") Return $tBuffer.path EndFunc Global $sISOFile = FileOpenDialog("Select an ISO file to mount", "", "ISO (*.iso)", BitOR($FD_FILEMUSTEXIST, $FD_PATHMUSTEXIST)) If @error Then Exit Global $tVIRTUAL_STORAGE_TYPE = DllStructCreate($tagVIRTUAL_STORAGE_TYPE) $tVIRTUAL_STORAGE_TYPE.DeviceId = $VIRTUAL_STORAGE_TYPE_DEVICE_ISO $tVIRTUAL_STORAGE_TYPE.VendorId = Binary("0xEC984AECA0F947E9901F71415A66345B") ;$VIRTUAL_STORAGE_TYPE_VENDOR_MICROSOFT Global $tOPEN_VIRTUAL_DISK_PARAMETERS = DllStructCreate($tagOPEN_VIRTUAL_DISK_PARAMETERS) $tOPEN_VIRTUAL_DISK_PARAMETERS.Version = $OPEN_VIRTUAL_DISK_VERSION_1 $tOPEN_VIRTUAL_DISK_PARAMETERS.RWDepth = 0 Global $tATTACH_VIRTUAL_DISK_PARAMETERS = DllStructCreate($tagATTACH_VIRTUAL_DISK_PARAMETERS) $tATTACH_VIRTUAL_DISK_PARAMETERS.Version = $ATTACH_VIRTUAL_DISK_VERSION_1 Global $hMountISO = _WinAPI_OpenVirtualDisk($tVIRTUAL_STORAGE_TYPE, _ $sISOFile, _ BitOR($VIRTUAL_DISK_ACCESS_READ, $VIRTUAL_DISK_ACCESS_ATTACH_RO), _ $OPEN_VIRTUAL_DISK_FLAG_NONE, _ $tOPEN_VIRTUAL_DISK_PARAMETERS) If Not $hMountISO Then Exit MsgBox($MB_ICONERROR, "ERROR", "Something went wrong opening ISO!") If _WinAPI_AttachVirtualDisk($hMountISO, _ 0, _ BitOR($ATTACH_VIRTUAL_DISK_FLAG_READ_ONLY, $ATTACH_VIRTUAL_DISK_FLAG_PERMANENT_LIFETIME, $ATTACH_VIRTUAL_DISK_FLAG_NO_SECURITY_DESCRIPTOR, $ATTACH_VIRTUAL_DISK_FLAG_REGISTER_VOLUME), _ 0, _ 0) Then Global $sPhysicalDrive = _WinAPI_GetVirtualDiskPhysicalPath($hMountISO) If StringRight($sPhysicalDrive, 1) <> "\" Then $sPhysicalDrive &= "\" Global $sVolumeNameGUID = _WinAPI_GetVolumeNameForVolumeMountPoint($sPhysicalDrive) If StringRight($sVolumeNameGUID, 1) <> "\" Then $sVolumeNameGUID &= "\" Global $sDrvLetter = _WinAPI_GetMountPointFromVolumeGUID($sVolumeNameGUID) MsgBox(0, "TEST ISO Mounting", "ISO mounted " & ($sDrvLetter = "" ? "but no drive letter was assigned!" : "to " & $sDrvLetter)) Else MsgBox($MB_ICONERROR, "ERROR", "Something went wrong attaching ISO!") EndIf If $hMountISO Then _WinAPI_DetachVirtualDisk($hMountISO) _WinAPI_CloseHandle($hMountISO) EndIf For some unknown reason to me, sometimes drive letter is not automatically assigned by the system although ISO is mounted. Can be checked by opening "Disk Management" -> diskmgmt.msc Edited 8 hours ago by UEZ Keketoco00 and Parsix 2 Please don't send me any personal message and ask for support! I will not reply! Selection of finest graphical examples at Codepen.io The own fart smells best! ✌Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!¯\_(ツ)_/¯ ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ
Solution Keketoco00 Posted Wednesday at 07:01 PM Author Solution Posted Wednesday at 07:01 PM 15 hours ago, argumentum said: Esse cara aqui ( https://github.com/christitustech/winutil ) faz isso. Observe o código e copie as partes que você precisa. Hi, argumentum! Thanks for your reply. I took a look and it uses PowerShell. I needed something without having to use external programs. UEZ sent exactly what I needed. 7 hours ago, UEZ said: Experimente isto: expandcollapse popup;Codificado por UEZ build 2025-06-11 beta #include <WinAPIHObj.au3> Const global $VIRTUAL_STORAGE_TYPE_VENDOR_MICROSOFT = '{EC984AEC-A0F9-47E9-901F-71415A66345B}' Const global $VIRTUAL_STORAGE_TYPE_VENDOR_UNKNOWN = '{00000000-0000-0000-0000-00000000000}' ;VIRTUAL_STORAGE_TYPE -> https://learn.microsoft.com/en-us/windows/win32/api/virtdisk/ns-virtdisk-virtual_storage_type Enumeração global $VIRTUAL_STORAGE_TYPE_DEVICE_UNKNOWN = 0 , $VIRTUAL_STORAGE_TYPE_DEVICE_ISO , $VIRTUAL_STORAGE_TYPE_DEVICE_VHD , $VIRTUAL_STORAGE_TYPE_DEVICE_VHDX ;VIRTUAL_DISK_ACCESS_MASK -> https://learn.microsoft.com/en-us/windows/win32/api/virtdisk/ne-virtdisk-virtual_disk_access_mask-r1 Enumeração global $VIRTUAL_DISK_ACCESS_NONE = 0 , $VIRTUAL_DISK_ACCESS_ATTACH_RO = 0x00010000 , $VIRTUAL_DISK_ACCESS_ATTACH_RW = 0x00020000 , $VIRTUAL_DISK_ACCESS_DETACH = 0x00040000 , _ $VIRTUAL_DISK_ACCESS_GET_INFO = 0x00080000 , $VIRTUAL_DISK_ACCESS_CREATE = 0x00100000 , $VIRTUAL_DISK_ACCESS_METAOPS = 0x00200000 , $VIRTUAL_DISK_ACCESS_READ = 0x000D0000 , _ $VIRTUAL_DISK_ACCESS_ALL = 0x003F0000 , $VIRTUAL_DISK_ACCESS_WRITABLE = 0x00320000 ;ABRIR_SINALIZADOR_DE_DISCO_VIRTUAL -> https://learn.microsoft.com/en-us/windows/win32/api/virtdisk/ne-virtdisk-open_virtual_disk_flag Enumeração global $OPEN_VIRTUAL_DISK_FLAG_NONE = 0x00000000 , $OPEN_VIRTUAL_DISK_FLAG_NO_PARENTS = 0x00000001 , $OPEN_VIRTUAL_DISK_FLAG_BLANK_FILE = 0x00000002 , $OPEN_VIRTUAL_DISK_FLAG_BOOT_DRIVE = 0x00000004 , _ $OPEN_VIRTUAL_DISK_FLAG_CACHED_IO = 0x00000008 , $OPEN_VIRTUAL_DISK_FLAG_CUSTOM_DIFF_CHAIN = 0x00000010 , $OPEN_VIRTUAL_DISK_FLAG_PARENT_CACHED_IO = 0x00000020 , $OPEN_VIRTUAL_DISK_FLAG_VHDSET_FILE_ONLY = 0x00000040 , _ $OPEN_VIRTUAL_DISK_FLAG_IGNORE_RELATIVE_PARENT_LOCATOR = 0x00000080 , $OPEN_VIRTUAL_DISK_FLAG_NO_WRITE_HARDENING = 0x00000100 , $OPEN_VIRTUAL_DISK_FLAG_SUPPORT_COMPRESSED_VOLUMES , _ $OPEN_VIRTUAL_DISK_FLAG_SUPPORT_SPARSE_FILES_ANY_FS , $OPEN_VIRTUAL_DISK_FLAG_SUPPORT_ENCRYPTED_FILES ;ATTACH_VIRTUAL_DISK_FLAG -> https://learn.microsoft.com/en-us/windows/win32/api/virtdisk/ne-virtdisk-attach_virtual_disk_flag Enumeração global $ATTACH_VIRTUAL_DISK_FLAG_NONE = 0x00000000 , $ATTACH_VIRTUAL_DISK_FLAG_READ_ONLY = 0x00000001 , $ATTACH_VIRTUAL_DISK_FLAG_NO_DRIVE_LETTER = 0x00000002 , $ATTACH_VIRTUAL_DISK_FLAG_PERMANENT_LIFETIME = 0x00000004 , _ $ATTACH_VIRTUAL_DISK_FLAG_NO_LOCAL_HOST = 0x00000008 , $ATTACH_VIRTUAL_DISK_FLAG_NO_SECURITY_DESCRIPTOR = 0x00000010 , $ATTACH_VIRTUAL_DISK_FLAG_BYPASS_DEFAULT_ENCRYPTION_POLICY = 0x00000020 , _ $ATTACH_VIRTUAL_DISK_FLAG_NON_PNP , $ATTACH_VIRTUAL_DISK_FLAG_RESTRICTED_RANGE , $ATTACH_VIRTUAL_DISK_FLAG_SINGLE_PARTITION , $ATTACH_VIRTUAL_DISK_FLAG_REGISTER_VOLUME , $ATTACH_VIRTUAL_DISK_FLAG_AT_BOOT ;ABRIR_VERSÃO_DO_DISCO_VIRTUAL -> https://learn.microsoft.com/en-us/windows/win32/api/virtdisk/ne-virtdisk-open_virtual_disk_version Enumeração global $ABRIR_VERSÃO_DO_DISCO_VIRTUAL_UNSPECIFIED = 0 , $ABRIR_VERSÃO_DO_DISCO_VIRTUAL_1 , $ABRIR_VERSÃO_DO_DISCO_VIRTUAL_2 , $ABRIR_VERSÃO_DO_DISCO_VIRTUAL_3 Enumeração global $DETACH_VIRTUAL_DISK_FLAG_NONE = 0x00000000 ;DETACH_VIRTUAL_DISK_FLAG -> https://learn.microsoft.com/en-us/windows/win32/api/virtdisk/ne-virtdisk-detach_virtual_disk_flag Const Global $tagOPEN_VIRTUAL_DISK_PARAMETERS = "versão dword;dword RWDepth" ;"Dados ulong1;Dados ushort2;Dados ushort3;Dados ubyte4[8]" ;https://learn.microsoft.com/en-us/windows/win32/api/virtdisk/ns-virtdisk-virtual_storage_type Const global $tagVIRTUAL_STORAGE_TYPE = "ulong DeviceId;byte VendorId[16]" ;https://learn.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-security_descriptor Const global $tagSECURITY_DESCRIPTOR = "byte Revisão;byte Sbz1;ushort Controle;ptr Proprietário;ptr Grupo;ptr Sacl;ptr Dacl;" ;https://learn.microsoft.com/en-us/windows/win32/api/minwinbase/ns-minwinbase-overlapped ;Constante global $tagOVERLAPPED = "ptr interno;ptr interno alto;deslocamento dword;deslocamento dword alto;ptr hEvent" ;https://learn.microsoft.com/en-us/windows/win32/api/virtdisk/ns-virtdisk-attach_virtual_disk_parameters Const global $tagATTACH_VIRTUAL_DISK_PARAMETERS = "versão do dword;" & _ ; ATTACH_VIRTUAL_DISK_VERSION enum "uint reservado;" & _ ; Apenas na versão 1 "uint64 RestrictedOffset;" & _ ; Apenas na versão 2 "uint64 RestrictedLength;" ; Apenas na versão 2 ;https://learn.microsoft.com/en-us/windows/win32/api/virtdisk/nf-virtdisk-openvirtualdisk Func _ WinAPI _ OpenVirtualDisk ( $tVIRTUAL_STORAGE_TYPE , $sPath , $VIRTUAL_DISK_ACCESS_MASK = 0 , $OPEN_VIRTUAL_DISK_FLAG = 0 , $tOPEN_VIRTUAL_DISK_PARAMETERS = 0 ) Se não FileExists ( $sPath ) , então SetError ( 1 , 0 , 0 ) Local $aReturn = DllCall ( "VirtDisk.dll" , "dword" , "OpenVirtualDisk" , "struct*" , $tVIRTUAL_STORAGE_TYPE , "wstr" , $sPath , "ulong" , $VIRTUAL_DISK_ACCESS_MASK , "ulong" , $OPEN_VIRTUAL_DISK_FLAG , "struct*" , $tOPEN_VIRTUAL_DISK_PARAMETERS , "handle*" , 0 ) Se @error , então retornar SetError ( 2 , 0 , 0 ) Retornar $aReturn [ 6 ] EndFunc ;https://learn.microsoft.com/en-us/windows/win32/api/virtdisk/nf-virtdisk-attachvirtualdisk Func _ WinAPI _ AttachVirtualDisk ( $hVD , $tSECURITY_DESCRIPTOR , $ATTACH_VIRTUAL_DISK_FLAG , $ProviderSpecificFlags , $tATTACH_VIRTUAL_DISK_PARAMETERS = Null , $tOVERLAPPED = Null ) Se não for $hVD , retorne SetError ( 1 , 0 , 0 ) Local $aReturn = DllCall ( "VirtDisk.dll" , "dword" , "AttachVirtualDisk" , "handle" , $hVD , "struct*" , $tSECURITY_DESCRIPTOR , "ulong" , $ATTACH_VIRTUAL_DISK_FLAG , "ulong" , $ProviderSpecificFlags , "struct*" , $tATTACH_VIRTUAL_DISK_PARAMETERS , "struct*" , $tOVERLAPPED ) Se @error , então retornar SetError ( 2 , 0 , 0 ) Retornar 1 EndFunc ;https://learn.microsoft.com/en-us/windows/win32/api/virtdisk/nf-virtdisk-detachvirtualdisk Func _ WinAPI _ DetachVirtualDisk ( $hVD , $iFlags = $DETACH_VIRTUAL_DISK_FLAG_NONE , $ProviderSpecificFlags = 0 ) Local $aCall = DllCall ( "VirtDisk.dll" , "dword" , "DetachVirtualDisk" , "handle" , $hVD , "long" , $iFlags , "ulong" , $ProviderSpecificFlags ) Se @error , então retorne SetError ( 1 , 0 , 0 ) Se $aCall [ 0 ] <> 0, então retorne SetError ( 2 , $aCall [ 0 ] , 0 ) Retornar 1 Fim da função Global $sISOFile = FileOpenDialog ( "Selecione um arquivo ISO para montar" , "" , "ISO (*.iso)" , BitOR ( $FD_FILEMUSTEXIST , $FD_PATHMUSTEXIST ) ) Se @error , então saia Global $tVIRTUAL_STORAGE_TYPE = DllStructCreate ( $tagVIRTUAL_STORAGE_TYPE ) $tVIRTUAL_STORAGE_TYPE . DeviceId = $VIRTUAL_STORAGE_TYPE_DEVICE_ISO $tVIRTUAL_STORAGE_TYPE . VendorId = Binário ( "0xEC984AECA0F947E9901F71415A66345B" ) ;$VIRTUAL_STORAGE_TYPE_VENDOR_MICROSOFT Global $tOPEN_VIRTUAL_DISK_PARAMETERS = DllStructCreate ( $tagOPEN_VIRTUAL_DISK_PARAMETERS ) $tOPEN_VIRTUAL_DISK_PARAMETERS . Versão = $OPEN_VIRTUAL_DISK_VERSION_1 $tOPEN_VIRTUAL_DISK_PARAMETERS . RWDepth = 0 Global $tATTACH_VIRTUAL_DISK_PARAMETERS = DllStructCreate ( $tagATTACH_VIRTUAL_DISK_PARAMETERS ) $tATTACH_VIRTUAL_DISK_PARAMETERS . Versão = $OPEN_VIRTUAL_DISK_VERSION_1 Global $hMountISO = _ WinAPI _ OpenVirtualDisk ( $tVIRTUAL_STORAGE_TYPE , $ sISOFile , _ BitOR ( $VIRTUAL_DISK_ACCESS_READ , $VIRTUAL_DISK_ACCESS_ATTACH_RO ) , $ OPEN_VIRTUAL_DISK_FLAG_NONE , $ tOPEN_VIRTUAL_DISK_PARAMETERS ) Se não for $hMountISO , saia da MsgBox ( $MB_ICONERROR , "ERROR" , "Algo deu errado ao abrir o ISO!" ) Se _ WinAPI _ AttachVirtualDisk ( $hMountISO , _ 0 , _ BitOR ( $ATTACH_VIRTUAL_DISK_FLAG_READ_ONLY , $ATTACH_VIRTUAL_DISK_FLAG_PERMANENT_LIFETIME ) , _ 0 , _ $tATTACH_VIRTUAL_DISK_PARAMETERS , então MsgBox ( $0 , "TESTE a montagem do ISO" , "ISO montado - confira o Windows Explorer" ) , senão MsgBox ( $MB_ICONERROR , "ERRO" , "Algo deu errado ao anexar o ISO!" ) EndIf Se $hMountISO Então _ WinAPI _ DetachVirtualDisk ( $hMountISO ) _ WinAPI _ CloseHandle ( $hMountISO ) EndIf Hi UEZ! Thanks for your reply. That was exactly what I needed. Thank you very much for your time! Now I'm here trying to figure out how to find the letter of the auto-mounted drive. argumentum 1
UEZ Posted Wednesday at 07:45 PM Posted Wednesday at 07:45 PM 43 minutes ago, Keketoco00 said: Now I'm here trying to figure out how to find the letter of the auto-mounted drive. You are welcome. There is a way to choose the drive letter. Maybe tomorrow I can code something. Please don't send me any personal message and ask for support! I will not reply! Selection of finest graphical examples at Codepen.io The own fart smells best! ✌Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!¯\_(ツ)_/¯ ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ
UEZ Posted Wednesday at 08:34 PM Posted Wednesday at 08:34 PM (edited) Here the version to choose the drive letter: expandcollapse popup;Coded by UEZ build 2025-06-11 beta #RequireAdmin #include <WinAPIHObj.au3> #include <WinAPIFiles.au3> Global Const $VIRTUAL_STORAGE_TYPE_VENDOR_MICROSOFT = '{EC984AEC-A0F9-47E9-901F-71415A66345B}' Global Const $VIRTUAL_STORAGE_TYPE_VENDOR_UNKNOWN = '{00000000-0000-0000-0000-000000000000}' ;VIRTUAL_STORAGE_TYPE -> https://learn.microsoft.com/en-us/windows/win32/api/virtdisk/ns-virtdisk-virtual_storage_type Global Enum $VIRTUAL_STORAGE_TYPE_DEVICE_UNKNOWN = 0, $VIRTUAL_STORAGE_TYPE_DEVICE_ISO, $VIRTUAL_STORAGE_TYPE_DEVICE_VHD, $VIRTUAL_STORAGE_TYPE_DEVICE_VHDX ;VIRTUAL_DISK_ACCESS_MASK -> https://learn.microsoft.com/en-us/windows/win32/api/virtdisk/ne-virtdisk-virtual_disk_access_mask-r1 Global Enum $VIRTUAL_DISK_ACCESS_NONE = 0, $VIRTUAL_DISK_ACCESS_ATTACH_RO = 0x00010000, $VIRTUAL_DISK_ACCESS_ATTACH_RW = 0x00020000, $VIRTUAL_DISK_ACCESS_DETACH = 0x00040000, _ $VIRTUAL_DISK_ACCESS_GET_INFO = 0x00080000, $VIRTUAL_DISK_ACCESS_CREATE = 0x00100000, $VIRTUAL_DISK_ACCESS_METAOPS = 0x00200000, $VIRTUAL_DISK_ACCESS_READ = 0x000D0000, _ $VIRTUAL_DISK_ACCESS_ALL = 0x003F0000, $VIRTUAL_DISK_ACCESS_WRITABLE = 0x00320000 ;OPEN_VIRTUAL_DISK_FLAG -> https://learn.microsoft.com/en-us/windows/win32/api/virtdisk/ne-virtdisk-open_virtual_disk_flag Global Enum $OPEN_VIRTUAL_DISK_FLAG_NONE = 0x00000000, $OPEN_VIRTUAL_DISK_FLAG_NO_PARENTS = 0x00000001, $OPEN_VIRTUAL_DISK_FLAG_BLANK_FILE = 0x00000002, $OPEN_VIRTUAL_DISK_FLAG_BOOT_DRIVE = 0x00000004, _ $OPEN_VIRTUAL_DISK_FLAG_CACHED_IO = 0x00000008, $OPEN_VIRTUAL_DISK_FLAG_CUSTOM_DIFF_CHAIN = 0x00000010, $OPEN_VIRTUAL_DISK_FLAG_PARENT_CACHED_IO = 0x00000020, $OPEN_VIRTUAL_DISK_FLAG_VHDSET_FILE_ONLY = 0x00000040, _ $OPEN_VIRTUAL_DISK_FLAG_IGNORE_RELATIVE_PARENT_LOCATOR = 0x00000080, $OPEN_VIRTUAL_DISK_FLAG_NO_WRITE_HARDENING = 0x00000100, $OPEN_VIRTUAL_DISK_FLAG_SUPPORT_COMPRESSED_VOLUMES, _ $OPEN_VIRTUAL_DISK_FLAG_SUPPORT_SPARSE_FILES_ANY_FS, $OPEN_VIRTUAL_DISK_FLAG_SUPPORT_ENCRYPTED_FILES ;ATTACH_VIRTUAL_DISK_FLAG -> https://learn.microsoft.com/en-us/windows/win32/api/virtdisk/ne-virtdisk-attach_virtual_disk_flag Global Enum $ATTACH_VIRTUAL_DISK_FLAG_NONE = 0x00000000, $ATTACH_VIRTUAL_DISK_FLAG_READ_ONLY = 0x00000001, $ATTACH_VIRTUAL_DISK_FLAG_NO_DRIVE_LETTER = 0x00000002, $ATTACH_VIRTUAL_DISK_FLAG_PERMANENT_LIFETIME = 0x00000004, _ $ATTACH_VIRTUAL_DISK_FLAG_NO_LOCAL_HOST = 0x00000008, $ATTACH_VIRTUAL_DISK_FLAG_NO_SECURITY_DESCRIPTOR = 0x00000010, $ATTACH_VIRTUAL_DISK_FLAG_BYPASS_DEFAULT_ENCRYPTION_POLICY = 0x00000020, _ $ATTACH_VIRTUAL_DISK_FLAG_NON_PNP, $ATTACH_VIRTUAL_DISK_FLAG_RESTRICTED_RANGE, $ATTACH_VIRTUAL_DISK_FLAG_SINGLE_PARTITION, $ATTACH_VIRTUAL_DISK_FLAG_REGISTER_VOLUME, $ATTACH_VIRTUAL_DISK_FLAG_AT_BOOT ;OPEN_VIRTUAL_DISK_VERSION -> https://learn.microsoft.com/en-us/windows/win32/api/virtdisk/ne-virtdisk-open_virtual_disk_version Global Enum $OPEN_VIRTUAL_DISK_VERSION_UNSPECIFIED = 0, $OPEN_VIRTUAL_DISK_VERSION_1, $OPEN_VIRTUAL_DISK_VERSION_2, $OPEN_VIRTUAL_DISK_VERSION_3 Global Enum $DETACH_VIRTUAL_DISK_FLAG_NONE = 0x00000000 ;DETACH_VIRTUAL_DISK_FLAG -> https://learn.microsoft.com/en-us/windows/win32/api/virtdisk/ne-virtdisk-detach_virtual_disk_flag Global Const $tagOPEN_VIRTUAL_DISK_PARAMETERS = "dword Version;dword RWDepth" ;"ulong Data1;ushort Data2;ushort Data3;ubyte Data4[8]" ;https://learn.microsoft.com/en-us/windows/win32/api/virtdisk/ns-virtdisk-virtual_storage_type Global Const $tagVIRTUAL_STORAGE_TYPE = "ulong DeviceId;byte VendorId[16]" ;https://learn.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-security_descriptor Global Const $tagSECURITY_DESCRIPTOR = "byte Revision;byte Sbz1;ushort Control;ptr Owner;ptr Group;ptr Sacl;ptr Dacl;" ;https://learn.microsoft.com/en-us/windows/win32/api/minwinbase/ns-minwinbase-overlapped ;Global Const $tagOVERLAPPED = "ptr Internal;ptr InternalHigh;dword Offset;dword OffsetHigh;ptr hEvent" ;https://learn.microsoft.com/en-us/windows/win32/api/virtdisk/ns-virtdisk-attach_virtual_disk_parameters Global Const $tagATTACH_VIRTUAL_DISK_PARAMETERS = "dword Version;" & _ ; ATTACH_VIRTUAL_DISK_VERSION enum "uint Reserved;" & _ ; Nur bei Version1 "uint64 RestrictedOffset;" & _ ; Nur bei Version2 "uint64 RestrictedLength;" ; Nur bei Version2 ;https://learn.microsoft.com/en-us/windows/win32/api/virtdisk/nf-virtdisk-openvirtualdisk Func _WinAPI_OpenVirtualDisk($tVIRTUAL_STORAGE_TYPE, $sPath, $VIRTUAL_DISK_ACCESS_MASK = 0, $OPEN_VIRTUAL_DISK_FLAG = 0, $tOPEN_VIRTUAL_DISK_PARAMETERS = 0) If Not FileExists($sPath) Then SetError(1, 0, 0) Local $aReturn = DllCall("VirtDisk.dll", "dword", "OpenVirtualDisk", "struct*", $tVIRTUAL_STORAGE_TYPE, "wstr", $sPath, "ulong", $VIRTUAL_DISK_ACCESS_MASK, "ulong", $OPEN_VIRTUAL_DISK_FLAG, "struct*", $tOPEN_VIRTUAL_DISK_PARAMETERS, "handle*", 0) If @error Then Return SetError(2, 0, 0) Return $aReturn[6] EndFunc ;https://learn.microsoft.com/en-us/windows/win32/api/virtdisk/nf-virtdisk-attachvirtualdisk Func _WinAPI_AttachVirtualDisk($hVD, $tSECURITY_DESCRIPTOR, $ATTACH_VIRTUAL_DISK_FLAG, $ProviderSpecificFlags, $tATTACH_VIRTUAL_DISK_PARAMETERS = Null, $tOVERLAPPED = Null) If Not $hVD Then Return SetError(1, 0, 0) Local $aReturn = DllCall("VirtDisk.dll", "dword", "AttachVirtualDisk", "handle", $hVD, "struct*", $tSECURITY_DESCRIPTOR, "ulong", $ATTACH_VIRTUAL_DISK_FLAG, "ulong", $ProviderSpecificFlags, "struct*", $tATTACH_VIRTUAL_DISK_PARAMETERS, "struct*", $tOVERLAPPED) If @error Then Return SetError(2, 0, 0) Return 1 EndFunc ;https://learn.microsoft.com/en-us/windows/win32/api/virtdisk/nf-virtdisk-detachvirtualdisk Func _WinAPI_DetachVirtualDisk($hVD, $iFlags = $DETACH_VIRTUAL_DISK_FLAG_NONE, $ProviderSpecificFlags = 0) Local $aCall = DllCall("VirtDisk.dll", "dword", "DetachVirtualDisk", "handle", $hVD, "long", $iFlags, "ulong", $ProviderSpecificFlags) If @error Then Return SetError(1, 0, 0) If $aCall[0] <> 0 Then Return SetError(2, $aCall[0], 0) Return 1 EndFunc ;https://learn.microsoft.com/de-de/windows/win32/api/virtdisk/nf-virtdisk-getvirtualdiskphysicalpath Func _WinAPI_GetVirtualDiskPhysicalPath($hVD) If Not $hVD Then Return SetError(1, 0, 0) Local $tPhysicalDrive = DllStructCreate("wchar physicalDrive[260]") Local $aReturn = DllCall("VirtDisk.dll", "dword", "GetVirtualDiskPhysicalPath", "handle", $hVD, "ulong*", DllStructGetSize($tPhysicalDrive), "struct*", $tPhysicalDrive) If @error Then Return SetError(2, 0, 0) Return $tPhysicalDrive.physicalDrive EndFunc Global $sISOFile = FileOpenDialog("Select an ISO file to mount", "", "ISO (*.iso)", BitOR($FD_FILEMUSTEXIST, $FD_PATHMUSTEXIST)) If @error Then Exit Global $tVIRTUAL_STORAGE_TYPE = DllStructCreate($tagVIRTUAL_STORAGE_TYPE) $tVIRTUAL_STORAGE_TYPE.DeviceId = $VIRTUAL_STORAGE_TYPE_DEVICE_ISO $tVIRTUAL_STORAGE_TYPE.VendorId = Binary("0xEC984AECA0F947E9901F71415A66345B") ;$VIRTUAL_STORAGE_TYPE_VENDOR_MICROSOFT Global $tOPEN_VIRTUAL_DISK_PARAMETERS = DllStructCreate($tagOPEN_VIRTUAL_DISK_PARAMETERS) $tOPEN_VIRTUAL_DISK_PARAMETERS.Version = $OPEN_VIRTUAL_DISK_VERSION_1 $tOPEN_VIRTUAL_DISK_PARAMETERS.RWDepth = 0 Global $tATTACH_VIRTUAL_DISK_PARAMETERS = DllStructCreate($tagATTACH_VIRTUAL_DISK_PARAMETERS) $tATTACH_VIRTUAL_DISK_PARAMETERS.Version = $OPEN_VIRTUAL_DISK_VERSION_1 Global $sDrvLetter = "z:\" Global $hMountISO = _WinAPI_OpenVirtualDisk($tVIRTUAL_STORAGE_TYPE, _ $sISOFile, _ BitOR($VIRTUAL_DISK_ACCESS_READ, $VIRTUAL_DISK_ACCESS_ATTACH_RO, $VIRTUAL_DISK_ACCESS_GET_INFO), _ $OPEN_VIRTUAL_DISK_FLAG_NONE, _ $tOPEN_VIRTUAL_DISK_PARAMETERS) If Not $hMountISO Then Exit MsgBox($MB_ICONERROR, "ERROR", "Something went wrong opening ISO!") If _WinAPI_AttachVirtualDisk($hMountISO, _ 0, _ BitOR($ATTACH_VIRTUAL_DISK_FLAG_READ_ONLY, $ATTACH_VIRTUAL_DISK_FLAG_PERMANENT_LIFETIME, $ATTACH_VIRTUAL_DISK_FLAG_NO_DRIVE_LETTER), _ 0, _ $tATTACH_VIRTUAL_DISK_PARAMETERS) Then Global $sPhysicalDrive = _WinAPI_GetVirtualDiskPhysicalPath($hMountISO) If StringRight($sPhysicalDrive, 1) <> "\" Then $sPhysicalDrive &= "\" Global $sVolumeNameGUID = _WinAPI_GetVolumeNameForVolumeMountPoint($sPhysicalDrive) If StringRight($sVolumeNameGUID, 1) <> "\" Then $sVolumeNameGUID &= "\" _WinAPI_SetVolumeMountPoint($sDrvLetter, $sVolumeNameGUID) MsgBox(0, "TEST ISO Mounting", "ISO mounted to drive letter " & $sDrvLetter & " - checkout Windows Explorer") Else MsgBox($MB_ICONERROR, "ERROR", "Something went wrong attaching ISO!") EndIf If $hMountISO Then _WinAPI_DeleteVolumeMountPoint($sDrvLetter) _WinAPI_DetachVirtualDisk($hMountISO) _WinAPI_CloseHandle($hMountISO) EndIf Check out variable $sDrvLetter Edited Wednesday at 08:35 PM by UEZ genius257, argumentum and ioa747 2 1 Please don't send me any personal message and ask for support! I will not reply! Selection of finest graphical examples at Codepen.io The own fart smells best! ✌Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!¯\_(ツ)_/¯ ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ
Keketoco00 Posted yesterday at 03:17 AM Author Posted yesterday at 03:17 AM 6 hours ago, UEZ said: Aqui está a versão para escolher a letra da unidade: expandcollapse popup;Codificado por UEZ build 2025-06-11 beta #RequireAdmin #include <WinAPIHObj.au3> #include <WinAPIFiles.au3> Const global $VIRTUAL_STORAGE_TYPE_VENDOR_MICROSOFT = '{EC984AEC-A0F9-47E9-901F-71415A66345B}' Const global $VIRTUAL_STORAGE_TYPE_VENDOR_UNKNOWN = '{00000000-0000-0000-0000-00000000000}' ;VIRTUAL_STORAGE_TYPE -> https://learn.microsoft.com/en-us/windows/win32/api/virtdisk/ns-virtdisk-virtual_storage_type Enumeração global $VIRTUAL_STORAGE_TYPE_DEVICE_UNKNOWN = 0 , $VIRTUAL_STORAGE_TYPE_DEVICE_ISO , $VIRTUAL_STORAGE_TYPE_DEVICE_VHD , $VIRTUAL_STORAGE_TYPE_DEVICE_VHDX ;VIRTUAL_DISK_ACCESS_MASK -> https://learn.microsoft.com/en-us/windows/win32/api/virtdisk/ne-virtdisk-virtual_disk_access_mask-r1 Enumeração global $VIRTUAL_DISK_ACCESS_NONE = 0 , $VIRTUAL_DISK_ACCESS_ATTACH_RO = 0x00010000 , $VIRTUAL_DISK_ACCESS_ATTACH_RW = 0x00020000 , $VIRTUAL_DISK_ACCESS_DETACH = 0x00040000 , _ $VIRTUAL_DISK_ACCESS_GET_INFO = 0x00080000 , $VIRTUAL_DISK_ACCESS_CREATE = 0x00100000 , $VIRTUAL_DISK_ACCESS_METAOPS = 0x00200000 , $VIRTUAL_DISK_ACCESS_READ = 0x000D0000 , _ $VIRTUAL_DISK_ACCESS_ALL = 0x003F0000 , $VIRTUAL_DISK_ACCESS_WRITABLE = 0x00320000 ;OPEN_VIRTUAL_DISK_FLAG -> https://learn.microsoft.com/en-us/windows/win32/api/virtdisk/ne-virtdisk-open_virtual_disk_flag Global Enum $OPEN_VIRTUAL_DISK_FLAG_NONE = 0x00000000, $OPEN_VIRTUAL_DISK_FLAG_NO_PARENTS = 0x00000001, $OPEN_VIRTUAL_DISK_FLAG_BLANK_FILE = 0x00000002, $OPEN_VIRTUAL_DISK_FLAG_BOOT_DRIVE = 0x00000004, _ $OPEN_VIRTUAL_DISK_FLAG_CACHED_IO = 0x00000008, $OPEN_VIRTUAL_DISK_FLAG_CUSTOM_DIFF_CHAIN = 0x00000010, $OPEN_VIRTUAL_DISK_FLAG_PARENT_CACHED_IO = 0x00000020, $OPEN_VIRTUAL_DISK_FLAG_VHDSET_FILE_ONLY = 0x00000040, _ $OPEN_VIRTUAL_DISK_FLAG_IGNORE_RELATIVE_PARENT_LOCATOR = 0x00000080, $OPEN_VIRTUAL_DISK_FLAG_NO_WRITE_HARDENING = 0x00000100, $OPEN_VIRTUAL_DISK_FLAG_SUPPORT_COMPRESSED_VOLUMES, _ $OPEN_VIRTUAL_DISK_FLAG_SUPPORT_SPARSE_FILES_ANY_FS, $OPEN_VIRTUAL_DISK_FLAG_SUPPORT_ENCRYPTED_FILES ;ATTACH_VIRTUAL_DISK_FLAG -> https://learn.microsoft.com/en-us/windows/win32/api/virtdisk/ne-virtdisk-attach_virtual_disk_flag Global Enum $ATTACH_VIRTUAL_DISK_FLAG_NONE = 0x00000000, $ATTACH_VIRTUAL_DISK_FLAG_READ_ONLY = 0x00000001, $ATTACH_VIRTUAL_DISK_FLAG_NO_DRIVE_LETTER = 0x00000002, $ATTACH_VIRTUAL_DISK_FLAG_PERMANENT_LIFETIME = 0x00000004, _ $ATTACH_VIRTUAL_DISK_FLAG_NO_LOCAL_HOST = 0x00000008, $ATTACH_VIRTUAL_DISK_FLAG_NO_SECURITY_DESCRIPTOR = 0x00000010, $ATTACH_VIRTUAL_DISK_FLAG_BYPASS_DEFAULT_ENCRYPTION_POLICY = 0x00000020, _ $ATTACH_VIRTUAL_DISK_FLAG_NON_PNP, $ATTACH_VIRTUAL_DISK_FLAG_RESTRICTED_RANGE, $ATTACH_VIRTUAL_DISK_FLAG_SINGLE_PARTITION, $ATTACH_VIRTUAL_DISK_FLAG_REGISTER_VOLUME, $ATTACH_VIRTUAL_DISK_FLAG_AT_BOOT ;OPEN_VIRTUAL_DISK_VERSION -> https://learn.microsoft.com/en-us/windows/win32/api/virtdisk/ne-virtdisk-open_virtual_disk_version Global Enum $OPEN_VIRTUAL_DISK_VERSION_UNSPECIFIED = 0, $OPEN_VIRTUAL_DISK_VERSION_1, $OPEN_VIRTUAL_DISK_VERSION_2, $OPEN_VIRTUAL_DISK_VERSION_3 Global Enum $DETACH_VIRTUAL_DISK_FLAG_NONE = 0x00000000 ;DETACH_VIRTUAL_DISK_FLAG -> https://learn.microsoft.com/en-us/windows/win32/api/virtdisk/ne-virtdisk-detach_virtual_disk_flag Global Const $tagOPEN_VIRTUAL_DISK_PARAMETERS = "dword Version;dword RWDepth" ;"ulong Data1;ushort Data2;ushort Data3;ubyte Data4[8]" ;https://learn.microsoft.com/en-us/windows/win32/api/virtdisk/ns-virtdisk-virtual_storage_type Global Const $tagVIRTUAL_STORAGE_TYPE = "ulong DeviceId;byte VendorId[16]" ;https://learn.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-security_descriptor Global Const $tagSECURITY_DESCRIPTOR = "byte Revision;byte Sbz1;ushort Control;ptr Owner;ptr Group;ptr Sacl;ptr Dacl;" ;https://learn.microsoft.com/en-us/windows/win32/api/minwinbase/ns-minwinbase-overlapped ;Global Const $tagOVERLAPPED = "ptr Internal;ptr InternalHigh;dword Offset;dword OffsetHigh;ptr hEvent" ;https://learn.microsoft.com/en-us/windows/win32/api/virtdisk/ns-virtdisk-attach_virtual_disk_parameters Global Const $tagATTACH_VIRTUAL_DISK_PARAMETERS = "dword Version;" & _ ; ATTACH_VIRTUAL_DISK_VERSION enum "uint Reserved;" & _ ; Nur bei Version1 "uint64 RestrictedOffset;" & _ ; Nur bei Version2 "uint64 RestrictedLength;" ; Nur bei Version2 ;https://learn.microsoft.com/en-us/windows/win32/api/virtdisk/nf-virtdisk-openvirtualdisk Func _ WinAPI _ OpenVirtualDisk ( $tVIRTUAL_STORAGE_TYPE , $sPath , $VIRTUAL_DISK_ACCESS_MASK = 0 , $OPEN_VIRTUAL_DISK_FLAG = 0 , $tOPEN_VIRTUAL_DISK_PARAMETERS = 0 ) Se não FileExists ( $sPath ) , então SetError ( 1 , 0 , 0 ) Local $aReturn = DllCall ( "VirtDisk.dll" , "dword" , "OpenVirtualDisk" , "struct*" , $tVIRTUAL_STORAGE_TYPE , "wstr" , $sPath , "ulong" , $VIRTUAL_DISK_ACCESS_MASK , "ulong" , $OPEN_VIRTUAL_DISK_FLAG , "struct*" , $tOPEN_VIRTUAL_DISK_PARAMETERS , "handle*" , 0 ) Se @error , então retornar SetError ( 2 , 0 , 0 ) Retornar $aReturn [ 6 ] EndFunc ;https://learn.microsoft.com/en-us/windows/win32/api/virtdisk/nf-virtdisk-attachvirtualdisk Func _ WinAPI _ AttachVirtualDisk ( $hVD , $tSECURITY_DESCRIPTOR , $ATTACH_VIRTUAL_DISK_FLAG , $ProviderSpecificFlags , $tATTACH_VIRTUAL_DISK_PARAMETERS = Null , $tOVERLAPPED = Null ) Se não for $hVD , retorne SetError ( 1 , 0 , 0 ) Local $aReturn = DllCall ( "VirtDisk.dll" , "dword" , "AttachVirtualDisk" , "handle" , $hVD , "struct*" , $tSECURITY_DESCRIPTOR , "ulong" , $ATTACH_VIRTUAL_DISK_FLAG , "ulong" , $ProviderSpecificFlags , "struct*" , $tATTACH_VIRTUAL_DISK_PARAMETERS , "struct*" , $tOVERLAPPED ) Se @error , então retornar SetError ( 2 , 0 , 0 ) Retornar 1 EndFunc ;https://learn.microsoft.com/en-us/windows/win32/api/virtdisk/nf-virtdisk-detachvirtualdisk Func _ WinAPI _ DetachVirtualDisk ( $hVD , $iFlags = $DETACH_VIRTUAL_DISK_FLAG_NONE , $ProviderSpecificFlags = 0 ) Local $aCall = DllCall ( "VirtDisk.dll" , "dword" , "DetachVirtualDisk" , "handle" , $hVD , "long" , $iFlags , "ulong" , $ProviderSpecificFlags ) Se @error , então retorne SetError ( 1 , 0 , 0 ) Se $aCall [ 0 ] <> 0, então retorne SetError ( 2 , $aCall [ 0 ] , 0 ) Retornar 1 Fim da função ;https://learn.microsoft.com/de-de/windows/win32/api/virtdisk/nf-virtdisk-getvirtualdiskphysicalpath Func _ WinAPI _ GetVirtualDiskPhysicalPath ( $hVD ) Se não for $hVD , então retorne SetError ( 1 , 0 , 0 ) Local $tPhysicalDrive = DllStructCreate ( "wchar physicalDrive[260]" ) Local $aReturn = DllCall ( "VirtDisk.dll" , "dword" , "GetVirtualDiskPhysicalPath" , "handle" , $hVD , "ulong*" , DllStructGetSize ( $tPhysicalDrive ) , "struct*" , $tPhysicalDrive ) Se @error , então retorne SetError ( 2 , 0 , 0 ) Retornar $tPhysicalDrive . physicalDrive EndFunc Global $sISOFile = FileOpenDialog ( "Selecione um arquivo ISO para montar" , "" , "ISO (*.iso)" , BitOR ( $FD_FILEMUSTEXIST , $FD_PATHMUSTEXIST ) ) Se @error , então saia Global $tVIRTUAL_STORAGE_TYPE = DllStructCreate ( $tagVIRTUAL_STORAGE_TYPE ) $tVIRTUAL_STORAGE_TYPE . DeviceId = $VIRTUAL_STORAGE_TYPE_DEVICE_ISO $tVIRTUAL_STORAGE_TYPE . VendorId = Binário ( "0xEC984AECA0F947E9901F71415A66345B" ) ;$VIRTUAL_STORAGE_TYPE_VENDOR_MICROSOFT Global $tOPEN_VIRTUAL_DISK_PARAMETERS = DllStructCreate ( $tagOPEN_VIRTUAL_DISK_PARAMETERS ) $tOPEN_VIRTUAL_DISK_PARAMETERS . Versão = $OPEN_VIRTUAL_DISK_VERSION_1 $tOPEN_VIRTUAL_DISK_PARAMETERS . RWDepth = 0 Global $tATTACH_VIRTUAL_DISK_PARAMETERS = DllStructCreate ( $tagATTACH_VIRTUAL_DISK_PARAMETERS ) $tATTACH_VIRTUAL_DISK_PARAMETERS . Versão = $OPEN_VIRTUAL_DISK_VERSION_1 Global $sDrvLetter = "z:\" Global $hMountISO = _ WinAPI _ OpenVirtualDisk ( $tVIRTUAL_STORAGE_TYPE , $ sISOFile , _ BitOR ( $VIRTUAL_DISK_ACCESS_READ , $VIRTUAL_DISK_ACCESS_ATTACH_RO , $VIRTUAL_DISK_ACCESS_GET_INFO ) , $ OPEN_VIRTUAL_DISK_FLAG_NONE , $ tOPEN_VIRTUAL_DISK_PARAMETERS . Se não for $hMountISO , saia da MsgBox ( $MB_ICONERROR , "ERROR" , "Algo deu errado ao abrir o ISO!" ) Se _ WinAPI _ AttachVirtualDisk ( $hMountISO , _ 0 , _ BitOR ( $ATTACH_VIRTUAL_DISK_FLAG_READ_ONLY , $ATTACH_VIRTUAL_DISK_FLAG_PERMANENT_LIFETIME , $ATTACH_VIRTUAL_DISK_FLAG_NO_DRIVE_LETTER ) , _ 0 , _ $tATTACH_VIRTUAL_DISK_PARAMETERS ) Então Global $sPhysicalDrive = _ WinAPI _ GetVirtualDiskPhysicalPath ( $hMountISO ) Se StringRight ( $sPhysicalDrive , 1 ) <> "\" Então $sPhysicalDrive &= "\" Global $sVolumeNameGUID = _ WinAPI _ GetVolumeNameForVolumeMountPoint ( $sPhysicalDrive ) Se StringRight ( $sVolumeNameGUID , 1 ) <> "\" Então $sVolumeNameGUID &= "\" _ WinAPI _ SetVolumeMountPoint ( $sDrvLetter , $sVolumeNameGUID ) MsgBox ( 0 , "TESTE de montagem ISO" , "ISO montado na letra da unidade" & $sDrvLetter & "- verificar o Windows Explorer" ) Senão MsgBox ( $MB_ICONERROR , "ERRO" , "Algo deu errado ao anexar o ISO!" ) EndIf Se $hMountISO Então _ WinAPI _ DeleteVolumeMountPoint ( $sDrvLetter ) _ WinAPI _ DetachVirtualDisk ( $hMountISO ) _ WinAPI _ CloseHandle ( $hMountISO ) FimSe Verifique a variável $sDrvLetter Very good! I added some code that filters the available lyrics, which I found on Musashi. It turned out exactly as I wanted. Once again, thank you very much for your work and your time. Thank you! Just one question: is it possible to know if the ISO is already mounted so that I don't have to mount it again?
UEZ Posted yesterday at 06:47 AM Posted yesterday at 06:47 AM 3 hours ago, Keketoco00 said: is it possible to know if the ISO is already mounted so that I don't have to mount it again? Yes, it is - homework for you, check out _WinAPI_GetFinalPathNameByHandleEx() function. 🙂 Please don't send me any personal message and ask for support! I will not reply! Selection of finest graphical examples at Codepen.io The own fart smells best! ✌Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!¯\_(ツ)_/¯ ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ
Keketoco00 Posted yesterday at 05:17 PM Author Posted yesterday at 05:17 PM (edited) 11 hours ago, UEZ said: Sim, é isso mesmo. Lição de casa para você: confira a função _WinAPI_GetFinalPathNameByHandleEx(). 🙂 Hello again, UEZ! I don't have much knowledge yet, I only discovered AutoIt a week ago. I checked the _WinAPI_GetFinalPathNameByHandleEx function, but I don't understand which path I should put in the _WinAPI_CreateFile function. Local $hFile = _WinAPI_CreateFile(@ScriptFullPath, 2, 0, 6) ;Here I should put $sPhysicalDrive or $sVolumeNameGUID or neither ConsoleWrite(_WinAPI_GetFinalPathNameByHandleEx($hFile) & @CRLF) Edited yesterday at 06:36 PM by Keketoco00
UEZ Posted 23 hours ago Posted 23 hours ago (edited) This is more complicated than I thought. I have not found a way to read the path of the mounted ISO file via the WinAPI - only PowerShell: Get-Volume -DriveLetter Z | ForEach-Object { Get-DiskImage -DevicePath ($_.Path -replace '\\$','') } | Select-Object -ExpandProperty ImagePath Maybe WMI is also possible. Example: ;Coded by UEZ Global $sPath2ISO = "<path to your iso file>" MsgBox(0, "Test", $sPath2ISO & " already mounted: " & _IsISOFileMounted($sPath2ISO)) Func RunStdoutPS($sDrv) Local $sCmd = "powershell -NoProfile -Command Get-Volume -DriveLetter " & $sDrv & " | ForEach-Object { Get-DiskImage -DevicePath ($_.Path -replace '\\$','') } | Select-Object -ExpandProperty ImagePath" Local $tPipe = ObjCreate("WScript.Shell").Exec($sCmd) Local $sOutput = "" While Not $tPipe.StdOut.AtEndOfStream $sOutput &= $tPipe.StdOut.ReadLine() Sleep(10) WEnd Return $sOutput EndFunc Func _IsISOFileMounted($sISOPath) Local $aDrives = DriveGetDrive("CDROM"), $sVolumePath, $sDrive, $sResult If @error Then Return False For $i = 1 To $aDrives[0] $sDrive = $aDrives[$i] & "\" $sResult = RunStdoutPS($sDrive) If StringInStr($sResult, $sISOPath) = 1 Then Return 1 Next Return 0 EndFunc Edited 22 hours ago by UEZ Keketoco00 1 Please don't send me any personal message and ask for support! I will not reply! Selection of finest graphical examples at Codepen.io The own fart smells best! ✌Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!¯\_(ツ)_/¯ ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ
Keketoco00 Posted 1 hour ago Author Posted 1 hour ago 22 hours ago, UEZ said: Isso é mais complicado do que eu pensava. Não encontrei uma maneira de ler o caminho do arquivo ISO montado via WinAPI — apenas o PowerShell: Obter - Volume - Letra da Unidade Z | Para Cada - Objeto { Obter - Imagem de Disco - Caminho do Dispositivo ( $_ . Caminho - substituir '\\$' , '' ) } | Selecionar - Objeto - Expandir Propriedade Caminho da Imagem Talvez o WMI também seja possível. Exemplo: ;Codificado por UEZ Global $sPath2ISO = "<caminho para seu arquivo iso>" MsgBox ( 0 , "Teste" , $sPath2ISO & " já montado: " & _ IsISOFileMounted ( $sPath2ISO ) ) Func RunStdoutPS ( $sDrv ) Local $sCmd = "powershell -NoProfile -Command Get-Volume -DriveLetter " & $sDrv & " | ForEach-Object { Get-DiskImage -DevicePath ($_.Path -replace '\\$','') } | Select-Object -ExpandProperty ImagePath" Local $tPipe = ObjCreate ( "WScript.Shell" ) . Exec ( $sCmd ) Local $sOutput = "" While Not $tPipe . StdOut . AtEndOfStream $sOutput &= $tPipe . StdOut . ReadLine ( ) Sleep ( 10 ) WEnd Return $sOutput EndFunc Func _ IsISOFileMounted ( $sISOPath ) Local $aDrives = DriveGetDrive ( "CDROM" ) , $sVolumePath , $sDrive , $sResult Se @error Então Retorna Falso Para $i = 1 Para $aDrives [ 0 ] $sDrive = $aDrives [ $i ] & "\" $sResult = RunStdoutPS ( $sDrive ) Se StringInStr ( $sResult , $sISOPath ) = 1 Então Retorna 1 Próximo Retorna 0 Fim da função Thanks again! I'm going to skip this part, as I thought it would be easier. I'd like something that doesn't require calling an external program to do this. With PowerShell, it would take a while to load the images. And it would only work on 10 and 11. This wouldn't change much, it would just be a smarter way to mount an ISO. You've already helped me a lot. Thanks.
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