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

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

?? control.cpp

?? 一本在講述USB驅(qū)動程式的書 及其范例原碼
?? CPP
字號:
// Control.cpp -- IOCTL handlers for pnpmon driver
// Copyright (C) 1999 by Walter Oney
// All rights reserved

#include "stddcls.h"
#include <initguid.h>
#include <wdmguid.h>
#include "driver.h"
#include "ioctls.h"

NTSTATUS Register(PDEVICE_EXTENSION pdx, PREGISTER_PARAMS p);
NTSTATUS Deregister(PDEVICE_EXTENSION pdx, PUNREGISTER_PARAMS p);
VOID DeregisterAll(PDEVICE_EXTENSION pdx);
NTSTATUS OnPnpNotify(PPLUGPLAY_NOTIFICATION_HEADER p, PREG_RECORD reg);
VOID KillRegRecord(PREG_RECORD reg);
void SubscribeForTargetNotifications(PDEVICE_INTERFACE_CHANGE_NOTIFICATION q, PREG_RECORD reg);

typedef struct _SUBSCRIBE_CALLBACK_CONTEXT {
	PIO_WORKITEM item;
	PREG_RECORD reg;
	WCHAR name[1];
	} SUBSCRIBE_CALLBACK_CONTEXT, *PSUBSCRIBE_CALLBACK_CONTEXT;

void SubscribeCallback(PDEVICE_OBJECT DeviceObject, PSUBSCRIBE_CALLBACK_CONTEXT context);

///////////////////////////////////////////////////////////////////////////////

#pragma PAGEDCODE

NTSTATUS DispatchControl(PDEVICE_OBJECT fdo, PIRP Irp)
	{							// DispatchControl
	PAGED_CODE();
	PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) fdo->DeviceExtension;

	NTSTATUS status = STATUS_SUCCESS;
	ULONG info = 0;

	PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(Irp);
	ULONG cbin = stack->Parameters.DeviceIoControl.InputBufferLength;
	ULONG cbout = stack->Parameters.DeviceIoControl.OutputBufferLength;
	ULONG code = stack->Parameters.DeviceIoControl.IoControlCode;

	switch (code)
		{						// process request

	case IOCTL_REGISTER:				// code == 0x800
		{						// IOCTL_REGISTER
		if (cbin < sizeof(REGISTER_PARAMS))
			{
			status = STATUS_INVALID_PARAMETER;
			break;
			}
		status = Register(pdx, (REGISTER_PARAMS*) Irp->AssociatedIrp.SystemBuffer);
		break;
		}						// IOCTL_REGISTER

	case IOCTL_DEREGISTER:				// code == 0x801
		{						// IOCTL_DEREGISTER
		if (cbin < sizeof(UNREGISTER_PARAMS))
			{
			status = STATUS_INVALID_PARAMETER;
			break;
			}
		status = Deregister(pdx, (UNREGISTER_PARAMS*) Irp->AssociatedIrp.SystemBuffer);
		break;
		}						// IOCTL_DEREGISTER

	case IOCTL_GETEVENT:				// code == 0x802
		{						// IOCTL_GETEVENT
		if (cbout < sizeof(GETEVENT_PARAMS))
			{
			status = STATUS_INVALID_PARAMETER;
			break;
			}

		PLIST_ENTRY list = ExInterlockedRemoveHeadList(&pdx->events, &pdx->eventlock);
		if (!list)
			{
			status = STATUS_NO_MORE_ENTRIES;
			break;
			}

		PEVENT_RECORD evrec = CONTAINING_RECORD(list, EVENT_RECORD, ListEntry);
		*(PGETEVENT_PARAMS) Irp->AssociatedIrp.SystemBuffer = evrec->params;
		info = sizeof(GETEVENT_PARAMS);
		ExFreePool(evrec);
		break;
		}						// IOCTL_GETEVENT

	default:
		status = STATUS_INVALID_DEVICE_REQUEST;
		break;

		}						// process request

	return CompleteRequest(Irp, status, info);
	}							// DispatchControl

///////////////////////////////////////////////////////////////////////////////

#pragma PAGEDCODE

