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

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

?? device.c

?? 可用于嵌入式編程學習
?? C
?? 第 1 頁 / 共 4 頁
字號:
/* File:    device.c
 *
 * Purpose: WinCE device manager
 *
 * Copyright (c) 1995-2000 Microsoft Corporation.  All rights reserved.
 */

//
// This module contains these functions:
//  FS_RegisterDevice
//  RegisterDeviceEx
//  DoFreeFSD
//  DoFreeDevice
//  WaitForFSDs
//  NotifyFSDs
//  IsValidDevice
//  FS_DeregisterDevice
//  FS_ActivateDevice
//  FindActiveByHandle
//  FS_DeactivateDevice
//  GetFSD
//  FormatDeviceName
//  LoadFSDThread
//  FS_LoadFSD
//  FS_LoadFSDEx
//  FS_CeResyncFilesys
//  FS_PowerAllDevices
//  FS_GetDeviceByIndex
//  FS_CreateDeviceHandle
//  FS_DevCloseFileHandle
//  FS_DevReadFile
//  FS_DevWriteFile
//  FS_DevSetFilePointer
//  FS_DevDeviceIoControl
//  FS_DevGetFileSize
//  FS_DevGetFileInformation
//  FS_DevFlushFileBuffers
//  FS_DevGetFileTime
//  FS_DevSetFileTime
//  FS_DevSetEndOfFile
//  FS_DevProcNotify
//  FS_CloseAllDeviceHandles
//  WinMain
//

#include <device.h>
#include <devload.h>
#include <devloadp.h>
#include <cardserv.h>
#include <console.h>

#ifdef TARGET_NT
#include <devemul.h>
#include "proxy.h"
#endif

#ifdef INSTRUM_DEV
#include <instrumd.h>
#else
#define ENTER_INSTRUM
#define EXIT_INSTRUM_INIT
#define EXIT_INSTRUM_DEINIT
#define EXIT_INSTRUM_POWERDOWN
#define EXIT_INSTRUM_POWERUP
#define EXIT_INSTRUM_OPEN
#define EXIT_INSTRUM_CLOSE
#define EXIT_INSTRUM_READ
#define EXIT_INSTRUM_WRITE
#define EXIT_INSTRUM_SEEK
#define EXIT_INSTRUM_IOCONTROL
#endif // INSTRUM_DEV

/* Device driver implementation */

//      @doc    EXTERNAL OSDEVICE KERNEL

//      @module device.c - device driver support | Device driver support functions.

//      @topic WinCE Device Drivers | There are two types of device drivers.  The
//      first type are specialized drivers.  These are keyboard, mouse/touch screen,
//      and display drivers.  These drivers have specialized interfaces.  The other
//      type of driver is the stream based device driver model.  Drivers following the
//      stream based model will need to export several functions and be initialized
//      before they can be used.  They can be accessed through standard file APIs such
//      as OpenFile.  The driver dll must export a set of entrypoints of the form
//      ttt_api, where ttt is the device id passed in lpszType to RegisterDevice, and
//      api is a required or optional API.  The APIs required are: Init, Deinit, Open,
//      Close, Read, Write, Seek, and IOCtl.
//  Drivers which need interrupts can use kernel exported interrupt support 
//  routines. To understand the interrupt model and functions please look at
//  <l Interrupt Support.Kernel Interrupt Support>
//      @xref <f RegisterDevice> <f DeregisterDevice> 
//         <l Interrupt Support.Kernel Interrupt Support>

//	notes on handling of unloading of dlls while threads are in those dlls:
//	1> routines which take the device critical section before calling into a dll do not need to
//		adjust the reference count since the deregister call takes the critical section
//	2> routines which do not take the device critical section do the following:
//		a> check if the device is still valid [ if (fsodev->lpDev) ]
//		b> if so, increment the reference count, so dodec = 1, make call, decrement the reference count,
//			set dodec = 0
//		c> we assume we will not fault in the interlockedDecrement, since once we've succeeded in the
//			increment, we know we won't fault on the decrement since nobody will be LocalFree'ing the device
//		d> if we fault inside the actual function call, we'll do the decrement due to the dodec flag
// 	3> We signal an event when we put someone on the DyingDevs list.  We can just poll from that point onwards
//		since (1) it's a rare case and (2) it's cheaper than always doing a SetEvent if you decrement the
//		reference count to 0.

