;_________________________________________________________________________________________________ ; ; Heinz - Volker Viehof ; Assembler Test - , Demo - und Beispieldateien ; Läd Dateien aus dem Internet und stellt diese dann als Text dar. ;_________________________________________________________________________________________________ .386 .model flat, stdcall option casemap :none include \masm32\include\windows.inc include \masm32\include\shell32.inc include \masm32\include\user32.inc include \masm32\include\kernel32.inc include \masm32\include\wininet.inc includelib \masm32\lib\shell32.lib includelib \masm32\lib\wininet.lib includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib WndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD RegisterWinClass PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD PushButton PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD MsgLoop PROTO :DWORD Static PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD ExitProcess PROTO :DWORD CloseHandle PROTO :DWORD Updatett PROTO :DWORD,:DWORD EditSl PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD ;_________________________________________________________________________________________________ ; ; Daten (initialisiert) ;_________________________________________________________________________________________________ .data szCaption db "Download and View Ver. 1.0",0 szClassName db "My_Class",0 szTextEnd db " Programm Beenden ",0 szText2 db " lade von URL ",0 Titel1 db " UserAgent",0 Titel2 db " URL ",0 szText10 db "2004 2009 Heinz - Volker Viehof ",10,13 db "Test - und DemoSoftware ",0 szInfo db " Information: ",10,13 db " Das Programm erfordert einen installierten Internetexplorer ",10,13 db " da es dessen LowLevel Funktionen benutzt. Es stellt eine ",10,13 db " Verbindung zum Internet her, lädt Text/HTML Dateien herunter, ",10,13 db " und stellt diese dar. Bei HTML wird natürlich der Quelltext ",10,13 db " angezeigt. Die Addresszeile kann genau wie die Addresszeile ",10,13 db " eines Browsers benutzt werden. Als Useragent wird bei der ",10,13 db " Testverbindung angegeben, weitere Informationen als Kommentare",10,13 db " im Programmquelltext. Als vordefiniertes Beispiel wird der ",10,13 db " Quelltext der Win32 Beispielseite dargestellt.",0 ;__________________________________________________________________________ ;Folgende Zeile enthält die HTTP Header Informationen die übertragen werden ;__________________________________________________________________________ szTest db "Testverbindung",0 db 1024 dup (0) Default db "http://shylock.sh.funpic.de/win32example.htm",0 db 1024 dup (0) btnClass db "BUTTON",0 btnClass3 db "STATIC",0 slEdit db "EDIT",0 ;_________________________________________________________________________________________________ ; ; nicht initialisierte Daten ;_________________________________________________________________________________________________ .data? myBuff db 128000 dup (?) hInstance dd ? hIcon dd ? hCursor dd ? hWnd dd ? hSelf dd ? hEnd dd ? hSelf2 dd ? hEdit1 dd ? hEdit2 dd ? Flags DWORD ? iHnd DWORD ? urlHandle DWORD ? myPoint DWORD ? ;_________________________________________________________________________________________________ ; ; Programm (Hauptteil) ;_________________________________________________________________________________________________ .code start: call Init call Main invoke ExitProcess,eax ;_________________________________________________________________________________________________ ; ; Subroutinen ;_________________________________________________________________________________________________ Init proc invoke GetModuleHandle, NULL mov hInstance, eax invoke LoadIcon,hInstance,IDI_APPLICATION mov hIcon, eax invoke LoadCursor,NULL,IDC_ARROW mov hCursor, eax ; InternetKonfiguration ? invoke InternetGetConnectedState, addr Flags, 0 .if eax == FALSE invoke Beep ,440 ,100 .endif ret Init endp Main proc LOCAL Wwd:DWORD,Wht:DWORD,Wtx:DWORD,Wty:DWORD mov Wtx,10 ;x koordinate oben links mov Wty,10 ;y koordinate oben links mov Wwd,280+280 ;+x= unten rechts mov Wht,480 ;+y= unten rechts invoke RegisterWinClass,ADDR WndProc,ADDR szClassName,hIcon,hCursor,COLOR_BTNFACE+3 invoke CreateWindowEx,WS_EX_CONTEXTHELP,ADDR szClassName,ADDR szCaption,\ WS_OVERLAPPEDWINDOW,Wtx,Wty,Wwd,Wht,NULL,NULL,hInstance,NULL mov hWnd,eax invoke Static,ADDR szText10,hWnd,10,10,330,40,500 invoke Static,ADDR szInfo,hWnd,10,120,530,320,510 invoke PushButton,ADDR szText2,hWnd,360,10,180,20,620 mov hSelf2,eax invoke PushButton,ADDR szTextEnd,hWnd,360,30,180,20,600 mov hEnd,eax invoke Static,ADDR Titel1,hWnd,10,60,80,20,700 invoke EditSl,ADDR szTest,90,60,450,20,hWnd,710 mov hEdit1, eax invoke Static,ADDR Titel2,hWnd,10,80,80,20,730 invoke EditSl,ADDR Default,90,80,450,20,hWnd,740 mov hEdit2, eax invoke ShowWindow,hWnd, SW_SHOWNORMAL invoke UpdateWindow,hWnd invoke MsgLoop,0 ret Main endp ;_________________________________________________________________________________________________ ; ; andere Unterprogramme ;_________________________________________________________________________________________________ m2m MACRO M1, M2 push M2 pop M1 ENDM RegisterWinClass proc lpWndProc:DWORD,lpClassName:DWORD,Icon:DWORD,Cursor:DWORD, bColor:DWORD LOCAL wc:WNDCLASSEX mov wc.cbSize, sizeof WNDCLASSEX mov wc.style, CS_BYTEALIGNCLIENT or CS_BYTEALIGNWINDOW m2m wc.lpfnWndProc, lpWndProc mov wc.cbClsExtra, NULL mov wc.cbWndExtra, NULL m2m wc.hInstance, hInstance m2m wc.hbrBackground, bColor mov wc.lpszMenuName, NULL m2m wc.lpszClassName, lpClassName m2m wc.hIcon, Icon m2m wc.hCursor, Cursor m2m wc.hIconSm, Icon invoke RegisterClassEx,ADDR wc ret RegisterWinClass endp ;_________________________________________________________________________________________________ ; ; Message Loop ;_________________________________________________________________________________________________ MsgLoop proc hMSG:DWORD LOCAL msg:MSG StartLoop: invoke GetMessage,ADDR msg,0,0,0 .if eax == 0 jmp ExitLoop .endif INVOKE TranslateMessage, ADDR msg invoke DispatchMessage ,ADDR msg jmp StartLoop ExitLoop: invoke CloseHandle ,iHnd mov eax, msg.wParam ret MsgLoop endp ;_________________________________________________________________________________________________ ; ; Default Windows Procedur: ;_________________________________________________________________________________________________ WndProc proc hWin:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD .if uMsg == WM_DESTROY invoke CloseHandle ,iHnd invoke PostQuitMessage,NULL mov eax, 0 ret .elseif wParam == 600 invoke CloseHandle ,iHnd invoke PostQuitMessage,NULL mov eax, 0 ret .elseif wParam == 620 invoke GetWindowText, hEdit2, addr Default, 256 invoke GetWindowText, hEdit1, addr szTest, 256 invoke Updatett ,addr Default,addr szTest ret .endif invoke DefWindowProc,hWin,uMsg,wParam,lParam ret WndProc endp ;_________________________________________________________________________________________________ PushButton proc lpText:DWORD,hParent:DWORD, a:DWORD,b:DWORD,wd:DWORD,ht:DWORD,ID:DWORD invoke CreateWindowEx,0, ADDR btnClass,lpText, WS_CHILD or WS_VISIBLE or BS_PUSHBUTTON or BS_NOTIFY, a,b,wd,ht,hParent,ID, hInstance,NULL ret PushButton endp EditSl proc szMsg:DWORD,a:DWORD,b:DWORD, wd:DWORD,ht:DWORD,hParent:DWORD,ID:DWORD invoke CreateWindowEx,WS_EX_CLIENTEDGE or WS_EX_ACCEPTFILES,ADDR slEdit,szMsg, ES_MULTILINE or WS_VISIBLE or WS_CHILD or ES_WANTRETURN, a,b,wd,ht,hParent,ID,hInstance,NULL ret EditSl endp Static proc lpText:DWORD,hParent:DWORD, a:DWORD,b:DWORD,wd:DWORD,ht:DWORD,ID:DWORD invoke CreateWindowEx,WS_EX_STATICEDGE, ADDR btnClass3,lpText, WS_CHILD or WS_VISIBLE, a,b,wd,ht,hParent,ID, hInstance,NULL ret Static endp ;_________________________________________________________________________________________________ ; ; Die geforderte Datei mit 'InternetReadFile' aus dem Internet vom Server laden, ; und in den Puffer 'myBuff' speichern : ;_________________________________________________________________________________________________ Updatett proc szAdresse:DWORD, Header:DWORD invoke InternetOpen, Header, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL ,0 mov iHnd,eax invoke InternetOpenUrl, iHnd, szAdresse, NULL, 0, INTERNET_FLAG_RELOAD, 0 mov urlHandle,eax .if eax == NULL invoke Beep ,440 ,100 .endif ; ------------------------------------------------------------------------- ; jetzt wird die mit "url/datei" addressierte datei aus dem internet geladen : ; ------------------------------------------------------------------------- invoke InternetReadFile ,urlHandle,addr myBuff ,9999 ,addr myPoint .if eax == FALSE invoke Beep ,440 ,100 .endif ; ------------------------------------------------------------------------- ; am Dateiende noch eine 0 in den Puffer schreiben : ; ------------------------------------------------------------------------- mov ebx,[myPoint] mov byte ptr[offset myBuff+ebx],0 invoke InternetCloseHandle ,urlHandle invoke Static,ADDR myBuff,hWnd,10,120,530,320,510 invoke UpdateWindow ,hWnd invoke Beep ,1000,50 ret Updatett endp end start