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

? 歡迎來(lái)到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? ezusbisotransfer.cpp

?? DriverStdio的一個(gè)USB驅(qū)動(dòng)程序
?? CPP
字號(hào):
// EzUsbIsoTransfer.cpp 
//=============================================================================
//
// Compuware Corporation
// NuMega Lab
// 9 Townsend West
// Nashua, NH 03060  USA
//
// Copyright (c) 1999 Compuware Corporation. All Rights Reserved.
// Unpublished - rights reserved under the Copyright laws of the
// United States.
//
//=============================================================================

#include <vdw.h>
#include <kusb.h>
#include "EzUsbIsoTransfer.h"

// Global driver trace object
extern KDebugOnlyTrace t;				

//=============================================================================
// class EzUsbIsoTransferBase implementation
//

EzUsbIsoTransferBase::EzUsbIsoTransferBase(
	KUsbPipe& pipe,
	USHORT PacketSize,
	UCHAR PacketsPerUrb,
	UCHAR NumUrbs
	) : m_Pipe(pipe)
{
	m_ConstructorStatus = STATUS_SUCCESS;

	m_ppMdl = NULL;
	m_bRead = m_Pipe.EndpointAddress() >= 0x80;
	m_PacketsPerUrb = PacketsPerUrb;
	m_PacketSize = PacketSize ? PacketSize : m_Pipe.MaximumPacketSize();
	ASSERT( m_PacketSize );
	m_NumUrbs = NumUrbs;
	m_dwTotalPacketsProcessed = 0;
	m_dwTotalBytesProcessed = 0;
	m_dwErrorPacketCount = 0;

	if( m_PacketsPerUrb )
	{
		m_TransferSize = m_PacketSize * m_PacketsPerUrb;
		ASSERT( m_TransferSize <= m_Pipe.MaximumTransferSize() );
	}
	else
	{
		m_TransferSize = m_Pipe.MaximumTransferSize();
		m_PacketsPerUrb = static_cast<UCHAR>(m_TransferSize/m_PacketSize);
	}

// Allocate internal data structures
	//Allocate URBs contiguously from NonPagedPool
	m_UrbSize = GET_ISO_URB_SIZE(m_PacketsPerUrb);
	m_pUrb = new (NonPagedPool) UCHAR[ m_UrbSize * m_NumUrbs ];
	if( NULL == m_pUrb )
	{
		m_ConstructorStatus = STATUS_INSUFFICIENT_RESOURCES;
		return;
	}

	RtlZeroMemory(m_pUrb, m_UrbSize * m_NumUrbs);
	
	//Create MDLs for each URB.
	//Allocate memory to store an array of PMDL's
	m_ppMdl = new PMDL[m_NumUrbs];

	if( NULL == m_ppMdl )
	{
		delete m_pUrb;
		m_ConstructorStatus = STATUS_INSUFFICIENT_RESOURCES;
		return;
	}

	RtlZeroMemory(m_ppMdl, sizeof(PMDL) * m_NumUrbs);

	return;
}


EzUsbIsoTransferBase::~EzUsbIsoTransferBase(void)
{
	delete m_ppMdl;
	delete m_pUrb;
}


//=============================================================================
// class EzUsbIsoTransfer implementation
//

