Jump to content

How can I mount an iso image with autoit?


Go to solution Solved by Keketoco00,

Recommended Posts

Posted

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!

Posted (edited)

Try this:

;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 by UEZ

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
Posted
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:

;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.

Posted
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!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

Posted (edited)

Here the version to choose the drive letter:

;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 by UEZ

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!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

Posted
6 hours ago, UEZ said:

Aqui está a versão para escolher a letra da unidade:

;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?

Posted
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!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

Posted (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 by Keketoco00
Posted (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 by UEZ

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!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

Posted
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.

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...