NTSTATUS DispatchCreate(PDEVICE_OBJECT fdo, PIRP Irp)
	{							// DispatchCreate
	PAGED_CODE();
	KdPrint((DRIVERNAME " - "
		"IRP_MJ_CREATE\n"));
	PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) fdo->DeviceExtension;

	PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(Irp);
	
	NTSTATUS status = STATUS_SUCCESS;
	if (InterlockedIncrement(&pdx->handles) > 1)
		{						// too many opens
		InterlockedDecrement(&pdx->handles);
		status = STATUS_ACCESS_DENIED;
		}						// too many opens

	return CompleteRequest(Irp, status, 0);
	}							// DispatchCreate

///////////////////////////////////////////////////////////////////////////////

#pragma PAGEDCODE

NTSTATUS DispatchClose(PDEVICE_OBJECT fdo, PIRP Irp)
	{							// DispatchClose
	PAGED_CODE();
	KdPrint((DRIVERNAME " - "
		"IRP_MJ_CLOSE\n"));
	PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) fdo->DeviceExtension;
	DeregisterAll(pdx);
	InterlockedDecrement(&pdx->handles);
	return CompleteRequest(Irp, STATUS_SUCCESS, 0);
	}							// DispatchClose

///////////////////////////////////////////////////////////////////////////////

#pragma PAGEDCODE

NTSTATUS Register(PDEVICE_EXTENSION pdx, PREGISTER_PARAMS p)
	{							// Register
	NTSTATUS status;

	// Get a pointer to the event object we will set when notifications about
	// the specified GUID occur
	
	PKEVENT event;
	status = ObReferenceObjectByHandle(p->hevent, EVENT_MODIFY_STATE, *ExEventObjectType,
		KernelMode, (PVOID*) &event, NULL);

	if (!NT_SUCCESS(status))
		{
		KdPrint((DRIVERNAME " - ObReferenceObjectByHandle failed - %X\n", status));
		return status;
		}

	// Create an event registration structure

	PREG_RECORD reg = (PREG_RECORD) ExAllocatePool(NonPagedPool, sizeof(REG_RECORD));

	if (!reg)
		{
		KdPrint((DRIVERNAME " - unable to allocate %d bytes for registration record\n", sizeof(REG_RECORD)));
		ObDereferenceObject(event);
		return STATUS_INSUFFICIENT_RESOURCES;
		}

	RtlZeroMemory(reg, sizeof(REG_RECORD));
	reg->Event = event;
	reg->Guid = p->guid;
	reg->DeviceExtension = pdx;

	// Register for PnP notifications

	status = IoRegisterPlugPlayNotification(EventCategoryDeviceInterfaceChange,
		PNPNOTIFY_DEVICE_INTERFACE_INCLUDE_EXISTING_INTERFACES,
		&p->guid, pdx->DriverObject,
		(PDRIVER_NOTIFICATION_CALLBACK_ROUTINE) OnPnpNotify, reg, &reg->InterfaceNotificationEntry);
	
	if (!NT_SUCCESS(status))
		{
		KdPrint((DRIVERNAME " - IoRegisterPlugPlayNotification failed - %X\n", status));
		ObDereferenceObject(event);
		ExFreePool(reg);
		return status;
		}

	// Put the registration record onto our list

	InsertTailList(&pdx->registered, &reg->ListEntry);
	return STATUS_SUCCESS;
	}							// Register

///////////////////////////////////////////////////////////////////////////////

#pragma PAGEDCODE

NTSTATUS Deregister(PDEVICE_EXTENSION pdx, PUNREGISTER_PARAMS p)
	{							// Deregister
	PLIST_ENTRY list;
	NTSTATUS status = STATUS_SUCCESS;

	for (list = pdx->registered.Flink; list != &pdx->registered; )
		{						// for each list element
		PLIST_ENTRY next = list->Flink;
		PREG_RECORD reg = CONTAINING_RECORD(list, REG_RECORD, ListEntry);
		if (reg->Guid == p->guid)
			{					// found a registration record
			RemoveEntryList(list);
			KillRegRecord(reg);
			break;
			}					// found a registration record
		list = next;
		}						// for each list element

	return status;
	}							// Deregister

///////////////////////////////////////////////////////////////////////////////

#pragma PAGEDCODE

