Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <Binary.au3>
- #include <WinAPI.au3>
- #include <WinAPIEx.au3>
- #include <WinHTTP.au3>
- ; -Author: name22(www.autoit.de)
- $nSpeedLimit = 1024 * 200
- $iBytePerStep = 8192
- $iBufferSize = 1024 * 1024
- $iSleepTime = Round($iBytePerStep / $nSpeedLimit * 1000)
- $sURL_Download = 'http://speedtest.qsc.de/10MB.qsc'
- $sPathDst = @DesktopDir
- $vNTdll = DllOpen("ntdll.dll")
- $tPrecSleep = DllStructCreate("int64 time;")
- $pPrecSleep = DllStructGetPtr($tPrecSleep)
- $aURL_Split = _WinHttpCrackUrl($sURL_Download)
- $hOpen = _WinHttpOpen()
- $hConnect = _WinHttpConnect($hOpen, $aURL_Split[2])
- $hRequest = _WinHttpOpenRequest($hConnect, "GET", $aURL_Split[6])
- _WinHttpSendRequest($hRequest)
- _WinHttpReceiveResponse($hRequest)
- $iSizeBytes = _WinHttpQueryHeaders($hRequest, $WINHTTP_QUERY_CONTENT_LENGTH)
- $nT2 = TimerInit()
- Switch _WinHttpQueryDataAvailable($hRequest)
- Case True
- $hFile = _WinAPI_CreateFileEx($sPathDst & "\" & StringTrimLeft($aURL_Split[6], StringInStr($aURL_Split[6], "/", 0, -1)), $CREATE_NEW, $GENERIC_WRITE, $FILE_SHARE_READ, BitOR($FILE_ATTRIBUTE_NORMAL, $FILE_FLAG_OVERLAPPED))
- $tBuffer = DllStructCreate("byte[" & $iBufferSize & "]")
- $pBuffer = DllStructGetPtr($tBuffer)
- $tOverlapped = _GetStruct_Overlapped(0)
- $pOverlapped = DllStructGetPtr($tOverlapped)
- $iByteWritten = 0
- $iOffsetFile = 0
- $vData = Binary("")
- $nT = TimerInit()
- Do
- $iSleepTemp = ($iSleepTime - TimerDiff($nT))
- If $iSleepTemp > 0 Then
- DllStructSetData($tPrecSleep, "time", -10000 * $iSleepTemp)
- DllCall($vNTdll, "dword", "ZwDelayExecution", "int", 0, "ptr", $pPrecSleep)
- EndIf
- $nT = TimerInit()
- $vData &= _WinHttpReadData($hRequest, 2, $iBytePerStep)
- $iError = @error
- $iBufferContent = BinaryLen($vData)
- If $iBufferContent >= $iBufferSize - $iBytePerStep Or $iError = -1 Then
- _WinAPI_GetOverlappedResult($hFile, $pOverlapped, $iByteWritten, True)
- DllStructSetData($tBuffer, 1, $vData)
- $vData = Binary("")
- $iOffsetFile += $iByteWritten
- $tOverlapped = _GetStruct_Overlapped($iOffsetFile)
- $pOverlapped = DllStructGetPtr($tOverlapped)
- _WinAPI_WriteFile($hFile, $pBuffer, $iBufferContent, $iByteWritten, $pOverlapped)
- EndIf
- Until $iError = -1
- _WinHttpCloseHandle($hRequest)
- _WinHttpCloseHandle($hConnect)
- _WinHttpCloseHandle($hOpen)
- MsgBox(64, "Info", "Download completed." & @CRLF & "Time: " & Int(TimerDiff($nT2)) & @CRLF & "Speed: " & Round($iSizeBytes / Int(TimerDiff($nT2))))
- Case False
- MsgBox(16, "Error", "No Data available.")
- EndSwitch
- DllClose($vNTdll) ;Dll schließen
- Func _GetStruct_Overlapped($iOffset, $hEvent = 0)
- Local $tOffset = DllStructCreate('int64')
- Local $tOffsetSplit = DllStructCreate('dword;dword', DllStructGetPtr($tOffset))
- DllStructSetData($tOffset, 1, $iOffset)
- $tStruct = DllStructCreate($tagOVERLAPPED)
- DllStructSetData($tStruct, "Internal", 0)
- DllStructSetData($tStruct, "InternalHigh", 0)
- DllStructSetData($tStruct, "Offset", DllStructGetData($tOffsetSplit, 1))
- DllStructSetData($tStruct, "OffsetHigh", DllStructGetData($tOffsetSplit, 2))
- DllStructSetData($tStruct, "hEvent", $hEvent)
- Return $tStruct
- EndFunc
Add Comment
Please, Sign In to add comment