CRITICAL_SECTION g_devcs;
LIST_ENTRY g_DevChain;
LIST_ENTRY g_DyingDevs;
fsopendev_t *g_lpOpenDevs;
fsopendev_t *g_lpDyingOpens;
HANDLE g_hDevApiHandle, g_hDevFileApiHandle, g_hCleanEvt, g_hCleanDoneEvt;
fsd_t *g_lpFSDChain;

//
// Devload.c and pcmcia.c 
//
typedef DWORD (*SYSTEMPOWER)(DWORD);
extern SYSTEMPOWER pfnSystemPower;
extern void DevloadInit(void);
extern void DevloadPostInit(void);
extern BOOL I_DeactivateDevice(HANDLE hDevice, LPWSTR ActivePath);
extern HANDLE StartOneDriver(LPTSTR RegPath, LPTSTR PnpId,
                  DWORD LoadOrder, DWORD ClientInfo, CARD_SOCKET_HANDLE hSock);

#ifndef TARGET_NT
const PFNVOID FDevApiMethods[] = {
	(PFNVOID)FS_DevProcNotify,
	(PFNVOID)0,
	(PFNVOID)FS_RegisterDevice,
	(PFNVOID)FS_DeregisterDevice,
	(PFNVOID)FS_CloseAllDeviceHandles,
	(PFNVOID)FS_CreateDeviceHandle,
	(PFNVOID)FS_LoadFSD,
	(PFNVOID)FS_ActivateDevice,
	(PFNVOID)FS_DeactivateDevice,
	(PFNVOID)FS_LoadFSDEx,
	(PFNVOID)FS_GetDeviceByIndex,
	(PFNVOID)FS_CeResyncFilesys,
};

#define NUM_FDEV_APIS (sizeof(FDevApiMethods)/sizeof(FDevApiMethods[0]))

const DWORD FDevApiSigs[NUM_FDEV_APIS] = {
	FNSIG3(DW, DW, DW),                     // ProcNotify
	FNSIG0(),
	FNSIG4(PTR, DW, PTR, DW),       // RegisterDevice
	FNSIG1(DW),                                     // DeregisterDevice
	FNSIG0(),                                       // CloseAllDeviceHandles
	FNSIG4(PTR, DW, DW, DW),            // CreateDeviceHandle
	FNSIG2(PTR, PTR),            // LoadFSD
	FNSIG2(PTR, DW),       // ActivateDevice
	FNSIG1(DW),            // DeactivateDevice
	FNSIG3(PTR, PTR, DW),	//LoadFSDEx
	FNSIG2(DW, PTR),		// GetDeviceByIndex
	FNSIG1(DW),	// CeResyncFilesys
};

const PFNVOID DevFileApiMethods[] = {
    (PFNVOID)FS_DevCloseFileHandle,
    (PFNVOID)0,
    (PFNVOID)FS_DevReadFile,
    (PFNVOID)FS_DevWriteFile,
    (PFNVOID)FS_DevGetFileSize,
    (PFNVOID)FS_DevSetFilePointer,
    (PFNVOID)FS_DevGetFileInformationByHandle,
	(PFNVOID)FS_DevFlushFileBuffers,
	(PFNVOID)FS_DevGetFileTime,
	(PFNVOID)FS_DevSetFileTime,
	(PFNVOID)FS_DevSetEndOfFile,
	(PFNVOID)FS_DevDeviceIoControl,
};

#define NUM_FAPIS (sizeof(DevFileApiMethods)/sizeof(DevFileApiMethods[0]))

const DWORD DevFileApiSigs[NUM_FAPIS] = {
    FNSIG1(DW),                                 // CloseFileHandle
    FNSIG0(),
    FNSIG5(DW,PTR,DW,PTR,PTR),  // ReadFile
    FNSIG5(DW,PTR,DW,PTR,PTR),  // WriteFile
    FNSIG2(DW,PTR),                             // GetFileSize
    FNSIG4(DW,DW,PTR,DW),               // SetFilePointer
    FNSIG2(DW,PTR),                             // GetFileInformationByHandle
	FNSIG1(DW),                                     // FlushFileBuffers
	FNSIG4(DW,PTR,PTR,PTR),         // GetFileTime
	FNSIG4(DW,PTR,PTR,PTR),         // SetFileTime
	FNSIG1(DW),                                     // SetEndOfFile,
	FNSIG8(DW, DW, PTR, DW, PTR, DW, PTR, PTR), // DeviceIoControl
};
#endif // TARGET_NT