VOID DeregisterAll(PDEVICE_EXTENSION pdx)
	{							// DeregisterAll
	while (!IsListEmpty(&pdx->registered))
		{						// deregister all notifications
		PLIST_ENTRY next = RemoveHeadList(&pdx->registered);
		PREG_RECORD reg = CONTAINING_RECORD(next, REG_RECORD, ListEntry);
		KillRegRecord(reg);
		}						// deregister all notifications
	}							// DeregisterAll

///////////////////////////////////////////////////////////////////////////////

#pragma PAGEDCODE

VOID KillRegRecord(PREG_RECORD reg)
	{							// KillRegRecord
	if (reg->InterfaceNotificationEntry)
		IoUnregisterPlugPlayNotification(reg->InterfaceNotificationEntry);
	reg->InterfaceNotificationEntry = NULL;

	if (reg->HandleNotificationEntry)
		IoUnregisterPlugPlayNotification(reg->HandleNotificationEntry);
	reg->HandleNotificationEntry = NULL;

	if (reg->TargetFileReferenced)
		ObDereferenceObject(reg->TargetFile);
	reg->TargetFileReferenced = FALSE;

	if (reg->Event)
		ObDereferenceObject(reg->Event);
	reg->Event = NULL;

	// Make sure we don't release the registration structure while a
	// work item is outstanding.

	if (reg->WorkItemCount == 0)
		ExFreePool(reg);
	else
		reg->DeferredRelease = TRUE;
	}							// KillRegRecord

///////////////////////////////////////////////////////////////////////////////

#pragma PAGEDCODE

NTSTATUS OnPnpNotify(PPLUGPLAY_NOTIFICATION_HEADER p, PREG_RECORD reg)
	{							// OnPnpNotify
	PAGED_CODE();
	NTSTATUS status;

	// Report the event

#if DBG

	char *msg;
	
	if (p->Event == GUID_DEVICE_INTERFACE_ARRIVAL)
		msg = "arrival";
	else if (p->Event == GUID_DEVICE_INTERFACE_REMOVAL)
		msg = "removal";
	else if (p->Event == GUID_TARGET_DEVICE_QUERY_REMOVE)
		msg = "target query remove";
	else if (p->Event == GUID_TARGET_DEVICE_REMOVE_CANCELLED)
		msg = "target remove cancelled";
	else if (p->Event == GUID_TARGET_DEVICE_REMOVE_COMPLETE)
		msg = "target remove complete";
	else 
		msg = "custom notification";

	KdPrint((DRIVERNAME " - PnP notification (%s event)\n", msg));

#endif // DBG

	// Create an event record for reporting back to the application

	PDEVICE_EXTENSION pdx = reg->DeviceExtension;
	
	PEVENT_RECORD evrec = (PEVENT_RECORD) ExAllocatePool(NonPagedPool, sizeof(EVENT_RECORD));
	if (!evrec)
		{
		KdPrint((DRIVERNAME " - can't allocate %d bytes for event record\n", sizeof(EVENT_RECORD)));
		return STATUS_SUCCESS;
		}
	RtlZeroMemory(evrec, sizeof(EVENT_RECORD));

	evrec->params.event = p->Event;

	if (p->Event == GUID_DEVICE_INTERFACE_ARRIVAL || p->Event == GUID_DEVICE_INTERFACE_REMOVAL)
		{						// interface notification
		PDEVICE_INTERFACE_CHANGE_NOTIFICATION q = (PDEVICE_INTERFACE_CHANGE_NOTIFICATION) p;
		evrec->params.guid = q->InterfaceClassGuid;

		// N.B.: Don't just rely on an ASSERT like the following one in a production
		// driver -- handle the case where the name is too long in the free build too!

		ASSERT(q->SymbolicLinkName->Length + 2 <= sizeof(reg->LinkName));
		memcpy(reg->LinkName, q->SymbolicLinkName->Buffer, q->SymbolicLinkName->Length);
		reg->LinkName[q->SymbolicLinkName->Length/2] = 0;
		wcscpy(evrec->params.linkname, reg->LinkName);

		// For an arrival notification, we want to register for target device change notifications. To
		// do this, we must get a pointer to a file object for the device. Doing *that* entails opening
		// the device, which might cause a deadlock if the target device performs blocking PnP operations.
		// Therefore, arrange to do the open in another thread by queuing a work item.

		if (p->Event == GUID_DEVICE_INTERFACE_ARRIVAL)
			SubscribeForTargetNotifications(q, reg);
		}						// interface notification

	else if (p->Event == GUID_TARGET_DEVICE_QUERY_REMOVE
		|| p->Event == GUID_TARGET_DEVICE_REMOVE_COMPLETE)
		{						// target device notification
		PTARGET_DEVICE_REMOVAL_NOTIFICATION q = (PTARGET_DEVICE_REMOVAL_NOTIFICATION) p;
		wcscpy(evrec->params.linkname, reg->LinkName);

		// You need to close the file object when the query arrives,
		// or else the removal will get cancelled. Makes the idea
		// of getting a remove complete seem kind of silly, eh?

		if (reg->TargetFileReferenced)
			{					// dereference target
			if (reg->HandleNotificationEntry)
				IoUnregisterPlugPlayNotification(reg->HandleNotificationEntry);
			reg->HandleNotificationEntry = NULL;
			ObDereferenceObject(reg->TargetFile);
			reg->TargetFile = NULL;
			reg->TargetFileReferenced = FALSE;
			}					// dereference target
		}						// target device notification

	else if (p->Event == GUID_TARGET_DEVICE_REMOVE_CANCELLED)
		{						// remove cancelled
		PTARGET_DEVICE_REMOVAL_NOTIFICATION q = (PTARGET_DEVICE_REMOVAL_NOTIFICATION) p;
		wcscpy(evrec->params.linkname, reg->LinkName);
		}						// remove cancelled

	else
		{						// custom notification
		PTARGET_DEVICE_CUSTOM_NOTIFICATION q = (PTARGET_DEVICE_CUSTOM_NOTIFICATION) p;
		ASSERT(q->FileObject == reg->TargetFile);
		wcscpy(evrec->params.linkname, reg->LinkName);
		evrec->params.guid = q->Event;
		ULONG datasize = q->Size - FIELD_OFFSET(TARGET_DEVICE_CUSTOM_NOTIFICATION, CustomDataBuffer);
		
		// Don't just rely on an ASSERT for a production driver -- make it work even
		// in the free build!

		ASSERT(datasize <= sizeof(evrec->params.data));
		memcpy(evrec->params.data, q->CustomDataBuffer, datasize);
		evrec->params.datasize = datasize;
		evrec->params.textoffset = q->NameBufferOffset;
		}						// custom notification

	ExInterlockedInsertTailList(&pdx->events, &evrec->ListEntry, &pdx->eventlock);

	KeSetEvent(reg->Event, IO_NO_INCREMENT, FALSE);

	return STATUS_SUCCESS;
	}							// OnPnpNotify

