Jump to content

ISO Creator v1.16 build 2015-07-13 beta


UEZ
 Share

Recommended Posts

Updated to v1.0.0 before I leave soon to vacation. :)

If you are still interested into this topic look to 1st post for more details.

Br,

UEZ

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

Link to comment
Share on other sites

  • Replies 76
  • Created
  • Last Reply

Top Posters In This Topic

Hi and thank you for the update.

Hopefully by the time you get back from vacation I may have some more functions you can add.

Make it so you dump Audio CD (to bin/cue or wave), UDF and other formats to iso.

All using autoit and native windows (still trying to make the code modular).

Further on maybe add burn iso or bin/cue to cd/dvd (still working on that).

Have a good time on vacation.

Cheers

Link to comment
Share on other sites

Hi again,

Here's a proof of concept for ripping a CDDA Audio CD to bin/cue image using $IOCTL_SCSI_PASS_THROUGH_DIRECT.

It's not perfect, but it should give you some insight into adding dumping an audio cd to your program :)

- Works under NT/W2K/XP and requires administrative privileges!

- Be aware it will overwrite an already existing bin/cue with the same name.

(I've only tested on XP x86)

#include <WinAPI.au3>

Opt("MustDeclareVars", 1)

Global $iAbort = 0

HotKeySet("{ESC}", "_Abort")


_SPTI_RIP_AUDIO_CD_TO_BIN_CUE("d:")
Switch @error
    Case -1
        ConsoleWrite("ERROR -1: Failed to open the CDRom drive." & @LF)
    Case -2
        ConsoleWrite("ERROR -2: Failed to create the output bin file." & @LF)
    Case -3
        ConsoleWrite("ERROR -3: Failed to create the output cue file" & @LF)
    Case 1
        ConsoleWrite("ERROR 1: _WinAPI_DeviceIoControl failed to read CD TOC." & @LF)
        ConsoleWrite("_WinAPI_GetLastErrorMessage: " & _WinAPI_GetLastErrorMessage())
    Case 2
        ConsoleWrite("ERROR 2: Invalid sector count when trying to calculate total sectors." & @LF)
    Case 3
        ConsoleWrite("ERROR 3: _WinAPI_DeviceIoControl failed to read a sector." & @LF)
        ConsoleWrite("_WinAPI_GetLastErrorMessage: " & _WinAPI_GetLastErrorMessage())
    Case 4
        ConsoleWrite("ERROR 4: Aborted by user." & @LF)
    Case 0
        ;;; Success hopefully ...lol
EndSwitch

; -[_SPTI_RIP_AUDIO_CD_TO_BIN_CUE]------------------------------------------------------------------------------------
;
;
;   $sDrive            -  CD drive letter with no trailing back slashes(eg: "d:")
;   $sOutPutCueBinName -  Path/Name for output file, no file extension needed(eg: "MyAudioCD" or "Your:\Path\MyAudioCD")
;                         Default witout a path will be created in the script dir.
;
;   Success - Returns 1 and @error 0
;   Failure - Returns 0 and @erroras follows;
;             @error -1 Failed to open the CDRom drive.
;             @error -2 Failed to file open the output bin.
;             @error -3 Failed to file open the output cue.
;             @error 1 _WinAPI_DeviceIoControl failed to read CD TOC, call _WinAPI_GetLastErrorMessage()to see what happened.
;             @error 2 Invalid sector count when trying to calculate total sectors.
;             @error 3 _WinAPI_DeviceIoControl failed to read a sector, call _WinAPI_GetLastErrorMessage()to see what happened.
;             @error 4 Aborted by user.
;  NOTE:
;        - Works under NT/W2K/XP and requires administrative privileges!
;        - 64 K is the max buffer size for ripping sectors!
; -------------------------------------------------------------------------
Func _SPTI_RIP_AUDIO_CD_TO_BIN_CUE($sDrive, $sOutPutCueBinName = "Audio_CD")
    Local Const $IOCTL_CDROM_READ_TOC = 0x00024000
    Local Const $IOCTL_SCSI_PASS_THROUGH_DIRECT = 0x0004D014
    Local Const $SCSI_IOCTL_DATA_IN = 1
    Local Const $CDB_RAW_READ_CMD = 0xBE
    Local Const $CDB_WHATS_READ = 0xF8
    Local Const $iSector = 2352 ; CDDA Sector Size in bytes
    Local Const $tag_CDROM_TOC = _
            "BYTE Length[2];" & _
            "BYTE FirstTrack;" & _
            "BYTE LastTrack;" & _
            "BYTE TrackData[800]";This should hold 100 * 8 bytes, each 8 bytes represent a track toc

    Local Const $tag_SCSI_PASS_THROUGH_DIRECT = _
            "USHORT Length;" & _
            "BYTE ScsiStatus;" & _
            "BYTE PathId;" & _
            "BYTE TargetId;" & _
            "BYTE Lun;" & _
            "BYTE CdbLength;" & _
            "BYTE SenseInfoLength;" & _
            "BYTE DataIn;" & _
            "ULONG DataTransferLength;" & _
            "ULONG TimeOutValue;" & _
            "PTR DataBuffer;" & _
            "ULONG SenseInfoOffset;" & _
            "BYTE Cdb[16]"

    Local $hCD, $hFO, $tCDTOC, $tBuffer, $tSRB, $iReturn, $iTD, $iMS
    Local $iStart = TimerInit(), $iSecDone = 0
    Local $iTotalSectors = 0, $iTotalSectorsStart, $iStepSectors = 25

    ; Open CDROM to read from
    $hCD = _WinAPI_CreateFile("\\.\" & $sDrive, 2, 6, 6)
    If Not $hCD Then Return SetError(-1, 0, 0)

    ; Open output bin file to write to.
    $hFO = FileOpen($sOutPutCueBinName & ".bin", 18)
    If $hFO = -1 Then
        _WinAPI_CloseHandle($hCD)
        Return SetError(-2, 0, 0)
    EndIf

    ; Read the CDROM TOC
    $tCDTOC = DllStructCreate($tag_CDROM_TOC)
    DllStructSetData($tCDTOC, "Length", DllStructGetSize($tCDTOC))
    $iReturn = _WinAPI_DeviceIoControl($hCD, $IOCTL_CDROM_READ_TOC, 0, 0, DllStructGetPtr($tCDTOC), DllStructGetSize($tCDTOC))
    If Not $iReturn Then
        _WinAPI_CloseHandle($hCD)
        FileClose($hFO)
        FileDelete($sOutPutCueBinName & ".bin")
        Return SetError(1, 0, 0)
    EndIf

    ; Calculate how many sectors the Audio CD has by reading the last lead out track toc.
    $iTotalSectors = BinaryMid(DllStructGetData($tCDTOC, "TrackData"), 8 * DllStructGetData($tCDTOC, "LastTrack") + 6, 3)
    $iTotalSectors = Int(BinaryMid($iTotalSectors, 1, 1)) * 75 * 60 + Int(BinaryMid($iTotalSectors, 2, 1)) * 75 + Int(BinaryMid($iTotalSectors, 3, 1)) - 150
    If $iTotalSectors < 300 Then ; Minimum Sectors to Audio CD 300 Sectors = 4 Seconds (the first track starts after 150 sectors)
        _WinAPI_CloseHandle($hCD)
        FileClose($hFO)
        FileDelete($sOutPutCueBinName & ".bin")
        $tCDTOC = 0
        Return SetError(2, 0, 0)
    EndIf
    ; Doing this in case $iTotalSectors is not evenly dividable by $iStepSectors
    $iTotalSectorsStart = Floor($iTotalSectors / $iStepSectors) * $iStepSectors


    ; This is not needed, I'm using this to update a tooltip with info.
    $iTD = TimerDiff($iStart)
    ToolTip(StringFormat("Copying From: %s To %s", $sDrive, $sOutPutCueBinName & ".bin") & @LF & _
            StringFormat("Sectors Copied: %d of %d", $iSecDone, $iTotalSectors) & @LF & _
            StringFormat('Time Elapsed: %02d:%02d', Mod($iTD / 1000, 3600) / 60, Mod(Mod($iTD / 1000, 3600), 60)) & @LF & @LF & _
            'Press "Esc" to Abort', @DesktopWidth / 2, @DesktopHeight / 2, "", 0, 2)

    ; Create the output buffer (2352 * 25 = 58800 bytes) and the SRB struct we pass to DeviceIoControl.
    $tBuffer = DllStructCreate("byte[" & $iSector * $iStepSectors & "]")
    $tSRB = DllStructCreate($tag_SCSI_PASS_THROUGH_DIRECT)
    DllStructSetData($tSRB, "Length", DllStructGetSize($tSRB))
    DllStructSetData($tSRB, "PathId", 0)
    DllStructSetData($tSRB, "TargetId", 0)
    DllStructSetData($tSRB, "Lun", 0)
    DllStructSetData($tSRB, "CdbLength", 12)
    DllStructSetData($tSRB, "SenseInfoLength", 0)
    DllStructSetData($tSRB, "DataIn", $SCSI_IOCTL_DATA_IN)
    DllStructSetData($tSRB, "DataTransferLength", $iSector * $iStepSectors)
    DllStructSetData($tSRB, "TimeOutValue", 200)
    DllStructSetData($tSRB, "DataBuffer", DllStructGetPtr($tBuffer))
    DllStructSetData($tSRB, "SenseInfoOffset", 0)
    DllStructSetData($tSRB, "Cdb", $CDB_RAW_READ_CMD, 1)
    DllStructSetData($tSRB, "Cdb", 0x0, 2)
    DllStructSetData($tSRB, "Cdb", _LoByte(_WinAPI_HiWord($iStepSectors)), 7)
    DllStructSetData($tSRB, "Cdb", _HiByte(_WinAPI_LoWord($iStepSectors)), 8)
    DllStructSetData($tSRB, "Cdb", _LoByte(_WinAPI_LoWord($iStepSectors)), 9)
    DllStructSetData($tSRB, "Cdb", $CDB_WHATS_READ, 10)
    DllStructSetData($tSRB, "Cdb", 0, 11)
    DllStructSetData($tSRB, "Cdb", 0, 12)

    ; Loop through the amount of sectors at 25 sectors per loop (sectors start at 0 and the last sector is $iTotalSectors - 1)
    For $i = 0 To $iTotalSectorsStart - 1 Step $iStepSectors

        ; Set the Sector offset of where we are ripping from
        DllStructSetData($tSRB, "Cdb", _HiByte(_WinAPI_HiWord($i)), 3)
        DllStructSetData($tSRB, "Cdb", _LoByte(_WinAPI_HiWord($i)), 4)
        DllStructSetData($tSRB, "Cdb", _HiByte(_WinAPI_LoWord($i)), 5)
        DllStructSetData($tSRB, "Cdb", _LoByte(_WinAPI_LoWord($i)), 6)

        ; Pass the srb struct to DeviceIoControl and then write the contents ofthe buffer the bin file.
        $iReturn = _WinAPI_DeviceIoControl($hCD, $IOCTL_SCSI_PASS_THROUGH_DIRECT, DllStructGetPtr($tSRB), DllStructGetSize($tSRB), DllStructGetPtr($tSRB), 0)
        If Not $iReturn Or Not FileWrite($hFO, DllStructGetData($tBuffer, 1)) Then
            _WinAPI_CloseHandle($hCD)
            FileClose($hFO)
            FileDelete($sOutPutCueBinName & ".bin")
            $tCDTOC = 0
            $tBuffer = 0
            $tSRB = 0
            Return SetError(3, 0, 0)
        EndIf

        ; This is not needed, I'm using this to update a tooltip with info.
        $iSecDone += $iStepSectors
        $iTD = TimerDiff($iStart)
        ToolTip(StringFormat("Copying From: %s To %s", $sDrive, $sOutPutCueBinName & ".bin") & @LF & _
                StringFormat("Sectors Copied: %d of %d", $iSecDone, $iTotalSectors) & @LF & _
                StringFormat('Time Elapsed: %02d:%02d', Mod($iTD / 1000, 3600) / 60, Mod(Mod($iTD / 1000, 3600), 60)) & @LF & @LF & _
                'Press "Esc" to Abort', @DesktopWidth / 2, @DesktopHeight / 2, "", 0, 2)

        ; Give the user a chance to Abort.
        If $iAbort Then
            _WinAPI_CloseHandle($hCD)
            FileClose($hFO)
            FileDelete($sOutPutCueBinName & ".bin")
            $tCDTOC = 0
            $tBuffer = 0
            $tSRB = 0
            Return SetError(4, 0, 0)
        EndIf
    Next

    ; This will catch the sectors that that are less then $iStepSectors
    If $iTotalSectors > $iTotalSectorsStart Then

        ; Recreate the output buffer as it's now only needed as 1 sector size (2352 bytes)
        $tBuffer = 0
        $tBuffer = DllStructCreate("byte[" & $iSector & "]")

        ; Update the SRB struct
        DllStructSetData($tSRB, "DataTransferLength", $iSector)
        DllStructSetData($tSRB, "DataBuffer", DllStructGetPtr($tBuffer))
        DllStructSetData($tSRB, "Cdb", _LoByte(_WinAPI_HiWord(1)), 7)
        DllStructSetData($tSRB, "Cdb", _HiByte(_WinAPI_LoWord(1)), 8)
        DllStructSetData($tSRB, "Cdb", _LoByte(_WinAPI_LoWord(1)), 9)

        ; Loop through the last sectors 1 at a time.
        For $i = $iTotalSectorsStart To $iTotalSectors - 1
            DllStructSetData($tSRB, "Cdb", _HiByte(_WinAPI_HiWord($i)), 3)
            DllStructSetData($tSRB, "Cdb", _LoByte(_WinAPI_HiWord($i)), 4)
            DllStructSetData($tSRB, "Cdb", _HiByte(_WinAPI_LoWord($i)), 5)
            DllStructSetData($tSRB, "Cdb", _LoByte(_WinAPI_LoWord($i)), 6)

            ; Pass the srb struct to DeviceIoControl and then write the contents ofthe buffer the bin file.
            $iReturn = _WinAPI_DeviceIoControl($hCD, $IOCTL_SCSI_PASS_THROUGH_DIRECT, DllStructGetPtr($tSRB), DllStructGetSize($tSRB), DllStructGetPtr($tSRB), 0)
            If Not $iReturn Or Not FileWrite($hFO, DllStructGetData($tBuffer, 1)) Then
                _WinAPI_CloseHandle($hCD)
                FileClose($hFO)
                FileDelete($sOutPutCueBinName & ".bin")
                $tCDTOC = 0
                $tBuffer = 0
                $tSRB = 0
                Return SetError(3, 0, 0)
            EndIf

            ; This is not needed, I'm using this to update a tooltip with info.
            $iSecDone += 1
            $iTD = TimerDiff($iStart)
            ToolTip(StringFormat("Copying From: %s To %s", $sDrive, $sOutPutCueBinName & ".bin") & @LF & _
                    StringFormat("Sectors Copied: %d of %d", $iSecDone, $iTotalSectors) & @LF & _
                    StringFormat('Time Elapsed: %02d:%02d', Mod($iTD / 1000, 3600) / 60, Mod(Mod($iTD / 1000, 3600), 60)) & @LF & @LF & _
                    'Press "Esc" to Abort', @DesktopWidth / 2, @DesktopHeight / 2, "", 0, 2)

            ; Give the user a chance to Abort.
            If $iAbort Then
                _WinAPI_CloseHandle($hCD)
                FileClose($hFO)
                FileDelete($sOutPutCueBinName & ".bin")
                $tCDTOC = 0
                $tBuffer = 0
                $tSRB = 0
                Return SetError(4, 0, 0)
            EndIf
        Next
    EndIf

    _WinAPI_CloseHandle($hCD)
    FileClose($hFO)
    $tBuffer = 0
    $tSRB = 0

    ; This is not needed, I'm using this to update a tooltip with info.
    $iTD = TimerDiff($iStart)
    ToolTip("Creating Cue: " & $sOutPutCueBinName & ".cue" & @LF & _
            StringFormat("Sectors Copied: %d of %d", $iSecDone, $iTotalSectors) & @LF & _
            StringFormat('Time Elapsed: %02d:%02d', Mod($iTD / 1000, 3600) / 60, Mod(Mod($iTD / 1000, 3600), 60)) & @LF & @LF & _
            'Press "Esc" to Abort', @DesktopWidth / 2, @DesktopHeight / 2, "", 0, 2)

    ; Create the Cue file from the TOC we read earlier
    $hFO = FileOpen($sOutPutCueBinName & ".cue", 2)
    If $hFO = -1 Then Return SetError(-3, 0, 0)
    FileWrite($hFO, 'FILE "' & StringTrimLeft($sOutPutCueBinName, StringInStr($sOutPutCueBinName, "\", 0, -1)) & '.bin" BINARY' & @CRLF)

    Dim $aTMSF[5] = [DllStructGetData($tCDTOC, "TrackData"), 3, 6, 7, 8] ;0
    For $i = 1 To DllStructGetData($tCDTOC, "LastTrack")
        FileWrite($hFO, StringFormat('  TRACK %02d AUDIO', BinaryMid($aTMSF[0], $aTMSF[1], 1)) & @CRLF)
        $iMS = (1000 * ((60 * Int(BinaryMid($aTMSF[0], $aTMSF[2], 1))) + Int(BinaryMid($aTMSF[0], $aTMSF[3], 1)))) - 2000
        FileWrite($hFO, StringFormat('    INDEX 01 %02d:%02d:%02d', Mod($iMS / 1000, 6000) / 60, Mod(Mod($iMS / 1000, 3600), 60), Int(BinaryMid($aTMSF[0], $aTMSF[4], 1))) & @CRLF)
        For $j = 1 To 4
            $aTMSF[$j] += 8
        Next

    Next
    FileClose($hFO)
    $tCDTOC = 0

    ; This is not needed, I'm using this to update a tooltip with info.
    $iTD = TimerDiff($iStart)
    ConsoleWrite("Completed Successfully (fingers crossed :P )" & @LF & _
            StringFormat("Sectors Copied: %d of %d", $iSecDone, $iTotalSectors) & @LF & _
            StringFormat('Time Elapsed: %02d:%02d', Mod($iTD / 1000, 3600) / 60, Mod(Mod($iTD / 1000, 3600), 60)) & @LF)
    Return SetError(0, 0, 1)
EndFunc   ;==>_SPTI_RIP_AUDIO_CD_TO_BIN_CUE

Func _Abort()
    $iAbort = 1
EndFunc   ;==>_Abort

; Helper functions
Func _WinAPI_DeviceIoControl($hFile, $iIoControlCode, $pInBuffer, $iInBufferSize, $pOutBuffer, $iOutBufferSize, $pOverlapped = 0)
    Local $aReturn = DllCall('kernel32.dll', 'int', 'DeviceIoControl', 'ptr', $hFile, 'dword', $iIoControlCode, 'ptr', $pInBuffer, 'dword', $iInBufferSize, 'ptr', $pOutBuffer, 'dword', $iOutBufferSize, 'dword*', 0, 'ptr', $pOverlapped)
    If @error Then Return SetError(@error, @extended, 0)
    Return SetError($aReturn[0] = 0, $aReturn[7], $aReturn[0])
EndFunc   ;==>_WinAPI_DeviceIoControl

Func _HiByte($iValue)
    Return BitAND(BitShift($iValue, 8), 0xFF)
EndFunc   ;==>_HiByte

Func _LoByte($iValue)
    Return BitAND($iValue, 0xFF)
EndFunc   ;==>_LoByte

Cheers

Edited by smashly
Link to comment
Share on other sites

Hi again,

Here's another version for ripping a CDDA Audio CD to bin/cue that does not need admin privileges and is a little simpler struct wise.

It's a safer way of doing doing things from what I read.

I've only tested it on WinXP x86

#include <WinAPI.au3>
 
Opt("MustDeclareVars", 1)
 
Global $iAbort = 0
 
HotKeySet("{ESC}", "_Abort")
 
 
_IOCTL_CDROM_RAW_READ_RIP_AUDIO_CD_TO_BIN_CUE("d:")
Switch @error
    Case -1
        ConsoleWrite("ERROR -1: Failed to open the CDRom drive." & @LF)
    Case -2
        ConsoleWrite("ERROR -2: Failed to create the output bin file." & @LF)
    Case -3
        ConsoleWrite("ERROR -3: Failed to create the output cue file" & @LF)
    Case 1
        ConsoleWrite("ERROR 1: _WinAPI_DeviceIoControl failed to read CD TOC." & @LF)
        ConsoleWrite("_WinAPI_GetLastErrorMessage: " & _WinAPI_GetLastErrorMessage())
    Case 2
        ConsoleWrite("ERROR 2: Invalid sector count when trying to calculate total sectors." & @LF)
    Case 3
        ConsoleWrite("ERROR 3: _WinAPI_DeviceIoControl failed to read a sector." & @LF)
        ConsoleWrite("_WinAPI_GetLastErrorMessage: " & _WinAPI_GetLastErrorMessage())
    Case 4
        ConsoleWrite("ERROR 4: Aborted by user." & @LF)
    Case 0
        ;;; Success hopefully ...lol
EndSwitch
 
 
 
Func _IOCTL_CDROM_RAW_READ_RIP_AUDIO_CD_TO_BIN_CUE($sDrive, $sOutPutCueBinName = "Audio_CD_No_Admin")
    Local Const $IOCTL_CDROM_RAW_READ = 0x0002403E
    Local Const $IOCTL_CDROM_READ_TOC = 0x00024000
    Local Const $iSector = 2352 ; CDDA Sector Size in bytes
 
    Local $hCD, $hFO, $tCDTOC, $tRAW_READ_INFO, $tBuffer, $iReturn, $iTD, $iMS
    Local $iStart = TimerInit(), $iSecDone = 0
    Local $iTotalSectors = 0, $iTotalSectorsStart, $iStepSectors = 25
 
    ; Open CDROM to read from
    $hCD = _WinAPI_CreateFile("\\.\" & $sDrive, 2, 6, 6)
    If Not $hCD Then Return SetError(-1, 0, 0)
 
    ; Open output bin file to write to.
    $hFO = FileOpen($sOutPutCueBinName & ".bin", 18)
    If $hFO = -1 Then
        _WinAPI_CloseHandle($hCD)
        Return SetError(-2, 0, 0)
    EndIf
 
    ; Read the CDROM TOC
    $tCDTOC = DllStructCreate("BYTE Length[2];BYTE FirstTrack;BYTE LastTrack;BYTE TrackData[800]")
    DllStructSetData($tCDTOC, "Length", DllStructGetSize($tCDTOC))
    $iReturn = _WinAPI_DeviceIoControl($hCD, $IOCTL_CDROM_READ_TOC, 0, 0, DllStructGetPtr($tCDTOC), DllStructGetSize($tCDTOC))
    If Not $iReturn Then
        _WinAPI_CloseHandle($hCD)
        FileClose($hFO)
        FileDelete($sOutPutCueBinName & ".bin")
        Return SetError(1, 0, 0)
    EndIf
 
    ; Calculate how many sectors the Audio CD has by reading the last lead out track toc.
    $iTotalSectors = BinaryMid(DllStructGetData($tCDTOC, "TrackData"), 8 * DllStructGetData($tCDTOC, "LastTrack") + 6, 3)
    $iTotalSectors = Int(BinaryMid($iTotalSectors, 1, 1)) * 75 * 60 + Int(BinaryMid($iTotalSectors, 2, 1)) * 75 + Int(BinaryMid($iTotalSectors, 3, 1)) - 150
    If $iTotalSectors < 300 Then ; Minimum Sectors to Audio CD 300 Sectors = 4 Seconds (the first track starts after 150 sectors)
        _WinAPI_CloseHandle($hCD)
        FileClose($hFO)
        FileDelete($sOutPutCueBinName & ".bin")
        $tCDTOC = 0
        Return SetError(2, 0, 0)
    EndIf
    ; Doing this in case $iTotalSectors is not evenly dividable by $iStepSectors
    $iTotalSectorsStart = Floor($iTotalSectors / $iStepSectors) * $iStepSectors
 
    ; This is not needed, I'm using this to update a tooltip with info.
    $iTD = TimerDiff($iStart)
    ToolTip(StringFormat("Copying From: %s To %s", $sDrive, $sOutPutCueBinName & ".bin") & @LF & _
            StringFormat("Sectors Copied: %d of %d", $iSecDone, $iTotalSectors) & @LF & _
            StringFormat('Time Elapsed: %02d:%02d', Mod($iTD / 1000, 3600) / 60, Mod(Mod($iTD / 1000, 3600), 60)) & @LF & @LF & _
            'Press "Esc" to Abort', @DesktopWidth / 2, @DesktopHeight / 2, "", 0, 2)
 
    ; Create the RAW_READ_INFO struct we pass to DeviceIoControl and the output buffer (2352 * 25 = 58800 bytes).
    $tRAW_READ_INFO = DllStructCreate("int64 DiskOffset;ULONG SectorCount;ULONG TrackMode")
    DllStructSetData($tRAW_READ_INFO, "SectorCount", $iStepSectors)
    DllStructSetData($tRAW_READ_INFO, "TrackMode", 2) ; CDDA Audio CD
    $tBuffer = DllStructCreate("byte[" & $iSector * $iStepSectors & "]")
 
    ; Loop through the amount of sectors at 25 sectors per loop (sectors start at 0 and the last sector is $iTotalSectors - 1)
    For $i = 0 To $iTotalSectorsStart - 1 Step $iStepSectors
 
        ; Set the Sector offset of where we are ripping from
        DllStructSetData($tRAW_READ_INFO, "DiskOffset", $i * 2048)
 
        ; Pass the RAW_READ_INFO struct to DeviceIoControl and then write the contents ofthe buffer the bin file.
        $iReturn = _WinAPI_DeviceIoControl($hCD, $IOCTL_CDROM_RAW_READ, DllStructGetPtr($tRAW_READ_INFO), DllStructGetSize($tRAW_READ_INFO), DllStructGetPtr($tBuffer), DllStructGetSize($tBuffer))
        If Not $iReturn Or (@extended <> ($iSector * $iStepSectors)) Or Not FileWrite($hFO, DllStructGetData($tBuffer, 1)) Then
            _WinAPI_CloseHandle($hCD)
            FileClose($hFO)
            FileDelete($sOutPutCueBinName & ".bin")
            $tCDTOC = 0
            $tRAW_READ_INFO = 0
            $tBuffer = 0
            Return SetError(3, 0, 0)
        EndIf
 
        ; This is not needed, I'm using this to update a tooltip with info.
        $iSecDone += $iStepSectors
        $iTD = TimerDiff($iStart)
        ToolTip(StringFormat("Copying From: %s To %s", $sDrive, $sOutPutCueBinName & ".bin") & @LF & _
                StringFormat("Sectors Copied: %d of %d", $iSecDone, $iTotalSectors) & @LF & _
                StringFormat('Time Elapsed: %02d:%02d', Mod($iTD / 1000, 3600) / 60, Mod(Mod($iTD / 1000, 3600), 60)) & @LF & @LF & _
                'Press "Esc" to Abort', @DesktopWidth / 2, @DesktopHeight / 2, "", 0, 2)
 
        ; Give the user a chance to Abort.
        If $iAbort Then
            _WinAPI_CloseHandle($hCD)
            FileClose($hFO)
            FileDelete($sOutPutCueBinName & ".bin")
            $tCDTOC = 0
            $tRAW_READ_INFO = 0
            $tBuffer = 0
            Return SetError(4, 0, 0)
        EndIf
    Next
 
    ; This will catch the sectors that that are less then $iStepSectors
    If $iTotalSectors > $iTotalSectorsStart Then
 
        ; Set the amountof read sectors to 1
        DllStructSetData($tRAW_READ_INFO, "SectorCount", 1)
 
        ; Recreate the output buffer as it's now only needed as 1 sector size (2352 bytes)
        $tBuffer = 0
        $tBuffer = DllStructCreate("byte[" & $iSector & "]")
 
        ; Loop through the last sectors 1 at a time.
        For $i = $iTotalSectorsStart To $iTotalSectors - 1
 
            ; Set the Sector offset of where we are ripping from
            DllStructSetData($tRAW_READ_INFO, "DiskOffset", $i * 2048) ;QuadPart ? have no idea about LARGE_INT structure
 
            ; Pass the RAW_READ_INFO struct to DeviceIoControl and then write the contents ofthe buffer the bin file.
            $iReturn = _WinAPI_DeviceIoControl($hCD, $IOCTL_CDROM_RAW_READ, DllStructGetPtr($tRAW_READ_INFO), DllStructGetSize($tRAW_READ_INFO), DllStructGetPtr($tBuffer), DllStructGetSize($tBuffer))
            If @extended <> $iSector Then ConsoleWrite("ShortSector: " & @extended & @LF)
            If Not $iReturn Or (@extended <> $iSector) Or Not FileWrite($hFO, DllStructGetData($tBuffer, 1)) Then
                _WinAPI_CloseHandle($hCD)
                FileClose($hFO)
                FileDelete($sOutPutCueBinName & ".bin")
                $tCDTOC = 0
                $tRAW_READ_INFO = 0
                $tBuffer = 0
                Return SetError(3, 0, 0)
            EndIf
 
            ; This is not needed, I'm using this to update a tooltip with info.
            $iSecDone += 1
            $iTD = TimerDiff($iStart)
            ToolTip(StringFormat("Copying From: %s To %s", $sDrive, $sOutPutCueBinName & ".bin") & @LF & _
                    StringFormat("Sectors Copied: %d of %d", $iSecDone, $iTotalSectors) & @LF & _
                    StringFormat('Time Elapsed: %02d:%02d', Mod($iTD / 1000, 3600) / 60, Mod(Mod($iTD / 1000, 3600), 60)) & @LF & @LF & _
                    'Press "Esc" to Abort', @DesktopWidth / 2, @DesktopHeight / 2, "", 0, 2)
 
            ; Give the user a chance to Abort.
            If $iAbort Then
                _WinAPI_CloseHandle($hCD)
                FileClose($hFO)
                FileDelete($sOutPutCueBinName & ".bin")
                $tCDTOC = 0
                $tRAW_READ_INFO = 0
                $tBuffer = 0
                Return SetError(4, 0, 0)
            EndIf
        Next
    EndIf
 
    _WinAPI_CloseHandle($hCD)
    FileClose($hFO)
    $tBuffer = 0
    $tRAW_READ_INFO = 0
 
    ; This is not needed, I'm using this to update a tooltip with info.
    $iTD = TimerDiff($iStart)
    ToolTip("Creating Cue: " & $sOutPutCueBinName & ".cue" & @LF & _
            StringFormat("Sectors Copied: %d of %d", $iSecDone, $iTotalSectors) & @LF & _
            StringFormat('Time Elapsed: %02d:%02d', Mod($iTD / 1000, 3600) / 60, Mod(Mod($iTD / 1000, 3600), 60)) & @LF & @LF & _
            'Press "Esc" to Abort', @DesktopWidth / 2, @DesktopHeight / 2, "", 0, 2)
 
    ; Create the Cue file from the TOC we read earlier
    $hFO = FileOpen($sOutPutCueBinName & ".cue", 2)
    If $hFO = -1 Then Return SetError(-3, 0, 0)
    FileWrite($hFO, 'FILE "' & StringTrimLeft($sOutPutCueBinName, StringInStr($sOutPutCueBinName, "\", 0, -1)) & '.bin" BINARY' & @CRLF)
 
    Dim $aTMSF[5] = [DllStructGetData($tCDTOC, "TrackData"), 3, 6, 7, 8]
    For $i = 1 To DllStructGetData($tCDTOC, "LastTrack")
        FileWrite($hFO, StringFormat('  TRACK %02d AUDIO', BinaryMid($aTMSF[0], $aTMSF[1], 1)) & @CRLF)
        $iMS = (1000 * ((60 * Int(BinaryMid($aTMSF[0], $aTMSF[2], 1))) + Int(BinaryMid($aTMSF[0], $aTMSF[3], 1)))) - 2000
        FileWrite($hFO, StringFormat('    INDEX 01 %02d:%02d:%02d', Mod($iMS / 1000, 6000) / 60, Mod(Mod($iMS / 1000, 3600), 60), Int(BinaryMid($aTMSF[0], $aTMSF[4], 1))) & @CRLF)
        For $j = 1 To 4
            $aTMSF[$j] += 8
        Next
    Next
    FileClose($hFO)
    $tCDTOC = 0
 
    ; This is not needed, I'm using this to write info to console on completion.
    $iTD = TimerDiff($iStart)
    ConsoleWrite("Completed Successfully (fingers crossed :P )" & @LF & _
            StringFormat("Sectors Copied: %d of %d", $iSecDone, $iTotalSectors) & @LF & _
            StringFormat('Time Elapsed: %02d:%02d', Mod($iTD / 1000, 3600) / 60, Mod(Mod($iTD / 1000, 3600), 60)) & @LF)
 
    Return SetError(0, 0, 1)
EndFunc   ;==>_IOCTL_CDROM_RAW_READ_RIP_AUDIO_CD_TO_BIN_CUE
 
Func _Abort()
    $iAbort = 1
EndFunc   ;==>_Abort
 
Func _WinAPI_DeviceIoControl($hFile, $iIoControlCode, $pInBuffer, $iInBufferSize, $pOutBuffer, $iOutBufferSize, $pOverlapped = 0)
    Local $aReturn = DllCall('kernel32.dll', 'int', 'DeviceIoControl', 'ptr', $hFile, 'dword', $iIoControlCode, 'ptr', $pInBuffer, 'dword', $iInBufferSize, 'ptr', $pOutBuffer, 'dword', $iOutBufferSize, 'dword*', 0, 'ptr', $pOverlapped)
    If @error Then Return SetError(@error, @extended, 0)
    Return SetError($aReturn[0] = 0, $aReturn[7], $aReturn[0]); @extended is the bytes that were written to the buffer if applicable
EndFunc   ;==>_WinAPI_DeviceIoControl

Cheers

Edited by smashly
Link to comment
Share on other sites

Hi again,

Here's another version of the function above, but this one rips an Audio CD to wave files.

#include <WinAPI.au3>

Opt("MustDeclareVars", 1)

Global $iAbort = 0

HotKeySet("{ESC}", "_Abort")


_IOCTL_CDROM_RAW_READ_RIP_AUDIO_CD_TRACKS_TO_WAVE("d:")
Switch @error
    Case -1
        ConsoleWrite("ERROR -1: Failed to open the CDRom drive." & @LF)
    Case -2
        ConsoleWrite("ERROR -2: Failed to create the output wave file." & @LF)
    Case 1
        ConsoleWrite("ERROR 1: _WinAPI_DeviceIoControl failed to read CD TOC." & @LF)
        ConsoleWrite("_WinAPI_GetLastErrorMessage: " & _WinAPI_GetLastErrorMessage())
    Case 2
        ConsoleWrite("ERROR 2: _WinAPI_DeviceIoControl failed to read a sector." & @LF)
        ConsoleWrite("_WinAPI_GetLastErrorMessage: " & _WinAPI_GetLastErrorMessage())
    Case 3
        ConsoleWrite("ERROR 3: Aborted by user." & @LF)
    Case 0
        ;;; Success hopefully ...lol
EndSwitch

; $sDrive - Drive letter that contains a CDDA Audio CD. (eg; "d:")
; $sOutDirectory - where the wave files will be saved. The directory will be created if it does no exist.
Func _IOCTL_CDROM_RAW_READ_RIP_AUDIO_CD_TRACKS_TO_WAVE($sDrive, $sOutDirectory = "AudioCDToWave")
    Local Const $IOCTL_CDROM_RAW_READ = 0x0002403E
    Local Const $IOCTL_CDROM_READ_TOC = 0x00024000
    Local Const $iSector = 2352 ; CDDA Sector Size in bytes

    Local $hCD, $hFO, $tCDTOC, $tRAW_READ_INFO, $tBuffer, $iReturn, $iTD, $iMS
    Local $iStart = TimerInit(), $iSecDone = 0
    Local $iTrkStart, $iTrkEnd

    Local $iTotalSectors = 0, $iTotalSectorsStart, $iStepSectors = 25

    ; Open CDROM to read from
    $hCD = _WinAPI_CreateFile("\\.\" & $sDrive, 2, 6, 6)
    If Not $hCD Then Return SetError(-1, 0, 0)

    ; Read the CDROM TOC
    $tCDTOC = DllStructCreate("BYTE Length[2];BYTE FirstTrack;BYTE LastTrack;BYTE TrackData[800]")
    DllStructSetData($tCDTOC, "Length", DllStructGetSize($tCDTOC))
    $iReturn = _WinAPI_DeviceIoControl($hCD, $IOCTL_CDROM_READ_TOC, 0, 0, DllStructGetPtr($tCDTOC), DllStructGetSize($tCDTOC))
    If Not $iReturn Then
        _WinAPI_CloseHandle($hCD)
        Return SetError(1, 0, 0)
    EndIf

    ; Create the RAW_READ_INFO struct we pass to DeviceIoControl and the output buffer (2352 * 25 = 58800 bytes).
    $tRAW_READ_INFO = DllStructCreate("int64 DiskOffset;ULONG SectorCount;ULONG TrackMode")
    DllStructSetData($tRAW_READ_INFO, "TrackMode", 2) ; CDDA Audio CD


    ; Loop through each track and write it to a wave file.
    Dim $aMSF[4] = [DllStructGetData($tCDTOC, "TrackData"), 6, 7, 8]
    For $i = DllStructGetData($tCDTOC, "FirstTrack") To DllStructGetData($tCDTOC, "LastTrack")
        $hFO = FileOpen($sOutDirectory & StringFormat("\Track%02d.wav", $i), 26)
        If $hFO = -1 Then
            _WinAPI_CloseHandle($hCD)
            Return SetError(-2, 0, 0)
        EndIf

        ; Work out the track start sector and how many sectors the track has by reading the TOC
        $iTrkStart = (Int(BinaryMid($aMSF[0], $aMSF[1], 1)) * 75 * 60) + (Int(BinaryMid($aMSF[0], $aMSF[2], 1)) * 75) + Int(BinaryMid($aMSF[0], $aMSF[3], 1)) - 150
        For $j = 1 To 3
            $aMSF[$j] += 8
        Next
        $iTrkEnd = (Int(BinaryMid($aMSF[0], $aMSF[1], 1)) * 75 * 60) + (Int(BinaryMid($aMSF[0], $aMSF[2], 1)) * 75) + Int(BinaryMid($aMSF[0], $aMSF[3], 1)) - 150

        ; Doing this in case $iTrkEnd is not evenly dividable by $iStepSectors
        $iTotalSectors = $iTrkEnd - $iTrkStart
        $iTotalSectorsStart = Floor($iTotalSectors / $iStepSectors) * $iStepSectors

        ; We need a wave header as the audio data is just that, only raw data without a header.
        FileWrite($hFO, "RIFF") ; Riff header start
        FileWrite($hFO, Binary(36 + (($iTrkEnd - $iTrkStart) * $iSector))) ; Total length of the wave (Header + Data length)
        FileWrite($hFO, "WAVEfmt ") ; Wave Format section
        FileWrite($hFO, Binary(16)) ; Format chunk length
        FileWrite($hFO, BinaryMid(Binary(1), 1, 2)) ; Format Type
        FileWrite($hFO, BinaryMid(Binary(2), 1, 2)) ; Channel Count
        FileWrite($hFO, Binary(44100)) ; Sample Rate
        FileWrite($hFO, Binary(176400)) ; Bytes Per Second
        FileWrite($hFO, BinaryMid(Binary(4), 1, 2)) ; Bytes Per Sample
        FileWrite($hFO, BinaryMid(Binary(16), 1, 2)) ; Bits Per Channel

        ; Write the audio data section header.
        FileWrite($hFO, "data") ; Data section
        FileWrite($hFO, Binary((($iTrkEnd - $iTrkStart) * $iSector))) ; Audio Data length

        ;Set how many sectors to rip to the buffer (25 sectors at a time) and create an output buffer.
        DllStructSetData($tRAW_READ_INFO, "SectorCount", $iStepSectors)
        $tBuffer = 0
        $tBuffer = DllStructCreate("byte[" & $iSector * $iStepSectors & "]")

        ; Loop through the amount of sectors at 25 sectors per loop and write them to the wave file
        For $j = $iTrkStart To ($iTrkStart + $iTotalSectorsStart) - 1 Step $iStepSectors

            ; Set the Sector offset of where we are ripping from
            DllStructSetData($tRAW_READ_INFO, "DiskOffset", $j * 2048) ; QuadPart? I have no idea about LARGE_INTEGER structure.

            ; Pass the RAW_READ_INFO struct to DeviceIoControl and then write the returned contents of the buffer the wave file.
            $iReturn = _WinAPI_DeviceIoControl($hCD, $IOCTL_CDROM_RAW_READ, DllStructGetPtr($tRAW_READ_INFO), DllStructGetSize($tRAW_READ_INFO), DllStructGetPtr($tBuffer), DllStructGetSize($tBuffer))
            If Not $iReturn Or (@extended <> ($iSector * $iStepSectors)) Or Not FileWrite($hFO, DllStructGetData($tBuffer, 1)) Then
                _WinAPI_CloseHandle($hCD)
                FileClose($hFO)
                FileDelete($sOutDirectory & StringFormat("\Track%02d.wav", $i))
                $tCDTOC = 0
                $tRAW_READ_INFO = 0
                $tBuffer = 0
                Return SetError(2, 0, 0)
            EndIf

            ; This is not needed, I'm using this to update a tooltip with info.
            $iSecDone += $iStepSectors
            $iTD = TimerDiff($iStart)
            ToolTip("Total Tracks: " & DllStructGetData($tCDTOC, "LastTrack") & @LF & _
                    StringFormat("Ripping From: %s To %s", $sDrive, $sOutDirectory & StringFormat("\Track%02d.wav", $i)) & @LF & _
                    StringFormat("Track Sectors Copied: %d of %d", $iSecDone, $iTotalSectors) & @LF & _
                    StringFormat('Time Elapsed: %02d:%02d', Mod($iTD / 1000, 3600) / 60, Mod(Mod($iTD / 1000, 3600), 60)) & @LF & @LF & _
                    'Press "Esc" to Abort', @DesktopWidth / 2, @DesktopHeight / 2, "", 0, 2)

            ; Give the user a chance to Abort.
            If $iAbort Then
                _WinAPI_CloseHandle($hCD)
                FileClose($hFO)
                FileDelete($sOutDirectory & StringFormat("\Track%02d.wav", $i))
                $tCDTOC = 0
                $tRAW_READ_INFO = 0
                $tBuffer = 0
                Return SetError(3, 0, 0)
            EndIf
        Next

        ; This will catch the sectors that that are less then $iStepSectors
        If $iTotalSectors > $iTotalSectorsStart Then

            ; Set the amount of read sectors to 1
            DllStructSetData($tRAW_READ_INFO, "SectorCount", 1)

            ; Recreate the output buffer as it's now only needed as 1 sector size (2352 bytes)
            $tBuffer = 0
            $tBuffer = DllStructCreate("byte[" & $iSector & "]")

            ; Loop through the last sectors 1 at a time.
            For $j = ($iTrkStart + $iTotalSectorsStart) To $iTrkEnd - 1

                ; Set the Sector offset of where we are ripping from
                DllStructSetData($tRAW_READ_INFO, "DiskOffset", $j * 2048) ; QuadPart? I have no idea about LARGE_INTEGER structure.

                ; Pass the RAW_READ_INFO struct to DeviceIoControl and then write the contents ofthe buffer the bin file.
                $iReturn = _WinAPI_DeviceIoControl($hCD, $IOCTL_CDROM_RAW_READ, DllStructGetPtr($tRAW_READ_INFO), DllStructGetSize($tRAW_READ_INFO), DllStructGetPtr($tBuffer), DllStructGetSize($tBuffer))
                If @extended <> $iSector Then ConsoleWrite("ShortSector: " & @extended & @LF)
                If Not $iReturn Or (@extended <> $iSector) Or Not FileWrite($hFO, DllStructGetData($tBuffer, 1)) Then
                    _WinAPI_CloseHandle($hCD)
                    FileClose($hFO)
                    FileDelete($sOutDirectory & StringFormat("\Track%02d.wav", $i))
                    $tCDTOC = 0
                    $tRAW_READ_INFO = 0
                    $tBuffer = 0
                    Return SetError(2, 0, 0)
                EndIf

                ; This is not needed, I'm using this to update a tooltip with info.
                ToolTip("Total Tracks: " & DllStructGetData($tCDTOC, "LastTrack") & @LF & _
                        StringFormat("Ripping From: %s To %s", $sDrive, $sOutDirectory & StringFormat("\Track%02d.wav", $i)) & @LF & _
                        StringFormat("Track Sectors Copied: %d of %d", $iSecDone, $iTotalSectors) & @LF & _
                        StringFormat('Time Elapsed: %02d:%02d', Mod($iTD / 1000, 3600) / 60, Mod(Mod($iTD / 1000, 3600), 60)) & @LF & @LF & _
                        'Press "Esc" to Abort', @DesktopWidth / 2, @DesktopHeight / 2, "", 0, 2)

;~              ; Give the user a chance to Abort.
                If $iAbort Then
                    _WinAPI_CloseHandle($hCD)
                    FileClose($hFO)
                    FileDelete($sOutDirectory & StringFormat("\Track%02d.wav", $i))
                    $tCDTOC = 0
                    $tRAW_READ_INFO = 0
                    $tBuffer = 0
                    Return SetError(3, 0, 0)
                EndIf
            Next
        EndIf
        $iSecDone = 0
        FileClose($hFO)
    Next
    _WinAPI_CloseHandle($hCD)
    $tCDTOC = 0
    $tRAW_READ_INFO = 0
    $tBuffer = 0

    ; This is not needed, I'm using this to write info to console on completion.
    $iTD = TimerDiff($iStart)
    ConsoleWrite("Completed Successfully (fingers crossed :P )" & @LF & _
            StringFormat('Time Elapsed: %02d:%02d', Mod($iTD / 1000, 3600) / 60, Mod(Mod($iTD / 1000, 3600), 60)) & @LF)

    Return SetError(0, 0, 1)
EndFunc   ;==>_IOCTL_CDROM_RAW_READ_RIP_AUDIO_CD_TRACKS_TO_WAVE

Func _Abort()
    $iAbort = 1
EndFunc   ;==>_Abort

Func _WinAPI_DeviceIoControl($hFile, $iIoControlCode, $pInBuffer, $iInBufferSize, $pOutBuffer, $iOutBufferSize, $pOverlapped = 0)
    Local $aReturn = DllCall('kernel32.dll', 'int', 'DeviceIoControl', 'ptr', $hFile, 'dword', $iIoControlCode, 'ptr', $pInBuffer, 'dword', $iInBufferSize, 'ptr', $pOutBuffer, 'dword', $iOutBufferSize, 'dword*', 0, 'ptr', $pOverlapped)
    If @error Then Return SetError(@error, @extended, 0)
    Return SetError($aReturn[0] = 0, $aReturn[7], $aReturn[0]); @extended is the bytes that were written to the buffer if applicable
EndFunc   ;==>_WinAPI_DeviceIoControl

Cheers

Edited by smashly
Link to comment
Share on other sites

  • 1 month later...

Updated only pure AutoIt version (the development of v1 and v2 is discontinued!) -> check out post #1.

Br,

UEZ

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

Link to comment
Share on other sites

  • 2 weeks later...

Removed one ISO 9660 check item otherwise UDF DVDs cannot be copied... :mellow:

Sorry,

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

Link to comment
Share on other sites

Found a bug in display of MB on disc image and added feature to create MD5 check sum of ISOs directly (checkout menu on left upper corner menu)

Is this tool useful for you?

Br,

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

Link to comment
Share on other sites

Found a bug in display of MB on disc image and added feature to create MD5 check sum of ISOs directly (checkout menu on left upper corner menu)

Is this tool useful for you?

Br,

UEZ

YES..........OR in Future YES..........

I was using another portable app to make ISO's but I'd rather something where I can see teh code. :mellow:

Also haveing a command line interface works well for me.

Thanks for the all the effort

John Morrison

Link to comment
Share on other sites

Thank you both for your feedback! The purpose of this tool is to have a handy small tool for creating ISO without having to install a whole burning studio a la Nero.

It is not a pro tool but it is doing the job for standard CD/DVD formats properly.

I will use it to create ISOs from my CDs/DVDs. :mellow:

Br,

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

Link to comment
Share on other sites

Thank you both for your feedback! The purpose of this tool is to have a handy small tool for creating ISO without having to install a whole burning studio a la Nero.

It is not a pro tool but it is doing the job for standard CD/DVD formats properly.

I will use it to create ISOs from my CDs/DVDs. :mellow:

Br,

UEZ

That is "exactly" what I was kooking for. :)

Thanks!

Link to comment
Share on other sites

  • 1 year later...

Made some updates!

Can you test whether it is working on your PC/notebook to dump CD/DVD to an ISO image properly? What about external drives?

Br,

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

Link to comment
Share on other sites

  • 6 years later...
2 hours ago, haijie1223 said:

How to read a iso file?

What do you mean exactly? 

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

Link to comment
Share on other sites

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
 Share

×
×
  • Create New...