EzUsbIsoTransfer::EzUsbIsoTransfer(
	KMemory& Mdl,
	ULONG Length,		//Size of Data Buffer in bytes
	KUsbPipe& pipe,
	USHORT PacketSize,
	UCHAR PacketsPerUrb,
	PVOID pDescBuffer,	//Optional pointer to packet buffer
	UCHAR NumUrbs
	)
	: EzUsbIsoTransferBase( pipe, PacketSize, PacketsPerUrb, NumUrbs)
{
	if( NT_SUCCESS(m_ConstructorStatus) )
	{

	// Initialize data members
		m_Mem = Mdl;
		m_Length = Length;
		m_pDescriptorBuffer = pDescBuffer;
		m_dwDescrOffset = 0;
		m_dwOffset = 0;

		//This is ok since we don't really use this virtual address 
		m_VirtualAddress = m_Mem.VirtualAddress();

		for( UCHAR i = 0; i < m_NumUrbs; i++ )
		{
			//Allocate the Mdl and store it in the array of ptrs to Mdl's.  Since the buffer may not be page aligned,
			//the size of the IRP adds a PAGE_SIZE so that the Mdl will be large enough to describe a buffer
			//that spans more than one physical page.
			reinterpret_cast<MDL**>(m_ppMdl)[i] = IoAllocateMdl(NULL, m_TransferSize + PAGE_SIZE, FALSE, FALSE, NULL);
			if( NULL == m_ppMdl[i] )
			{
				m_ConstructorStatus = STATUS_INSUFFICIENT_RESOURCES;
				break;
			}

			//Map part of the client's MDL buffer into this MDL
			IoBuildPartialMdl( m_Mem, m_ppMdl[i], reinterpret_cast<PVOID>(ULONG_PTR(m_VirtualAddress) + m_dwOffset), m_TransferSize );
			m_dwOffset += m_TransferSize;

			KMemory M(m_ppMdl[i]);

			//Initialize the URBs
			m_Pipe.BuildIsochronousTransfer(
					m_PacketsPerUrb,
					m_PacketSize,
					m_bRead,
					TRUE, 
					0, 
					M,
					m_TransferSize,
					reinterpret_cast<PURB>(reinterpret_cast<ULONG_PTR>(m_pUrb) + m_UrbSize * i)
					);
		}

		// Check for allocation failure
		if( STATUS_INSUFFICIENT_RESOURCES == m_ConstructorStatus )
		{
			// An allocation error occurred, Free all MDL's allocated.
			for( UCHAR j = 0; j < i; j++ )
			{
				IoFreeMdl(m_ppMdl[j]);
				m_ppMdl[j] = NULL;
			}
		}

		stream.Initialize(this, m_Pipe.Interface()->UsbLowerDevice());
	}
}


EzUsbIsoTransfer::~EzUsbIsoTransfer(void)
{
	// Free all MDL's allocated.
	for( UCHAR j = 0; j < m_NumUrbs; j++ )
	{
		if( NULL != m_ppMdl[j] )
		{
			IoFreeMdl(m_ppMdl[j]);
			m_ppMdl[j] = NULL;
		}
	}
}