///////////////////////////////////////////////////////////////////////////////

#pragma PAGEDCODE

void SubscribeCallback(PDEVICE_OBJECT DeviceObject, PSUBSCRIBE_CALLBACK_CONTEXT context)
	{							// SubscribeCallback
	PREG_RECORD reg = context->reg;
	PDEVICE_EXTENSION pdx = reg->DeviceExtension;
	InterlockedDecrement(&reg->WorkItemCount);
	IoFreeWorkItem(context->item);

	if (reg->DeferredRelease)
		{						// no-one interested anymore
		KillRegRecord(reg);
		ExFreePool(context);
		return;
		}						// no-one interested anymore

	PDEVICE_OBJECT junk;
	UNICODE_STRING name;
	RtlInitUnicodeString(&name, context->name);
	NTSTATUS status = IoGetDeviceObjectPointer(&name, 0, &reg->TargetFile, &junk);
	if (NT_SUCCESS(status))
		{				// register for notifications
		reg->TargetFileReferenced = TRUE;
		status = IoRegisterPlugPlayNotification(EventCategoryTargetDeviceChange, 0,
			reg->TargetFile, pdx->DriverObject, (PDRIVER_NOTIFICATION_CALLBACK_ROUTINE) OnPnpNotify,
			reg, &reg->HandleNotificationEntry);
		if (!NT_SUCCESS(status))
			{			// error registering
			KdPrint((DRIVERNAME " - IoRegisterPlugPlayNotification failed - %X\n", status));
			ObDereferenceObject(reg->TargetFile);
			reg->TargetFile = NULL;
			reg->TargetFileReferenced = FALSE;
			}			// error registering
		}				// register for notifications
	else
		KdPrint((DRIVERNAME " - IoGetDeviceObjectPointer failed - %X\n", status));

	ExFreePool(context);
	}							// SubscribeCallback

