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

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

?? ezusbisotransfer.cpp

?? EZ_USB cy7c68013的驅(qū)動程序
?? CPP
字號:
// 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;
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
美女视频黄久久| 在线免费观看日本欧美| 久久综合九色欧美综合狠狠| 精品在线观看免费| 一区二区三区中文字幕电影| 日韩欧美电影在线| 91尤物视频在线观看| 久久精品国产久精国产爱| 亚洲日穴在线视频| 国产色综合一区| 欧美日韩免费不卡视频一区二区三区| 国产电影一区在线| 美国十次综合导航| 天天综合天天综合色| 中文字幕一区二区三区在线播放| 久久亚洲综合色| 日韩欧美国产综合| 欧美一区永久视频免费观看| 在线视频中文字幕一区二区| 成人国产精品免费网站| 精品一区精品二区高清| 免费在线观看一区| 日韩av一级片| 五月婷婷综合在线| 亚洲成人你懂的| 亚洲一区视频在线| 亚洲欧美日韩国产另类专区| 中文欧美字幕免费| 久久精品水蜜桃av综合天堂| 精品国产人成亚洲区| 欧美浪妇xxxx高跟鞋交| 欧美性感一区二区三区| 91麻豆国产在线观看| 91在线视频网址| 成人av电影在线网| www.欧美.com| 97se亚洲国产综合自在线不卡| 国产999精品久久久久久| 国产精品自拍一区| 国产精品正在播放| 国产成人综合在线播放| 国产二区国产一区在线观看| 国产a久久麻豆| 国产福利精品一区| 成人a区在线观看| 99久久国产综合精品色伊| www.色精品| 日本久久一区二区| 欧美性大战久久久久久久蜜臀 | 成人黄色片在线观看| 国产成人精品免费看| 91精品国产免费| 精品成人在线观看| 中文字幕高清不卡| 亚洲欧美日韩综合aⅴ视频| 亚洲一二三专区| 美国毛片一区二区三区| 国产在线精品免费| 99久久综合精品| 欧美中文字幕一二三区视频| 91精品国产色综合久久ai换脸 | 欧美另类z0zxhd电影| 欧美一区二区日韩一区二区| 欧美一二三区在线| 欧美日韩大陆在线| 欧美成人性福生活免费看| 国产视频一区二区在线观看| 国产精品久久久久aaaa樱花| 一二三四区精品视频| 在线成人免费视频| 9色porny自拍视频一区二区| 日本韩国视频一区二区| 制服丝袜中文字幕一区| 国产丝袜欧美中文另类| 亚洲久草在线视频| 视频在线观看国产精品| 国产成人在线免费| yourporn久久国产精品| 欧美精品99久久久**| 日本一区二区三区在线不卡| 亚洲高清免费观看高清完整版在线观看| 日韩高清不卡在线| 成人午夜精品在线| 欧美日韩国产乱码电影| 亚洲第一福利一区| 美女国产一区二区| 色综合色综合色综合| 欧美大尺度电影在线| 亚洲伦理在线精品| 国内精品在线播放| 欧美日韩一级片在线观看| 国产午夜亚洲精品理论片色戒| 亚洲综合色在线| 国产成人综合亚洲91猫咪| 欧美蜜桃一区二区三区| 国产精品视频麻豆| 精品一区二区三区不卡| 欧美在线观看视频一区二区| 久久久www成人免费毛片麻豆| 亚洲午夜激情网页| 91亚洲永久精品| xnxx国产精品| 免费在线视频一区| 欧美日韩视频专区在线播放| 国产精品少妇自拍| 国精产品一区一区三区mba桃花| 日本乱码高清不卡字幕| 国产精品私人自拍| 国产在线视视频有精品| 91麻豆精品国产91久久久资源速度| 国产精品国产成人国产三级 | 精品国产制服丝袜高跟| 亚洲sss视频在线视频| 色婷婷国产精品久久包臀| 亚洲国产精品高清| 久久99精品久久久| 欧美一区二区精品久久911| 一卡二卡三卡日韩欧美| 91网站在线播放| 中文字幕在线观看一区二区| 国产主播一区二区| 26uuuu精品一区二区| 久久成人免费网站| 日韩午夜电影在线观看| 午夜一区二区三区在线观看| 欧美三级三级三级| 一区二区三区免费观看| 91色在线porny| 亚洲欧美在线另类| 97se亚洲国产综合自在线不卡| 国产精品久久久久久久第一福利| 国产一区二区精品久久99| 久久久久久97三级| 国产乱一区二区| 国产亚洲综合av| 粉嫩av亚洲一区二区图片| 国产日韩欧美不卡在线| 成人免费观看视频| 国产精品免费久久久久| 不卡电影一区二区三区| 亚洲欧美欧美一区二区三区| 91蜜桃网址入口| 亚洲最新在线观看| 欧美福利视频一区| 日本sm残虐另类| 精品久久久久久久久久久久包黑料| 免费高清视频精品| 国产视频一区二区三区在线观看| 国产成人精品免费一区二区| 中文字幕综合网| 欧美视频一区二| 免费看日韩a级影片| 欧美不卡一区二区| 国产91露脸合集magnet| 亚洲丝袜制服诱惑| 欧美无乱码久久久免费午夜一区 | 国产精品免费aⅴ片在线观看| 成人app在线观看| 亚洲国产精品久久人人爱蜜臀 | ●精品国产综合乱码久久久久| 91亚洲精品乱码久久久久久蜜桃| 一区二区三区四区蜜桃| 欧美精品久久99| 国产精品一区二区x88av| 亚洲欧美在线观看| 制服丝袜亚洲网站| 国产成人av影院| 亚洲一区二区三区视频在线播放| 欧美一级理论片| 国产成人精品午夜视频免费| 亚洲一区在线看| 精品国产伦理网| 色综合久久久久综合体| 免费在线观看一区二区三区| 亚洲国产精品v| 777奇米成人网| 成人av免费网站| 久久国产乱子精品免费女| 日韩毛片精品高清免费| 日韩美女一区二区三区四区| 成人av片在线观看| 久久精品99国产精品| 亚洲人成亚洲人成在线观看图片| 欧美乱妇15p| 北条麻妃一区二区三区| 日本 国产 欧美色综合| 亚洲欧美日韩在线播放| 久久新电视剧免费观看| 色婷婷狠狠综合| 国产成人精品aa毛片| 五月婷婷欧美视频| 亚洲视频香蕉人妖| 久久亚洲精品国产精品紫薇| 欧美日韩精品综合在线| 91色在线porny| 国产成人av一区二区三区在线| 日本欧美在线观看| 亚洲一区二区三区美女| 国产精品午夜电影| 久久免费电影网|