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

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

?? ptextend.c

?? NDIS IM Driver passthruEx
?? C
字號:
/////////////////////////////////////////////////
// PTEXTEND.c文件


#include "precomp.h"
#pragma hdrstop
#include "iocommon.h"

extern NDIS_SPIN_LOCK	GlobalLock;
extern PADAPT pAdaptList;


//////////////////////////////////////////
// 派遣例程

// 這是處理IRP_MJ_CREATE的派遣例程,我們僅簡單的返回成功
NTSTATUS DevOpen(PDEVICE_OBJECT pDeviceObject, PIRP pIrp)
{
	NTSTATUS status = STATUS_SUCCESS;
	PIO_STACK_LOCATION pIrpStack;

	// 初始化這個新的文件對象

	pIrpStack = IoGetCurrentIrpStackLocation(pIrp);

	pIrpStack->FileObject->FsContext = NULL;
	pIrpStack->FileObject->FsContext2 = NULL;


	DBGPRINT(("  DevOpen: FileObject %p\n", pIrpStack->FileObject));

	// 完成此IRP請求
	pIrp->IoStatus.Information = 0;
	pIrp->IoStatus.Status = status;
	IoCompleteRequest(pIrp, IO_NO_INCREMENT);
	return status;
}

// 這是處理IRP_MJ_CLEANUP的派遣例程
NTSTATUS DevCleanup(PDEVICE_OBJECT pDeviceObject,PIRP pIrp)
{
    PIO_STACK_LOCATION  pIrpSp;
    NTSTATUS            status = STATUS_SUCCESS;
    POPEN_CONTEXT       pOpenContext;
	
	// 取得句柄
    pIrpSp = IoGetCurrentIrpStackLocation(pIrp);
    pOpenContext = pIrpSp->FileObject->FsContext;
	
    if(pOpenContext)
    {
		// 在這里取消所有未決的IRP。這個例子里沒有。
    }

    pIrp->IoStatus.Information = 0;
    pIrp->IoStatus.Status = status;
    IoCompleteRequest(pIrp, IO_NO_INCREMENT);
	
    return status;
} 

// 這是處理IRP_MJ_CLOSE的派遣例程,如果是適配器句柄,我們要減小對打開環(huán)境的引用
NTSTATUS DevClose(PDEVICE_OBJECT pDeviceObject, PIRP pIrp)
{
	NTSTATUS status = STATUS_SUCCESS;
	PIO_STACK_LOCATION pIrpStack;
	POPEN_CONTEXT pOpenContext;

	pIrpStack = IoGetCurrentIrpStackLocation(pIrp);
	pOpenContext = (POPEN_CONTEXT)pIrpStack->FileObject->FsContext;


	pIrpStack->FileObject->FsContext = NULL;
	pIrpStack->FileObject->FsContext2 = NULL;

	if(pOpenContext != NULL) // 關(guān)閉的是一個適配器句柄
	{
		if(pOpenContext->pAdapt != NULL)
		{
			NdisAcquireSpinLock(&(pOpenContext->pAdapt)->Lock);
			(pOpenContext->pAdapt)->pOpenContext = NULL;
			NdisReleaseSpinLock(&(pOpenContext->pAdapt)->Lock);
		}
		DevDerefOpenContext(pOpenContext);
	}

	// 完成此IRP請求
	pIrp->IoStatus.Information = 0;
	pIrp->IoStatus.Status = status;
	IoCompleteRequest(pIrp, IO_NO_INCREMENT);
	return status;
}