PFNVOID FS_GetProcAddr(LPCWSTR type, LPCWSTR lpszName, HINSTANCE hInst) {
	WCHAR fullname[32];
	memcpy(fullname,type,3*sizeof(WCHAR));
	fullname[3] = L'_';
	wcscpy(&fullname[4],lpszName);
	return (PFNVOID)GetProcAddress(hInst,fullname);
}

//      @func   HANDLE | RegisterDevice | Register a new device
//  @parm       LPCWSTR | lpszType | device id (SER, PAR, AUD, etc) - must be 3 characters long
//  @parm       DWORD | dwIndex | index between 0 and 9, ie: COM2 would be 2
//  @parm       LPCWSTR | lpszLib | dll containing driver code
//  @parm       DWORD | dwInfo | instance information
//      @rdesc  Returns a handle to a device, or 0 for failure.  This handle should
//                      only be passed to DeregisterDevice.
//      @comm   For stream based devices, the drivers will be .dll or .drv files.
//                      Each driver is initialized by
//                      a call to the RegisterDevice API (performed by the server process).
//                      The lpszLib parameter is what will be to open the device.  The
//                      lpszType is a three character string which is used to identify the 
//                      function entry points in the DLL, so that multiple devices can exist
//                      in one DLL.  The lpszLib is the name of the DLL which contains the
//                      entry points.  Finally, dwInfo is passed in to the init routine.  So,
//                      if there were two serial ports on a device, and comm.dll was the DLL
//                      implementing the serial driver, it would be likely that there would be
//                      the following init calls:<nl>
//                      <tab>h1 = RegisterDevice(L"COM", 1, L"comm.dll",0x3f8);<nl>
//                      <tab>h2 = RegisterDevice(L"COM", 2, L"comm.dll",0x378);<nl>
//                      Most likely, the server process will read this information out of a
//                      table or registry in order to initialize all devices at startup time.
//      @xref <f DeregisterDevice> <l Overview.WinCE Device Drivers>
//

HANDLE
FS_RegisterDevice(
    LPCWSTR lpszType,
    DWORD   dwIndex,
    LPCWSTR lpszLib,
    DWORD   dwInfo
    )
{
    return RegisterDeviceEx(
                lpszType,
                dwIndex,
                lpszLib,
                dwInfo,
                MAX_LOAD_ORDER+1
                );
}

