IPMAN.C
上传用户:zsjierui
上传日期:2007-01-05
资源大小:156k
文件大小:42k
源码类别:

网络编程

开发平台:

Visual C++

  1. /* IPMan.C
  2. Console application to send and receive IP packet
  3.         Written by HiHint
  4.         Using vpacket.vxd */
  5. #include <stdio.h>
  6. #include <windows.h>
  7. #include <string.h>
  8. #include "ntddpack.h"
  9. #include "conpack.h"
  10. #include "ip.h"
  11. #define ERROR_OUT(str) { fprintf(stderr,str); CloseHandle(hEvent); return(0); }
  12. #define RECV_MAX 32
  13. #define SEND_MAX 32
  14. #define MAX_CONNECTION 64
  15. #define MAX_COMMAND 64
  16. #define MAX_DATA 64
  17. #define MAX_QUERY 64
  18. #define SYSERR -1
  19. #define OK 0
  20. #define OPT_DO_NOTHING 0x0 /* Do nothing, print local ethernet address */
  21. #define OPT_LISTEN_ALL 0x1 /* Listen all packet */
  22. #define OPT_LISTEN_SPEC 0x41e /* Listen specially */
  23. #define OPT_LISTEN 0x41f /* Listen */
  24. #define OPT_LISTEN_IP 0xa /* Listen IP packet carry special address */
  25. #define OPT_LISTEN_IP_1 0x2 /* Listen IP packet carry one special address */
  26. #define OPT_LISTEN_PORT 0x14 /* Listen IP packet carry special port */
  27. #define OPT_LISTEN_PORT_1 0x4 /* Listen IP packet carry one special port */
  28. #define OPT_LISTEN_IP_2 0x8 /* Listern IP packet between two address */
  29. #define OPT_LISTEN_PORT_2 0x10 /* Listen IP packet between two port */
  30. #define OPT_QUE_IP 0x20 /* Query ethernet address from IP address */
  31. #define OPT_QUE_ETHER 0x40 /* Query IP address from ethernet address */
  32. #define OPT_COMMAND_FILE 0x80 /* Work with command file */
  33. #define OPT_OUTPUT_FILE 0x100 /* Output to file */
  34. #define OPT_HELP 0x200 /* Print help message */
  35. #define COMMAND_SEND_ARP 0x1 /* Send ARP packet */
  36. #define COMMAND_SEND_TCP 0x2 /* Send TCP packet */
  37. #define COMMAND_RECV_TCP 0x4 /* Receive TCP packet */
  38. #define COMMAND_CONNECT_TCP 0x8 /* Connect TCP */
  39. #define COMMAND_CLOSE_TCP 0x10 /* Close TCP */
  40. #define COMMENT 0x8000 /* Comment line */
  41. #define COMMAND_UNKNOWN 0x0 /* Unknown command */
  42. #define OPT_LISTEN_INIT 0x400 /* Listen IP packet match INI file speciallity */
  43. #define INITIAL_FILE "ipman.ini" /* Initial file name */
  44. #define INITIAL_MAX_DATA 0x01 /* Initial file max data legth */
  45. #define INITIAL_IP_ADDR 0x02 /* Initial file my IP address */
  46. #define INITIAL_NDIS 0x04 /* Initial file NDIS */
  47. #define INITIAL_QUERY_IP 0x08 /* Initial file query ip array */
  48. #define INITIAL_QUERY_PORT 0x10 /* Initial file query port array */
  49. #define INITIAL_TIMEOUT 0x20 /* Initial file timeout */
  50. #define INITIAL_INFINITE "INFINITE" /* Initial file timeout infinite */
  51. #define INITIAL_END_SEGMENT 0x40 /* Initial file blank line as end of segment */
  52. struct CommandLine {
  53. DWORD option;
  54. char outfile[50];
  55. char cmdfile[50];
  56. struct IPAddr queip[2];
  57. struct EtherAddr queeth[2];
  58. WORD queport[2];
  59. };
  60. struct InitialFile {
  61. int maxdatalen;
  62. struct IPAddr mipaddr;
  63. char ndis[16];
  64. struct IPAddr qip[MAX_QUERY];
  65. int ipno;
  66. WORD qport[MAX_QUERY];
  67. int portno;
  68. DWORD timeout;
  69. };
  70. struct TCPConnection {
  71. struct EtherAddr sendeth,recveth;
  72. struct IPAddr sourip,destip;
  73. WORD sourport,destport;
  74. WORD id;
  75. DWORD ackno,seqno;
  76. BOOL inuse;
  77. };
  78. BYTE InBuff[ sizeof(PACKET_OID_DATA) + 128 ];
  79. DWORD Bind(HANDLE hVxD, BYTE* inBuffer);
  80. WORD  GetHardEtherAddr(HANDLE hVxD,struct EtherAddr *petheraddr);
  81. BYTE* SetOid(HANDLE hVxD, ULONG ulOid, ULONG ulLength, ULONG data);
  82. DWORD QueryPacket(HANDLE hVxD,ULONG ioctl,BYTE* inBuffer,DWORD cbIn,
  83.   BYTE* outBuffer,DWORD cbOut);
  84. BYTE* QueryOid(HANDLE hVxD, ULONG ulOid, ULONG ulLength);
  85. WORD RecvStart(HANDLE hVxD,struct PacketTable *packtab);
  86. WORD SendStart(HANDLE hVxD,struct PacketTable *packtab);
  87. WORD RecvPacket(HANDLE hVxD,BYTE *pbuf);
  88. WORD SendPacket(HANDLE hVxD,BYTE *pbuf,WORD len);
  89. WORD CheckSum(WORD *pbuf,WORD len);
  90. WORD ListenStart(HANDLE hVxD);
  91. WORD SendARPPacket(HANDLE hVxD,
  92.    struct EtherAddr *psourether,
  93.    struct EtherAddr *pdestether,
  94.    struct EtherAddr *psendether,
  95.    struct EtherAddr *precvether,
  96.    struct IPAddr *psendip,
  97.    struct IPAddr *precvip,
  98.    WORD oper);
  99. WORD SendTCPPacket(HANDLE hVxD,
  100.    struct EtherAddr *psourether,
  101.    struct EtherAddr *pdestether,
  102.    struct IPAddr *psourip,
  103.    struct IPAddr *pdestip,
  104.    WORD sourport,
  105.    WORD destport,
  106.    WORD flag,
  107.    DWORD seqno,
  108.    DWORD ackno,
  109.    char *pbuf,
  110.    WORD len);
  111. WORD RecvTCPPacket(HANDLE hVxD,
  112.    struct IPAddr *psourip,
  113.    struct IPAddr *pdestip,
  114.    WORD sourport,
  115.    WORD destport,
  116.    WORD *flag,
  117.    DWORD *seqno,
  118.    DWORD *ackno,
  119.    char *pbuf,
  120.    WORD *size);
  121. WORD swaps(WORD net);
  122. DWORD swapl(DWORD net);
  123. WORD GetOption(int argc,char *argv[],struct CommandLine *cmdline);
  124. WORD GetInitial(FILE *pfini,struct InitialFile *inifile);
  125. void ReadCommand(FILE *pf,char *pbuf);
  126. WORD GetCommand(char *pbuf);
  127. void GetSendARPArg(char *pbuf,
  128.        struct EtherAddr *psendeth,
  129.    struct EtherAddr *precveth,
  130.    struct EtherAddr *soureth,
  131.    struct EtherAddr *desteth,
  132.    struct IPAddr *sourip,
  133.    struct IPAddr *destip,
  134.    WORD *oper);
  135. void GetSendTCPArg(char *pbuf,WORD *id,char *pdata,WORD *size);
  136. void GetRecvTCPArg(char *pbuf,WORD *id);
  137. void GetConnectArg(char *pbuf,
  138.    struct EtherAddr *sendeth,
  139.    struct EtherAddr *recveth,
  140.    struct IPAddr *sourip,
  141.    struct IPAddr *destip,
  142.    WORD *sourport,
  143.    WORD *destport,
  144.    WORD *id);
  145. void GetCloseArg(char *pbuf,WORD *id);
  146. void GetDataArg(char *pbuf,char *pdata,WORD *size);
  147. void GetIPAddr(char *pbuf,struct IPAddr *pipaddr);
  148. void GetEtherAddr(char *pbuf,struct EtherAddr *pethaddr);
  149. void PrintEtherAddr(FILE *pf,struct EtherAddr *pethaddr);
  150. void PrintIPAddr(FILE *pf,struct IPAddr *pIPaddr);
  151. void PrintData(FILE *pf,BYTE *pdata,int size);
  152. void ToUpper(char *pbuf);
  153. static Max_Data_Len;
  154. int main(int argc,char *argv[])
  155. {
  156. HANDLE hVxD;
  157. DWORD dwErrorCode;
  158. struct EtherAddr m_EtherAddr;
  159. struct IPAddr m_IPAddr;
  160. HANDLE hEvent;
  161. BOOL Continue;
  162. int i,j,k;
  163. BYTE Buffer[BUFFER_SIZE];
  164. WORD DataLen;
  165. struct EtherPacketHead *pEtherHead;
  166. struct IPPacketHead *pIPHead;
  167. struct TCPPacketHead *pTCPHead;
  168. struct ARPPacket *pARPHead;
  169. struct ICMPPacketHead *pICMPHead;
  170. struct UDPPacketHead *pUDPHead;
  171. int headlen,totallen;
  172. struct IPAddr *psourip,*pdestip;
  173. struct EtherAddr *psoureth,*pdesteth;
  174. WORD sourport,destport;
  175. DWORD seqno,ackno;
  176. BYTE *pdata;
  177. WORD filter;
  178. BOOL flag;
  179. FILE *pfout=NULL,*pfcmd=NULL,*pfini=NULL;
  180. struct EtherAddr ethernull,etherbroad;
  181. struct IPAddr ipnull;
  182. struct CommandLine cmdline;
  183. struct InitialFile inifile;
  184. char Command[BUFFER_SIZE];
  185. char *pbufh,*pbuft;
  186. struct EtherAddr sendethaddr,recvethaddr,sourethaddr,destethaddr;
  187. struct IPAddr sipaddr,dipaddr;
  188. WORD arpoper,tcpid;
  189. struct TCPConnection TCP[MAX_CONNECTION];
  190. WORD maxconn=0;
  191. WORD TCPFlag;
  192. /* Set null ethernet address and broadcast ethernet address */
  193. memset((void*)&ethernull,0,6);
  194. memset((void*)&etherbroad,0xff,6);
  195. memset((void*)&ipnull,0,6);
  196. /* Get initial file property */
  197. if((pfini=fopen(INITIAL_FILE,"r"))==NULL) {
  198. fprintf(stderr,"Can not open %sn",INITIAL_FILE);
  199. return 0;
  200. }
  201. if(GetInitial(pfini,&inifile)!=OK) {
  202. fprintf(stderr,"Not valid initial file.n");
  203. return 0;
  204. }
  205. Max_Data_Len=inifile.maxdatalen;
  206. memcpy((void *)&m_IPAddr,(void *)&inifile.mipaddr,4);
  207. /* Get command line option */
  208. if(GetOption(argc,argv,&cmdline)!=OK||cmdline.option&OPT_HELP) {
  209.                 fprintf(stderr,"IPMan Version 0.5bn");
  210.                 fprintf(stderr,"Author: HiHintnEmail:HiHint@hotmail.comnn");
  211.                 fprintf(stderr,"Usage ipman [-?] [-l[ini] [-ip:sour_ip[:dest_ip]] [-port:sour_port[:dest_port]]] [-qeth:ip_addr] [-qip:eth_addr] [-fout:output_file] [-fcmd:command_file]n");
  212. return 0;
  213. }
  214. if((cmdline.option&OPT_LISTEN)!=0) filter=NDIS_PACKET_TYPE_PROMISCUOUS;
  215. else filter=NDIS_PACKET_TYPE_DIRECTED;
  216. /* Open device */
  217.     hVxD = CreateFile("\\.\VPACKET.VXD", 
  218.                       GENERIC_READ | GENERIC_WRITE,
  219.                       0,
  220.                       NULL,
  221.                       OPEN_EXISTING,
  222.                       FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED |
  223.                       FILE_FLAG_DELETE_ON_CLOSE,
  224.                       NULL);
  225.     if (hVxD == INVALID_HANDLE_VALUE) {
  226.         dwErrorCode = GetLastError();
  227.         if (dwErrorCode == ERROR_NOT_SUPPORTED) {
  228.             fprintf(stderr,"Unable to open VxD,ndevice does not support DeviceIOCTLn");
  229.         }
  230.         else
  231.             fprintf(stderr,"Unable to open VxD, Error code: %lxn", dwErrorCode);
  232. return(0);
  233.     }
  234. /* Device opened successfully */
  235. /* Bind driver to NDIS3 adapter */
  236. Bind(hVxD,inifile.ndis);
  237. /* Get ethernet address and IP */
  238. if(GetHardEtherAddr(hVxD,&m_EtherAddr)!=OK) return 0;
  239. /* Set Filter */
  240. SetOid(hVxD, OID_GEN_CURRENT_PACKET_FILTER, 4, filter);
  241. if((cmdline.option&OPT_OUTPUT_FILE)!=0) { /* Open output file */
  242. if((pfout=fopen(cmdline.outfile,"w"))==NULL) {
  243. fprintf(stderr,"Can not open output file.n");
  244. goto ENDOFTASK;
  245. }
  246. }
  247. else pfout=stdout;
  248. if(cmdline.option==0) {
  249. fprintf(pfout,"Ether address:");
  250. PrintEtherAddr(pfout,&m_EtherAddr);
  251. goto ENDOFTASK;
  252. }
  253. if((cmdline.option&OPT_COMMAND_FILE)!=0) { /* Open command file */
  254. if((pfcmd=fopen(cmdline.cmdfile,"r"))==NULL) {
  255. fprintf(stderr,"Can not open command file.n");
  256. goto ENDOFTASK;
  257. }
  258. for(i=0;i<MAX_CONNECTION;i++) TCP[i].inuse=FALSE;
  259. }
  260. if((cmdline.option&OPT_LISTEN)!=0) {
  261. /* Do listen */
  262. Continue=TRUE;
  263. while(Continue) {
  264. DataLen=RecvPacket(hVxD,Buffer);
  265. if(DataLen==SYSERR) goto ENDOFTASK;
  266. /* Begin to process data */
  267. pEtherHead=(struct EtherPacketHead *)Buffer;
  268. switch (swaps(pEtherHead->ServType)) {
  269. case ETHER_PROTO_IP: /* IP packet */
  270. pIPHead=(struct IPPacketHead *)(Buffer+ETHER_HEAD_LEN);
  271. headlen=(pIPHead->VerHLen)&0xf;
  272. headlen*=4;
  273. totallen=swaps(pIPHead->TtlLen);
  274. psourip=&(pIPHead->SourIP);
  275. pdestip=&(pIPHead->DestIP);
  276. flag=TRUE;
  277. if(cmdline.option&OPT_LISTEN_IP) {
  278. flag=FALSE;
  279. if((cmdline.option&OPT_LISTEN_IP_1)&&
  280.    (memcmp((void *)&cmdline.queip[0],(void *)psourip,4)==0||
  281. memcmp((void *)&cmdline.queip[0],(void *)pdestip,4)==0))  
  282. flag=TRUE;
  283. else if((cmdline.option&OPT_LISTEN_IP_2)&&
  284. ((memcmp((void *)&cmdline.queip[0],(void *)psourip,4)==0&&
  285.   memcmp((void *)&cmdline.queip[1],(void *)pdestip,4))||
  286.  (memcmp((void *)&cmdline.queip[0],(void *)pdestip,4)==0&&
  287.   memcmp((void *)&cmdline.queip[1],(void *)psourip,4))))
  288. flag=TRUE;
  289. }
  290. else if(cmdline.option&OPT_LISTEN_INIT) {
  291. flag=FALSE;
  292. for(i=0;i<inifile.ipno;i++) 
  293. if(memcmp((void *)&inifile.qip[i],(void *)psourip,4)==0||
  294.    memcmp((void *)&inifile.qip[i],(void *)pdestip,4)==0) break;
  295. if(i<inifile.ipno) flag=TRUE;
  296. }
  297. if(flag) {
  298. switch (pIPHead->Proto) {
  299. case IP_PROTO_TCP: /* TCP packet */
  300. pTCPHead=(struct TCPPacketHead *)(Buffer+ETHER_HEAD_LEN+headlen);
  301. totallen-=headlen;
  302. sourport=swaps(pTCPHead->SourPort);
  303. destport=swaps(pTCPHead->DestPort);
  304. seqno=swapl(pTCPHead->SeqNo);
  305. ackno=swapl(pTCPHead->AckNo);
  306. headlen=(pTCPHead->HLen)>>4;
  307. headlen*=4;
  308. totallen-=headlen;
  309. pdata=((BYTE *)pTCPHead)+headlen;
  310. /* TODO */
  311. flag=TRUE;
  312. if(cmdline.option&OPT_LISTEN_PORT) {
  313. flag=FALSE;
  314. if((cmdline.option&OPT_LISTEN_PORT_1)&&
  315.    (cmdline.queport[0]==sourport||
  316.     cmdline.queport[0]==destport))
  317. flag=TRUE;
  318. else if((cmdline.option&OPT_LISTEN_PORT_2)&&
  319.      ((cmdline.queport[0]==sourport&&cmdline.queport[1]==destport)||
  320.   (cmdline.queport[0]==destport&&cmdline.queport[1]==sourport)))
  321. flag=TRUE;
  322. }
  323. else if(cmdline.option&OPT_LISTEN_INIT) {
  324. flag=FALSE;
  325. for(i=0;i<inifile.portno;i++) 
  326. if(sourport==inifile.qport[i]||
  327.    destport==inifile.qport[i]) break;
  328. if(i<inifile.portno) flag=TRUE;
  329. }
  330. if(flag) {
  331. PrintIPAddr(pfout,psourip);
  332. fprintf(pfout,":%d -> ",sourport);
  333. PrintIPAddr(pfout,pdestip);
  334. fprintf(pfout,":%dn",destport);
  335. fprintf(pfout,"%d Byte(s) TCP Message:",totallen);
  336. PrintData(pfout,pdata,totallen);
  337. fprintf(pfout,"n");
  338. }
  339. break;
  340. case IP_PROTO_UDP: /* UDP packet */
  341. pUDPHead=(struct UDPPacketHead *)(Buffer+ETHER_HEAD_LEN+headlen);
  342. totallen-=headlen;
  343. sourport=swaps(pUDPHead->SourPort);
  344. destport=swaps(pUDPHead->DestPort);
  345. pdata=((BYTE *)pUDPHead)+UDP_HEAD_LEN;
  346. /* TODO */
  347. totallen-=UDP_HEAD_LEN;
  348. flag=TRUE;
  349. if(cmdline.option&OPT_LISTEN_PORT) {
  350. flag=FALSE;
  351. if((cmdline.option&OPT_LISTEN_PORT_1)&&
  352.    (cmdline.queport[0]==sourport||
  353.     cmdline.queport[0]==destport))
  354. flag=TRUE;
  355. else if((cmdline.option&OPT_LISTEN_PORT_2)&&
  356.      ((cmdline.queport[0]==sourport&&cmdline.queport[1]==destport)||
  357.   (cmdline.queport[0]==destport&&cmdline.queport[1]==sourport)))
  358. flag=TRUE;
  359. }
  360. else if(cmdline.option&OPT_LISTEN_INIT) {
  361. flag=FALSE;
  362. for(i=0;i<inifile.portno;i++) 
  363. if(sourport==inifile.qport[i]||
  364.    destport==inifile.qport[i]) break;
  365. if(i<inifile.portno) flag=TRUE;
  366. }
  367. if(flag) {
  368. PrintIPAddr(pfout,psourip);
  369. fprintf(pfout,":%d -> ",sourport);
  370. PrintIPAddr(pfout,pdestip);
  371. fprintf(pfout,":%dn",destport);
  372. fprintf(pfout,"%d Byte(s) UDP Message:",totallen);
  373. PrintData(pfout,pdata,totallen);
  374. fprintf(pfout,"n");
  375. }
  376. break;
  377. case IP_PROTO_ICMP: /* ICMP packet */
  378. flag=TRUE;
  379. if(cmdline.option&OPT_LISTEN_PORT) 
  380.    flag=FALSE;
  381. if(flag) {
  382. pICMPHead=(struct ICMPPacketHead *)(Buffer+ETHER_HEAD_LEN+headlen);
  383. totallen-=headlen;
  384. pdata=((BYTE *)pICMPHead)+ICMP_HEAD_LEN;
  385. totallen-=ICMP_HEAD_LEN;
  386. /* TODO */
  387. PrintIPAddr(pfout,psourip);
  388. fprintf(pfout," -> ");
  389. PrintIPAddr(pfout,pdestip);
  390. fprintf(pfout,"n");
  391. fprintf(pfout,"%d Byte(s) ICMP Message:Type:%d Code:%dn",totallen,pICMPHead->Type,pICMPHead->Code);
  392. }
  393. break;
  394. default: /* Unknown packet */
  395. /*fprintf(stderr,"Unknown ip packet type.n");*/
  396. break;
  397. }
  398. }
  399. break;
  400. case ETHER_PROTO_ARP: /* ARP packet */
  401. if((cmdline.option&OPT_LISTEN_SPEC)==0) {
  402. pARPHead=(struct ARPPacket*)(Buffer+ETHER_HEAD_LEN);
  403. psourip=&(pARPHead->SourIP);
  404. pdestip=&(pARPHead->DestIP);
  405. psoureth=&(pARPHead->SourEther);
  406. pdesteth=&(pARPHead->DestEther);
  407. /* TODO */
  408. fprintf(pfout,"ARP Message:From:");
  409. PrintEtherAddr(pfout,psoureth);
  410. fprintf(pfout,":");
  411. PrintIPAddr(pfout,psourip);
  412. fprintf(pfout," To:");
  413. PrintEtherAddr(pfout,pdesteth);
  414. fprintf(pfout,":");
  415. PrintIPAddr(pfout,pdestip);
  416. fprintf(pfout," Operation:%dn",swaps(pARPHead->Oper));
  417. }
  418. break;
  419. default: /* Unknown packet */
  420. /*fprintf(stderr,"Unknown ethernet packet type.n");*/
  421. break;
  422. }
  423. }
  424. }
  425. else if((cmdline.option&OPT_QUE_ETHER)!=0) {
  426. /* Do query ethernet address form IP */
  427. ListenStart(hVxD);
  428. SendARPPacket(hVxD,
  429.   &m_EtherAddr,
  430.   &etherbroad,
  431.   &m_EtherAddr,
  432.   &ethernull,
  433.   &m_IPAddr,
  434.   &cmdline.queip[0],
  435.   ARP_OPER_ARP_REQ);
  436. Continue=TRUE;
  437. while(Continue) {
  438. if((DataLen=RecvPacket(hVxD,Buffer))==SYSERR) {
  439. fprintf(stderr,"Can not recv ARP packet.n");
  440. goto ENDOFTASK;
  441. }
  442. pEtherHead=(struct EtherPacketHead *)Buffer;
  443. if(swaps(pEtherHead->ServType)!=ETHER_PROTO_ARP) continue;
  444. pARPHead=(struct ARPPacket *)(Buffer+ETHER_HEAD_LEN);
  445. if(swaps(pARPHead->Oper)!=ARP_OPER_ARP_ANS) continue;
  446. if(memcmp((void *)&pARPHead->SourIP,(void *)&cmdline.queip[0],4)!=0) continue;
  447. /* Get ethernet address */
  448. fprintf(pfout,"Ethernet Address:");
  449. PrintEtherAddr(pfout,&pARPHead->SourEther);
  450. fprintf(pfout," of IP Address:");
  451. PrintIPAddr(pfout,&cmdline.queip[0]);
  452. fprintf(pfout,"n"); 
  453. Continue=FALSE;
  454. }
  455. }
  456. else if((cmdline.option&OPT_QUE_IP)!=0) {
  457. /* Do query IP from ethernet address */
  458. ListenStart(hVxD);
  459. SendARPPacket(hVxD,
  460.   &m_EtherAddr,
  461.   &etherbroad,
  462.   &m_EtherAddr,
  463.   &cmdline.queeth[0],
  464.   &m_IPAddr,
  465.   &ipnull,
  466.   ARP_OPER_RARP_REQ);
  467. Continue=TRUE;
  468. while(Continue) {
  469. if((DataLen=RecvPacket(hVxD,Buffer))==SYSERR) {
  470. fprintf(stderr,"Can not recv ARP packet.n");
  471. goto ENDOFTASK;
  472. }
  473. pEtherHead=(struct EtherPacketHead *)Buffer;
  474. if(swaps(pEtherHead->ServType)!=ETHER_PROTO_ARP) continue;
  475. pARPHead=(struct ARPPacket *)(Buffer+ETHER_HEAD_LEN);
  476. if(swaps(pARPHead->Oper)!=ARP_OPER_RARP_ANS) continue;
  477. if(memcmp((void *)&pARPHead->SourEther,(void *)&cmdline.queeth[0],6)!=0) continue;
  478. /* Get IP address */
  479. fprintf(pfout,"IP Address:");
  480. PrintIPAddr(pfout,&pARPHead->SourIP);
  481. fprintf(pfout," of Ethernet Address:");
  482. PrintEtherAddr(pfout,&cmdline.queeth[0]);
  483. fprintf(pfout,"n");
  484. Continue=FALSE;
  485. }
  486. }
  487. else if((cmdline.option&OPT_COMMAND_FILE)!=0) {
  488. /* Do command file */
  489. while(feof(pfcmd)==0) {
  490. ReadCommand(pfcmd,Command);
  491. switch (GetCommand(Command)) {
  492. case COMMAND_SEND_ARP:
  493. GetSendARPArg(Command,
  494.           &sendethaddr,
  495.   &recvethaddr,
  496.   &sourethaddr,
  497.   &destethaddr,
  498.   &sipaddr,
  499.   &dipaddr,
  500.   &arpoper);
  501. SendARPPacket(hVxD,
  502.           &sendethaddr,
  503.   &recvethaddr,
  504.   &sourethaddr,
  505.   &destethaddr,
  506.   &sipaddr,
  507.   &dipaddr,
  508.   arpoper);
  509. fprintf(pfout,"Send ARP.n");
  510. break;
  511. case COMMAND_SEND_TCP:
  512. GetSendTCPArg(Command,&tcpid,Buffer,&DataLen);
  513. if(TCP[tcpid].inuse==FALSE) 
  514. fprintf(stdout,"Connection %d invalid or already closed.n",tcpid);
  515. else {
  516. SendTCPPacket(hVxD,
  517.   &TCP[tcpid].sendeth,
  518.   &TCP[tcpid].recveth,
  519.   &TCP[tcpid].sourip,
  520.   &TCP[tcpid].destip,
  521.   TCP[tcpid].sourport,
  522.   TCP[tcpid].destport,
  523.   TCP_ACK|TCP_PSH,
  524.   TCP[tcpid].seqno,
  525.   TCP[tcpid].ackno,
  526.   Buffer,
  527.   DataLen);
  528. fprintf(pfout,"Send %d TCP:",tcpid);
  529. PrintData(pfout,Buffer,DataLen);
  530. fprintf(pfout,"n");
  531. }
  532. break;
  533. case COMMAND_RECV_TCP:
  534. GetRecvTCPArg(Command,&tcpid);
  535. RecvTCPPacket(hVxD,
  536.   &TCP[tcpid].destip,
  537.   &TCP[tcpid].sourip,
  538.   TCP[tcpid].destport,
  539.   TCP[tcpid].sourport,
  540.   &TCPFlag,
  541.   &TCP[tcpid].ackno,
  542.   &TCP[tcpid].seqno,
  543.   Buffer,
  544.   &DataLen);
  545. if(DataLen==0) TCP[tcpid].ackno++;
  546. else TCP[tcpid].ackno+=DataLen;
  547. fprintf(pfout,"Receive %d TCP %d byte(s):",tcpid,DataLen);
  548. PrintData(pfout,Buffer,DataLen);
  549. fprintf(pfout,"n");
  550. /*fprintf(pfout,"Flag:%xn",TCPFlag);*/
  551. if(TCPFlag&TCP_FIN||TCPFlag&TCP_RST) {
  552. TCP[tcpid].inuse=FALSE;
  553. fprintf(pfout,"Peer close connection %d.n",tcpid);
  554. }
  555. break;
  556. case COMMAND_CONNECT_TCP:
  557. ListenStart(hVxD);
  558. GetConnectArg(Command,
  559.   &sendethaddr,
  560.   &recvethaddr,
  561.   &sipaddr,
  562.   &dipaddr,
  563.   &sourport,
  564.   &destport,
  565.   &tcpid);
  566. memcpy((void *)&TCP[tcpid].sendeth,(void *)&sendethaddr,6);
  567. memcpy((void *)&TCP[tcpid].recveth,(void *)&recvethaddr,6);
  568. memcpy((void *)&TCP[tcpid].sourip,(void *)&sipaddr,4);
  569. memcpy((void *)&TCP[tcpid].destip,(void *)&dipaddr,4);
  570. TCP[tcpid].sourport=sourport;
  571. TCP[tcpid].destport=destport;
  572. TCP[tcpid].seqno=swapl(0x1234);
  573. TCP[tcpid].ackno=0;
  574. TCPFlag=TCP_SYN;
  575. SendTCPPacket(hVxD,
  576.   &TCP[tcpid].sendeth,
  577.   &TCP[tcpid].recveth,
  578.   &TCP[tcpid].sourip,
  579.   &TCP[tcpid].destip,
  580.   TCP[tcpid].sourport,
  581.   TCP[tcpid].destport,
  582.   TCPFlag,
  583.   TCP[tcpid].seqno,
  584.   TCP[tcpid].ackno,
  585.   Buffer,
  586.   0);
  587. /*fprintf(pfout,"First:Flag:%x Seq:%lu Ack:%lun",
  588.     TCPFlag,swapl(0x1234),ackno);*/
  589. RecvTCPPacket(hVxD,
  590.   &TCP[tcpid].destip,
  591.   &TCP[tcpid].sourip,
  592.   TCP[tcpid].destport,
  593.   TCP[tcpid].sourport,
  594.   &TCPFlag,
  595.   &TCP[tcpid].ackno,
  596.   &TCP[tcpid].seqno,
  597.   Buffer,
  598.   &DataLen);
  599. /*fprintf(pfout,"Second:Flag:%x Seq:%lu Ack:%lun",
  600.     TCPFlag,TCP[tcpid].ackno,TCP[tcpid].seqno);*/
  601. TCP[tcpid].ackno++;
  602. TCPFlag=TCP_ACK;
  603. SendTCPPacket(hVxD,
  604.   &TCP[tcpid].sendeth,
  605.   &TCP[tcpid].recveth,
  606.   &TCP[tcpid].sourip,
  607.   &TCP[tcpid].destip,
  608.   TCP[tcpid].sourport,
  609.   TCP[tcpid].destport,
  610.   TCPFlag,
  611.   TCP[tcpid].seqno,
  612.   TCP[tcpid].ackno,
  613.   Buffer,
  614.   0);
  615. /*fprintf(pfout,"Third:Flag:%x Seq:%lu Ack:%lun",
  616.     TCPFlag,TCP[tcpid].seqno,TCP[tcpid].ackno);*/
  617. fprintf(pfout,"TCP %d Connectedn",tcpid);
  618. TCP[tcpid].inuse=TRUE;
  619. break;
  620. case COMMAND_CLOSE_TCP:
  621. GetCloseArg(Command,&tcpid);
  622. TCPFlag=TCP_FIN|TCP_ACK;
  623. SendTCPPacket(hVxD,
  624.   &TCP[tcpid].sendeth,
  625.   &TCP[tcpid].recveth,
  626.   &TCP[tcpid].sourip,
  627.   &TCP[tcpid].destip,
  628.   TCP[tcpid].sourport,
  629.   TCP[tcpid].destport,
  630.   TCPFlag,
  631.   TCP[tcpid].seqno,
  632.   TCP[tcpid].ackno,
  633.   Buffer,
  634.   0);
  635. fprintf(pfout,"Closen");
  636. TCP[tcpid].inuse=FALSE;
  637. break;
  638. case COMMENT:
  639. break;
  640. case COMMAND_UNKNOWN:
  641. if(feof(pfcmd)==0) fprintf(stderr,"Command unknown.n");
  642. /*goto ENDOFTASK;*/
  643. }
  644. }
  645. }
  646. ENDOFTASK:
  647. CloseHandle(hVxD);
  648. if(pfout!=NULL) fclose(pfout);
  649. if(pfcmd!=NULL) fclose(pfcmd);
  650. return 0;
  651. }
  652. DWORD Bind(HANDLE hVxD, BYTE* inBuffer)
  653. {
  654.     HANDLE          hEvent  = 0;
  655.     DWORD           cbRet   = 0;
  656.     OVERLAPPED      ovlp    = {0,0,0,0,0};
  657.     int result;
  658.     int cbIn = 5;
  659.     
  660.     hEvent = CreateEvent(0, TRUE, 0, NULL);
  661. if(!hEvent) {
  662. fprintf(stderr,"Can not create eventn");
  663. return SYSERR;
  664. }
  665. ovlp.hEvent=hEvent;
  666.     result = DeviceIoControl(hVxD,
  667.  IOCTL_PROTOCOL_BIND, 
  668.  inBuffer, 
  669.  cbIn, 
  670.  inBuffer, 
  671.  cbIn, 
  672.  &cbRet, 
  673.  &ovlp);
  674.     if (!result)
  675.         GetOverlappedResult(hVxD, &ovlp, &cbRet, TRUE);
  676. CloseHandle(hEvent);
  677.     return OK;
  678. }
  679. WORD GetHardEtherAddr(HANDLE hVxD,struct EtherAddr *petheraddr)
  680. {
  681.     BYTE*   buffer = QueryOid(hVxD, OID_802_3_CURRENT_ADDRESS, 6);
  682.     if (buffer!=NULL) {
  683. memcpy((void *)petheraddr->AddrByte,(void*)buffer,6);
  684. return OK;
  685. }
  686. return SYSERR;
  687. }
  688. DWORD QueryPacket(HANDLE hVxD,ULONG ioctl,BYTE* inBuffer,DWORD cbIn,
  689.   BYTE* outBuffer,DWORD cbOut)
  690. {
  691.     HANDLE      hEvent = 0;
  692.     DWORD       cbRet;
  693.     OVERLAPPED  ovlp = {0,0,0,0,0};
  694.    
  695.     if (!(hEvent = CreateEvent(0, TRUE, 0, NULL)))
  696.         ERROR_OUT("CreateEvent failed!n")
  697.     ovlp.hEvent = hEvent;
  698.     
  699.     if (!DeviceIoControl(hVxD, ioctl, inBuffer, cbIn, outBuffer, cbOut, &cbRet, &ovlp)) {
  700.         if (GetLastError() == ERROR_IO_PENDING)                         
  701.             fprintf(stderr,"VxD correctly returned operation incomplete.n" );
  702.         else
  703.             ERROR_OUT( "VxD does not support the requested API!!!n" );
  704.         if (!GetOverlappedResult(hVxD, &ovlp, &cbRet, FALSE)) {
  705.             if (GetLastError() == ERROR_IO_INCOMPLETE)
  706.                 fprintf(stderr,"GetOverlappedResult returned expected value.n");
  707.             else
  708.                 ERROR_OUT("GetOverlappedResult returned unexpected error.n");
  709.         }
  710.         GetOverlappedResult( hVxD, &ovlp, &cbRet, TRUE);
  711. }
  712.     return cbRet;
  713. }
  714. BYTE* QueryOid(HANDLE hVxD, ULONG ulOid, ULONG ulLength)
  715. {
  716.     DWORD               cbIn = sizeof(PACKET_OID_DATA) + ulLength;
  717.     DWORD               cbRet;
  718. PPACKET_OID_DATA pOidData = (PPACKET_OID_DATA)InBuff;
  719.     ULONG               ioctl;
  720.     ioctl = (ulOid >= OID_802_3_PERMANENT_ADDRESS) 
  721.   
  722.    ? IOCTL_PROTOCOL_QUERY_OID : IOCTL_PROTOCOL_STATISTICS;
  723.     memset(InBuff, 0, cbIn+1);
  724. pOidData->Oid    = ulOid;
  725. pOidData->Length = ulLength;
  726. cbRet = QueryPacket( hVxD, ioctl, InBuff, cbIn, InBuff, cbIn );
  727.    
  728. if ( cbRet > 0 ) 
  729.         return (InBuff+sizeof(PACKET_OID_DATA)-1);
  730. return 0;
  731. }
  732. BYTE* SetOid(HANDLE hVxD, ULONG ulOid, ULONG ulLength, ULONG data)
  733. {
  734.     DWORD               cbIn = sizeof(PACKET_OID_DATA) + ulLength;
  735.     DWORD               cbRet;
  736. PPACKET_OID_DATA pOidData = (PPACKET_OID_DATA)InBuff;
  737.     ULONG               ioctl;
  738.     if (ulOid == OID_GEN_CURRENT_PACKET_FILTER)
  739.         ioctl = (ULONG) IOCTL_PROTOCOL_SET_OID;
  740.     memset(InBuff, 0, cbIn+1);
  741.     pOidData->Oid     = ulOid;
  742.     pOidData->Length  = ulLength;
  743.     pOidData->Data[0] = (UCHAR) data;
  744.     cbRet = QueryPacket(hVxD, ioctl, InBuff, cbIn, InBuff, cbIn);
  745.    
  746. return 0;
  747. }
  748. WORD RecvStart(HANDLE hVxD,struct PacketTable *packtab)
  749. {
  750. int result;
  751. packtab->Overlap.Internal=0;
  752. packtab->Overlap.InternalHigh=0;
  753. packtab->Overlap.Offset=0;
  754. packtab->Overlap.OffsetHigh=0;
  755. packtab->Overlap.hEvent=packtab->hEvent;
  756. result=DeviceIoControl(hVxD,
  757.    IOCTL_PROTOCOL_READ,
  758.    &packtab->Buffer,
  759.    packtab->Size,
  760.    &packtab->Buffer,
  761.    packtab->Size,
  762.    &packtab->Length,
  763.    &packtab->Overlap);
  764. if(result) return SYSERR;
  765. return OK;
  766. }
  767. WORD SendStart(HANDLE hVxD,struct PacketTable *packtab)
  768. {
  769. int result;
  770. packtab->Overlap.Internal=0;
  771. packtab->Overlap.InternalHigh=0;
  772. packtab->Overlap.Offset=0;
  773. packtab->Overlap.OffsetHigh=0;
  774. packtab->Overlap.hEvent=packtab->hEvent;
  775. result=DeviceIoControl(hVxD,
  776.    IOCTL_PROTOCOL_WRITE,
  777.    &packtab->Buffer,
  778.    packtab->Size,
  779.    &packtab->Buffer,
  780.    packtab->Length,
  781.    &packtab->Length,
  782.    &packtab->Overlap);
  783. if(result) return SYSERR;
  784. return OK;
  785. }
  786. WORD ListenStart(HANDLE hVxD)
  787. {
  788. return RecvPacket(hVxD,NULL);
  789. }
  790. WORD RecvPacket(HANDLE hVxD,BYTE *pbuf)
  791. {
  792. static BOOL first=TRUE;
  793. static struct PacketTable RecvTab[RECV_MAX];
  794. static HANDLE EventTab[RECV_MAX];
  795. HANDLE hEvent;
  796. int i,j,k;
  797. WORD len;
  798. if(first) {
  799. for(i=0;i<RECV_MAX;i++) {
  800. hEvent=CreateEvent(0, TRUE, 0, NULL);
  801. if(!hEvent) {
  802. fprintf(stderr,"Can not create eventn");
  803. return SYSERR;
  804. }
  805. RecvTab[i].hEvent=hEvent;
  806. memset(RecvTab[i].Buffer,0,BUFFER_SIZE);
  807. RecvTab[i].Size=BUFFER_SIZE;
  808. RecvTab[i].Active=TRUE;
  809. RecvTab[i].Type=READ;
  810. EventTab[i]=hEvent;
  811. RecvStart(hVxD,&RecvTab[i]);
  812. }
  813. first=FALSE;
  814. }
  815. if(pbuf==NULL) return OK;
  816. i=WaitForMultipleObjectsEx(RECV_MAX,EventTab,FALSE,INFINITE,FALSE);
  817. if(i==WAIT_FAILED) return SYSERR;
  818. for(j=0;j<RECV_MAX;j++) 
  819. if(EventTab[i]==RecvTab[j].hEvent) break;
  820. k=j;
  821. if(RecvTab[k].Type==READ&&RecvTab[k].Active==TRUE) { /* read complete */
  822. GetOverlappedResult(hVxD,&RecvTab[k].Overlap,&RecvTab[k].Length,FALSE);
  823. if(RecvTab[k].Length>BUFFER_SIZE) RecvTab[k].Length=BUFFER_SIZE;
  824. memcpy((void *)pbuf,(void *)RecvTab[k].Buffer,RecvTab[k].Length);
  825. len=RecvTab[k].Length;
  826. CloseHandle(RecvTab[k].hEvent);
  827. for(j=i;j<RECV_MAX-1;i++) 
  828. EventTab[i]=EventTab[++j];
  829. hEvent=CreateEvent(0, TRUE, 0, NULL);
  830. if(!hEvent) {
  831. fprintf(stderr,"Can not create eventn");
  832. return SYSERR;
  833. }
  834. RecvTab[k].hEvent=hEvent;
  835. memset(RecvTab[k].Buffer,0,BUFFER_SIZE);
  836. RecvTab[k].Size=BUFFER_SIZE;
  837. RecvTab[k].Active=TRUE;
  838. RecvTab[k].Type=READ;
  839. EventTab[RECV_MAX-1]=hEvent;
  840. RecvStart(hVxD,&RecvTab[k]);
  841. return len;
  842. }
  843. else return SYSERR;
  844. }
  845. WORD SendPacket(HANDLE hVxD,BYTE *pbuf,WORD len)
  846. {
  847. static struct PacketTable SendTab;
  848. HANDLE hEvent;
  849. hEvent=CreateEvent(0, TRUE, 0, NULL);
  850. if(!hEvent) {
  851. fprintf(stderr,"Can not create eventn");
  852. return SYSERR;
  853. }
  854. SendTab.hEvent=hEvent;
  855. memcpy(SendTab.Buffer,(void *)pbuf,len);
  856. SendTab.Size=len;
  857. SendTab.Length=BUFFER_SIZE;
  858. SendTab.Active=TRUE;
  859. SendTab.Type=WRITE;
  860. SendStart(hVxD,&SendTab);
  861. GetOverlappedResult(hVxD,&SendTab.Overlap,&SendTab.Length,TRUE);
  862. return OK;
  863. }
  864. WORD CheckSum(WORD *addr,WORD len)
  865. {
  866. DWORD lSum;
  867. WORD wOddByte;
  868. WORD wAnswer; 
  869. lSum=0l;
  870. while(len>1) {
  871. lSum+= *addr++;
  872. len-=2;
  873. }
  874. if(len==1) {
  875. wOddByte=0;
  876. *((unsigned char*)&wOddByte)=*(unsigned char*)addr;
  877. lSum+=wOddByte;
  878. }
  879. lSum=(lSum>>16)+(lSum&0xffff);
  880. lSum+=(lSum>>16);
  881. wAnswer=(unsigned int)~lSum;
  882. return wAnswer;
  883. }
  884. WORD swaps(WORD net)
  885. {
  886. WORD lo,hi;
  887. WORD host;
  888. lo=net&0xff;
  889. hi=net&0xff00;
  890. lo=lo<<8;
  891. hi=hi>>8;
  892. host=hi|lo;
  893. return host;
  894. }
  895. DWORD swapl(DWORD net)
  896. {
  897. DWORD b1,b2,b3,b4;
  898. DWORD host;
  899. b1=net&0xff;
  900. b2=net&0xff00;
  901. b3=net&0xff0000;
  902. b4=net&0xff000000;
  903. b1=b1<<24;
  904. b2=b2<<8;
  905. b3=b3>>8;
  906. b4=b4>>24;
  907. host=b1|b2|b3|b4;
  908. return host;
  909. }
  910. WORD GetOption(int argc,char *argv[],struct CommandLine *cmdline)
  911. {
  912. int i;
  913. char *pbufh,*pbuft;
  914. char c;
  915. cmdline->option=OPT_DO_NOTHING;
  916. for(i=1;i<argc;i++) {
  917. if((pbufh=strstr(argv[i],"-l"))!=NULL) { /* Listen */
  918. if(strstr(argv[i],"-lini")!=NULL) cmdline->option|=OPT_LISTEN_INIT;
  919. else cmdline->option|=OPT_LISTEN_ALL;
  920. /*printf("listenn");*/
  921. }
  922. else if(strstr(argv[i],"-?")!=NULL) {
  923. cmdline->option|=OPT_HELP;
  924. }
  925. else if((pbufh=strstr(argv[i],"-ip:"))!=NULL&&
  926. (cmdline->option&OPT_LISTEN_ALL)!=0) { /* IP address */
  927. pbufh+=4;
  928. if((pbuft=strstr(pbufh,":"))!=NULL) { /* Two IP */
  929. pbuft++;
  930. GetIPAddr(pbufh,&cmdline->queip[0]);
  931. GetIPAddr(pbuft,&cmdline->queip[1]);
  932. cmdline->option|=OPT_LISTEN_IP_2;
  933. }
  934. else { /* One IP */
  935. GetIPAddr(pbufh,&cmdline->queip[0]);
  936. cmdline->option|=OPT_LISTEN_IP_1;
  937. }
  938. }
  939. else if((pbufh=strstr(argv[i],"-port:"))!=NULL&&
  940. (cmdline->option&OPT_LISTEN_ALL)!=0) { /* Port */
  941. pbufh+=6;
  942. if((pbuft=strstr(pbufh,":"))!=NULL) { /* Two port */
  943. pbuft++;
  944. sscanf(pbufh,"%d",&cmdline->queport[0]);
  945. sscanf(pbuft,"%d",&cmdline->queport[1]);
  946. cmdline->option|=OPT_LISTEN_PORT_2;
  947. }
  948. else { /* One port */
  949. sscanf(pbufh,"%d",&cmdline->queport[0]);
  950. cmdline->option|=OPT_LISTEN_PORT_1;
  951. }
  952. }
  953. else if((pbufh=strstr(argv[i],"-qeth:"))!=NULL) { /* Query ethernet address */
  954. cmdline->option|=OPT_QUE_ETHER;
  955. pbufh+=6;
  956. GetIPAddr(pbufh,&cmdline->queip[0]);
  957. }
  958. else if((pbufh=strstr(argv[i],"-qip:"))!=NULL) { /* Query IP */
  959. cmdline->option|=OPT_QUE_IP;
  960. pbufh+=5;
  961. GetEtherAddr(pbufh,&cmdline->queeth[0]);
  962. }
  963. else if((pbufh=strstr(argv[i],"-fout:"))!=NULL) { /* Output file */
  964. cmdline->option|=OPT_OUTPUT_FILE;
  965. pbufh+=6;
  966. sscanf(pbufh,"%s",cmdline->outfile);
  967. }
  968. else if((pbufh=strstr(argv[i],"-fcmd:"))!=NULL) { /* Command file */
  969. cmdline->option|=OPT_COMMAND_FILE;
  970. pbufh+=6;
  971. sscanf(pbufh,"%s",cmdline->cmdfile);
  972. }
  973. }
  974. if(cmdline->option&OPT_LISTEN_SPEC) cmdline->option&=~OPT_LISTEN_ALL;
  975. return OK;
  976. }
  977. WORD GetInitial(FILE *pfini,struct InitialFile *inifile)
  978. {
  979. char Command[BUFFER_SIZE];
  980. int i;
  981. int out;
  982. out=2;
  983. inifile->ipno=0;
  984. inifile->portno=0;
  985. inifile->timeout=INFINITE;
  986. inifile->maxdatalen=MAX_DATA;
  987. while(feof(pfini)==0) {
  988. ReadCommand(pfini,Command);
  989. switch (GetCommand(Command)) {
  990. case INITIAL_MAX_DATA:
  991. ReadCommand(pfini,Command);
  992. sscanf(Command,"%d",&inifile->maxdatalen);
  993. break;
  994. case INITIAL_IP_ADDR:
  995. ReadCommand(pfini,Command);
  996. out--;
  997. GetIPAddr(Command,&inifile->mipaddr);
  998. break;
  999. case INITIAL_NDIS:
  1000. out--;
  1001. ReadCommand(pfini,inifile->ndis);
  1002. break;
  1003. case INITIAL_QUERY_IP:
  1004. ReadCommand(pfini,Command);
  1005. i=0;
  1006. while(GetCommand(Command)!=INITIAL_END_SEGMENT) {
  1007. GetIPAddr(Command,&inifile->qip[i]);
  1008. i++;
  1009. if(i==MAX_QUERY) return SYSERR;
  1010. ReadCommand(pfini,Command);
  1011. }
  1012. inifile->ipno=i;
  1013. break;
  1014. case INITIAL_QUERY_PORT:
  1015. ReadCommand(pfini,Command);
  1016. i=0;
  1017. while(GetCommand(Command)!=INITIAL_END_SEGMENT) {
  1018. sscanf(Command,"%d",&inifile->qport[i]);
  1019. i++;
  1020. if(i==MAX_QUERY) return SYSERR;
  1021. ReadCommand(pfini,Command);
  1022. }
  1023. inifile->portno=i;
  1024. break;
  1025. case INITIAL_TIMEOUT:
  1026. ReadCommand(pfini,Command);
  1027. if(strstr(Command,INITIAL_INFINITE)==NULL) 
  1028. sscanf(Command,"%d",&inifile->timeout);
  1029. else inifile->timeout=INFINITE;
  1030. break;
  1031. case COMMENT:
  1032. break;
  1033. case INITIAL_END_SEGMENT:
  1034. break;
  1035. default:
  1036. if(feof(pfini)==0) return SYSERR;
  1037. }
  1038. }
  1039. if(out>0) return SYSERR;
  1040. else return OK;
  1041. return OK;
  1042. }
  1043. void PrintEtherAddr(FILE *pf,struct EtherAddr *pethaddr)
  1044. {
  1045. fprintf(pf,"%02x.%02x.%02x.%02x.%02x.%02x",pethaddr->AddrByte[0],
  1046.     pethaddr->AddrByte[1],
  1047.     pethaddr->AddrByte[2],
  1048.     pethaddr->AddrByte[3],
  1049.     pethaddr->AddrByte[4],
  1050.     pethaddr->AddrByte[5]);
  1051. }
  1052. void PrintIPAddr(FILE *pf,struct IPAddr *pIPaddr)
  1053. {
  1054. fprintf(pf,"%d.%d.%d.%d",pIPaddr->AddrByte[0],
  1055.     pIPaddr->AddrByte[1],
  1056.     pIPaddr->AddrByte[2],
  1057.     pIPaddr->AddrByte[3]);
  1058. }
  1059. WORD SendARPPacket(HANDLE hVxD,
  1060.    struct EtherAddr *psourether,
  1061.    struct EtherAddr *pdestether,
  1062.    struct EtherAddr *psendether,
  1063.    struct EtherAddr *precvether,
  1064.    struct IPAddr *psendip,
  1065.    struct IPAddr *precvip,
  1066.    WORD oper)
  1067. {
  1068. char Buffer[BUFFER_SIZE];
  1069. struct EtherPacketHead *pEtherHead;
  1070. struct ARPPacket *pARPHead;
  1071. memset(Buffer,0,BUFFER_SIZE);
  1072. pEtherHead=(struct EtherPacketHead *)Buffer;
  1073. pARPHead=(struct ARPPacket *)(Buffer+ETHER_HEAD_LEN);
  1074. memcpy((void *)&pEtherHead->SourEther,(void *)psourether,6);
  1075. memcpy((void *)&pEtherHead->DestEther,(void *)pdestether,6);
  1076. pEtherHead->ServType=swaps(ETHER_PROTO_ARP);
  1077. memset((void *)pARPHead,0,ARP_PACKET_LEN);
  1078. pARPHead->Type=swaps(ARP_HARD_TYPE);
  1079. pARPHead->Proto=swaps(ARP_PROTO_TYPE);
  1080. pARPHead->HardAddrLen=ARP_HARD_ADDR_LEN;
  1081. pARPHead->AddrLen=ARP_ADDR_LEN;
  1082. pARPHead->Oper=swaps(oper);
  1083. memcpy((void *)&pARPHead->SourEther,(void *)psendether,6);
  1084. memcpy((void *)&pARPHead->DestEther,(void *)precvether,6);
  1085. memcpy((void *)&pARPHead->SourIP,(void *)psendip,4);
  1086. memcpy((void *)&pARPHead->DestIP,(void *)precvip,4);
  1087. if(SendPacket(hVxD,Buffer,ETHER_HEAD_LEN+ARP_PACKET_LEN)==SYSERR) {
  1088. fprintf(stderr,"Can not send ARP packet.n");
  1089. return SYSERR;
  1090. }
  1091. return OK;
  1092. }
  1093. WORD SendTCPPacket(HANDLE hVxD,
  1094.    struct EtherAddr *psourether,
  1095.    struct EtherAddr *pdestether,
  1096.    struct IPAddr *psourip,
  1097.    struct IPAddr *pdestip,
  1098.    WORD sourport,
  1099.    WORD destport,
  1100.    WORD flag,
  1101.    DWORD seqno,
  1102.    DWORD ackno,
  1103.    char *pbuf,
  1104.    WORD len)
  1105. {
  1106. char Buffer[BUFFER_SIZE];
  1107. char HelpBuffer[BUFFER_SIZE];
  1108. char *pdata;
  1109. struct EtherPacketHead *pEtherHead;
  1110. struct IPPacketHead *pIPHead;
  1111. struct TCPPacketHead *pTCPHead,*pHelpTCPHead;
  1112. struct PseudoHead *pPseudoHead;
  1113. static WORD id=0;
  1114. WORD wlen;
  1115. id++;
  1116. memset(Buffer,0,BUFFER_SIZE);
  1117. pEtherHead=(struct EtherPacketHead *)Buffer;
  1118. pIPHead=(struct IPPacketHead *)(Buffer+ETHER_HEAD_LEN);
  1119. pTCPHead=(struct TCPPacketHead *)(Buffer+ETHER_HEAD_LEN+IP_HEAD_BYTE_LEN);
  1120. pPseudoHead=(struct PseudoHead *)HelpBuffer;
  1121. pHelpTCPHead=(struct TCPPacketHead *)(HelpBuffer+PSEUDO_HEAD_LEN);
  1122. pdata=(char *)(Buffer+ETHER_HEAD_LEN+IP_HEAD_BYTE_LEN+TCP_HEAD_BYTE_LEN);
  1123. /* Set ether head */
  1124. memcpy((void *)&pEtherHead->SourEther,(void *)psourether,6);
  1125. memcpy((void *)&pEtherHead->DestEther,(void *)pdestether,6);
  1126. pEtherHead->ServType=swaps(ETHER_PROTO_IP);
  1127. /* Set IP head */
  1128. memcpy((void *)&pIPHead->SourIP,(void *)psourip,4);
  1129. memcpy((void *)&pIPHead->DestIP,(void *)pdestip,4);
  1130. pIPHead->VerHLen=(IP_VER<<4)|IP_HEAD_LEN;
  1131. pIPHead->Type=IP_SERV_TYPE;
  1132. wlen=len+TCP_HEAD_BYTE_LEN+IP_HEAD_BYTE_LEN;
  1133. pIPHead->TtlLen=swaps(wlen);
  1134. pIPHead->Id=swaps(id);
  1135. pIPHead->FlgOff=0;
  1136. pIPHead->TTL=69;
  1137. pIPHead->Proto=IP_PROTO_TCP;
  1138. pIPHead->ChkSum=0;
  1139. pIPHead->ChkSum=CheckSum((WORD *)pIPHead,IP_HEAD_BYTE_LEN);
  1140. /* Set TCP head */
  1141. pTCPHead->SourPort=swaps(sourport);
  1142. pTCPHead->DestPort=swaps(destport);
  1143. pTCPHead->SeqNo=swapl(seqno);
  1144. pTCPHead->AckNo=swapl(ackno);
  1145. pTCPHead->HLen=TCP_HEAD_LEN<<4;
  1146. pTCPHead->Flag=flag;
  1147. pTCPHead->WndSize=swaps(8192);
  1148. pTCPHead->ChkSum=0;
  1149. pTCPHead->UrgPtr=0;
  1150. /* Set TCP data */
  1151. memcpy((void *)pdata,(void *)pbuf,len);
  1152. /* Calculate TCP checksum */
  1153. memcpy((void *)&pPseudoHead->SourIP,(void *)psourip,4);
  1154. memcpy((void *)&pPseudoHead->DestIP,(void *)pdestip,4);
  1155. pPseudoHead->Pad=0;
  1156. pPseudoHead->Proto=IP_PROTO_TCP;
  1157. wlen=len+TCP_HEAD_BYTE_LEN;
  1158. pPseudoHead->Len=swaps(wlen);
  1159. memcpy((void *)pHelpTCPHead,(void *)pTCPHead,wlen);
  1160. wlen=len+TCP_HEAD_BYTE_LEN+PSEUDO_HEAD_LEN;
  1161. pTCPHead->ChkSum=CheckSum((WORD *)HelpBuffer,wlen);
  1162. wlen=len+TCP_HEAD_BYTE_LEN+IP_HEAD_BYTE_LEN+ETHER_HEAD_LEN;
  1163. if(SendPacket(hVxD,Buffer,wlen)==SYSERR) {
  1164. fprintf(stderr,"Can not send TCP packet.n");
  1165. return SYSERR;
  1166. }
  1167. return OK;
  1168. }
  1169. WORD RecvTCPPacket(HANDLE hVxD,
  1170.    struct IPAddr *psourip,
  1171.    struct IPAddr *pdestip,
  1172.    WORD sourport,
  1173.    WORD destport,
  1174.    WORD *flag,
  1175.    DWORD *seqno,
  1176.    DWORD *ackno,
  1177.    char *pbuf,
  1178.    WORD *size)
  1179. {
  1180. BOOL Continue;
  1181. WORD DataLen;
  1182. char Buffer[BUFFER_SIZE];
  1183. struct EtherPacketHead *pEtherHead;
  1184. struct IPPacketHead *pIPHead;
  1185. struct TCPPacketHead *pTCPHead;
  1186. int headlen;
  1187. int totallen;
  1188. char *pdata;
  1189. struct IPAddr *mpsourip,*mpdestip;
  1190. WORD msourport,mdestport,i;
  1191. DWORD mackno,mseqno;
  1192. Continue=TRUE;
  1193. while(Continue) {
  1194. if((DataLen=RecvPacket(hVxD,Buffer))==SYSERR) {
  1195. fprintf(stderr,"Can not recv TCP packet.n");
  1196. return SYSERR;
  1197. }
  1198. pEtherHead=(struct EtherPacketHead *)Buffer;
  1199. if(swaps(pEtherHead->ServType)!=ETHER_PROTO_IP) continue;
  1200. pIPHead=(struct IPPacketHead *)(Buffer+ETHER_HEAD_LEN);
  1201. if(memcmp((void *)&pIPHead->SourIP,(void *)psourip,4)!=0) continue;
  1202. if(memcmp((void *)&pIPHead->DestIP,(void *)pdestip,4)!=0) continue;
  1203. headlen=(pIPHead->VerHLen)&0xf;
  1204. headlen*=4;
  1205. totallen=swaps(pIPHead->TtlLen);
  1206. pTCPHead=(struct TCPPacketHead *)(Buffer+ETHER_HEAD_LEN+headlen);
  1207. if(swaps(pTCPHead->SourPort)!=sourport) continue;
  1208. if(swaps(pTCPHead->DestPort)!=destport) continue;
  1209. /* Get TCP data */
  1210. totallen-=headlen;
  1211. headlen=pTCPHead->HLen>>4;
  1212. headlen*=4;
  1213. totallen-=headlen;
  1214. *flag=pTCPHead->Flag;
  1215. *seqno=swapl(pTCPHead->SeqNo);
  1216. *ackno=swapl(pTCPHead->AckNo);
  1217. *size=totallen;
  1218. pdata=((char *)pTCPHead)+headlen;
  1219. memcpy((void *)pbuf,(void *)pdata,totallen);
  1220. Continue=FALSE;
  1221. }
  1222. return OK;
  1223. }
  1224. void ReadCommand(FILE *pf,char *pbuf)
  1225. {
  1226. while(feof(pf)==0) {
  1227. *pbuf=fgetc(pf);
  1228. if(*pbuf=='n') break;
  1229. pbuf++;
  1230. }
  1231. *pbuf=0;
  1232. }
  1233. WORD GetCommand(char *pbuf)
  1234. {
  1235. char buf[MAX_COMMAND];
  1236. if(*pbuf==0) return INITIAL_END_SEGMENT;
  1237. sscanf(pbuf,"%s",buf);
  1238. ToUpper(buf);
  1239. if(strstr(buf,"SENDARP")!=NULL) return COMMAND_SEND_ARP;
  1240. else if(strstr(buf,"SENDTCP")!=NULL) return COMMAND_SEND_TCP;
  1241. else if(strstr(buf,"RECVTCP")!=NULL) return COMMAND_RECV_TCP;
  1242. else if(strstr(buf,"CONNECT")!=NULL) return COMMAND_CONNECT_TCP;
  1243. else if(strstr(buf,"CLOSE")!=NULL) return COMMAND_CLOSE_TCP;
  1244. else if(buf[0]=='#') return COMMENT;
  1245. else if(strstr(buf,"[IPADDR]")!=NULL) return INITIAL_IP_ADDR;
  1246. else if(strstr(buf,"[NDIS]")!=NULL) return INITIAL_NDIS;
  1247. else if(strstr(buf,"[MAXDATALEN]")!=NULL) return INITIAL_MAX_DATA;
  1248. else if(strstr(buf,"[QUERYIP]")!=NULL) return INITIAL_QUERY_IP;
  1249. else if(strstr(buf,"[QUERYPORT]")!=NULL) return INITIAL_QUERY_PORT;
  1250. else if(strstr(buf,"[TIMEOUT]")!=NULL) return INITIAL_TIMEOUT;
  1251. else return COMMAND_UNKNOWN;
  1252. }
  1253. void ToUpper(char *pbuf)
  1254. {
  1255. char c;
  1256. while(*pbuf) {
  1257. c=*pbuf;
  1258. if(c>='a'&&c<='z') *pbuf=c+'A'-'a';
  1259. pbuf++;
  1260. }
  1261. }
  1262. void GetSendARPArg(char *pbuf,
  1263.    struct EtherAddr *psendeth,
  1264.    struct EtherAddr *precveth,
  1265.    struct EtherAddr *soureth,
  1266.    struct EtherAddr *desteth,
  1267.    struct IPAddr *sourip,
  1268.    struct IPAddr *destip,
  1269.    WORD *oper)
  1270. {
  1271. char pcmd[20],pseth[20],preth[20],psoureth[20],pdesteth[20],psip[20],pdip[20],poper[20];
  1272. /* A line as "SENDARP sendeth recveth soureth sourip desteth destip oper" */
  1273. sscanf(pbuf,"%s %s %s %s %s %s %s %s",
  1274.    pcmd,pseth,preth,psoureth,psip,pdesteth,pdip,poper);
  1275. GetEtherAddr(pseth,psendeth);
  1276. GetEtherAddr(preth,precveth);
  1277. GetEtherAddr(psoureth,soureth);
  1278. GetEtherAddr(pdesteth,desteth);
  1279. GetIPAddr(psip,sourip);
  1280. GetIPAddr(pdip,destip);
  1281. sscanf(poper,"%d",oper);
  1282. }
  1283. void GetSendTCPArg(char *pbuf,WORD *id,char *pdata,WORD *size)
  1284. {
  1285. /* A line as "SENDTCP id data" */
  1286. char pcmd[20],pid[20],Buffer[BUFFER_SIZE];
  1287. sscanf(pbuf,"%s %s %s",pcmd,pid,Buffer);
  1288. sscanf(pid,"%d",id);
  1289. GetDataArg(Buffer,pdata,size);
  1290. }
  1291. void GetRecvTCPArg(char *pbuf,WORD *id)
  1292. {
  1293. /* A line as "RECVTCP id" */
  1294. char pcmd[20],pid[20];
  1295. sscanf(pbuf,"%s %s",pcmd,pid);
  1296. sscanf(pid,"%d",id);
  1297. }
  1298. void GetConnectArg(char *pbuf,
  1299.    struct EtherAddr *sendeth,
  1300.    struct EtherAddr *recveth,
  1301.    struct IPAddr *sourip,
  1302.    struct IPAddr *destip,
  1303.    WORD *sourport,
  1304.    WORD *destport,
  1305.    WORD *id)
  1306. {
  1307. /* A line as "CONNECT sendeth recveth sourip destip sourport destport id" */
  1308. char pcmd[20],psip[20],pdip[20],psport[20],pdport[20],pid[20],pseth[20],preth[20];
  1309. sscanf(pbuf,"%s %s %s %s %s %s %s %s",
  1310.    pcmd,pseth,preth,psip,pdip,psport,pdport,pid);
  1311. GetEtherAddr(pseth,sendeth);
  1312. GetEtherAddr(preth,recveth);
  1313. GetIPAddr(psip,sourip);
  1314. GetIPAddr(pdip,destip);
  1315. sscanf(psport,"%d",sourport);
  1316. sscanf(pdport,"%d",destport);
  1317. sscanf(pid,"%d",id);
  1318. }
  1319. void GetCloseArg(char *pbuf,WORD *id)
  1320. {
  1321. /* A line as "CLOSE id */
  1322. char pcmd[20],pid[20];
  1323. sscanf(pbuf,"%s %s",pcmd,pid);
  1324. sscanf(pid,"%d",id);
  1325. }
  1326. void GetIPAddr(char *pbuf,struct IPAddr *pipaddr)
  1327. {
  1328. char c;
  1329. sscanf(pbuf,"%d%c%d%c%d%c%d",&pipaddr->AddrByte[0],&c,
  1330.    &pipaddr->AddrByte[1],&c,
  1331.    &pipaddr->AddrByte[2],&c,
  1332.    &pipaddr->AddrByte[3]);
  1333. }
  1334. void GetEtherAddr(char *pbuf,struct EtherAddr *pethaddr)
  1335. {
  1336. char c;
  1337. sscanf(pbuf,"%x%c%x%c%x%c%x%c%x%c%x",&pethaddr->AddrByte[0],&c,
  1338.    &pethaddr->AddrByte[1],&c,
  1339.    &pethaddr->AddrByte[2],&c,
  1340.    &pethaddr->AddrByte[3],&c,
  1341.    &pethaddr->AddrByte[4],&c,
  1342.    &pethaddr->AddrByte[5]);
  1343. }
  1344. void GetDataArg(char *pbuf,char *pdata,WORD *size)
  1345. {
  1346. char buf[4];
  1347. (*size)=0;
  1348. while(*pbuf) {
  1349. if(*pbuf=='\') {
  1350. pbuf++;
  1351. memcpy(buf,pbuf,3);
  1352. buf[3]=0;
  1353. sscanf(buf,"%d",pdata);
  1354. pbuf+=2;
  1355. }
  1356. else *pdata=*pbuf;
  1357. pdata++;
  1358. pbuf++;
  1359. (*size)++;
  1360. }
  1361. }
  1362. void PrintData(FILE *pf,BYTE *pdata,int size)
  1363. {
  1364. int i;
  1365. if(size>Max_Data_Len) size=Max_Data_Len;
  1366. for(i=0;i<size;i++) {
  1367. if(pdata[i]<' ') fprintf(pf,"\%03d",pdata[i]);
  1368. else fprintf(pf,"%c",pdata[i]);
  1369. }
  1370. }