// 這是處理IRP_MJ_DEVICE_CONTROL的派遣例程,如果是適配器句柄,我們要減小對打開環(huán)境的引用
NTSTATUS DevIoControl(PDEVICE_OBJECT pDeviceObject, PIRP pIrp)
{
	// 假設(shè)失敗
	NTSTATUS status = STATUS_INVALID_DEVICE_REQUEST;

	// 取得此IRP(pIrp)的I/O堆棧指針
	PIO_STACK_LOCATION pIrpStack = IoGetCurrentIrpStackLocation(pIrp);

	// 取得I/O控制代碼
	ULONG uIoControlCode = pIrpStack->Parameters.DeviceIoControl.IoControlCode;
	// 取得I/O緩沖區(qū)指針和它的長度
	PVOID pIoBuffer = pIrp->AssociatedIrp.SystemBuffer;
	ULONG uInSize = pIrpStack->Parameters.DeviceIoControl.InputBufferLength;
	ULONG uOutSize = pIrpStack->Parameters.DeviceIoControl.OutputBufferLength;

	ULONG uTransLen = 0;

	DBGPRINT((" DevIoControl... \n"));

	switch(uIoControlCode)
	{
	case IOCTL_PTUSERIO_ENUMERATE:
		{
			status = DevGetBindingList(pIoBuffer, uOutSize, &uTransLen);
		}
		break;
	case IOCTL_PTUSERIO_OPEN_ADAPTER: // 打開一個適配器。實際上是為適配器關(guān)聯(lián)一個OPEN_CONTEXT結(jié)構(gòu)
		{
			POPEN_CONTEXT pOpenContext;
			PADAPT pAdapt = LookupAdaptByName((PUCHAR)pIoBuffer, uInSize);
			if(pAdapt == NULL)
			{
				status = STATUS_OBJECT_NAME_NOT_FOUND;
				break;
			}

			
			// 如果正在Unbind,則失敗
			NdisAcquireSpinLock(&pAdapt->Lock);  
			if(pAdapt->UnbindingInProcess)
			{
				NdisReleaseSpinLock(&pAdapt->Lock);
				PtDerefAdapter(pAdapt);
				status = STATUS_INVALID_DEVICE_STATE;
				break;
			}
			NdisReleaseSpinLock(&pAdapt->Lock);

			// 如果適配器已經(jīng)打開,則失敗
			if(pAdapt->pOpenContext != NULL)
			{
				PtDerefAdapter(pAdapt);
				status = STATUS_DEVICE_BUSY;
				break;
			}

			// 為新的OPEN_CONTEXT結(jié)構(gòu)申請內(nèi)存空間
			pOpenContext = DevAllocateOpenContext(pAdapt);
			if(pOpenContext == NULL)
			{
				PtDerefAdapter(pAdapt);
				status = STATUS_INSUFFICIENT_RESOURCES;
				break;
			}


				// 在ADAPT結(jié)構(gòu)中保存pOpenContext指針
			// InterlockedXXX函數(shù)執(zhí)行原子操作:首先它將pAdapt->pOpenContext
			// 與NULL檢查,如果它們相等,這個函數(shù)將pOpenContext放入pAdapt->pOpenContext,
			// 返回NULL。否則,它僅返回現(xiàn)存的Adapt->pOpenContext,不改變?nèi)魏沃怠?	
			/* 功能上相當(dāng)于 
			if(pAdapt->pOpenContext == NULL)
			{
				pAdapt->pOpenContext = pOpenContext;
			}
			else
			{
				// error 
			}*/
			if(InterlockedCompareExchangePointer(&(pAdapt->pOpenContext), 
													pOpenContext, NULL) != NULL)
			{
				PtDerefAdapter(pAdapt);
				status = STATUS_DEVICE_BUSY;
				break;
			}

			// 將打開環(huán)境與句柄關(guān)聯(lián)
			pIrpStack->FileObject->FsContext = pOpenContext;

			status = STATUS_SUCCESS;
		}
		break;
	case IOCTL_PTUSERIO_QUERY_OID:
	case IOCTL_PTUSERIO_SET_OID: 
		{
			return DevHandleOidRequest(pDeviceObject, pIrp);
		}
		break;
	default:
		return FltDevIoControl(pDeviceObject, pIrp);
	}


	if(status == STATUS_SUCCESS)
		pIrp->IoStatus.Information = uTransLen;
	else
		pIrp->IoStatus.Information = 0;

	pIrp->IoStatus.Status = status;
	IoCompleteRequest(pIrp, IO_NO_INCREMENT);
	return status;
}


