亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? tapdrvr.c

?? 一個Windows下的Linux專用虛擬機
?? C
?? 第 1 頁 / 共 5 頁
字號:
	  if (NewDeviceState > NdisDeviceStateD0)	    {	      l_Adapter->m_InterfaceIsRunning = FALSE;	      DEBUGP (("[%s] Power management device state OFF\n",		       NAME (l_Adapter)));	    }	  else	    {	      l_Adapter->m_InterfaceIsRunning = TRUE;	      DEBUGP (("[%s] Power management device state ON\n",		       NAME (l_Adapter)));	    }	  l_Status = NDIS_STATUS_SUCCESS;	}      while (FALSE);      if (l_Status == NDIS_STATUS_SUCCESS)	{	  *p_BytesRead = sizeof (NDIS_DEVICE_POWER_STATE);	  *p_BytesNeeded = 0;	}      else	{	  *p_BytesRead = 0;	  *p_BytesNeeded = sizeof (NDIS_DEVICE_POWER_STATE);	}      break;    case OID_PNP_REMOVE_WAKE_UP_PATTERN:    case OID_PNP_ADD_WAKE_UP_PATTERN:      l_Status = NDIS_STATUS_SUCCESS;      *p_BytesRead = *p_BytesNeeded = 0;      break;    default:      DEBUGP (("[%s] Can't set value for OID %lx\n", NAME (l_Adapter),	       p_OID));      l_Status = NDIS_STATUS_INVALID_OID;      *p_BytesRead = *p_BytesNeeded = 0;      break;    }  return l_Status;}//====================================================================//                               Adapter Transmission//====================================================================NDIS_STATUSAdapterTransmit (IN NDIS_HANDLE p_AdapterContext,		 IN PNDIS_PACKET p_Packet,		 IN UINT p_Flags){  TapAdapterPointer l_Adapter = (TapAdapterPointer) p_AdapterContext;  ULONG l_Index = 0, l_BufferLength = 0, l_PacketLength = 0;  PIRP l_IRP;  TapPacketPointer l_PacketBuffer;  PNDIS_BUFFER l_NDIS_Buffer;  PUCHAR l_Buffer;  PVOID result;  NdisQueryPacket (p_Packet, NULL, NULL, &l_NDIS_Buffer, &l_PacketLength);  //====================================================  // Here we abandon the transmission attempt if any of  // the parameters is wrong or memory allocation fails  // but we do not indicate failure. The packet is  // silently dropped.  //====================================================  if (l_PacketLength < ETHERNET_HEADER_SIZE || l_PacketLength > 65535)    goto exit_fail;  else if (!l_Adapter->m_Extension.m_TapOpens || !l_Adapter->m_MediaState)    goto exit_success;              // Nothing is bound to the TAP device  if (NdisAllocateMemoryWithTag (&l_PacketBuffer,				 TAP_PACKET_SIZE (l_PacketLength),				 '5PAT') != NDIS_STATUS_SUCCESS)    goto exit_no_resources;  if (l_PacketBuffer == NULL)    goto exit_no_resources;  l_PacketBuffer->m_SizeFlags = (l_PacketLength & TP_SIZE_MASK);  //===========================  // Reassemble packet contents  //===========================  __try  {    l_Index = 0;    while (l_NDIS_Buffer && l_Index < l_PacketLength)      {	ULONG newlen;	NdisQueryBuffer (l_NDIS_Buffer, (PVOID *) & l_Buffer,			 &l_BufferLength);	newlen = l_Index + l_BufferLength;	if (newlen > l_PacketLength)	  {	    NOTE_ERROR ();	    goto no_queue; /* overflow */	  }	NdisMoveMemory (l_PacketBuffer->m_Data + l_Index, l_Buffer,			l_BufferLength);	l_Index = newlen;	NdisGetNextBuffer (l_NDIS_Buffer, &l_NDIS_Buffer);      }    if (l_Index != l_PacketLength)      {	NOTE_ERROR ();	goto no_queue; /* underflow */      }    DUMP_PACKET ("AdapterTransmit", l_PacketBuffer->m_Data, l_PacketLength);    //=====================================================    // If IPv4 packet, check whether or not packet    // was truncated.    //=====================================================#if PACKET_TRUNCATION_CHECK    IPv4PacketSizeVerify (l_PacketBuffer->m_Data, l_PacketLength, FALSE, "TX", &l_Adapter->m_TxTrunc);#endif    //=====================================================    // Are we running in DHCP server masquerade mode?    //    // If so, catch both DHCP requests and ARP queries    // to resolve the address of our virtual DHCP server.    //=====================================================    if (l_Adapter->m_dhcp_enabled)      {	const ETH_HEADER *eth = (ETH_HEADER *) l_PacketBuffer->m_Data;	const IPHDR *ip = (IPHDR *) (l_PacketBuffer->m_Data + sizeof (ETH_HEADER));	const UDPHDR *udp = (UDPHDR *) (l_PacketBuffer->m_Data + sizeof (ETH_HEADER) + sizeof (IPHDR));	// ARP packet?	if (l_PacketLength == sizeof (ARP_PACKET)	    && eth->proto == htons (ETH_P_ARP)	    && l_Adapter->m_dhcp_server_arp)	  {	    if (ProcessARP (l_Adapter,			    (PARP_PACKET) l_PacketBuffer->m_Data,			    l_Adapter->m_dhcp_addr,			    l_Adapter->m_dhcp_server_ip,			    ~0,			    l_Adapter->m_dhcp_server_mac))	      goto no_queue;	  }	// DHCP packet?	else if (l_PacketLength >= sizeof (ETH_HEADER) + sizeof (IPHDR) + sizeof (UDPHDR) + sizeof (DHCP)		 && eth->proto == htons (ETH_P_IP)		 && ip->version_len == 0x45 // IPv4, 20 byte header		 && ip->protocol == IPPROTO_UDP		 && udp->dest == htons (BOOTPS_PORT))	  {	    const DHCP *dhcp = (DHCP *) (l_PacketBuffer->m_Data					 + sizeof (ETH_HEADER)					 + sizeof (IPHDR)					 + sizeof (UDPHDR));	    const int optlen = l_PacketLength	      - sizeof (ETH_HEADER)	      - sizeof (IPHDR)	      - sizeof (UDPHDR)	      - sizeof (DHCP);	    if (optlen > 0) // we must have at least one DHCP option	      {		if (ProcessDHCP (l_Adapter, eth, ip, udp, dhcp, optlen))		  goto no_queue;	      }	    else	      goto no_queue;	  }      }    //===============================================    // In Point-To-Point mode, check to see whether    // packet is ARP or IPv4 (if neither, then drop).    //===============================================    if (l_Adapter->m_tun)      {	ETH_HEADER *e;	if (l_PacketLength < ETHERNET_HEADER_SIZE)	  goto no_queue;	e = (ETH_HEADER *) l_PacketBuffer->m_Data;	switch (ntohs (e->proto))	  {	  case ETH_P_ARP:	    // Make sure that packet is the	    // right size for ARP.	    if (l_PacketLength != sizeof (ARP_PACKET))	      goto no_queue;	    ProcessARP (l_Adapter,			(PARP_PACKET) l_PacketBuffer->m_Data,			l_Adapter->m_localIP,			l_Adapter->m_remoteNetwork,			l_Adapter->m_remoteNetmask,			l_Adapter->m_TapToUser.dest);	  default:	    goto no_queue;	  case ETH_P_IP:	    // Make sure that packet is large	    // enough to be IPv4.	    if (l_PacketLength		< ETHERNET_HEADER_SIZE + IP_HEADER_SIZE)	      goto no_queue;	    // Only accept directed packets,	    // not broadcasts.	    if (memcmp (e, &l_Adapter->m_TapToUser, ETHERNET_HEADER_SIZE))	      goto no_queue;	    // Packet looks like IPv4, queue it.	    l_PacketBuffer->m_SizeFlags |= TP_TUN;	  }      }    //===============================================    // Push packet onto queue to wait for read from    // userspace.    //===============================================    NdisAcquireSpinLock (&l_Adapter->m_Extension.m_QueueLock);    result = NULL;    if (IS_UP (l_Adapter))      result = QueuePush (l_Adapter->m_Extension.m_PacketQueue, l_PacketBuffer);    NdisReleaseSpinLock (&l_Adapter->m_Extension.m_QueueLock);    if ((TapPacketPointer) result != l_PacketBuffer)      {	// adapter receive overrun	INCREMENT_STAT (l_Adapter->m_TxErr);	goto no_queue;      }    else      {	INCREMENT_STAT (l_Adapter->m_Tx);      }    //============================================================    // Cycle through IRPs and packets, try to satisfy each pending    // IRP with a queued packet.    //============================================================    while (TRUE)      {	l_IRP = NULL;	l_PacketBuffer = NULL;	NdisAcquireSpinLock (&l_Adapter->m_Extension.m_QueueLock);	if (IS_UP (l_Adapter)	    && QueueCount (l_Adapter->m_Extension.m_PacketQueue)	    && QueueCount (l_Adapter->m_Extension.m_IrpQueue))	  {	    l_IRP = (PIRP) QueuePop (l_Adapter->m_Extension.m_IrpQueue);	    l_PacketBuffer = (TapPacketPointer)	      QueuePop (l_Adapter->m_Extension.m_PacketQueue);	  }	NdisReleaseSpinLock (&l_Adapter->m_Extension.m_QueueLock);	MYASSERT ((l_IRP != NULL) + (l_PacketBuffer != NULL) != 1);	if (l_IRP && l_PacketBuffer)	  {	    CompleteIRP (l_IRP,			 l_PacketBuffer, 			 IO_NETWORK_INCREMENT);	  }	else	  break;      }  }  __except (EXCEPTION_EXECUTE_HANDLER)    {    }  return NDIS_STATUS_SUCCESS; no_queue:  NdisFreeMemory (l_PacketBuffer,		  TAP_PACKET_SIZE (l_PacketLength),		  0);   exit_success:  return NDIS_STATUS_SUCCESS;     exit_fail:  return NDIS_STATUS_FAILURE; exit_no_resources:  return NDIS_STATUS_RESOURCES;}//======================================================================// Hooks for catching TAP device IRP's.//======================================================================NTSTATUSTapDeviceHook (IN PDEVICE_OBJECT p_DeviceObject, IN PIRP p_IRP){  TapAdapterPointer l_Adapter = LookupAdapterInInstanceList (p_DeviceObject);  PIO_STACK_LOCATION l_IrpSp;  NTSTATUS l_Status = STATUS_SUCCESS;  BOOLEAN accessible;  l_IrpSp = IoGetCurrentIrpStackLocation (p_IRP);  p_IRP->IoStatus.Status = STATUS_SUCCESS;  p_IRP->IoStatus.Information = 0;  if (!l_Adapter || l_Adapter->m_Extension.m_Halt)    {      DEBUGP (("TapDeviceHook called when TAP device is halted, MajorFunction=%d\n",	       (int)l_IrpSp->MajorFunction));      if (l_IrpSp->MajorFunction == IRP_MJ_CLOSE)	{	  IoCompleteRequest (p_IRP, IO_NO_INCREMENT);	  return STATUS_SUCCESS;	}      else	{	  p_IRP->IoStatus.Status = STATUS_NO_SUCH_DEVICE;	  IoCompleteRequest (p_IRP, IO_NO_INCREMENT);	  return STATUS_NO_SUCH_DEVICE;	}    }  switch (l_IrpSp->MajorFunction)    {      //===========================================================      //                 Ioctl call handlers      //===========================================================    case IRP_MJ_DEVICE_CONTROL:      {	switch (l_IrpSp->Parameters.DeviceIoControl.IoControlCode)	  {	  case TAP_IOCTL_GET_MAC:	    {	      if (l_IrpSp->Parameters.DeviceIoControl.OutputBufferLength		  >= sizeof (MACADDR))		{		  COPY_MAC (p_IRP->AssociatedIrp.SystemBuffer,			    l_Adapter->m_MAC);		  p_IRP->IoStatus.Information = sizeof (MACADDR);		}	      else		{		  NOTE_ERROR ();		  p_IRP->IoStatus.Status = l_Status = STATUS_BUFFER_TOO_SMALL;		}	      break;	    }	  case TAP_IOCTL_GET_VERSION:	    {	      const ULONG size = sizeof (ULONG) * 3;	      if (l_IrpSp->Parameters.DeviceIoControl.OutputBufferLength		  >= size)		{		  ((PULONG) (p_IRP->AssociatedIrp.SystemBuffer))[0]		    = TAP_DRIVER_MAJOR_VERSION;		  ((PULONG) (p_IRP->AssociatedIrp.SystemBuffer))[1]		    = TAP_DRIVER_MINOR_VERSION;		  ((PULONG) (p_IRP->AssociatedIrp.SystemBuffer))[2]#if DBG		    = 1;#else		  = 0;#endif		  p_IRP->IoStatus.Information = size;		}	      else		{		  NOTE_ERROR ();		  p_IRP->IoStatus.Status = l_Status = STATUS_BUFFER_TOO_SMALL;		}	      break;	    }	  case TAP_IOCTL_GET_MTU:	    {	      const ULONG size = sizeof (ULONG) * 1;	      if (l_IrpSp->Parameters.DeviceIoControl.OutputBufferLength		  >= size)		{		  ((PULONG) (p_IRP->AssociatedIrp.SystemBuffer))[0]		    = l_Adapter->m_MTU;		  p_IRP->IoStatus.Information = size;		}	      else		{		  NOTE_ERROR ();		  p_IRP->IoStatus.Status = l_Status = STATUS_BUFFER_TOO_SMALL;		}	      break;	    }	  case TAP_IOCTL_GET_INFO:	    {	      char state[16];	      if (l_Adapter->m_InterfaceIsRunning)		state[0] = 'A';	      else		state[0] = 'a';	      if (l_Adapter->m_Extension.m_TapIsRunning)		state[1] = 'T';	      else		state[1] = 't';	      state[2] = l_Adapter->m_DeviceState;	      if (l_Adapter->m_MediaStateAlwaysConnected)		state[3] = 'C';	      else		state[3] = 'c';	      state[4] = '\0';	      p_IRP->IoStatus.Status = l_Status = RtlStringCchPrintfExA (	        ((LPTSTR) (p_IRP->AssociatedIrp.SystemBuffer)),		l_IrpSp->Parameters.DeviceIoControl.OutputBufferLength,		NULL,		NULL,		STRSAFE_FILL_BEHIND_NULL | STRSAFE_IGNORE_NULLS,#if PACKET_TRUNCATION_CHECK		"State=%s Err=[%s/%d] #O=%d Tx=[%d,%d,%d] Rx=[%d,%d,%d] IrpQ=[%d,%d,%d] PktQ=[%d,%d,%d]",#else		"State=%s Err=[%s/%d] #O=%d Tx=[%d,%d] Rx=[%d,%d] IrpQ=[%d,%d,%d] PktQ=[%d,%d,%d]",#endif		state,		g_LastErrorFilename,		g_LastErrorLineNumber,		(int)l_Adapter->m_Extension.m_NumTapOpens,		(int)l_Adapter->m_Tx,		(int)l_Adapter->m_TxErr,#if PACKET_TRUNCATION_CHECK		(int)l_Adapter->m_TxTrunc,

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲自拍另类综合| 亚洲免费资源在线播放| 欧美日韩成人在线| 欧美色大人视频| 欧美私人免费视频| 欧美精品 日韩| 欧美一级片免费看| 精品88久久久久88久久久| 久久久蜜桃精品| 亚洲国产精品激情在线观看| 国产亚洲午夜高清国产拍精品| 久久久久久一二三区| 久久午夜色播影院免费高清| 久久久91精品国产一区二区精品| 精品国产一区二区三区久久久蜜月 | 热久久久久久久| 久久国产视频网| 成人在线综合网站| 日本韩国欧美在线| 717成人午夜免费福利电影| 日韩欧美在线观看一区二区三区| 精品国产99国产精品| 中文字幕一区二区日韩精品绯色| 亚洲国产日日夜夜| 九一久久久久久| 99视频精品全部免费在线| 在线亚洲+欧美+日本专区| 日韩欧美成人一区| 亚洲欧洲日韩在线| 另类的小说在线视频另类成人小视频在线| 国产精品综合一区二区三区| 色综合天天综合在线视频| 欧美久久久久久久久久| 久久久久久久久99精品| 亚洲一区二区3| 国产伦精品一区二区三区免费| 97精品电影院| 精品福利二区三区| 亚洲国产精品久久久久秋霞影院| 麻豆精品新av中文字幕| 91美女蜜桃在线| 精品免费日韩av| 亚洲第一久久影院| 波多野结衣亚洲一区| 日韩欧美中文一区二区| 一区二区三区欧美激情| 国产精品一级片| 欧美一级片免费看| 亚洲成人福利片| 91在线视频免费观看| 国产视频一区二区三区在线观看| 天天操天天干天天综合网| 99麻豆久久久国产精品免费 | 欧美蜜桃一区二区三区| 中文字幕亚洲区| 国产成人免费在线| 337p亚洲精品色噜噜噜| 亚洲午夜久久久久| 91农村精品一区二区在线| 久久理论电影网| 狠狠色狠狠色综合系列| 日韩一区二区不卡| 亚洲国产成人精品视频| 色呦呦国产精品| 国产精品丝袜在线| 国产传媒久久文化传媒| 久久久久久夜精品精品免费| 久久99精品国产麻豆不卡| 91麻豆精品国产| 日本视频一区二区| 日韩你懂的电影在线观看| 日本在线不卡视频| 91麻豆精品国产91久久久资源速度 | 在线免费观看成人短视频| 亚洲欧洲日韩在线| 99久久伊人网影院| 亚洲欧美在线aaa| 91麻豆6部合集magnet| 亚洲色图欧美偷拍| 色综合久久精品| 亚洲在线视频网站| 欧美日韩夫妻久久| 日本一不卡视频| 久久久久久久精| 成人理论电影网| 亚洲精品日产精品乱码不卡| 欧美影视一区在线| 日韩国产一二三区| 久久伊99综合婷婷久久伊| 成人av资源下载| 一区二区三区91| 日韩一区二区三区电影在线观看| 久久69国产一区二区蜜臀| 久久蜜桃香蕉精品一区二区三区| 成人丝袜视频网| 亚洲色图丝袜美腿| 欧美一级高清片| 国产成人三级在线观看| 亚洲制服丝袜av| 日韩亚洲欧美综合| 大美女一区二区三区| 亚洲综合免费观看高清在线观看| 777欧美精品| 国产高清不卡一区| 亚洲成av人片| 国产精品久久看| 日韩精品一区二区三区在线观看 | 91久久线看在观草草青青| 婷婷久久综合九色综合伊人色| 欧美大片一区二区| kk眼镜猥琐国模调教系列一区二区| 一区二区三区产品免费精品久久75| 欧美高清hd18日本| 成人免费视频播放| 久久精品国产一区二区三 | 精品亚洲免费视频| 亚洲欧美另类久久久精品| 日韩欧美一区二区在线视频| av电影天堂一区二区在线| 青娱乐精品视频在线| 亚洲精品日韩专区silk| 26uuu久久综合| 欧美日韩中文字幕一区二区| 福利电影一区二区三区| 日本免费在线视频不卡一不卡二 | 欧洲av在线精品| 国产1区2区3区精品美女| 日韩av二区在线播放| 亚洲激情第一区| 国产精品国产a级| 久久综合九色综合欧美98 | 久久一留热品黄| 91精品国产综合久久福利| 欧美最猛黑人xxxxx猛交| www.亚洲色图| 国产乱对白刺激视频不卡| 首页亚洲欧美制服丝腿| 一区二区三区电影在线播| 国产精品色哟哟| 国产欧美日韩麻豆91| 久久亚洲捆绑美女| 日韩亚洲欧美一区| 欧美四级电影网| 欧美日韩一区二区三区免费看| 一本久道久久综合中文字幕 | 欧美videos大乳护士334| 欧美日韩综合在线免费观看| 色www精品视频在线观看| 91麻豆精东视频| 色综合色狠狠天天综合色| 91丨九色丨国产丨porny| 成人免费福利片| eeuss鲁片一区二区三区在线看| 成人丝袜视频网| av在线播放一区二区三区| 91亚洲精品久久久蜜桃网站| 成人av网站在线观看免费| 成人精品gif动图一区| 不卡的看片网站| 在线日韩av片| 91精品国产综合久久久久久久久久| 9191久久久久久久久久久| 51久久夜色精品国产麻豆| 精品国产一区二区在线观看| 欧美国产丝袜视频| 亚洲综合成人在线视频| 国产精品美女视频| 亚洲图片激情小说| 欧美国产日韩亚洲一区| 成人黄色免费短视频| 91免费在线看| 国产精品少妇自拍| 久久精品99国产精品| 欧美这里有精品| 国产精品网友自拍| 久久99热狠狠色一区二区| 欧美日韩一本到| 亚洲欧美激情插| 成人性生交大片免费看视频在线| 精品国产乱码久久久久久浪潮| 亚洲国产乱码最新视频| 99精品视频中文字幕| 国产精品三级电影| 高清免费成人av| 久久久久国产精品免费免费搜索| 日韩高清中文字幕一区| 欧美性大战久久久| 亚洲成人久久影院| 欧美日韩日日摸| 亚洲一区二区三区中文字幕| 一本一本大道香蕉久在线精品| 亚洲欧洲精品一区二区三区 | 精品国产免费一区二区三区香蕉 | 日韩欧美一级片| 美女尤物国产一区| 欧美一区二区大片| 美女一区二区视频| 久久综合色一综合色88| 国产在线不卡一区| 久久久www成人免费毛片麻豆|