USB_STREAM_STATUS EzUsbIsoTransfer::OnCompletedUrb(PURB pUrb, NTSTATUS status)
{
	USB_STREAM_STATUS streamStatus = USB_STREAM_STATUS_STOP;

// Error checking
	//check the Irp status
	if( !NT_SUCCESS(status) || !pUrb )
	{
		ASSERT(pUrb);
		//handle error condition for this device
		t << "Irp Error " << status <<"\n";
		//this prevents re-sending the URB to the bus driver
		return streamStatus;
	}

//++ Debugging instrumentation
	t << (m_bRead ? "Frame[" : "                Frame[")
	  << ULONG_PTR(pUrb)
	  << "-"
	  << (m_bRead ? " IN" : "OUT")
	  << "] = " 
	  << ULONG(pUrb->UrbIsochronousTransfer.StartFrame) 
	  << "\n";
//-- Debugging instrumentation

	//check the URB header status
	USBD_STATUS usbdStatus = URB_STATUS( pUrb );

	if( USBD_SUCCESS(usbdStatus) )
	{
		if( USBD_STATUS_SUCCESS != usbdStatus )
		{
			t << "usbdStatus = " << usbdStatus << "\n";
		}
	}
	else
	{
		t << "usbdStatus = " << usbdStatus << "\n";
	}

	ASSERT( pUrb->UrbIsochronousTransfer.NumberOfPackets ) ;

	for( ULONG i = 0; i < pUrb->UrbIsochronousTransfer.NumberOfPackets; i++ )
	{
		m_dwTotalPacketsProcessed++;

		if( USBD_SUCCESS( ISO_PKT_STATUS(pUrb, i) ) ) 
		{
			m_dwTotalBytesProcessed += (ISO_PKT_LENGTH(pUrb, i));

			if( USBD_STATUS_SUCCESS != ( ISO_PKT_STATUS(pUrb, i) ) )
			{
				t << "usbd Iso Packet Status = " << ( ISO_PKT_STATUS(pUrb, i) ) << "\n"; 
			}
		}
		else 
		{
			t << "usbd Iso Packet Status = " << ( ISO_PKT_STATUS(pUrb, i) ) << "\n"; 
			m_dwErrorPacketCount++;
		}

		// Save the descriptors (if necessary)
		if( m_pDescriptorBuffer )
		{
			RtlCopyMemory( 
				reinterpret_cast<PUCHAR>(m_pDescriptorBuffer) + m_dwDescrOffset, 
				&pUrb->UrbIsochronousTransfer.IsoPacket[i], 
				sizeof(USBD_ISO_PACKET_DESCRIPTOR) 
				);

			m_dwDescrOffset += sizeof(USBD_ISO_PACKET_DESCRIPTOR);
		}
	}

	//Determine if there is more data to transfer
	if( m_dwOffset + m_TransferSize > m_Length)
	{
		return streamStatus;
	}

	streamStatus = USB_STREAM_STATUS_CONTINUE;

	RtlZeroMemory(&pUrb->UrbIsochronousTransfer.hca, sizeof(_URB_HCD_AREA));

	pUrb->UrbIsochronousTransfer.Hdr.UsbdDeviceHandle	= NULL;
	pUrb->UrbIsochronousTransfer.Hdr.UsbdFlags			= 0;
	pUrb->UrbIsochronousTransfer.TransferBuffer			= NULL;
	pUrb->UrbIsochronousTransfer.TransferBufferLength	= m_TransferSize;
	pUrb->UrbIsochronousTransfer.StartFrame				= 0;

	IoBuildPartialMdl( 
		m_Mem, 
		pUrb->UrbIsochronousTransfer.TransferBufferMDL, 
		reinterpret_cast<PVOID>(ULONG_PTR(m_VirtualAddress) + m_dwOffset), 
		m_TransferSize 
		);

	m_dwOffset += m_TransferSize;

	return streamStatus;
}

//=============================================================================
// class EzUsbDriverManagedIsoTransfer implementation
//