//////////////////////////////////
// 處理IOCTL時要使用的函數(shù)

// 處理用戶的OID請求
NTSTATUS DevHandleOidRequest(PDEVICE_OBJECT pDeviceObject, PIRP pIrp)
{
	// 假設(shè)失敗
	NTSTATUS status = STATUS_INVALID_DEVICE_REQUEST;

	// 取得此IRP(pIrp)的I/O堆棧指針
	PIO_STACK_LOCATION pIrpStack = IoGetCurrentIrpStackLocation(pIrp);

	// 取得I/O控制代碼
	ULONG uIoControlCode = pIrpStack->Parameters.DeviceIoControl.IoControlCode;
	// 取得I/O緩沖區(qū)指針和它的長度
	PPTUSERIO_OID_DATA pOidData = (PPTUSERIO_OID_DATA)pIrp->AssociatedIrp.SystemBuffer;
	ULONG uInSize = pIrpStack->Parameters.DeviceIoControl.InputBufferLength;
	ULONG uOutSize = pIrpStack->Parameters.DeviceIoControl.OutputBufferLength;
	ULONG uTransLen = 0;

	POPEN_CONTEXT pOpenContext;
	PADAPT pAdapt;
	do
	{
		// 取得與此句柄關(guān)聯(lián)的OPEN_CONTEXT結(jié)構(gòu)的指針	// 首先檢查此句柄是否打開適配器
		pOpenContext = (POPEN_CONTEXT)pIrpStack->FileObject->FsContext;
		if(pOpenContext == NULL)
		{
			status = STATUS_INVALID_HANDLE;
			break;
		}
		pAdapt = pOpenContext->pAdapt;
		if(pAdapt == NULL)
		{
			status = STATUS_INVALID_HANDLE;
			break;
		}
		
		// 檢查緩沖區(qū)
		if(uOutSize != uInSize || uOutSize < sizeof(PTUSERIO_OID_DATA) ||
					uOutSize < sizeof(PTUSERIO_OID_DATA) - 1 + pOidData->Length)
		{
			status = STATUS_INVALID_PARAMETER;
			break;
		}
		

		
		// 如果Unbind正在進(jìn)行,則失敗
		NdisAcquireSpinLock(&pAdapt->Lock);
		
		if( pAdapt->UnbindingInProcess )
		{
			NdisReleaseSpinLock(&pAdapt->Lock);
			DBGPRINT(( "      Unbind In Process\n" ));
			status = STATUS_INVALID_DEVICE_STATE;
			break;
		}
		
		//
		// All other queries are failed, if the miniport is not at D0,
		//
		if (pAdapt->MPDeviceState > NdisDeviceStateD0)
		{
			NdisReleaseSpinLock(&pAdapt->Lock);
			DBGPRINT(( "      Invalid Miniport Device State\n" ));
			status = STATUS_INVALID_DEVICE_STATE;
			break;
		}
		
		//
		// This is in the process of powering down the system, always fail the request
		// 
		if (pAdapt->StandingBy == TRUE)
		{
			NdisReleaseSpinLock(&pAdapt->Lock);
			DBGPRINT(( "      Miniport Powering Down\n" ));
			
			status = STATUS_INVALID_DEVICE_STATE;
			break;
		}
		
		NdisReleaseSpinLock(&pAdapt->Lock);
		
			// 檢查完畢,最后,進(jìn)行這個請求

		DevRefOpenContext(pOpenContext);	
		
		// 初始化NDIS_REQUEST結(jié)構(gòu)
		NdisZeroMemory(&pOpenContext->Request, sizeof(pOpenContext->Request));
		if(uIoControlCode == IOCTL_PTUSERIO_SET_OID)
		{ 
			pOpenContext->Request.RequestType = NdisRequestSetInformation;
			pOpenContext->Request.DATA.SET_INFORMATION.Oid = pOidData->Oid;
			pOpenContext->Request.DATA.SET_INFORMATION.InformationBuffer = pOidData->Data;
			pOpenContext->Request.DATA.SET_INFORMATION.InformationBufferLength = pOidData->Length;
		}
		else
		{
			pOpenContext->Request.RequestType = NdisRequestQueryInformation;
			pOpenContext->Request.DATA.QUERY_INFORMATION.Oid = pOidData->Oid;
			pOpenContext->Request.DATA.QUERY_INFORMATION.InformationBuffer = pOidData->Data;
			pOpenContext->Request.DATA.QUERY_INFORMATION.InformationBufferLength = pOidData->Length;
		}
		
		NdisResetEvent( &pOpenContext->RequestEvent);
		
		// 提交這個請求
		NdisRequest(&status, pAdapt->BindingHandle, &pOpenContext->Request);
		
		
		if(status != NDIS_STATUS_PENDING)
		{
			DevRequestComplete(pAdapt, &pOpenContext->Request, status);
		}
		
		// 等待請求的完成,即等待Ndis調(diào)用DevRequestComplete例程
		NdisWaitEvent(&pOpenContext->RequestEvent, 0);
		
		if(pOpenContext->RequestStatus == NDIS_STATUS_SUCCESS)
		{
			//  將大小返回到用戶緩沖區(qū)
			if(uIoControlCode == IOCTL_PTUSERIO_SET_OID) 
			{
				pOidData->Length = pOpenContext->Request.DATA.SET_INFORMATION.BytesRead;
			} 
			else if(uIoControlCode == IOCTL_PTUSERIO_QUERY_OID) 
			{
				pOidData->Length = pOpenContext->Request.DATA.QUERY_INFORMATION.BytesWritten;
			}	
			
			// 設(shè)置返回給I/O管理器的信息
			uTransLen = pIrpStack->Parameters.DeviceIoControl.InputBufferLength;
			status = STATUS_SUCCESS;
		}
		else
		{
			status = STATUS_UNSUCCESSFUL;
		}
		
		DevDerefOpenContext(pOpenContext);
	}
	while(FALSE);

	if(status == STATUS_SUCCESS)
		pIrp->IoStatus.Information = uTransLen;
	else
		pIrp->IoStatus.Information = 0;

	pIrp->IoStatus.Status = status;
	IoCompleteRequest(pIrp, IO_NO_INCREMENT);
	return status;
}