HANDLE
RegisterDeviceEx(
    LPCWSTR lpszType,
    DWORD dwIndex,
    LPCWSTR lpszLib,
    DWORD dwInfo,
    DWORD dwLoadOrder
    )
{
	HANDLE hDev = 0;
	fsdev_t *lpdev = 0, *lpTrav;
	DWORD retval = 0;

	DEBUGMSG(ZONE_DYING, (TEXT("DEVICE: About to wait on CleanDoneEvt.\r\n")));

	// Need to wait for any filesystem devices to finish getting deregistered 
	// before we go ahead and register them again. This gets around problems
	// with storage card naming. 
	retval = WaitForSingleObject(g_hCleanDoneEvt, 5000);
	DEBUGMSG(ZONE_DYING, (TEXT("DEVICE: Got CleanDoneEvt.\r\n")));
	
	ASSERT(retval != WAIT_TIMEOUT);
	
	retval = ERROR_SUCCESS;	// Initialize for success

	if (dwIndex > 9) {
		retval = ERROR_INVALID_PARAMETER;
		goto errret;
	}
	if (!(lpdev = LocalAlloc(LPTR,sizeof(fsdev_t)))) {
		retval = ERROR_OUTOFMEMORY;
		goto errret;
	}
	
	__try {
        memset(lpdev, 0, sizeof(fsdev_t));
        memcpy(lpdev->type,lpszType,sizeof(lpdev->type));
		lpdev->index = dwIndex;
		if (!(lpdev->hLib = LoadDriver(lpszLib))) {
			retval = ERROR_FILE_NOT_FOUND;
		} else {
			if (!(lpdev->fnInit = (pInitFn)FS_GetProcAddr(lpdev->type,L"Init",lpdev->hLib)) ||
				!(lpdev->fnDeinit = (pDeinitFn)FS_GetProcAddr(lpdev->type,L"Deinit",lpdev->hLib)) ||
				!(lpdev->fnOpen = (pOpenFn)FS_GetProcAddr(lpdev->type,L"Open",lpdev->hLib)) ||
				!(lpdev->fnClose = (pCloseFn)FS_GetProcAddr(lpdev->type,L"Close",lpdev->hLib)) ||
				!(lpdev->fnRead = (pReadFn)FS_GetProcAddr(lpdev->type,L"Read",lpdev->hLib)) ||
				!(lpdev->fnWrite = (pWriteFn)FS_GetProcAddr(lpdev->type,L"Write",lpdev->hLib)) ||
				!(lpdev->fnSeek = (pSeekFn)FS_GetProcAddr(lpdev->type,L"Seek",lpdev->hLib)) ||
				!(lpdev->fnControl = (pControlFn)FS_GetProcAddr(lpdev->type,L"IOControl",lpdev->hLib))) {
				retval = ERROR_INVALID_FUNCTION;
			} else {
				// Got all the required functions.  Now let's get the optional ones
				lpdev->fnPowerup = (pPowerupFn)FS_GetProcAddr(lpdev->type,L"PowerUp",lpdev->hLib);
				lpdev->fnPowerdn = (pPowerupFn)FS_GetProcAddr(lpdev->type,L"PowerDown",lpdev->hLib);
			}
		}
	} __except (EXCEPTION_EXECUTE_HANDLER) {
		retval = ERROR_INVALID_PARAMETER;
	}

	if (retval) {
		goto errret;
	}

	// Now enter the critical section to look for it in the device list
	EnterCriticalSection (&g_devcs);
	__try {
		//
        // check for uniqueness
        //
        for (lpTrav = (fsdev_t *)g_DevChain.Flink;
             lpTrav != (fsdev_t *)&g_DevChain;
             lpTrav = (fsdev_t *)(lpTrav->list.Flink)) {
            if (!memcmp(lpTrav->type,lpdev->type,sizeof(lpdev->type)) &&
               (lpTrav->index == lpdev->index)) {
                retval = ERROR_DEVICE_IN_USE;
				break;
            }
		}
	} __except (EXCEPTION_EXECUTE_HANDLER) {
		retval = ERROR_INVALID_PARAMETER;
	}
	LeaveCriticalSection(&g_devcs);
	if (retval) {
		goto errret;
	}

	
	__try {
		ENTER_INSTRUM {
			lpdev->dwData = lpdev->fnInit(dwInfo);
		} EXIT_INSTRUM_INIT;

		if (!(lpdev->dwData)) {
			retval = ERROR_OPEN_FAILED;
		} else {
			// Sucess
			lpdev->PwrOn = TRUE;
			lpdev->dwLoadOrder = dwLoadOrder;
		}
	} __except (EXCEPTION_EXECUTE_HANDLER) {
		retval = ERROR_INVALID_PARAMETER;
	}
	if (retval) {
		goto errret;
	}

	EnterCriticalSection(&g_devcs);
	__try {
        //
        // Insert according to LoadOrder
        //
        for (lpTrav = (fsdev_t *)g_DevChain.Flink;
             lpTrav != (fsdev_t *)&g_DevChain;
             lpTrav = (fsdev_t *)(lpTrav->list.Flink)) {
            if (lpTrav->dwLoadOrder >= dwLoadOrder) {
                InsertHeadList((PLIST_ENTRY)lpTrav, (PLIST_ENTRY)lpdev);
				break;
            }
        }
		if (lpTrav == (fsdev_t *)&g_DevChain) {
			// insert at the end
			InsertTailList(&g_DevChain, (PLIST_ENTRY)lpdev);
		}
        hDev = (HANDLE)lpdev;

	} __except (EXCEPTION_EXECUTE_HANDLER) {
		retval = ERROR_INVALID_PARAMETER;
	}
	LeaveCriticalSection(&g_devcs);

errret:
	
#ifdef DEBUG
    if (ZONE_ACTIVE) {
        if (hDev != NULL) {
            DEBUGMSG(ZONE_ACTIVE, (TEXT("DEVICE: Name   Load Order\r\n")));
            //
            // Display the list of devices in ascending load order.
            //
			EnterCriticalSection(&g_devcs);
            for (lpTrav = (fsdev_t *)g_DevChain.Flink;
                 lpTrav != (fsdev_t *)&g_DevChain;
                 lpTrav = (fsdev_t *)(lpTrav->list.Flink)) {
                DEBUGMSG(ZONE_ACTIVE, (TEXT("DEVICE: %c%c%c%d:  %d\r\n"),
                         lpTrav->type[0], lpTrav->type[1], lpTrav->type[2],
                         lpTrav->index, lpTrav->dwLoadOrder));
            }
			LeaveCriticalSection(&g_devcs);
        }
    }
#endif

	// If we failed then let's clean up the module and data
	if (retval) {
		SetLastError (retval);
		if (lpdev) {
			if (lpdev->hLib) {
				FreeLibrary(lpdev->hLib);
			}
			LocalFree (lpdev);
		}
	}

	return hDev;
}