EzUsbDriverManagedIsoTransfer::EzUsbDriverManagedIsoTransfer(
	KUsbPipe& pipe,
	ULONG Length,		//Size of Data Buffer in bytes
	USHORT PacketSize,
	UCHAR PacketsPerUrb,
	UCHAR NumUrbs,
	ULONG NumPackets,	//Size of Packet Buffer
	PVOID pBuffer		//Optional pointer to a buffer
	) 
	: EzUsbIsoTransferBase( pipe, PacketSize, PacketsPerUrb, NumUrbs)
{
	if( NT_SUCCESS(m_ConstructorStatus) )
	{

		//Allocate NonPagedPool buffer for USBD_ISO_PACKET_DESCRIPTOR's
		if(NumPackets)
		{
			m_pDescriptorBuffer = new KLockableFifo<USBD_ISO_PACKET_DESCRIPTOR>(NumPackets, NonPagedPool);
			if( NULL == m_pDescriptorBuffer )
			{
				m_ConstructorStatus = STATUS_INSUFFICIENT_RESOURCES;			
				return;
			}
		}
		else
		{
			m_pDescriptorBuffer = NULL;
		}
		
		//Allocate NonPagedPool buffer for URB TransferBuffer
		m_TransferBuffers = new (NonPagedPool) UCHAR[m_TransferSize * m_NumUrbs];
		if( NULL == m_TransferBuffers )
		{
			delete m_pDescriptorBuffer;
			m_pDescriptorBuffer = NULL;
			m_ConstructorStatus = STATUS_INSUFFICIENT_RESOURCES;			
			return;
		}

		RtlZeroMemory(m_TransferBuffers, m_TransferSize * m_NumUrbs);

		for( UCHAR i = 0; i < m_NumUrbs; i++ )
		{
			//Allocate the Mdl and store it in the array of ptrs to Mdl's.  
			reinterpret_cast<MDL**>(m_ppMdl)[i] = IoAllocateMdl(
				reinterpret_cast<PUCHAR>(m_TransferBuffers) + m_TransferSize * i, m_TransferSize, FALSE, FALSE, NULL);
			if( NULL == m_ppMdl[i] )
			{
				m_ConstructorStatus = STATUS_INSUFFICIENT_RESOURCES;
				break;
			}

			KMemory M(m_ppMdl[i]);
			M.SetPageArray();

			//Initialize the URBs
			m_Pipe.BuildIsochronousTransfer(
					m_PacketsPerUrb,
					m_PacketSize,
					m_bRead,
					TRUE, 
					0, 
					M,
					m_TransferSize,
					reinterpret_cast<PURB>(reinterpret_cast<ULONG_PTR>(m_pUrb) + m_UrbSize * i)
					);
		}

		// Check for allocation failure
		if( STATUS_INSUFFICIENT_RESOURCES == m_ConstructorStatus )
		{
			// An allocation error occurred, Free all MDL's allocated.
			for( UCHAR j = 0; j < i; j++ )
			{
				IoFreeMdl(m_ppMdl[j]);
				m_ppMdl[j] = NULL;
			}

			delete m_pDescriptorBuffer;
			m_pDescriptorBuffer = NULL;
			delete m_TransferBuffers;
			m_TransferBuffers = NULL;
			return;
		}

		stream.Initialize(this, m_Pipe.Interface()->UsbLowerDevice());

		if( pBuffer )
		{
			KFifo<UCHAR>::Initialize(Length+1, pBuffer);
		}
		else
		{
			KFifo<UCHAR>::Initialize(Length, NonPagedPool);
		}
	}
}


EzUsbDriverManagedIsoTransfer::~EzUsbDriverManagedIsoTransfer(void)
{
	// Free all MDL's allocated.
	for( UCHAR j = 0; j < m_NumUrbs; j++ )
	{
		if( NULL != m_ppMdl[j] )
		{
			IoFreeMdl(m_ppMdl[j]);
			m_ppMdl[j] = NULL;
		}
	}

	delete m_TransferBuffers;
	delete m_pDescriptorBuffer;
}


