Skocz do zawartości

Recommended Posts

Napisano

Witam
Może i to dość proste, jednak ja nigdy nie zajmowalem sie programowaniem aplikacji sieciowych przy użyciu WinApi. Czy ktoś może podać przykład jak napisać (oczywiście w WinApi) funkcję która zwróci te informacjie co komenda Ping (W takiej lub podobnej postaci) z tym, że chcę mieć dostęp do poszczególnych zawartych tam informacji. Dobrze by było gdyby można podać nazwę lub adres IP.
Pozdro

Napisano

Dzięki, już sobie poradziłem :) Wszystko działa :) Napisałem (w MASM) to tak:

To jest kod modułu ping.inc

include wsock32.inc
includelib wsock32.lib

PingInit PROTO
PingClean PROTO
Ping PROTO :DWORD,:DWORD,:DWORD,:WORD

.const   
    ECHO_PACKET_SIZE            equ 32 ;rozmiar pakietu danych
               
    PING_INIT_OK                equ 0
    PING_INIT_ERROR_LOADLIB     equ 1
    PING_INIT_ERROR_GETPROCADDR equ 2
    PING_INIT_ERROR_WSASTARTUP  equ 3
   
    PING_INVALID_HOSTNAME       equ -1
   
.data
   
    szIcmp            db "icmp.dll",0
    szIcmpCreateFile  db "IcmpCreateFile",0
    szIcmpCloseHandle db "IcmpCloseHandle",0
    szIcmpSendEcho    db "IcmpSendEcho",0

.data?
    
    hIcmp             dd ?
    lpIcmpCreateFile  dd ?
    lpIcmpCloseHandle dd ?
    lpIcmpSendEcho    dd ?         

.code

PingInit proc 
LOCAL wsa: WSADATA
          
        invoke LoadLibrary, offset szIcmp
        cmp eax, 0
        je errorloadlib
        mov hIcmp, eax
        
    invoke GetProcAddress, hIcmp, offset szIcmpCreateFile
    cmp eax, 0
    je errorgetprocaddr
    mov lpIcmpCreateFile, eax
    
    invoke GetProcAddress, hIcmp, offset szIcmpCloseHandle
    cmp eax, 0
    je errorgetprocaddr
    mov lpIcmpCloseHandle, eax
    
    invoke GetProcAddress, hIcmp, offset szIcmpSendEcho
    cmp eax, 0
    je errorgetprocaddr
    mov lpIcmpSendEcho, eax
    
    invoke WSAStartup, 0101h, addr wsa
    cmp eax, 0
    jne errorwsastartup
    sub eax, eax
    ret
    errorwsastartup:
    inc eax ;eax = 3 Error PING_INIT_ERROR_WSASTARTUP
    errorgetprocaddr:
    push eax
    invoke FreeLibrary, hIcmp
    pop eax
    inc eax ;eax = 2 Error PING_INIT_ERROR_GETPROCADDR
    errorloadlib:    
    inc eax ;eax = 1 Error PING_INIT_ERROR_LOADLIB
        ret
              
PingInit endp

PingClean proc
        
        invoke WSACleanup
        invoke FreeLibrary, hIcmp
        ret

PingClean endp

Ping proc uses esi lpAddr:DWORD, lpEcho:DWORD, lpOptions:DWORD, TimeOut:WORD
LOCAL addrIP: DWORD
LOCAL hIcmpFile: DWORD
LOCAL acPingBuffer[ECHO_PACKET_SIZE]: BYTE
        

         invoke inet_addr, lpAddr
         mov addrIP, eax
         
         .if eax == INADDR_NONE
                invoke gethostbyname, lpAddr
                .if eax == 0  
                    dec eax ;eax = -1 PING_INVALID_HOSTNAME                     
                ret
                .endif
                mov eax, dword ptr [eax + 12]
                mov eax, dword ptr [eax]
                mov eax, dword ptr [eax]
                mov addrIP, eax
         .endif 
                 
         invoke RtlFillMemory, addr acPingBuffer, ECHO_PACKET_SIZE, 0AAh
         
         call lpIcmpCreateFile
         mov hIcmpFile, eax
                 
         mov esi, lpEcho
         assume esi: ptr ICMP_ECHO_REPLY
         lea eax, acPingBuffer
         mov [esi].DataPointer, eax
         mov [esi].DataSize, ECHO_PACKET_SIZE
         assume esi: nothing
         
         push TimeOut
         push sizeof ICMP_ECHO_REPLY + ECHO_PACKET_SIZE
         push lpEcho
         push lpOptions
         push ECHO_PACKET_SIZE
         lea  eax, acPingBuffer
         push eax
         push addrIP
         push hIcmpFile
         call lpIcmpSendEcho
         
         push eax
         
         push hIcmpFile
         call lpIcmpCloseHandle 
         
         pop eax                 
         ret

Ping endp

Najpierw wywołuję funkcję PingInit, później Ping i odpowiednio formatuję dane które podaję/otrzymuję no i po wszystkim PingClean.
Parametry funkcji Ping to:
lpAddr - adres lub nazwa hosta
lpEcho - adres zmiennej typu ICMP_ECHO_REPLY (zwraca potrzebne mi informacje)
lpOptions - adres zmiennej typu ICMP_OPTIONS (tu podaję niektóre dane np. TTL)
TimeOut - max. czas odpowiedzi
Wydaje mi się że wszystko działa poprawnie, gdyby jednak ktos zauważył jakiś błąd to proszę o wyjaśnienie co i dlaczego jest źle.
Pozdrawiam

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gość
Odpowiedz...

×   Wkleiłeś zawartość bez formatowania.   Usuń formatowanie

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Utwórz nowe...