void DoFreeFSD(pfsd_t pfsd)
{
    pfsd_t pfsd1;

    if (pfsd->cFSDDevices <= 0) {
        FreeLibrary(pfsd->hFSDLib);
        if (pfsd == g_lpFSDChain) {
            g_lpFSDChain = pfsd->next;
            LocalFree(pfsd);
            return;
        } else {
            pfsd1 = g_lpFSDChain;
            while (pfsd1) {
                if (pfsd1->next == pfsd) {
                    pfsd1->next = pfsd->next;
                    LocalFree(pfsd);
                    return;
                }

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日本一道高清亚洲日美韩| 国产不卡在线播放| 国产最新精品免费| 欧美视频在线一区二区三区 | 国产一区二区视频在线播放| av电影在线观看一区| 精品久久久久香蕉网| 亚洲成人一区二区在线观看| 成人a区在线观看| 精品动漫一区二区三区在线观看 | 26uuu成人网一区二区三区| 亚洲一区免费观看| 成人av免费在线播放| 久久嫩草精品久久久精品| 亚洲成人激情自拍| 欧美影视一区在线| 亚洲精品一二三区| 91麻豆精品国产无毒不卡在线观看 | 久久综合成人精品亚洲另类欧美 | 国产一区二区免费视频| 在线综合亚洲欧美在线视频| 性做久久久久久免费观看欧美| 99re成人精品视频| 日韩毛片精品高清免费| 91亚洲男人天堂| 最新不卡av在线| 94-欧美-setu| 亚洲人精品午夜| 色婷婷综合久久久| 亚洲一区二区三区四区在线免费观看 | 欧美日本韩国一区| 五月激情综合婷婷| 日韩亚洲欧美高清| 免费观看日韩av| 久久综合狠狠综合| 丁香天五香天堂综合| 国产日产欧美一区二区视频| 国产精品1区2区3区| 欧美国产日本韩| 99久久久久久99| 亚洲永久精品国产| 欧美日韩国产小视频| 日本视频一区二区三区| 精品少妇一区二区三区日产乱码| 麻豆久久久久久| 久久久久久麻豆| 91首页免费视频| 午夜久久电影网| 精品国产123| 成人h动漫精品一区二区| 一区二区三区日本| 制服丝袜成人动漫| 高清不卡一区二区| 亚洲一区二区四区蜜桃| 欧美一区二区在线免费观看| 国产一区 二区| 亚洲欧美国产三级| 欧美一区二区三区视频免费| 国产高清无密码一区二区三区| 亚洲欧洲精品一区二区三区不卡| 色av综合在线| 久久精品99国产国产精| 国产欧美综合色| 一区二区三区资源| wwwwxxxxx欧美| 亚洲国产精品精华液2区45| 久久精品男人天堂av| 国产精品888| 亚洲一区二区三区四区的| 日韩无一区二区| 99久久精品国产麻豆演员表| 日韩电影在线看| 日韩码欧中文字| 精品国产一二三区| 精品国产污污免费网站入口| 色综合久久66| 国产剧情av麻豆香蕉精品| 亚洲国产精品一区二区尤物区| 精品国产伦一区二区三区观看方式 | 日日骚欧美日韩| 国产精品家庭影院| 欧美不卡一区二区三区| 91福利区一区二区三区| 国产一区二区三区日韩| 午夜精品福利一区二区三区蜜桃| 久久久久88色偷偷免费| 欧美美女喷水视频| 色婷婷av一区| 成人综合激情网| 激情久久五月天| 日本午夜精品视频在线观看| 亚洲主播在线观看| 自拍偷拍欧美激情| 欧美国产在线观看| 久久精品视频免费观看| 日韩欧美中文字幕公布| 欧美精品在线观看播放| 色av成人天堂桃色av| caoporn国产精品| 成人av资源站| 成人国产免费视频| 成人免费高清在线| 粉嫩一区二区三区性色av| 激情综合亚洲精品| 麻豆中文一区二区| 免费成人美女在线观看.| 日本中文在线一区| 日韩在线一区二区三区| 日韩在线卡一卡二| 日韩av中文字幕一区二区三区| 香港成人在线视频| 亚洲福利视频一区| 日韩二区三区四区| 蜜臀久久久99精品久久久久久| 日产国产高清一区二区三区| 日本特黄久久久高潮| 蜜桃精品视频在线观看| 久久狠狠亚洲综合| 狠狠色伊人亚洲综合成人| 激情文学综合网| 国产福利一区二区三区视频在线 | 国产在线精品一区二区夜色 | 国产精品福利在线播放| 中文字幕乱码久久午夜不卡| 国产欧美日韩另类一区| 国产精品国产三级国产aⅴ中文| 亚洲欧洲日韩一区二区三区| 亚洲精品乱码久久久久久久久 | av高清不卡在线| 在线观看日韩电影| 7878成人国产在线观看| 欧美成人一区二区| 国产精品素人视频| 亚洲一区二区av电影| 蜜芽一区二区三区| 国产成人免费视频| 91亚洲男人天堂| 日韩亚洲欧美综合| 欧美国产激情二区三区| 一区二区三区 在线观看视频| 99精品黄色片免费大全| 欧美私模裸体表演在线观看| 欧美sm极限捆绑bd| 国产精品久久三| 亚洲成a人v欧美综合天堂下载| 看片的网站亚洲| 9人人澡人人爽人人精品| 欧美美女黄视频| 国产欧美日韩激情| 亚洲国产aⅴ天堂久久| 国产在线一区二区| 在线精品视频一区二区三四| 精品福利视频一区二区三区| 一区二区三区在线不卡| 久久国产麻豆精品| 在线一区二区三区四区五区 | 欧美大片拔萝卜| 国产精品乱码人人做人人爱| 亚洲午夜在线观看视频在线| 国产一区三区三区| 欧美吻胸吃奶大尺度电影| 久久久青草青青国产亚洲免观| 一区二区国产视频| 国产精品资源网| 69久久99精品久久久久婷婷| 亚洲欧美日韩一区二区| 国产精品夜夜嗨| 欧美精品一二三区| 亚洲美女一区二区三区| 国产高清一区日本| 精品国产乱码久久| 日韩国产精品久久久久久亚洲| 91麻豆福利精品推荐| 国产拍欧美日韩视频二区| 免费日本视频一区| 在线免费不卡视频| 亚洲人成网站影音先锋播放| 国产伦精品一区二区三区免费迷 | 国产精品萝li| 国产一区二区三区四区五区美女| 欧美日韩国产成人在线91| 亚洲男同性视频| a4yy欧美一区二区三区| 欧美国产在线观看| 成人免费视频一区二区| 久久亚洲一区二区三区四区| 麻豆91精品视频| 日韩午夜激情电影| 久久99精品久久久久久动态图 | 日韩一级免费一区| 天天影视涩香欲综合网| 欧美午夜精品理论片a级按摩| 一区二区三区.www| 欧美三区在线视频| 亚洲国产精品久久艾草纯爱| 欧美在线一二三| 性做久久久久久久久| 制服丝袜日韩国产| 麻豆精品一二三| 精品久久久久久亚洲综合网|