USB_STREAM_STATUS EzUsbDriverManagedIsoTransfer::OnCompletedUrb(PURB pUrb, NTSTATUS status)
{
	ASSERT(pUrb);

	USB_STREAM_STATUS streamStatus = USB_STREAM_STATUS_STOP;

// Error checking
	//check the Irp status
	if( !NT_SUCCESS(status) )
	{
		//handle error condition for this device
		
		//this prevents re-sending the URB to the bus driver
		return streamStatus;
	}

	//check the URB header status
	USBD_STATUS usbdStatus = URB_STATUS( pUrb );

	if( USBD_SUCCESS(usbdStatus) )
	{
		if( USBD_STATUS_SUCCESS != usbdStatus )
		{
			t << "usbdStatus = " << usbdStatus << "\n";
		}
	}
	else
	{
		t << "usbdStatus = " << usbdStatus << "\n";
	}

	ASSERT( pUrb->UrbIsochronousTransfer.NumberOfPackets ) ;

	for( ULONG i = 0; i < pUrb->UrbIsochronousTransfer.NumberOfPackets; i++ )
	{
		m_dwTotalPacketsProcessed++;

		if( USBD_SUCCESS( ISO_PKT_STATUS(pUrb, i) ) ) 
		{
			m_dwTotalBytesProcessed += (ISO_PKT_LENGTH(pUrb, i));

			if( USBD_STATUS_SUCCESS != ( ISO_PKT_STATUS(pUrb, i) ) )
			{
				t << "usbd Iso Packet Status = " << ( ISO_PKT_STATUS(pUrb, i) ) << "\n"; 
			}
		}
		else 
		{
			t << "usbd Iso Packet Status = " << ( ISO_PKT_STATUS(pUrb, i) ) << "\n"; 
			m_dwErrorPacketCount++;
		}
	}
	
// This is a Read operation on the device (an IN isochronous transfer)
		
	//store the data from the device (described by the URB) in our buffer
	ULONG NumWrote = WriteBuffer(pUrb);

	//determine if we successfully wrote the data to the buffer
	if( 0 == NumWrote )
	{
		t << "USB_STREAM_STATUS_STOP\n";

		streamStatus = USB_STREAM_STATUS_STOP;
	}
	else
	{
		streamStatus = USB_STREAM_STATUS_CONTINUE;

	}

	//put descriptors into FIFO
	WriteDescriptorBuffer(
		pUrb->UrbIsochronousTransfer.IsoPacket, 
		pUrb->UrbIsochronousTransfer.NumberOfPackets
		);

	RtlZeroMemory(&pUrb->UrbIsochronousTransfer.hca, sizeof(_URB_HCD_AREA));

	return streamStatus;
}


ULONG EzUsbDriverManagedIsoTransfer::WriteBuffer(PURB pUrb)
{
	ASSERT( pUrb );
	_URB_ISOCH_TRANSFER* pIsoUrb = (_URB_ISOCH_TRANSFER*)pUrb;
	KMemory M(pIsoUrb->TransferBufferMDL);

	PUCHAR p = (PUCHAR)M.MapToSystemSpace();
	ULONG len = pIsoUrb->TransferBufferLength;
	PUCHAR ptemp = NULL;

	Lock();
	ULONG NumAvail = NumberOfItemsAvailableForWrite();
	if ( len > NumAvail )
	{
		// Allocate a temporary holding place for old data
		ptemp = (PUCHAR) new (NonPagedPool) UCHAR[len];
		// Discard oldest data from the FIFO by Reading elements
		Read(ptemp, len);
	}

	ULONG dwNumWrote = Write(p, len);
	Unlock();

	delete ptemp;

	return dwNumWrote;
}


ULONG EzUsbDriverManagedIsoTransfer::ReadBuffer(PVOID ptr, ULONG len)
{
	ULONG dwNumRead = 0;

	Lock();
	dwNumRead = Read(static_cast<PUCHAR>(ptr), len);
	Unlock();

	return dwNumRead;
}


ULONG EzUsbDriverManagedIsoTransfer::ReadDescriptorBuffer(
	PVOID pBuff, 
	ULONG dwNumDescriptorsToRead
	)
{
	if(NULL == m_pDescriptorBuffer)
	{
		return 0;
	}

	ULONG dwNumRead = 0;

	m_pDescriptorBuffer->Lock();
	dwNumRead = m_pDescriptorBuffer->Read(static_cast<PUSBD_ISO_PACKET_DESCRIPTOR>(pBuff), dwNumDescriptorsToRead);
	m_pDescriptorBuffer->Unlock();

	return dwNumRead;
}