///////////////////////////////////////////////////////////////////////////////

#pragma PAGEDCODE

void SubscribeForTargetNotifications(PDEVICE_INTERFACE_CHANGE_NOTIFICATION q, PREG_RECORD reg)
	{							// SubscribeForTargetNotifications

	// Use IoAllocateWorkItem so our driver can't disappear from memory while
	// the work item is outstanding. Note that we don't have access to a remove lock
	// in this driver, so we can't just call IoAcquireRemoveLock.

	PIO_WORKITEM item = IoAllocateWorkItem(reg->DeviceExtension->DeviceObject);
	if (!item)
		return;

	ULONG size = sizeof(SUBSCRIBE_CALLBACK_CONTEXT) + q->SymbolicLinkName->Length;
	PSUBSCRIBE_CALLBACK_CONTEXT context = (PSUBSCRIBE_CALLBACK_CONTEXT) ExAllocatePool(NonPagedPool, size);
	if (!context)
		{
		IoFreeWorkItem(item);
		return;
		}

	RtlZeroMemory(context, size);

	context->reg = reg;
	context->item = item;
	RtlCopyMemory(context->name, q->SymbolicLinkName->Buffer, q->SymbolicLinkName->Length);

	InterlockedIncrement(&reg->WorkItemCount);

	IoQueueWorkItem(item, (PIO_WORKITEM_ROUTINE) SubscribeCallback, DelayedWorkQueue, context);
	}							// SubscribeForTargetNotifications


