Сейчас на форуме: rmn, Magister Yoda, vasilevradislav, tyns777 (+6 невидимых) |
![]() |
eXeL@B —› Программирование —› Как сделать скачивалку файлов на ассемблер по http c возможностью докачки |
Посл.ответ | Сообщение |
|
Создано: 30 июля 2008 07:48 · Личное сообщение · #1 Вот код, но я не пойму как сделать так чтобы можно было возобновить докачку файла, а не скачить его загого. ;EasyCodeName=Download,1 .386 .model flat,stdcall option casemap:none include windows.inc include kernel32.inc include user32.inc includelib kernel32.lib includelib user32.lib include wininet.inc includelib wininet.lib ;GetFileName PROTO :DWORD .data ; "http://www.robotask.com/downloads/RoboTaskSetup.exe",0 ifmt BYTE "%ib",0 crlf BYTE 13,10 msgOk DB "Connection error!",0 success DB "Download is end",0 noname DB "Wrong data in clipboard...i'll be terminate ![]() FileName DB " ",0 ;try_get_name db "I'll try to get url ![]() filez dword ? sizef DD ? Bufferlen dword ? .data? buf DB 51 dup(?) AppName DB 127 dup(?) fHand DD ? bwrite DD ? hInstance HINSTANCE ? ;fHand2 dd ? displayh DD ? Buffer DB 15500 Dup(?) ;buffer for download data ThreadID DWORD ? ;hTarget DWORD ? getstd macro invoke GetStdHandle,STD_OUTPUT_HANDLE mov displayh,eax EndM .code start: GetInetFile proc LOCAL hSession: DWORD LOCAL hUrl: DWORD ;LOCAL Bufferlen: DWORD LOCAL nSize: DWORD LOCAL fileUrl: DWORD local filedata: DWORD getstd ;invoke MessageBox, 0, addr msgErr, addr mcap, MB_OK ;invoke wsprintf,addr buf,addr try_get_name,0 ;invoke WriteConsole,displayh,addr buf,sizeof buf,0,0 call GetFileName ;call Startdownload ; invoke WriteConsole,displayh,addr startd,sizeof startd,0,0 invoke GetModuleFileName, hInstance, addr AppName, sizeof AppName invoke InternetOpen, addr AppName, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, NULL mov hSession, eax .if hSession == INVALID_HANDLE_VALUE ret .endif invoke GetClipboardData,CF_TEXT mov fileUrl,eax invoke InternetOpenUrl, hSession, fileUrl, NULL, NULL, NULL, NULL mov hUrl, eax .if hUrl == 0 ;invoke MessageBox, 0, addr msgOk, addr FileName, MB_OK invoke Sleep,3000 ret .endif mov fileUrl,0 invoke CreateFile, addr FileName, GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ, NULL,CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL,NULL mov fHand, eax .if fHand == 0 ret .endif invoke SetFilePointer, fHand, NULL, NULL, FILE_BEGIN ;HANDLE CreateThread( ;LPSECURITY_ATTRIBUTES lpThreadAttributes, // pointer to thread security attributes ;DWORD dwStackSize, // initial thread stack size, in bytes ;LPTHREAD_START_ROUTINE lpStartAddress, // pointer to thread function ;LPVOID lpParameter, // argument for new thread ;DWORD dwCreationFlags, // creation flags ;LPDWORD lpThreadId // pointer to returned thread identifier ;); mov eax,OFFSET getsize invoke CreateThread,NULL,NULL,eax,NULL,NULL,ADDR ThreadID download: ;call getsize invoke InternetReadFile, hUrl, addr Buffer, sizeof Buffer, addr Bufferlen .if Bufferlen != 0 invoke WriteFile, fHand, addr Buffer, Bufferlen, ADDR bwrite, NULL jmp download .endif invoke CloseHandle, fHand invoke InternetCloseHandle, hUrl invoke InternetCloseHandle, hSession invoke CloseClipboard ;terminating thread invoke MessageBox, 0, addr success, addr FileName, MB_OK invoke ExitProcess,0 ret GetInetFile endp GetFileName proc URL:DWORD invoke OpenClipboard,NULL invoke GetClipboardData,CF_TEXT cmp word ptr ds:[eax],"th"; must be reversed! jnz second_check; first check go: invoke lstrcpy,addr URL, eax invoke RtlFillMemory,addr FileName,256,0 invoke lstrlen,addr URL std mov edi, edx add edi,eax dec edi mov ecx,eax mov al,"/" repne scasb cld cmp byte ptr [URL],"/" je No_name inc edi inc edi invoke lstrcpy,addr FileName,edi ret No_name: getstd ;invoke MessageBox, 0, addr msgErr, addr mcap, MB_OK ;invoke wsprintf,addr buf,addr noname,0 ;invoke WriteConsole,displayh,addr noname,sizeof noname,0,0 invoke MessageBox, 0, addr noname, addr FileName, MB_OK invoke ExitProcess,0 second_check: cmp word ptr ds:[eax],"TH" jnz No_name; not equal? Exit! je go ; equal, then try to download ret GetFileName endp Startdownload proc getstd ;invoke wsprintf,addr buf,addr startd,0 ;invoke WriteConsole,displayh,addr buf,sizeof buf,0,0 Ret Startdownload EndP getsize proc ;local hTarget:DWORD ;local filez:DWORD ;invoke CreateFile,addr FileName,FILE_SHARE_READ+FILE_SHARE_WRITE,NULL, ;OPEN_EXISTING, ;FILE_ATTRIBUTE_NORMAL, ;NULL next: invoke GetFileSize,fHand, sizef mov filez,eax invoke wsprintf,addr buf,addr ifmt,eax getstd invoke WriteConsole,displayh,addr buf,sizeof buf,0,0 ;invoke MessageBox, 0, addr buf, addr buf, MB_OK invoke WriteConsole,displayh,addr crlf,2,0,0 invoke Sleep,2000 .if Bufferlen != 0 jmp quit .else mov filez,0 jmp next .endif quit: Ret getsize EndP end start ![]() |
|
Создано: 30 июля 2008 11:04 · Личное сообщение · #2 |
|
Создано: 30 июля 2008 11:08 · Личное сообщение · #3 |
|
Создано: 30 июля 2008 12:23 · Личное сообщение · #4 |
|
Создано: 30 июля 2008 13:25 · Личное сообщение · #5 Сначала узнаешь размер скачанного файла , далее создаешь файл с таким же размером и забиваешь его любимыми тебе символами. Далее начинаешь скачку ...качаешь и записываешь считая сколько пришло ...когда будет обрыв или остановка то файл у тебя сохранится , часть его , и часть твоих забитых символов. Далее можно востановить закачку с места где остановились ...например расчитывая оффсет к твоим символам узнаем размер закачанного и место старта. Ну уже меню делать чтоб управление красивое было это твоя задача. Далее после закачки, если что то не пашет , можно сравнение сделать как бы опять закачивая и сравнивая поврежденные места. Все =) Ну а закачка через хттп идет такая же как и обычно, просто те реализовать дополнительную часть надо выше описанную. ----- RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube ![]() |
|
Создано: 01 августа 2008 05:34 · Личное сообщение · #6 |
|
Создано: 01 августа 2008 10:55 · Личное сообщение · #7 |
|
Создано: 04 августа 2008 07:25 · Личное сообщение · #8 |
![]() |
eXeL@B —› Программирование —› Как сделать скачивалку файлов на ассемблер по http c возможностью докачки |