//--------------------------------------------------------------------------- BOOLEAN PacketReceivePacket(LPADAPTER AdapterObject, LPPACKET lpPacket, BOOLEAN Sync) { return PacketDeviceIoControl(AdapterObject, lpPacket, (ULONG) IOCTL_PROTOCOL_READ, Sync); }
//--------------------------------------------------------------------------- BOOLEAN PacketSendPacket (LPADAPTER AdapterObject, LPPACKET lpPacket, BOOLEAN Sync) { int i; for(i=0;i<AdapterObject->NumWrites;i++){ if(PacketDeviceIoControl (AdapterObject,lpPacket,(ULONG) IOCTL_PROTOCOL_WRITE,Sync)==FALSE) return FALSE; } return TRUE; }
BOOLEAN PacketRequest( LPADAPTER lpAdapterObject, LPPACKET lpPacket, BOOLEAN bSet ) { BOOLEAN Result = FALSE; Result = PacketDeviceIoControl( lpAdapterObject, lpPacket, (ULONG) ((bSet) ? IOCTL_PROTOCOL_SET_OID : IOCTL_PROTOCOL_QUERY_OID), TRUE ); if ( lpPacket->BytesReceived == 0 ) { D(bug( "Packet32: Ndis returned error to OID\r\n")); Result = FALSE; } return Result; }
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; }