?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
狠狠色综合日日| 免费观看在线综合色| 国产剧情一区在线| 欧美性大战久久久久久久蜜臀| 久久天天做天天爱综合色| 亚洲国产精品视频| 成人国产精品免费观看| 精品国产一二三| 亚洲制服丝袜在线| 成人av网址在线| 亚洲精品在线观看视频| 日韩黄色免费电影| 欧美性色黄大片| 最新高清无码专区| 国产成人欧美日韩在线电影| 欧美一三区三区四区免费在线看| 亚洲美女电影在线| 成人av网站在线观看免费| 久久尤物电影视频在线观看| 免费人成网站在线观看欧美高清| 91久久精品网| 最好看的中文字幕久久| 国产高清在线观看免费不卡| 日韩一二三区不卡| 日韩精品乱码免费| 欧美人与性动xxxx| 亚洲高清免费在线| 欧美午夜精品理论片a级按摩| 亚洲三级在线看| 成人av午夜影院| 国产精品美女久久久久久久久久久 | 粗大黑人巨茎大战欧美成人| 久久你懂得1024| 久草这里只有精品视频| 欧美一卡2卡三卡4卡5免费| 亚洲成人av福利| 欧美喷水一区二区| 亚洲成人激情社区| 欧美日韩久久一区| 亚洲国产cao| 在线成人午夜影院| 日本特黄久久久高潮 | 国产激情精品久久久第一区二区| 精品国产青草久久久久福利| 蜜桃久久久久久久| 久久―日本道色综合久久| 韩国成人在线视频| 欧美国产综合一区二区| 成人在线综合网站| 国产精品成人免费| 色噜噜狠狠色综合中国| 亚洲午夜激情av| 7777精品伊人久久久大香线蕉的| 日本中文在线一区| 欧美成va人片在线观看| 国产精品正在播放| 亚洲欧洲日韩在线| 日本道精品一区二区三区| 亚洲国产欧美在线人成| 欧美一区二区三区视频免费播放 | 国产精品美女久久久久久| 成人aa视频在线观看| 亚洲欧美一区二区久久| 欧美三级午夜理伦三级中视频| 亚洲18影院在线观看| 日韩欧美高清一区| 国产成人av电影在线| 最新中文字幕一区二区三区| 欧美亚洲综合网| 日韩av午夜在线观看| 2023国产精品自拍| 成人午夜私人影院| 亚洲国产精品麻豆| 精品国产sm最大网站免费看| 成人网在线免费视频| 亚洲主播在线播放| 精品久久久三级丝袜| 99久久精品免费| 五月婷婷久久综合| 久久久高清一区二区三区| 91毛片在线观看| 香蕉久久夜色精品国产使用方法| 欧美va日韩va| 99久久精品久久久久久清纯| 日本一区中文字幕| 国产色婷婷亚洲99精品小说| 在线观看视频一区| 久久国产免费看| 亚洲精品视频免费看| 日韩视频免费直播| www..com久久爱| 亚洲电影一级黄| 欧美xxxxx裸体时装秀| 播五月开心婷婷综合| 日韩高清不卡一区二区| 国产欧美一区二区精品秋霞影院| 欧洲精品一区二区| 国产乱人伦偷精品视频不卡| 一个色综合av| 久久嫩草精品久久久精品一| 欧美视频一二三区| 粉嫩绯色av一区二区在线观看| 亚洲一区二区影院| 国产精品三级av在线播放| 欧美福利电影网| 精品一区在线看| 一区二区三区国产| 国产色综合久久| 日韩一区二区免费在线电影| 99re在线视频这里只有精品| 久久99国产精品免费| 亚洲综合在线五月| 国产欧美日韩在线| 欧美岛国在线观看| 欧美三级一区二区| 99精品视频中文字幕| 国产伦精品一区二区三区免费迷| 亚洲成人av在线电影| 成人免费在线观看入口| xnxx国产精品| 69堂成人精品免费视频| 色综合av在线| 成人综合激情网| 久久99国产精品免费| 一区二区高清在线| 国产精品乱码一区二区三区软件| 欧美大白屁股肥臀xxxxxx| 欧美日韩中文字幕精品| 色999日韩国产欧美一区二区| 粉嫩在线一区二区三区视频| 精品亚洲国内自在自线福利| 丝袜美腿亚洲色图| 一区二区三区在线观看视频| 成人欧美一区二区三区黑人麻豆| 久久精品一区二区三区不卡牛牛| 日韩天堂在线观看| 制服丝袜国产精品| 欧美日韩国产电影| 91福利视频在线| 色综合天天综合给合国产| 日本久久一区二区三区| 国产福利一区二区| 九九在线精品视频| 久久99日本精品| 视频一区视频二区在线观看| 亚洲一级二级三级在线免费观看| 中文字幕一区二区三区四区不卡 | 在线观看免费亚洲| 99re在线视频这里只有精品| 99久久精品久久久久久清纯| 成人免费视频网站在线观看| 国产风韵犹存在线视精品| 国产一区二区在线影院| 精品综合久久久久久8888| 精品影院一区二区久久久| 激情另类小说区图片区视频区| 久久99久久精品欧美| 久久精品国产成人一区二区三区| 久久精品国产一区二区三区免费看| 天天综合色天天综合色h| 午夜伊人狠狠久久| 日本在线不卡视频| 久久99精品久久只有精品| 精品一区二区日韩| 国产精品一二三四区| 国产精品1024| 不卡的看片网站| 在线一区二区视频| 欧美色中文字幕| 欧美日韩国产美女| 欧美一区二区日韩一区二区| 日韩三级免费观看| www成人在线观看| 国产精品欧美一区喷水| 亚洲视频一二三| 亚洲国产视频在线| 日本成人在线视频网站| 激情综合色综合久久| 国产精华液一区二区三区| 97精品国产97久久久久久久久久久久 | 亚洲777理论| 美女视频免费一区| 丰满白嫩尤物一区二区| 日本道色综合久久| 日韩三级伦理片妻子的秘密按摩| 久久亚洲一区二区三区明星换脸 | 久久看人人爽人人| 一色屋精品亚洲香蕉网站| 亚洲国产sm捆绑调教视频| 蜜臀av性久久久久蜜臀aⅴ流畅 | 免费精品99久久国产综合精品| 国产一区二区美女| kk眼镜猥琐国模调教系列一区二区| 在线精品亚洲一区二区不卡| 678五月天丁香亚洲综合网| 精品国产乱码久久久久久1区2区 | 国产欧美1区2区3区| 亚洲色图欧美激情| 日本欧洲一区二区| 丰满少妇久久久久久久|