VOID DevRequestComplete(PADAPT pAdapt, PNDIS_REQUEST NdisRequest,NDIS_STATUS Status)
{
	POPEN_CONTEXT pOpenContext = CONTAINING_RECORD(NdisRequest, OPEN_CONTEXT, Request);
	pOpenContext->RequestStatus = Status;
    NdisSetEvent(&pOpenContext->RequestEvent);
}

// 獲取綁定列表
NTSTATUS DevGetBindingList(
    IN  PVOID              Buffer,		// 緩沖區(qū)
    IN  ULONG              Length,		// 緩沖區(qū)大小
    IN  OUT PULONG         DataLength	// 返回實際需要的長度
    )
{
	PADAPT pAdapt ;

		// 遍歷列表,計算所需的緩沖區(qū)大小
	ULONG nRequiredLength = 0;
	ULONG nAdapters = 0;

	NdisAcquireSpinLock(&GlobalLock);

	pAdapt = pAdaptList;
	while(pAdapt != NULL)
	{
		nRequiredLength += pAdapt->DeviceName.Length + sizeof(UNICODE_NULL); 
		nRequiredLength += pAdapt->LowerDeviceName.Length + sizeof(UNICODE_NULL);
		nAdapters++;

		pAdapt = pAdapt->Next;
	}

	// 我們將要以下面的格式返回數(shù)據(jù):
	// nAdapters + 一個或者多個("DeviceName\0" + "LowerDeviceName\0") + UNICODE_NULL
	// 所以,下面要包含上nAapters和UNICODE_NULL的大小
	nRequiredLength += sizeof(nAdapters) + sizeof(UNICODE_NULL); 

	*DataLength = nRequiredLength;
	if(nRequiredLength > Length) 
	{
       NdisReleaseSpinLock(&GlobalLock);
       return STATUS_BUFFER_TOO_SMALL;
    }

		// 填充緩沖區(qū)
	// 首先是適配器數(shù)量
	*(PULONG)Buffer = nAdapters;
	Buffer = (PCHAR)Buffer + sizeof(ULONG);

	// 然后復(fù)制適配器和符號連接名稱
	pAdapt = pAdaptList;
	while(pAdapt != NULL)
	{
		NdisMoveMemory(Buffer,pAdapt->DeviceName.Buffer, pAdapt->DeviceName.Length + sizeof(WCHAR));

		Buffer = (PCHAR)Buffer + pAdapt->DeviceName.Length + sizeof(WCHAR);

        NdisMoveMemory(Buffer,pAdapt->LowerDeviceName.Buffer, pAdapt->LowerDeviceName.Length + sizeof(WCHAR)); 

		Buffer = (PCHAR)Buffer + pAdapt->LowerDeviceName.Length + sizeof(WCHAR);    

		pAdapt = pAdapt->Next;
    }
	
	// 最后的結(jié)束標(biāo)志
    *(PWCHAR)Buffer = UNICODE_NULL;
    
    NdisReleaseSpinLock(&GlobalLock);

	return STATUS_SUCCESS;
}



