UEZ Posted June 25, 2011 Author Share Posted June 25, 2011 (edited) 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 June 25, 2011 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 More sharing options...
smashly Posted June 25, 2011 Share Posted June 25, 2011 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 More sharing options...
smashly Posted July 2, 2011 Share Posted July 2, 2011 (edited) 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)expandcollapse popup#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 ;==>_LoByteCheers Edited July 3, 2011 by smashly Link to comment Share on other sites More sharing options...
smashly Posted July 3, 2011 Share Posted July 3, 2011 (edited) 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 x86expandcollapse popup#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 August 29, 2011 by smashly Link to comment Share on other sites More sharing options...
smashly Posted July 4, 2011 Share Posted July 4, 2011 (edited) Hi again, Here's another version of the function above, but this one rips an Audio CD to wave files.expandcollapse popup#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 July 12, 2011 by smashly Link to comment Share on other sites More sharing options...
monoscout999 Posted July 4, 2011 Share Posted July 4, 2011 Hi again,Here's another version of the function above, but this one rips an Audio CD to wave files.CheersGreat! It works in win7 64x. Link to comment Share on other sites More sharing options...
UEZ Posted August 19, 2011 Author Share Posted August 19, 2011 (edited) Updated only pure AutoIt version (the development of v1 and v2 is discontinued!) -> check out post #1.Br,UEZ Edited August 19, 2011 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 More sharing options...
UEZ Posted August 29, 2011 Author Share Posted August 29, 2011 Removed one ISO 9660 check item otherwise UDF DVDs cannot be copied... 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 More sharing options...
UEZ Posted August 30, 2011 Author Share Posted August 30, 2011 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 More sharing options...
storme Posted August 31, 2011 Share Posted August 31, 2011 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. Also haveing a command line interface works well for me. Thanks for the all the effortJohn Morrison Some of my small contributions to AutoIt Browse for Folder Dialog - Automation SysTreeView32 | FileHippo Download and/or retrieve program information | Get installedpath from uninstall key in registry | RoboCopy function John Morrison aka Storm-E Link to comment Share on other sites More sharing options...
monoscout999 Posted August 31, 2011 Share Posted August 31, 2011 Not for me,, no right now, maybe in the future Link to comment Share on other sites More sharing options...
UEZ Posted August 31, 2011 Author Share Posted August 31, 2011 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. 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 More sharing options...
storme Posted August 31, 2011 Share Posted August 31, 2011 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. Br,UEZ That is "exactly" what I was kooking for. Thanks! Some of my small contributions to AutoIt Browse for Folder Dialog - Automation SysTreeView32 | FileHippo Download and/or retrieve program information | Get installedpath from uninstall key in registry | RoboCopy function John Morrison aka Storm-E Link to comment Share on other sites More sharing options...
UEZ Posted September 11, 2012 Author Share Posted September 11, 2012 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 More sharing options...
haijie1223 Posted August 10, 2019 Share Posted August 10, 2019 How to read a iso file? Link to comment Share on other sites More sharing options...
UEZ Posted August 10, 2019 Author Share Posted August 10, 2019 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 More sharing options...
dmob Posted August 11, 2019 Share Posted August 11, 2019 21 hours ago, haijie1223 said: How to read a iso file? I believe this UDF for creating ISO. 7-zip can read ISO files. Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now