void WritePacket(int Snaplen) { LPPACKET lpPacket = 0; // define a pointer to a PACKET structure if (Snaplen > sizeof(tx_buffer)) Snaplen = sizeof(tx_buffer); lpPacket = CreatePacket((char*)tx_buffer, Snaplen); PacketSetNumWrites(lpAdapter, 1); PacketSendPacket(lpAdapter, lpPacket, TRUE); ReleasePacket(lpPacket); }
//发包 int NetworkInterface::SendPacket(u_char *buffer, int packetLen, int repeatNum) { LPPACKET lpPacket; memcpy((buffer + 6), srcMAC, 6); //分配并初始化一个包结构,将用于发送数据包 if ( (lpPacket = PacketAllocatePacket()) == NULL ) { LastErrCode = GetLastError(); strcpy_s(LastErrStr, "Error: failed to allocate the LPPACKET structure."); return (-1); } PacketInitPacket(lpPacket, buffer, packetLen); if (PacketSetNumWrites(adapter.lpAdapter, repeatNum) == FALSE) { LastErrCode = GetLastError(); strcpy_s(LastErrStr, "Unable to send more than one packet in a single write!"); PacketFreePacket(lpPacket); return -1; } if(PacketSendPacket(adapter.lpAdapter, lpPacket, TRUE) == FALSE) { LastErrCode = GetLastError(); strcpy_s(LastErrStr, "Error sending the packets!"); PacketFreePacket(lpPacket); return -1; } PacketFreePacket(lpPacket); //将发送的数据包转存到文件中 //PrintPacket(buffer, packetLen, 1); return 0; }
LPADAPTER PacketOpenAdapter (LPTSTR AdapterName) { LPPACKET lpSupport; LPADAPTER nAdapter; DWORD error; BOOL res; OPENVXDHANDLE OpenVxDHandle; DWORD KernEvent; UINT BytesReturned; struct _timeb time; ODSEx ("Packet32: PacketOpenAdapter, opening %s\n", AdapterName); nAdapter = (LPADAPTER) GlobalAllocPtr (GMEM_MOVEABLE | GMEM_ZEROINIT,sizeof (ADAPTER)); if (nAdapter == NULL) { error=GetLastError(); ODS ("Packet32: PacketOpenAdapter GlobalAlloc Failed\n"); ODSEx("Error=%d\n",error); //set the error to the one on which we failed SetLastError(error); return NULL; } wsprintf (nAdapter->SymbolicLink, TEXT ("\\\\.\\%s"), TEXT ("NPF.VXD")); nAdapter->hFile = CreateFile (nAdapter->SymbolicLink, GENERIC_WRITE | GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED | FILE_FLAG_DELETE_ON_CLOSE, 0); if (nAdapter->hFile == INVALID_HANDLE_VALUE) { error=GetLastError(); ODS ("Packet32: PacketOpenAdapter Could not open adapter, 1\n"); ODSEx("Error=%d\n",error); GlobalFreePtr (nAdapter); //set the error to the one on which we failed SetLastError(error); return NULL; } lpSupport=PacketAllocatePacket(); PacketInitPacket(lpSupport,AdapterName,strlen(AdapterName)); if (nAdapter && (nAdapter->hFile != INVALID_HANDLE_VALUE)) { res=PacketDeviceIoControl(nAdapter, lpSupport, (ULONG) IOCTL_OPEN, TRUE); if (res==FALSE || ((char*)lpSupport->Buffer)[0]=='\0'){ SetLastError(ERROR_FILE_NOT_FOUND); goto err; } PacketFreePacket(lpSupport); // Set the time zone _ftime(&time); if(DeviceIoControl(nAdapter->hFile,pBIOCSTIMEZONE,&time.timezone,2,NULL,0,&BytesReturned,NULL)==FALSE){ error=GetLastError(); ODS ("Packet32: PacketOpenAdapter Could not open adapter, 2\n"); ODSEx("Error=%d\n",error); GlobalFreePtr (nAdapter); //set the error to the one on which we failed SetLastError(error); return NULL; } // create the read event nAdapter->ReadEvent=CreateEvent(NULL, TRUE, FALSE, NULL); // obtain the pointer of OpenVxDHandle in KERNEL32.DLL. // It is not possible to reference statically this function, because it is present only in Win9x OpenVxDHandle = (OPENVXDHANDLE) GetProcAddress(GetModuleHandle("KERNEL32"),"OpenVxDHandle"); // map the event to kernel mode KernEvent=(DWORD)(OpenVxDHandle)(nAdapter->ReadEvent); // pass the event to the driver if(DeviceIoControl(nAdapter->hFile,pBIOCEVNAME,&KernEvent,4,NULL,0,&BytesReturned,NULL)==FALSE){ error=GetLastError(); ODS("Packet32: PacketOpenAdapter Could not open adapter, 3\n"); ODSEx("Error=%d\n",error); GlobalFreePtr (nAdapter); //set the error to the one on which we failed SetLastError(error); return NULL; } //set the maximum lookhahead size allowable with this NIC driver PacketSetMaxLookaheadsize(nAdapter); //set the number of times a single write will be repeated PacketSetNumWrites(nAdapter,1); return nAdapter; } err: error=GetLastError(); ODS ("Packet32: PacketOpenAdapter Could not open adapter, 4\n"); ODSEx("Error=%d\n",error); //set the error to the one on which we failed SetLastError(error); return NULL; }