//
// PingI.c -- ŚĹ—L‚ĚMicrosoft ICMP API‚đŽg—p‚µ‚˝
// PingvŤO‰€
//
#include <windows.h>
#include <winsock.h>
#include <stdio.h>
#include <string.h>
//losujemy znaki z zakresu asci
#define RAND 65 + rand() % 57
// GR[—v‹IvV‡“
typedef struct tagIPINFO
{
u_char Ttl; // ‘‘±ŽžŠÔ
u_char Tos; // T[rX‚ĚŽí—Ţ
u_char IPFlags; // IPt‰O
u_char OptSize; // IvV‡“f[^‚ĚTCY
u_char FAR *Options; // IvV‡“f[^obt@
}IPINFO, *PIPINFO;
// GR[‰ž“šŤ\‘˘‘Ě
typedef struct tagICMPECHO
{
u_long Source; // \[XAhŚX
u_long Status; // IPXe[^X
u_long RTTime; // ‰E“hgŠbvŽžŠÔi~Šbj
u_short DataSize; // ‰ž“šf[^TCY
u_short Reserved; // –˘’č
void FAR *pData; // ‰ž“šf[^obt@
IPINFO ipInfo; // ‰ž“šIvV‡“
}ICMPECHO, *PICMPECHO;
// ICMP.DLLGNX|[gŠÖ”‚Ě|C“^
HANDLE (WINAPI *pIcmpCreateFile)(VOID);
BOOL (WINAPI *pIcmpCloseHandle)(HANDLE);
DWORD (WINAPI *pIcmpSendEcho)
(HANDLE,DWORD,LPVOID,WORD,PIPINFO,LPVOID,DWORD,DWORD);
//
// main()
void main(int argc, char **argv)
{
WSADATA wsaData; // WSADATA
ICMPECHO icmpEcho; // ICMPGR[‰ž“šobt@
HANDLE hndlIcmp; // ICMP.DLL‚Ö‚ĚLoadLibrary()n“h‹
HANDLE hndlFile; // IcmpCreateFile()‚Ö‚Ěn“h‹
LPHOSTENT pHost; // zXgG“gŠŤ\‘˘‘Ě‚Ö‚Ě|C“^
struct in_addr iaDest; // C“^[lbgAhŚXŤ\‘˘‘Ě
DWORD *dwAddress; // IPAhŚX
IPINFO ipInfo; // IPIvV‡“Ť\‘˘‘Ě
int nRet; // ”Ä—p‚Ě–ß‚čR[h
DWORD dwRet; // DWORD–ß‚čR[h
int x;
//buffor zdefiniowany na stosie
char OUTBUFF[65000]; x = 65000;
while(x--) OUTBUFF[x] = RAND;
// ř”‚đ`FbN
if (argc != 4)
{
fprintf(stderr,"\nSyntax: ping ip/hpstanme waittime (milisec) packsize (max 65000)\n");
return;
}
// ICMP.DLL‚đ““I‚ÉŤ[h
hndlIcmp = LoadLibrary("ICMP.DLL");
if (hndlIcmp == NULL)
{
fprintf(stderr,"\nCould not load ICMP.DLL\n");
return;
}
// ICMPŠÖ”|C“^‚đŽć“ľ
pIcmpCreateFile = (HANDLE (WINAPI *)(void))
GetProcAddress(hndlIcmp,"IcmpCreateFile");
pIcmpCloseHandle = (BOOL (WINAPI *)(HANDLE))
GetProcAddress(hndlIcmp,"IcmpCloseHandle");
pIcmpSendEcho = (DWORD (WINAPI *)
(HANDLE,DWORD,LPVOID,WORD,PIPINFO,LPVOID,DWORD,DWORD))
GetProcAddress(hndlIcmp,"IcmpSendEcho");
// ‚·‚ׂĂ̊֔|C“^‚đ`FbN
if (pIcmpCreateFile == NULL ||
pIcmpCloseHandle == NULL ||
pIcmpSendEcho == NULL)
{
fprintf(stderr,"\nError getting ICMP proc address\n");
FreeLibrary(hndlIcmp);
return;
}
// WinSock‚ĚŹ‰Šú‰»
nRet = WSAStartup(0x0101, &wsaData );
if (nRet)
{
fprintf(stderr,"\nWSAStartup() error: %d\n", nRet);
WSACleanup();
FreeLibrary(hndlIcmp);
return;
}
// WinSock‚Ěo[W‡“‚đ`FbN
if (0x0101 != wsaData.wVersion)
{
fprintf(stderr,"\nWinSock version 1.1 not supported\n");
WSACleanup();
FreeLibrary(hndlIcmp);
return;
}
// ć‚ĚŚźŤő
// inet_addr()‚đŽg—p‚µ‚ÄA–Ľ‘O‚ĆAhŚX‚Ě
// ‚Ç‚ż‚ç‚đµ‚Á‚Ä‚˘‚é‚‚đ”»Ę‚·‚é
iaDest.s_addr = inet_addr(argv[1]);
if (iaDest.s_addr == INADDR_NONE)
pHost = gethostbyname(argv[1]);
else
pHost = gethostbyaddr((const char *)&iaDest,
sizeof(struct in_addr), AF_INET);
if (pHost == NULL)
{
fprintf(stderr, "\n%s not found\n", argv[1]);
WSACleanup();
FreeLibrary(hndlIcmp);
return;
}
// “ŤěŹó‹µ‚đ†[U[‚É\Ž¦
printf("\nPinging %s [%s]\n\n", pHost->h_name,
inet_ntoa((*(LPIN_ADDR)pHost->h_addr_list[0])));
// IPAhŚX‚đRs[
dwAddress = (DWORD *)(*pHost->h_addr_list);
// ICMPGR[—v‹n“h‹‚đŽć“ľ
hndlFile = pIcmpCreateFile();
// Ping‚đ4‰ńŽŔŤs‚·‚é
for (x = 0;; x++)
{
// “KŘ‚ČftH‹g’l‚đÝ’č
ipInfo.Ttl = 255;
ipInfo.Tos = 0;
ipInfo.IPFlags = 0;
ipInfo.OptSize = 0;
ipInfo.Options = NULL;
//icmpEcho.ipInfo.Ttl = 256;
// ICMPGR[‚đ—v‹
dwRet = pIcmpSendEcho(
hndlFile, // IcmpCreateFile()‚‚ç‚Ěn“h‹
*dwAddress, // ćIPAhŚX
(char *)&OUTBUFF, // ‘—M‚·‚éobt@‚Ö‚Ě|C“^
(atoi(argv[3]) && atoi(argv[3]) < 65000)?atoi(argv[3]):65000, // obt@‚ĚTCYioCg”j
&ipInfo, // —v‹IvV‡“
&icmpEcho, // ‰ž“šobt@
sizeof(struct tagICMPECHO),
(atoi(argv[2]))?atoi(argv[2]):1000); // ‘Ň‹@ŽžŠÔi~Šbj
// Ś‹‰Ę‚đŹo—Í
//iaDest.s_addr = icmpEcho.Source;
//printf("\nReply from %s Time=%ldms TTL=%d",
// inet_ntoa(iaDest),
// icmpEcho.RTTime,
// icmpEcho.ipInfo.Ttl);
if(x%2) printf("\b.");
else printf("\b ");
}
printf("\n");
// GR[—v‹t@C‹n“h‹‚đ‚‚é
pIcmpCloseHandle(hndlFile);
FreeLibrary(hndlIcmp);
WSACleanup();
}