////////////////////////////////////////////
// 幫助函數(shù)

// 更加適配器名稱查找適配器的PADAPT結(jié)構(gòu)
PADAPT LookupAdaptByName(PUCHAR pNameBuffer, ULONG nNameLength)
{
	PADAPT pAdapt;

	NdisAcquireSpinLock(&GlobalLock);

	pAdapt = pAdaptList;
	while(pAdapt != NULL)
	{
		if(pAdapt->LowerDeviceName.Length == nNameLength &&
			NdisEqualMemory(pAdapt->LowerDeviceName.Buffer, pNameBuffer, nNameLength))
			break;


		pAdapt = pAdapt->Next;
	}

	// 防止在引用適配器期間,系統(tǒng)釋放緩沖區(qū)
	if(pAdapt != NULL)
		PtRefAdapter(pAdapt);

	NdisReleaseSpinLock(&GlobalLock);
	return pAdapt;
}

// 申請和初始化一個POPEN_CONTEXT結(jié)構(gòu)
POPEN_CONTEXT DevAllocateOpenContext(PADAPT pAdapt)
{
	POPEN_CONTEXT pOpenContext = NULL;

	// 為OPEN_CONTEXT結(jié)構(gòu)申請內(nèi)存空間
	NdisAllocateMemoryWithTag(&pOpenContext, sizeof(OPEN_CONTEXT), TAG);
	if(pOpenContext == NULL)
	{
		return NULL;
	}

	// 初始化這個內(nèi)存空間
	NdisZeroMemory(pOpenContext, sizeof(OPEN_CONTEXT));

	NdisAllocateSpinLock(&pOpenContext->Lock);

	NdisInitializeEvent(&pOpenContext->RequestEvent);

	pOpenContext->RefCount = 1;
	pOpenContext->pAdapt = pAdapt;

	return pOpenContext;
}

// 增加對適配器(PADAPT結(jié)構(gòu))的引用
VOID PtRefAdapter(PADAPT pAdapt)	
{
   NdisInterlockedIncrement(&pAdapt->RefCount);
}


// 減小對適配器(PADAPT結(jié)構(gòu))的引用,如果減為0,則釋放它占用的內(nèi)存
VOID PtDerefAdapter(PADAPT pAdapt) 
{
	if(pAdapt == NULL)
		return;
 
	if(NdisInterlockedDecrement(&pAdapt->RefCount) == 0) // 已經(jīng)沒有代碼再引用它了,釋放內(nèi)存
	{
		MPFreeAllPacketPools (pAdapt);

// BEGIN_PTEX_FILTER
      //
      // 反初始化此適配器上的過濾相關(guān)數(shù)據(jù)
      //
      FltOnDeinitAdapter(pAdapt);
// END_PTEX_FILTER

		NdisFreeMemory(pAdapt, 0, 0);
	}
}




