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

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

?? driver于app的事件通信.txt

?? 驅動開發過程中要注意的一些要點以及一些基本資料
?? TXT
字號:
Crteate an event in app: 
ULONG length;
HANDLE hDriver=NULL,hEvent=NULL; 
hEvent = Createevent(NULL, TRUE, FALSE, NULL);
if(hEvent==NULL){//...}
hDriver = CreateFile("\\.\xxxxx",GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if(hDriver==NULL){//..}
//....
Send the event to driver:
if(!DeviceIoControl(hDriver,IOCTL_SEND_EVENT,&hEvent,
sizeof(HANDLE),NULL,0,&length,NULL)){//....}
//...
Wait for the event triggered(by the driver):
WaitForSingleObject(hEvent, INFINITE);
//...
dispatch IRP_MJ_DEVICE_CONTROL:
PIO_STACK_LOCATION irpStack;
PVOID ioBuffer;
ULONG ioctl;
ioBuffer = Irp->AssociatedIrp.SystemBuffer;
irpStack = IoGetCurrentIrpStackLocation(Irp);
ioctl = irpStack->Parameters.DeviceIoControl.IoControlCode;
switch(ioctl){
case IOCTL_SEND_EVENT:
ObReferenceObjectByHandle((HANDLE)(*ioBuffer), 0x0002,
NULL, UserMode,
(PVOID *)(&(deviceExt->Event)),
NULL);
KeClearEvent(deviceExt->Event);
}
//trigger the event;
KeSetEvent(deviceExt->Event, 2, FALSE);

在app建立聊事件(event),在下層就不用再建立事件。當然,如果在下層建立了命名事件,在上層只需打開此命名事件,然后等待事件就可以了(WaitForSingleObject)。
但是,m$ 不推薦這么干。 
給你一個ddk的例子:
//sys
/*++

Copyright (c) 1996 Microsoft Corporation

Module Name:

Event.c

Abstract:

This sample demonstrates one way that a Windows NT kernel-mode driver
can share and explicitly signal an Event Object with a Win32 application.

This sample uses the following method:
The application creates an event object using CreateEvent().
The app passes the event handle to the driver in a private IOCTL.
The driver is running in the app's thread context during the IOCTL so 
there is a valid user-mode handle at that time.
The driver dereferences the user-mode handle into system space & saves 
the new system handle for later use.
The driver signals the event via KeSetEvent() at IRQL <= DISPATCH_LEVEL.
The driver MUST delete any driver references to the event object at 
Unload time.

An alternative method would be to create a named event in the driver via 
IoCreateNotificationEvent and then open the event in user mode. This API 
however is new to Windows NT 4.0 so you can not use this method in your 
NT 3.5x drivers.

Note that this sample's event can be signalled (almost) at will from within 
the driver. A different event signal can be set when the driver is setup to 
do asynchronous I/O, and it is opened with FILE_FLAG_OVERLAPPED, and an 
event handle is passed down in an OVERLAPPED struct from the app's Read, 
Write, or DeviceIoControl. This different event signal is set by the I/O 
Manager when the driver calls IoCompleteRequest on a pending Irp. This type 
of Irp completion signal is not the purpose of this sample, hence the lack of
Irp queing.

Author:

Jeff Midkiff 23-Jul-96

Enviroment:

Kernel Mode Only

Revision History:
Jeff Midkiff 19-Apr-99 
Fixed RequestorMode access control & event type to ObReferenceObjectByHandle. 
Fixed reference count.


--*/


//
// INCLUDES
//
#include "ntddk.h"
#include "event.h"

//
// DEFINES
//
#define USER_NAME L"\DosDevices\EVENT"
#define SYSTEM_NAME L"\Device\EVENT"

//
// DATA
//
typedef struct _DEVICE_EXTENSION {
KDPC Dpc;
KTIMER Timer;
HANDLE hEvent;
ULONG References;

} DEVICE_EXTENSION, *PDEVICE_EXTENSION;


//
// PROTOS
//
NTSTATUS
DriverEntry(
IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath
);

NTSTATUS
Unload(
IN PDRIVER_OBJECT DriverObject
);

NTSTATUS
Dispatch(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);

VOID
CustomTimerDPC(
IN PKDPC Dpc,
IN PVOID DeferredContext,
IN PVOID SystemArgument1,
IN PVOID SystemArgument2
);


NTSTATUS
DriverEntry(
IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath
)

/*++

Routine Description:

This routine gets called by the system to initialize the driver.

Arguments:

DriverObject - the system supplied driver object.
RegistryPath - the system supplied registry path for this driver.

Return Value:

NTSTATUS

--*/

{

PDEVICE_OBJECT pDeviceObject;
PDEVICE_EXTENSION pDeviceExtension;

UNICODE_STRING usSystemName;
UNICODE_STRING usUserName;

NTSTATUS status;


KdPrint(("Event!DriverEntry - INn"));

//
// create the device object
//
RtlInitUnicodeString( &usSystemName, SYSTEM_NAME );

status = IoCreateDevice( 
DriverObject, // DriverObject 
sizeof( DEVICE_EXTENSION ), // DeviceExtensionSize
&usSystemName, // DeviceName
FILE_DEVICE_UNKNOWN, // DeviceType
0, // DeviceCharacteristics
FALSE, // Exclusive
&pDeviceObject // DeviceObject
);

if ( !NT_SUCCESS(status) ) {
KdPrint(("tIoCreateDevice returned 0x%xn", status));

return( status );
}

//
// Set up dispatch entry points for the driver.
//
DriverObject->MajorFunction[IRP_MJ_CREATE] =
DriverObject->MajorFunction[IRP_MJ_CLOSE] =
DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = Dispatch;
DriverObject->DriverUnload = Unload;

//
// Create a symbolic link into user mode for the driver.
//
RtlInitUnicodeString( &usUserName, USER_NAME );
status = IoCreateSymbolicLink( &usUserName, &usSystemName );

if ( !NT_SUCCESS(status) ) {
IoDeleteDevice( pDeviceObject );
KdPrint(("tIoCreateSymbolicLink returned 0x%xn", status));

return( status );
}

//
// establish user-buffer access method
//
pDeviceObject->Flags |= DO_BUFFERED_IO;


//
// setup the device extension
//
pDeviceExtension = pDeviceObject->DeviceExtension;

KeInitializeDpc(
&pDeviceExtension->Dpc, // Dpc
CustomTimerDPC, // DeferredRoutine
pDeviceObject // DeferredContext
); 

KeInitializeTimer(
&pDeviceExtension->Timer // Timer
);

pDeviceExtension->hEvent = NULL;

pDeviceExtension->References = 0L;

KdPrint(("Event!DriverEntry - OUTn"));

return( status );
}



NTSTATUS
Unload(
IN PDRIVER_OBJECT DriverObject
)

/*++

Routine Description:

This routine gets called to remove the driver from the system.

Arguments:

DriverObject - the system supplied driver object.

Return Value:

NTSTATUS

--*/

{

PDEVICE_OBJECT pDeviceObject = DriverObject->DeviceObject;
PDEVICE_EXTENSION pDeviceExtension = pDeviceObject->DeviceExtension;
UNICODE_STRING usUserName;

KdPrint(("Event!Unloadn"));

// Delete the user-mode symbolic link.
RtlInitUnicodeString( &usUserName, USER_NAME );
IoDeleteSymbolicLink( &usUserName );

// Delete the DeviceObject
IoDeleteDevice( pDeviceObject );

return( STATUS_SUCCESS );
}



NTSTATUS
Dispatch(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
)

/*++

Routine Description:

This device control dispatcher handles IOCTLs.

Arguments:

DeviceObject - Context for the activity.
Irp - The device control argument block.

Return Value:

NTSTATUS

--*/

{

PDEVICE_EXTENSION pDeviceExtension;
PIO_STACK_LOCATION pIrpStack;
PSET_EVENT pSetEvent;

ULONG ulInformation = 0L;
NTSTATUS status = STATUS_NOT_IMPLEMENTED;


KdPrint(("Event!Dispatch - INn"));

pDeviceExtension = (PDEVICE_EXTENSION)DeviceObject->DeviceExtension;
pIrpStack = IoGetCurrentIrpStackLocation( Irp );

switch( pIrpStack->MajorFunction )
{
case IRP_MJ_CREATE:
KdPrint(("tIRP_MJ_CREATEn"));
status = STATUS_SUCCESS;
break;

case IRP_MJ_CLOSE:
KdPrint(("tIRP_MJ_CLOSEn"));

KeCancelTimer( &pDeviceExtension->Timer );

//
// dereference the event object or it will NEVER go away until reboot
//
if ( pDeviceExtension->hEvent ) {

while (pDeviceExtension->References) {
ObDereferenceObject( pDeviceExtension->hEvent );
pDeviceExtension->References--;
}

}

status = STATUS_SUCCESS;
break;

case IRP_MJ_DEVICE_CONTROL:
switch( pIrpStack->Parameters.DeviceIoControl.IoControlCode )
{
case IOCTL_SET_EVENT:
KdPrint(("tIOCTL_SET_EVENTn"));

if ( pIrpStack->Parameters.DeviceIoControl.InputBufferLength < SIZEOF_SETEVENT ) {
// Parameters are invalid
KdPrint(("tSTATUS_INVALID_PARAMETERn"));

status = STATUS_INVALID_PARAMETER;
} else {

pSetEvent = (PSET_EVENT)Irp->AssociatedIrp.SystemBuffer;
KdPrint(("tuser-mode HANDLE = 0x%xn", pSetEvent->hEvent ));

status = ObReferenceObjectByHandle( pSetEvent->hEvent,
SYNCHRONIZE,
*ExEventObjectType,
Irp->RequestorMode,
&pDeviceExtension->hEvent,
NULL
);

if ( !NT_SUCCESS(status) ) {

KdPrint(("tUnable to reference User-Mode Event object, Error = 0x%xn", status));

} else {

KdPrint(("tkernel-mode HANDLE = 0x%xn", pDeviceExtension->hEvent ));

// Warning: you should watch for wrap here
pDeviceExtension->References++;

//
// Start the timer to run the CustomTimerDPC in DueTime seconds to
// simulate an interrupt (which would queue a DPC).
// The user's event object is signaled in the DPC.
//

// ensure relative time for this sample
if ( pSetEvent->DueTime.QuadPart > 0 )
pSetEvent->DueTime.QuadPart = -(pSetEvent->DueTime.QuadPart);
KdPrint(("tDueTime = %dn", pSetEvent->DueTime.QuadPart ));

KeSetTimer(
&pDeviceExtension->Timer, // Timer
pSetEvent->DueTime, // DueTime
&pDeviceExtension->Dpc // Dpc 
);

status = STATUS_SUCCESS;
}
}
break;

default:
// should never hit this
ASSERT(0);
status = STATUS_NOT_IMPLEMENTED;
break;

} // switch IoControlCode
break;

default:
// should never hit this
ASSERT(0);
status = STATUS_NOT_IMPLEMENTED;
break;

} // switch MajorFunction


//
// complete the Irp
//
Irp->IoStatus.Status = status;
Irp->IoStatus.Information = ulInformation;
IoCompleteRequest( Irp, IO_NO_INCREMENT );

KdPrint(("Event!Dispatch - OUTn"));
return status;
}



VOID
CustomTimerDPC(
IN PKDPC Dpc,
IN PVOID DeferredContext,
IN PVOID SystemArgument1,
IN PVOID SystemArgument2
)

/*++

Routine Description:

This is the DPC associated with this drivers Timer object setup in DriverEntry.

Arguments:

Dpc - our DPC object associated with our Timer
DeferredContext - Context for the DPC that we setup in DriverEntry
SystemArgument1 -
SystemArgument2 -

Return Value:

Nothing.

--*/

{

PDEVICE_OBJECT pDeviceObject = DeferredContext;
PDEVICE_EXTENSION pDeviceExtension = pDeviceObject->DeviceExtension;


KdPrint(("Event!CustomTimerDPC - INn"));

//
// Signal the Event created in user-mode
//
// Note: 
// Do not call KeSetEvent from your ISR;
// you must call it at IRQL <= DISPATCH_LEVEL.
// Your ISR should queue a DPC and the DPC can
// then call KeSetEvent on the ISR's behalf.
//
KeSetEvent((PKEVENT)pDeviceExtension->hEvent,// Event
0, // Increment
FALSE // Wait
);

// there is no Irp to complete here

KdPrint(("Event!CustomTimerDPC - OUTn"));

return;
}


// EOF
//header(event.h)
/*++

Copyright (c) 1996 Microsoft Corporation

Module Name:

Event.h

Abstract:


Author:

Jeff Midkiff 23-Jul-96

Enviroment:


Revision History:

--*/

#ifndef __EVENT__
#define __EVENT__


#include "devioctl.h"

typedef struct _SET_EVENT
{
HANDLE hEvent;
LARGE_INTEGER DueTime; // requested DueTime in 100-nanosecond units

} SET_EVENT, *PSET_EVENT;

#define SIZEOF_SETEVENT sizeof(SET_EVENT)


#define IOCTL_SET_EVENT 
CTL_CODE( FILE_DEVICE_UNKNOWN, 0x800, METHOD_BUFFERED, FILE_ANY_ACCESS )


#endif // __EVENT__

//app
/*++

Copyright (c) 1996 Microsoft Corporation

Module Name:

EventTest.c

Abstract:

Simple console test app demonstrating how a Win32 app can share 
an event object with a kernel-mode driver. For more information 
on using Event Objects at the application level see the Win32 SDK.

Author:

Jeff Midkiff 23-Jul-96

Enviroment:

User Mode

Revision History:

--*/


//
// INCLUDES
//
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <winioctl.h>
#include <winbase.h>
#include <conio.h>

#include "event.h"


//
// MAIN
//
void __cdecl 
main(
int argc, 
char ** argv
)
{
BOOL bStatus;
HANDLE hDevice;
ULONG ulReturnedLength;

SET_EVENT setEvent;
FLOAT fDelay;
LPVOID lpMessageBuffer;

if ( (argc < 2) || (argv[1] == NULL) ) {
printf("event <delay>n");
printf("twhere <delay> = time to delay the event signal in seconds.n");
exit(0);
}
sscanf( argv[1], "%f", &fDelay );

//
// open the device
//
hDevice = CreateFile(
"\\.\EVENT", // lpFileName
GENERIC_READ | GENERIC_WRITE, // dwDesiredAccess
FILE_SHARE_READ | FILE_SHARE_WRITE, // dwShareMode
NULL, // lpSecurityAttributes
OPEN_EXISTING, // dwCreationDistribution
0, // dwFlagsAndAttributes
NULL // hTemplateFile
);

if (hDevice == INVALID_HANDLE_VALUE) {
printf("CreateFile error = %dn", GetLastError() );
exit(0);
}


//
// set the event signal delay
//
setEvent.DueTime.QuadPart = -((LONGLONG)(fDelay * 10.0E6));// use relative time for this sample


//
// test the driver for bad event handles
//
setEvent.hEvent = NULL;
bStatus = DeviceIoControl(
hDevice, // Handle to device
IOCTL_SET_EVENT, // IO Control code
&setEvent, // Input Buffer to driver.
SIZEOF_SETEVENT, // Length of input buffer in bytes.
NULL, // Output Buffer from driver.
0, // Length of output buffer in bytes.
&ulReturnedLength, // Bytes placed in buffer.
NULL // synchronous call
);
if ( !bStatus ) {
printf("Bad handle TEST returned code %d.nn", GetLastError() );
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,
NULL,GetLastError(),MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),
(LPSTR)&lpMessageBuffer,0,NULL);
printf("The Err is %sn",lpMessageBuffer);
LocalFree(lpMessageBuffer);
} else {
printf("we should never get heren");
exit(0);
}


//
// 
//
setEvent.hEvent = CreateEvent( 
NULL, // lpEventAttributes
TRUE, // bManualReset
FALSE, // bInitialState
#ifdef DBG
"TEST_EVENT" // use WinObj to view named events for DBG
#else
NULL // lpName
#endif
);


if ( !setEvent.hEvent ) {
printf("CreateEvent error = %dn", GetLastError() );
} else {

printf("Event HANDLE = 0x%xn", setEvent.hEvent );
printf("Press any key to exit.n");
while( !_kbhit() ) {
bStatus = DeviceIoControl(
hDevice, // Handle to device
IOCTL_SET_EVENT, // IO Control code
&setEvent, // Input Buffer to driver.
SIZEOF_SETEVENT, // Length of input buffer in bytes.
NULL, // Output Buffer from driver.
0, // Length of output buffer in bytes.
&ulReturnedLength, // Bytes placed in buffer.
NULL // synchronous call
);

if ( !bStatus ) {
printf("Ioctl failed with code %dn", GetLastError() );
break;
} else {
printf("Waiting for Event...n");

WaitForSingleObject(setEvent.hEvent,
INFINITE );

printf("Event signalled.nn");

ResetEvent( setEvent.hEvent);
//printf("Event reset.n");
}
}
}

//
// close the driver
//
if ( !CloseHandle(hDevice) ) {
printf("Failed to close device.n");
}

exit(0);
}


// EOF


?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩欧美在线影院| 亚洲色图制服丝袜| 亚洲国产美女搞黄色| 狠狠色2019综合网| 欧美日精品一区视频| 国产精品亲子乱子伦xxxx裸| 日本大胆欧美人术艺术动态| 日本丶国产丶欧美色综合| 日韩精品中文字幕在线一区| 亚洲一二三区在线观看| 成人亚洲一区二区一| 日韩久久久久久| 三级在线观看一区二区| 色婷婷国产精品| 国产精品国产自产拍在线| 韩国精品主播一区二区在线观看 | 亚洲日本韩国一区| 精品一区二区免费在线观看| 精品视频一区二区三区免费| 亚洲视频网在线直播| 国产精品99久久久久久久女警 | 欧美在线一区二区三区| 日本一区二区动态图| 狠狠狠色丁香婷婷综合激情| 7777精品久久久大香线蕉| 亚洲午夜激情网站| 在线国产电影不卡| 伊人夜夜躁av伊人久久| 91免费视频观看| 综合分类小说区另类春色亚洲小说欧美| 国产一区二区三区免费看| 欧美一区二区三区在线| 青椒成人免费视频| 欧美一级午夜免费电影| 九九国产精品视频| 久久综合久久综合亚洲| 国产成人精品一区二区三区网站观看| 精品国免费一区二区三区| 精品一区二区三区免费毛片爱| 日韩欧美国产午夜精品| 精品一区二区三区免费观看| 久久久99免费| 成人免费高清在线| 亚洲欧美色图小说| 欧美在线影院一区二区| 视频一区二区三区入口| 精品日韩在线一区| 国产成人午夜99999| 欧美激情一区二区三区四区| 99精品欧美一区二区三区小说 | 天天综合色天天综合色h| 欧美人与禽zozo性伦| 日本三级亚洲精品| 久久色在线观看| 99国内精品久久| 亚洲一二三区在线观看| 国产精品情趣视频| 日本伦理一区二区| 日韩va亚洲va欧美va久久| 国产色爱av资源综合区| 一本高清dvd不卡在线观看| 亚洲日穴在线视频| 91精品国产综合久久香蕉麻豆| 韩国精品久久久| 综合激情成人伊人| 日韩欧美一区在线观看| 成人免费毛片app| 青青草一区二区三区| 国产情人综合久久777777| 91久久精品一区二区三区| 麻豆91在线播放免费| **性色生活片久久毛片| 欧美一区二区高清| 91色|porny| 国产一区二区三区美女| 亚洲一本大道在线| 亚洲国产精品v| 日韩午夜在线影院| 在线影院国内精品| 国产不卡免费视频| 首页国产欧美日韩丝袜| 亚洲欧洲日韩综合一区二区| 日韩午夜在线观看视频| 色哦色哦哦色天天综合| 国产成人精品影视| 久久66热偷产精品| 亚洲观看高清完整版在线观看| 国产色婷婷亚洲99精品小说| 欧美一区二区三区免费视频| 色综合久久综合网欧美综合网| 91丨九色丨国产丨porny| 免费精品视频最新在线| 一区二区在线观看不卡| 国产精品免费观看视频| 久久综合九色综合97婷婷| 欧美精品久久一区| 欧美又粗又大又爽| 色综合久久中文综合久久97| 国产福利精品一区二区| 国产一区二区三区久久久| 日本不卡1234视频| 亚洲成人精品一区| 亚洲国产综合色| 亚洲男人的天堂在线观看| 国产精品欧美一区二区三区| 久久久久久久电影| 久久综合九色综合欧美亚洲| 精品国产精品一区二区夜夜嗨| 4438x成人网最大色成网站| 欧美日韩久久久| 欧美视频一区二区在线观看| 一本到不卡精品视频在线观看| 99精品欧美一区| 一本一本大道香蕉久在线精品 | 成人激情小说乱人伦| 国产精品主播直播| 国产白丝精品91爽爽久久| 成人91在线观看| 91蜜桃传媒精品久久久一区二区| eeuss鲁一区二区三区| 99久久伊人精品| 91玉足脚交白嫩脚丫在线播放| 欧美一区二区三区视频免费| 91精品国产色综合久久| 91精品中文字幕一区二区三区| 日韩一区二区精品葵司在线| 精品入口麻豆88视频| 国产拍揄自揄精品视频麻豆| 中文字幕成人网| 亚洲精选视频在线| 午夜精品aaa| 黄色精品一二区| 国产成人一区在线| 91麻豆免费看| 91精品欧美综合在线观看最新 | 欧美日韩在线播| 欧美一区二区三区思思人 | 欧美一级高清片在线观看| 日韩精品在线一区二区| 国产女主播视频一区二区| 亚洲免费观看在线观看| 天堂资源在线中文精品| 韩日av一区二区| 成人免费av在线| 欧美日韩国产另类一区| 久久综合成人精品亚洲另类欧美| 国产日韩欧美在线一区| 亚洲一区免费在线观看| 日韩av一级片| 成人美女视频在线观看18| 欧美日韩一区二区三区视频 | 国产黄色91视频| 色老汉一区二区三区| 欧美一区二区三区免费视频| 国产精品国产三级国产普通话三级 | 亚洲一区二区三区中文字幕 | 国产女主播一区| 亚洲图片有声小说| 国产伦精品一区二区三区视频青涩| 波多野结衣在线一区| 欧美猛男男办公室激情| 国产日产亚洲精品系列| 午夜精品一区二区三区三上悠亚| 国产精品一级黄| 7777精品伊人久久久大香线蕉的| 国产精品国产自产拍在线| 精品在线一区二区三区| 欧美在线一区二区三区| 国产精品乱码人人做人人爱 | 日本乱人伦一区| 国产性做久久久久久| 免费观看在线色综合| 在线免费观看日韩欧美| 欧美激情在线看| 国产精品亚洲视频| 日韩欧美色综合网站| 亚洲电影一区二区| 99r精品视频| 亚洲自拍偷拍网站| 国产.欧美.日韩| 欧美精品一区二区三区久久久| 午夜精品视频一区| 91免费版在线看| 亚洲欧洲成人av每日更新| 国产福利91精品一区二区三区| 欧美二区三区的天堂| 亚洲一区二区三区四区在线观看| 波多野结衣中文字幕一区| 国产精品婷婷午夜在线观看| 久久99精品国产麻豆不卡| 5566中文字幕一区二区电影| 性欧美大战久久久久久久久| 欧美性受xxxx黑人xyx| 一区二区三区资源| 在线国产电影不卡| 亚洲一区二区偷拍精品| 欧美日韩成人高清| 日韩在线观看一区二区| 91.com在线观看| 久久国产麻豆精品|