ULONG EzUsbDriverManagedIsoTransfer::WriteDescriptorBuffer(
	PUSBD_ISO_PACKET_DESCRIPTOR pFirst, 
	ULONG dwNumToWrite
	)
{
	if(NULL == m_pDescriptorBuffer)
	{
		return 0;
	}

	PUSBD_ISO_PACKET_DESCRIPTOR ptemp = NULL;

	m_pDescriptorBuffer->Lock();
	ULONG dwNumAvailable = m_pDescriptorBuffer->NumberOfItemsAvailableForWrite();

	if ( dwNumToWrite > dwNumAvailable )
	{
		ULONG dwNumToDiscard = dwNumToWrite - dwNumAvailable;

		ptemp = (PUSBD_ISO_PACKET_DESCRIPTOR) new (NonPagedPool) 
						USBD_ISO_PACKET_DESCRIPTOR[dwNumToDiscard];

		ASSERT( NULL != ptemp );
		if(NULL == ptemp)
		{
			m_pDescriptorBuffer->Unlock();
			return 0;
		}

		// Discard oldest data from the FIFO by Reading elements
		m_pDescriptorBuffer->Read(
			ptemp, 
			dwNumToDiscard
			);
	}

	ULONG dwNumWrote = m_pDescriptorBuffer->Write(
						pFirst, 
						dwNumToWrite
						);

	m_pDescriptorBuffer->Unlock();

	delete ptemp;

	return dwNumWrote;
}

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久一区二区三区国产精品| 亚洲成人7777| 久久亚洲精精品中文字幕早川悠里| 欧美午夜宅男影院| 91一区二区三区在线观看| 福利91精品一区二区三区| 国产精品自拍一区| 国产毛片一区二区| 狠狠色丁香久久婷婷综合_中| 男男成人高潮片免费网站| 日韩精品欧美精品| 青青草视频一区| 久久国产麻豆精品| 精品一区二区三区久久久| 麻豆精品国产91久久久久久| 蜜桃视频一区二区三区| 久久精品国产99久久6| 国产在线精品免费| 风间由美一区二区三区在线观看| 丝瓜av网站精品一区二区| 欧美a一区二区| 狠狠久久亚洲欧美| 国产a视频精品免费观看| 国产盗摄一区二区三区| 久久99国产精品麻豆| 国产河南妇女毛片精品久久久| 粉嫩久久99精品久久久久久夜| 成人h精品动漫一区二区三区| 不卡的电视剧免费网站有什么| 色呦呦网站一区| 在线播放91灌醉迷j高跟美女| 91精品国产综合久久久久久久| 精品久久一区二区| 中文字幕高清不卡| 亚洲精品v日韩精品| 日韩精品一级二级| 成人午夜看片网址| 在线观看亚洲精品视频| 日韩一区二区高清| 国产日产欧美精品一区二区三区| 国产精品美女www爽爽爽| 日韩一区二区电影网| 国产精品免费视频观看| 亚洲在线观看免费| 久久99精品国产91久久来源| 国产成人免费av在线| 欧美亚洲综合另类| 26uuuu精品一区二区| 亚洲男人的天堂网| 精品在线免费观看| 91美女精品福利| 欧美电影免费观看完整版| 中国色在线观看另类| 五月天视频一区| 成人午夜免费视频| 日韩亚洲欧美一区二区三区| 国产精品情趣视频| 三级一区在线视频先锋| 国产精一品亚洲二区在线视频| 欧美日韩三级在线| 国产日韩欧美高清在线| 亚洲高清中文字幕| 成人高清免费观看| 69成人精品免费视频| 中文字幕日本不卡| 日韩**一区毛片| 一本久久综合亚洲鲁鲁五月天 | 日韩欧美国产一区二区三区 | 欧美日韩亚洲另类| 国产日产欧美一区二区三区 | 欧美色成人综合| 国产精品久久久爽爽爽麻豆色哟哟| 午夜精品久久久久久久99樱桃| 国产激情一区二区三区桃花岛亚洲| 欧美午夜精品久久久久久孕妇 | 日韩精品中文字幕在线不卡尤物| 中文字幕一区二区三区蜜月| 久久99九九99精品| 在线一区二区观看| 国产亚洲欧洲一区高清在线观看| 亚洲大尺度视频在线观看| 国产不卡视频一区二区三区| 欧美精品一卡两卡| 一区二区三区不卡视频| 99久久婷婷国产精品综合| 国产亚洲精品资源在线26u| 日韩精品乱码免费| 欧美色图免费看| 自拍偷在线精品自拍偷无码专区| 久久se这里有精品| 欧美精品国产精品| 亚洲免费在线视频一区 二区| 国产剧情一区二区| 久久久噜噜噜久久人人看 | 国产成人av一区二区三区在线| 88在线观看91蜜桃国自产| 一区二区三区四区五区视频在线观看| 国产一区二区精品久久91| 欧美tickling挠脚心丨vk| 亚洲第一搞黄网站| 在线免费一区三区| 亚洲少妇中出一区| 99久久国产综合色|国产精品| 久久久99精品免费观看不卡| 精品一区二区在线视频| 日韩三级电影网址| 日本v片在线高清不卡在线观看| 欧美视频一区二区三区在线观看 | 99精品视频一区| 国产精品久久久久影视| 成人免费视频国产在线观看| 久久精品欧美日韩精品| 粉嫩在线一区二区三区视频| 国产精品国产三级国产aⅴ中文| 福利一区二区在线| 国产精品久久久久久亚洲伦 | 国产精品久久久久天堂| 成人看片黄a免费看在线| 中文成人av在线| 色综合视频一区二区三区高清| 亚洲欧美国产毛片在线| 91福利在线免费观看| 亚洲福利视频导航| 欧美一级午夜免费电影| 精品写真视频在线观看| 久久久久99精品国产片| 国产成人久久精品77777最新版本| 久久影音资源网| 成人国产精品免费| 亚洲一区在线观看网站| 91麻豆精品国产自产在线| 极品少妇xxxx精品少妇| 久久精品人人做人人综合 | 久久久99免费| www.一区二区| 一区二区三区欧美亚洲| 5566中文字幕一区二区电影 | 欧美成人三级电影在线| 成人综合在线观看| 亚洲精品国产视频| 4438x亚洲最大成人网| 国产一区二区视频在线| 国产精品毛片高清在线完整版| 色婷婷综合久久久中文字幕| 亚洲va欧美va人人爽| 91精品欧美一区二区三区综合在 | 日日摸夜夜添夜夜添亚洲女人| 欧美videossexotv100| 99久久国产综合色|国产精品| 性欧美疯狂xxxxbbbb| 久久久久99精品一区| 欧美中文一区二区三区| 精品一区二区在线视频| 亚洲精品写真福利| 337p日本欧洲亚洲大胆精品 | 精品美女一区二区| youjizz国产精品| 免费av成人在线| 一区免费观看视频| 欧美一区二区三区视频免费| 高清在线不卡av| 麻豆国产91在线播放| 最新日韩在线视频| 精品国产露脸精彩对白| 色94色欧美sute亚洲线路一ni| 精一区二区三区| 一区二区三区视频在线看| 91精品午夜视频| 99精品欧美一区二区蜜桃免费 | 日韩午夜在线影院| 色999日韩国产欧美一区二区| 国模娜娜一区二区三区| 图片区小说区区亚洲影院| 日本一二三不卡| 精品国产一区a| 欧美日韩亚洲另类| 91国偷自产一区二区开放时间 | 免费在线观看一区| 亚洲一区免费观看| 国产精品你懂的在线| 26uuu精品一区二区三区四区在线| 欧美视频一区二区三区| 91视频国产资源| 大尺度一区二区| 国产综合色产在线精品| 天天影视网天天综合色在线播放| 中文字幕一区在线观看视频| 久久综合色8888| 91精品国产欧美一区二区18| 色999日韩国产欧美一区二区| jlzzjlzz欧美大全| 国产一区二区三区观看| 免费成人在线视频观看| 亚洲精品中文在线观看| 久久久久久久久伊人| 欧美亚洲综合在线| 国产寡妇亲子伦一区二区| 久久久久久一二三区| 亚洲精品一区二区三区香蕉| 91精品久久久久久久久99蜜臂|