// 增加對打開環(huán)境的引用
VOID DevRefOpenContext(POPEN_CONTEXT pOpenContext) 
{
	// 首先增加對適配器的引用,然后再增加OPEN_CONTEXT的引用計數(shù)
   PtRefAdapter(pOpenContext->pAdapt);
   NdisInterlockedIncrement(&pOpenContext->RefCount);
}

// 減少對打開環(huán)境的引用,如果減為0,則釋放它占用的內(nèi)存
VOID DevDerefOpenContext(POPEN_CONTEXT pOpenContext) 
{
   PADAPT pAdapt = NULL;
   if(pOpenContext == NULL)
	   return;

   // 首先保存對應(yīng)的適配器指針,以便后面對它調(diào)用PtDerefAdapter函數(shù)
   pAdapt = pOpenContext->pAdapt;

   // 減小引用計數(shù),如果沒有代碼再引用它了,則清除資源
   if(NdisInterlockedDecrement(&pOpenContext->RefCount) == 0)
   {
      NdisFreeSpinLock(&pOpenContext->Lock);
      NdisFreeMemory(pOpenContext, 0, 0);
   }

   // 減少對適配器的引用
   PtDerefAdapter(pAdapt);
}




/*NTSTATUS DevOpenAdapter(PUCHAR pNameBuffer, ULONG nNameLength, )
{

}*/


