이녁 하늘 아래

Mount ISO _ 오토잇 소스 본문

Autoit3 및 PureBASIC

Mount ISO _ 오토잇 소스

이녁 2025. 7. 25. 08:28

 

 

스크립트 오토잇3 소스입니다.

 

;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

 

 

출처 : 

 

 

Comments