?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
蜜桃av一区二区三区电影| 激情五月激情综合网| 日韩欧美www| 91丝袜美女网| 国产一区二区三区四区五区美女| 中文成人av在线| 欧美一区二区精美| 91久久精品日日躁夜夜躁欧美| 黄网站免费久久| 婷婷亚洲久悠悠色悠在线播放| 中文字幕亚洲综合久久菠萝蜜| 欧美不卡123| 欧美无人高清视频在线观看| 国产一区二区伦理| 蜜桃久久久久久| 爽爽淫人综合网网站| 亚洲欧美日韩国产另类专区| 国产亚洲短视频| 欧美大尺度电影在线| 欧美日韩一级二级三级| 99热这里都是精品| 成人免费高清视频| 丁香婷婷综合色啪| 国产一区在线观看麻豆| 男男视频亚洲欧美| 视频一区欧美精品| 亚洲高清三级视频| 一区二区三区欧美激情| 中文字幕制服丝袜成人av| 久久久亚洲午夜电影| 欧美r级在线观看| 欧美哺乳videos| 日韩欧美在线1卡| 欧美丰满嫩嫩电影| 91麻豆精品国产| 欧美丰满一区二区免费视频 | 色88888久久久久久影院野外| 国产传媒一区在线| 成人午夜在线视频| 大白屁股一区二区视频| 国产一区二区剧情av在线| 国产精品资源网站| 国产精品77777| 福利91精品一区二区三区| 国产风韵犹存在线视精品| 国产高清视频一区| 成人激情校园春色| 99久久免费视频.com| 99精品欧美一区| 欧美综合一区二区| 欧美日韩免费在线视频| 欧美人xxxx| 精品噜噜噜噜久久久久久久久试看| 精品剧情v国产在线观看在线| 欧美精品一区二区三区很污很色的| 久久久久久亚洲综合影院红桃| 欧美精品一区二区三区高清aⅴ| 国产三级欧美三级日产三级99| 中文字幕欧美激情一区| 亚洲蜜臀av乱码久久精品蜜桃| 一区二区三区免费网站| 亚洲va欧美va天堂v国产综合| 日韩精品乱码av一区二区| 蜜臀a∨国产成人精品| 国产一区免费电影| 99久久久精品| 91久久精品一区二区三区| 91精品国产综合久久精品麻豆 | 国产专区综合网| 成人免费黄色大片| 欧美亚洲尤物久久| 日韩精品一区二区在线观看| 国产欧美一区二区精品久导航| 中文字幕在线观看不卡| 亚洲高清免费在线| 国产九色精品成人porny| 色综合中文字幕国产 | 免费的成人av| 成人精品高清在线| 欧美日韩成人综合在线一区二区| 欧美成人高清电影在线| 日韩一区中文字幕| 美女视频黄久久| aaa欧美大片| 欧美一级夜夜爽| 国产精品国产三级国产aⅴ中文| 亚洲高清免费一级二级三级| 国产精品一区在线观看你懂的| 91成人在线精品| 国产视频一区二区在线| 亚洲一级二级三级在线免费观看| 狠狠色狠狠色综合日日91app| 一本色道a无线码一区v| 精品三级在线看| 亚洲午夜影视影院在线观看| 国产精品18久久久久| 欧美日韩久久久一区| 欧美激情综合五月色丁香小说| 天使萌一区二区三区免费观看| 成人免费视频免费观看| 91精品久久久久久蜜臀| 国产精品国产三级国产普通话蜜臀 | 韩国成人精品a∨在线观看| 91小视频在线观看| 久久亚洲春色中文字幕久久久| 一区二区三区在线观看国产| 国产成人激情av| 91精品国产入口| 一区二区欧美国产| 成人黄动漫网站免费app| 日韩免费观看2025年上映的电影 | 欧美视频一区二| 国产精品久久久一本精品| 另类小说图片综合网| 精品视频999| 亚洲蜜桃精久久久久久久| 成人中文字幕电影| 欧美成人性战久久| 婷婷一区二区三区| 欧美亚州韩日在线看免费版国语版| 国产欧美精品在线观看| 久久精品国产亚洲a| 欧美一级二级三级乱码| 亚洲午夜视频在线观看| 色综合视频一区二区三区高清| 国产肉丝袜一区二区| 激情综合色综合久久综合| 欧美一级夜夜爽| 日韩高清一级片| 7777女厕盗摄久久久| 亚洲va韩国va欧美va精品| 欧洲一区二区av| 亚洲免费视频中文字幕| 色狠狠综合天天综合综合| 亚洲欧美一区二区视频| 99免费精品在线| 亚洲日本丝袜连裤袜办公室| 不卡电影一区二区三区| 国产精品每日更新| 91麻豆高清视频| 一区二区三区日韩| 欧美亚洲自拍偷拍| 日韩激情中文字幕| 91精品国产色综合久久不卡电影| 秋霞av亚洲一区二区三| 91精品国产免费| 久久er99热精品一区二区| 欧美白人最猛性xxxxx69交| 久久66热re国产| 欧美成人艳星乳罩| 国产超碰在线一区| 国产精品福利av| 91麻豆免费观看| 亚洲国产日韩一区二区| 欧美精品v国产精品v日韩精品| 婷婷久久综合九色综合伊人色| 欧美一级理论片| 久草这里只有精品视频| 国产日产欧美一区二区三区| 懂色av一区二区三区免费观看| 亚洲女性喷水在线观看一区| 一本色道久久综合精品竹菊| 午夜电影久久久| 欧美精品一区二区三区四区| 国产99精品国产| 亚洲婷婷在线视频| 在线播放国产精品二区一二区四区 | 亚洲一级不卡视频| 91精品国产综合久久久久久久| 国产在线精品一区二区不卡了| 亚洲欧洲精品一区二区精品久久久| 日本国产一区二区| 蜜臀av国产精品久久久久| 国产清纯美女被跳蛋高潮一区二区久久w | 不卡一区二区三区四区| 亚洲综合色成人| ww亚洲ww在线观看国产| 972aa.com艺术欧美| 青青草精品视频| 国产精品麻豆网站| 欧美精品一二三| 岛国精品一区二区| 午夜精品久久久久久| 久久精品日产第一区二区三区高清版| 色视频一区二区| 国产麻豆精品95视频| 樱桃国产成人精品视频| 欧美成人女星排名| 日本道色综合久久| 激情综合色丁香一区二区| 亚洲黄色免费电影| 久久精品亚洲精品国产欧美kt∨| 一本一道综合狠狠老| 久久国产婷婷国产香蕉| 一区二区三区.www| 中文av一区二区| 日韩欧美国产麻豆| 欧美日韩成人激情| 91美女在线观看| 岛国一区二区三区|