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

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

?? tdi_fw.c

?? 開源的防火墻代碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* Copyright (c) 2002-2005 Vladislav Goncharov.
*
* Redistribution and use in source forms, with and without modification,
* are permitted provided that this entire comment appears intact.
*
* Redistribution in binary form may occur without any restrictions.
*
* This software is provided ``AS IS'' without any warranties of any kind.
*/

// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil -*- (for GNU Emacs)
//
// $Id: tdi_fw.c,v 1.13 2003/09/04 15:20:09 dev Exp $

/*
* TDI-based open source personal firewall (TdiFw)
*/

#include <ntddk.h>
#include <tdikrnl.h>
#include "sock.h"

#include "conn_state.h"
#include "dispatch.h"
#include "filter.h"
#include "memtrack.h"
#include "obj_tbl.h"
#include "tdi_fw.h"

#define IOCTL_TRANSFER_TYPE(ioctl)	((ioctl) & 3)

/* context for tdi_skip_complete */
typedef struct
{
	PIO_COMPLETION_ROUTINE	old_cr;			/* old (original) completion routine */
	PVOID					old_context;	/* old (original) parameter for old_cr */
	PIO_COMPLETION_ROUTINE	new_cr;			/* new (replaced) completion routine */
	PVOID					new_context;	/* new (replaced) parameter for new_cr */
	PFILE_OBJECT			fileobj;		/* FileObject from IO_STACK_LOCATION */
	PDEVICE_OBJECT			new_devobj;		/* filter device object */
	UCHAR					old_control;	/* old (original) irps->Control */
} TDI_SKIP_CTX;

/* prototypes */

static NTSTATUS	DeviceDispatch(IN PDEVICE_OBJECT DeviceObject, IN PIRP irp);
static VOID		OnUnload(IN PDRIVER_OBJECT DriverObject);

#ifndef USE_TDI_HOOKING
static NTSTATUS	c_n_a_device(PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT *fltobj,
			     PDEVICE_OBJECT *oldobj, wchar_t *devname);
static void		d_n_d_device(PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT oldobj,
			     PDEVICE_OBJECT fltobj);
#else
static NTSTATUS	hook_tcpip(DRIVER_OBJECT *old_DriverObject, BOOLEAN b_hook);
static NTSTATUS	get_device_object(wchar_t *name, PDEVICE_OBJECT *devobj);
#endif

static NTSTATUS	tdi_skip_complete(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context);

/* device objects for: */
PDEVICE_OBJECT
g_tcpfltobj = NULL,		// \Device\Tcp
	      g_udpfltobj = NULL,		// \Device\Udp
	      g_ipfltobj = NULL,		// \Device\RawIp
	      g_devcontrol = NULL,	// control device (exclusive access only!)
	      g_devnfo = NULL;		// information device

BOOLEAN g_got_log = FALSE;	// got log app

#ifndef USE_TDI_HOOKING
// original device objects
PDEVICE_OBJECT g_tcpoldobj, g_udpoldobj, g_ipoldobj;
#else
// original driver object
DRIVER_OBJECT g_old_DriverObject;
BOOLEAN g_hooked = FALSE;
#endif

/* for IOCTL_TDI_QUERY_DIRECT_SEND_HANDLER */
typedef NTSTATUS  TCPSendData_t(IN PIRP Irp, IN PIO_STACK_LOCATION IrpSp);
static TCPSendData_t *g_TCPSendData = NULL;
static TCPSendData_t new_TCPSendData;

/* global traffic stats */
unsigned __int64 g_traffic[TRAFFIC_MAX];
KSPIN_LOCK g_traffic_guard;

/* initialization */
NTSTATUS
DriverEntry(IN PDRIVER_OBJECT theDriverObject,
	    IN PUNICODE_STRING theRegistryPath)
{
	NTSTATUS status = STATUS_SUCCESS;
	int i;
	UNICODE_STRING name, linkname;
	
	memtrack_init();
	KeInitializeSpinLock(&g_traffic_guard);
	
#ifdef USE_TDI_HOOKING
	KdPrint(("[tdi_fw] WARNING! Using unstable working mode: TDI hooking!\n"));
#endif
	
	status = ot_init();
	if (status != STATUS_SUCCESS)
		{
		KdPrint(("[tdi_fw] DriverEntry: ot_init: 0x%x\n", status));
		goto done;
		}
	
	status = filter_init();
	if (status != STATUS_SUCCESS)
		{
		KdPrint(("[tdi_fw] DriverEntry: filter_init: 0x%x\n", status));
		goto done;
		}
	
	status = conn_state_init();
	if (status != STATUS_SUCCESS)
		{
		KdPrint(("[tdi_fw] DriverEntry: conn_state_init: 0x%x\n", status));
		goto done;
		}
	
	for (i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++)
		theDriverObject->MajorFunction[i] = DeviceDispatch;
	
#if DBG
	// register UnLoad procedure
	theDriverObject->DriverUnload = OnUnload;
#endif
	
	/* create control device and symbolic link */
	
	RtlInitUnicodeString(&name, L"\\Device\\tdifw");
	
	status = IoCreateDevice(theDriverObject,
				0,
				&name,
				0,
				0,
				TRUE,		// exclusive!
				&g_devcontrol);
	if (status != STATUS_SUCCESS)
		{
		KdPrint(("[tdi_fw] DriverEntry: IoCreateDevice(control): 0x%x!\n", status));
		goto done;
		}
	
	RtlInitUnicodeString(&linkname, L"\\??\\tdifw");
	
	status = IoCreateSymbolicLink(&linkname, &name);
	if (status != STATUS_SUCCESS)
		{
		KdPrint(("[tdi_fw] DriverEntry: IoCreateSymbolicLink: 0x%x!\n", status));
		goto done;
		}
	
	RtlInitUnicodeString(&name, L"\\Device\\tdifw_nfo");
	
	status = IoCreateDevice(theDriverObject,
				0,
				&name,
				0,
				0,
				FALSE,		// not exclusive!
				&g_devnfo);
	if (status != STATUS_SUCCESS)
		{
		KdPrint(("[tdi_fw] DriverEntry: IoCreateDevice(nfo): 0x%x!\n", status));
		goto done;
		}
	
	RtlInitUnicodeString(&linkname, L"\\??\\tdifw_nfo");
	
	status = IoCreateSymbolicLink(&linkname, &name);
	if (status != STATUS_SUCCESS)
		{
		KdPrint(("[tdi_fw] DriverEntry: IoCreateSymbolicLink: 0x%x!\n", status));
		goto done;
		}
	
#ifndef USE_TDI_HOOKING
	
	status = c_n_a_device(theDriverObject, &g_tcpfltobj, &g_tcpoldobj, L"\\Device\\Tcp");
	if (status != STATUS_SUCCESS)
		{
		KdPrint(("[tdi_fw] DriverEntry: c_n_a_device: 0x%x\n", status));
		goto done;
		}
	
	status = c_n_a_device(theDriverObject, &g_udpfltobj, &g_udpoldobj, L"\\Device\\Udp");
	if (status != STATUS_SUCCESS)
		{
		KdPrint(("[tdi_fw] DriverEntry: c_n_a_device: 0x%x\n", status));
		goto done;
		}
	
	status = c_n_a_device(theDriverObject, &g_ipfltobj, &g_ipoldobj, L"\\Device\\RawIp");
	if (status != STATUS_SUCCESS)
		{
		KdPrint(("[tdi_fw] DriverEntry: c_n_a_device: 0x%x\n", status));
		goto done;
		}
	
#else	/* USE_TDI_HOOKING */
	
	/* get device objects for tcp/udp/ip */
	
	status = get_device_object(L"\\Device\\Tcp", &g_tcpfltobj);
	if (status != STATUS_SUCCESS)
		{
		KdPrint(("[tdi_fw] DriverEntry: get_device_object(tcp): 0x%x\n", status));
		goto done;
		}
	
	status = get_device_object(L"\\Device\\Udp", &g_udpfltobj);
	if (status != STATUS_SUCCESS)
		{
		KdPrint(("[tdi_fw] DriverEntry: get_device_object(udp): 0x%x\n", status));
		goto done;
		}
	
	status = get_device_object(L"\\Device\\RawIp", &g_ipfltobj);
	if (status != STATUS_SUCCESS)
		{
		KdPrint(("[tdi_fw] DriverEntry: get_device_object(ip): 0x%x\n", status));
		goto done;
		}
	
	/* hook tcpip */
	
	status = hook_tcpip(&g_old_DriverObject, TRUE);
	if (status != STATUS_SUCCESS)
		{
		KdPrint(("[tdi_fw] DriverEntry: hook_driver: 0x%x\n", status));
		goto done;
		}
	g_hooked = TRUE;
	
#endif	/* USE_TDI_HOOKING */
	
	status = STATUS_SUCCESS;
	
	done:
	if (status != STATUS_SUCCESS)
		{
		// cleanup
		OnUnload(theDriverObject);
		}
	
	return status;
}

/* deinitialization */
VOID	OnUnload(IN PDRIVER_OBJECT DriverObject)
{
#ifndef USE_TDI_HOOKING
	d_n_d_device(DriverObject, g_tcpoldobj, g_tcpfltobj);
	d_n_d_device(DriverObject, g_udpoldobj, g_udpfltobj);
	d_n_d_device(DriverObject, g_ipoldobj, g_ipfltobj);
#else
	if (g_hooked)
		hook_tcpip(&g_old_DriverObject, FALSE);
#endif
	
	// delete control device and symbolic link
	if (g_devcontrol != NULL)
		{
		UNICODE_STRING linkname;
		
		RtlInitUnicodeString(&linkname, L"\\??\\tdifw");
		IoDeleteSymbolicLink(&linkname);
		
		IoDeleteDevice(g_devcontrol);
		}
	
	// delete info device and symbolic link
	if (g_devnfo != NULL)
		{
		UNICODE_STRING linkname;
		
		RtlInitUnicodeString(&linkname, L"\\??\\tdifw_nfo");
		IoDeleteSymbolicLink(&linkname);
		
		IoDeleteDevice(g_devnfo);
		}
	
	filter_free();
	ot_free();
	conn_state_free();		// call after ot_free()
	
	memtrack_free();
}

#ifndef USE_TDI_HOOKING

/* create & attach device */
NTSTATUS	c_n_a_device(PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT *fltobj, PDEVICE_OBJECT *oldobj,
		     wchar_t *devname)
{
	NTSTATUS status;
	UNICODE_STRING str;
	
	/* create filter device */
	
	status = IoCreateDevice(DriverObject,
				0,
				NULL,
				FILE_DEVICE_UNKNOWN,
				0,
				TRUE,
				fltobj);
	if (status != STATUS_SUCCESS)
		{
		KdPrint(("[tdi_fw] c_n_a_device: IoCreateDevice(%S): 0x%x\n", devname, status));
		return status;
		}
	
	(*fltobj)->Flags |= DO_DIRECT_IO;
	
	RtlInitUnicodeString(&str, devname);
	
	status = IoAttachDevice(*fltobj, &str, oldobj);
	if (status != STATUS_SUCCESS)
		{
		KdPrint(("[tdi_fw] DriverEntry: IoAttachDevice(%S): 0x%x\n", devname, status));
		return status;
		}
	
	KdPrint(("[tdi_fw] DriverEntry: %S fileobj: 0x%x\n", devname, *fltobj));
	
	return STATUS_SUCCESS;
}

/* detach & delete device */
void	d_n_d_device(PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT oldobj, PDEVICE_OBJECT fltobj)
{
	/*
	* Detaching of a filter driver at runtime is a high-risk deal
	*/
	
#if 1
	// for extremal guys only!
	if (oldobj != NULL && fltobj != NULL)
		{
		int i;
		for (i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++)
			DriverObject->MajorFunction[i] = g_tcpoldobj->DriverObject->MajorFunction[i];
		}
#endif
	
	if (oldobj != NULL)
		IoDetachDevice(oldobj);
	
	if (fltobj != NULL)
		IoDeleteDevice(fltobj);
}

#else	/* USE_TDI_HOOKING */

/* hook/unhook driver */
NTSTATUS	hook_tcpip(DRIVER_OBJECT *old_DriverObject, BOOLEAN b_hook)
{
	UNICODE_STRING drv_name;
	NTSTATUS status;
	PDRIVER_OBJECT new_DriverObject;
	int i;
	
	RtlInitUnicodeString(&drv_name, L"\\Driver\\Tcpip");
	
	status = ObReferenceObjectByName(&drv_name, OBJ_CASE_INSENSITIVE, NULL, 0,
					 IoDriverObjectType, KernelMode, NULL, &new_DriverObject);
	if (status != STATUS_SUCCESS)
		{
		KdPrint(("[tdi_fw] hook_driver: ObReferenceObjectByName\n"));
		return status;
		}
	
	for (i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++)
		{
		if (b_hook)
			{
			old_DriverObject->MajorFunction[i] = new_DriverObject->MajorFunction[i];
			new_DriverObject->MajorFunction[i] = DeviceDispatch;
			}
		else
			new_DriverObject->MajorFunction[i] = old_DriverObject->MajorFunction[i];
		}
	
	return STATUS_SUCCESS;
}

/* get device object by its name */
NTSTATUS	get_device_object(wchar_t *name, PDEVICE_OBJECT *devobj)
{
	UNICODE_STRING str;
	NTSTATUS status;
	PFILE_OBJECT fileobj;
	
	RtlInitUnicodeString(&str, name);
	
	status = IoGetDeviceObjectPointer(&str, FILE_ALL_ACCESS, &fileobj, devobj);
	if (status == STATUS_SUCCESS)
		ObDereferenceObject(fileobj);
	
	return status;
}

#endif	/* USE_TDI_HOOKING */

/* dispatch */
NTSTATUS	DeviceDispatch(IN PDEVICE_OBJECT DeviceObject, IN PIRP irp)
{
	PIO_STACK_LOCATION irps;
	NTSTATUS status;
	
	// sanity check
	if (irp == NULL)
		{
		KdPrint(("[tdi_fw] DeviceDispatch: !irp\n"));
		return STATUS_SUCCESS;
		}
	
	irps = IoGetCurrentIrpStackLocation(irp);
	
	if (DeviceObject == g_tcpfltobj || DeviceObject == g_udpfltobj ||
		DeviceObject == g_ipfltobj)
		{
		
		/*
		* This IRP is for filtered device
		*/
		
		int result;
		struct completion completion;
		
		memset(&completion, 0, sizeof(completion));
		
		// Analyze MajorFunction
		switch (irps->MajorFunction)
			{
			
			case IRP_MJ_CREATE:		/* create fileobject */
				
				result = tdi_create(irp, irps, &completion);
				
				status = tdi_dispatch_complete(DeviceObject, irp, result,
							       completion.routine, completion.context);
				
				break;
				
			case IRP_MJ_DEVICE_CONTROL:
				
				KdPrint(("[tdi_fw] DeviceDispatch: IRP_MJ_DEVICE_CONTROL, control 0x%x for 0x%08X\n",
					irps->Parameters.DeviceIoControl.IoControlCode, irps->FileObject));
				
				if (KeGetCurrentIrql() == PASSIVE_LEVEL)
					{
					/*
					* try to convert it to IRP_MJ_INTERNAL_DEVICE_CONTROL
					* (works on PASSIVE_LEVEL only!)
					*/
					status = TdiMapUserRequest(DeviceObject, irp, irps);
					
					}
				else
					status = STATUS_NOT_IMPLEMENTED; // set fake status
				
				if (status != STATUS_SUCCESS)
					{
					void *buf = (irps->Parameters.DeviceIoControl.IoControlCode == IOCTL_TDI_QUERY_DIRECT_SEND_HANDLER) ?
						    irps->Parameters.DeviceIoControl.Type3InputBuffer : NULL;
					
					// send IRP to original driver
					status = tdi_dispatch_complete(DeviceObject, irp, FILTER_ALLOW, NULL, NULL);
					
					if (buf != NULL && status == STATUS_SUCCESS)
						{
						
						g_TCPSendData = *(TCPSendData_t **)buf;
						
						KdPrint(("[tdi_fw] DeviceDispatch: IOCTL_TDI_QUERY_DIRECT_SEND_HANDLER: TCPSendData = 0x%x\n",
							g_TCPSendData));
						
						*(TCPSendData_t **)buf = new_TCPSendData;
						}
					
					break;
					}
				
				// don't break! go to internal device control!
				
			case IRP_MJ_INTERNAL_DEVICE_CONTROL:
					{
					/*
					* Analyze ioctl for TDI driver
					*/
					int i;
					
					for (i = 0; g_tdi_ioctls[i].MinorFunction != 0; i++)
						if (g_tdi_ioctls[i].MinorFunction == irps->MinorFunction)
							{
							
#if DBG
						// print description
							KdPrint(("[tdi_fw] DeviceDispatch: %s (0x%x) for 0x%x\n",
								g_tdi_ioctls[i].desc,
								irps->MinorFunction,
								irps->FileObject));
#endif
							
							if (g_tdi_ioctls[i].fn == NULL)
							{
							// send IRP to original driver
							status = tdi_dispatch_complete(DeviceObject, irp, FILTER_ALLOW,
										       NULL, NULL);
							break;
							}
						
						// call dispatch function
						
						result = g_tdi_ioctls[i].fn(irp, irps, &completion);
						
						// complete request
						status = tdi_dispatch_complete(DeviceObject, irp, result,
									       completion.routine, completion.context);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人免费高清视频在线观看| 欧美剧在线免费观看网站| 欧美午夜寂寞影院| 综合久久久久综合| 欧美色综合天天久久综合精品| 日韩av网站在线观看| 国产精品久久午夜| 欧美精品日韩精品| 91性感美女视频| 国产一区二区主播在线| 亚洲国产精品传媒在线观看| 天堂午夜影视日韩欧美一区二区| 精品sm在线观看| 欧美日韩国产电影| 色8久久人人97超碰香蕉987| 国产一级精品在线| 精品一区二区三区在线播放| 亚洲国产日产av| 亚洲男人的天堂一区二区| 欧美国产乱子伦| 国产精品自拍在线| 狠狠久久亚洲欧美| 免费在线观看成人| 视频在线在亚洲| 日韩综合在线视频| 视频在线观看国产精品| 亚洲v日本v欧美v久久精品| 国产精品国产三级国产| 一区二区三区在线视频播放| 精品国产亚洲在线| 精品国产人成亚洲区| 欧洲精品中文字幕| 欧美色图天堂网| 4438x成人网最大色成网站| 欧美日韩国产一级| 欧美日韩国产一区| 精品人伦一区二区色婷婷| 日本一区二区免费在线观看视频 | 欧美精品第1页| 精品国内片67194| 中文字幕乱码久久午夜不卡| 中文字幕日本乱码精品影院| 国产精品久久久久婷婷| 国产亚洲污的网站| 亚洲柠檬福利资源导航| 午夜精品福利久久久| 激情综合色播激情啊| 欧美色窝79yyyycom| 国产午夜精品久久久久久免费视 | 欧美日韩一区三区| 欧美日韩在线综合| 26uuu久久天堂性欧美| 国产精品久久影院| 久久99最新地址| 欧美亚洲动漫精品| 日本一区二区在线不卡| 天堂成人免费av电影一区| 成人黄色电影在线| 欧美电视剧在线看免费| 亚洲精品中文在线| 奇米888四色在线精品| 99久久精品99国产精品| 久久精品亚洲麻豆av一区二区| 麻豆91在线播放| 91小视频在线免费看| 国产午夜精品一区二区三区嫩草| 性感美女久久精品| 欧美亚洲综合久久| 亚洲国产精品久久久男人的天堂| 国产一区二区三区四| 69堂国产成人免费视频| 石原莉奈在线亚洲二区| 久久久蜜臀国产一区二区| 免费在线欧美视频| 日韩一区二区精品在线观看| 视频在线观看一区二区三区| 欧美日韩精品专区| 免费在线看一区| 久久日一线二线三线suv| 亚洲素人一区二区| 成人一区二区三区在线观看| 国产视频在线观看一区二区三区| 国产一区不卡在线| 综合激情网...| 69久久夜色精品国产69蝌蚪网| 天天操天天色综合| 久久久久久99久久久精品网站| 成人国产精品免费观看动漫| 欧美国产丝袜视频| 久久精品欧美日韩精品| 成人精品电影在线观看| 一区二区三区久久久| 欧美一区二区三区成人| 国产精品18久久久久| 亚洲不卡在线观看| 亚洲国产日韩综合久久精品| 日韩欧美国产综合| 欧美亚洲丝袜传媒另类| 成人激情免费网站| 捆绑变态av一区二区三区| 亚洲精品欧美二区三区中文字幕| 高清shemale亚洲人妖| 亚洲一区二区欧美日韩 | 91麻豆精品国产自产在线| 99精品视频在线观看| 国产成人亚洲综合a∨猫咪| 人人狠狠综合久久亚洲| 亚洲图片自拍偷拍| 亚洲综合免费观看高清完整版在线| 精品国产百合女同互慰| 日韩丝袜情趣美女图片| 成人妖精视频yjsp地址| 视频一区二区欧美| 日韩二区在线观看| 蜜臀av在线播放一区二区三区| 亚洲成人资源网| 日本女优在线视频一区二区| 美女在线一区二区| 国产在线麻豆精品观看| 国产呦精品一区二区三区网站 | 国产乱子伦视频一区二区三区| 男男成人高潮片免费网站| 免费欧美高清视频| 美女一区二区在线观看| 久久99久久精品欧美| 粉嫩高潮美女一区二区三区| av一区二区三区| 欧美午夜一区二区| 国产欧美日韩激情| 国产精品午夜免费| 日韩精品一二三四| 国产精品一区二区x88av| 色婷婷亚洲一区二区三区| 欧美日韩一区在线| 亚洲天堂2014| 一区二区视频在线| 玖玖九九国产精品| 欧洲一区二区三区免费视频| 日韩免费高清av| 久草在线在线精品观看| 欧美亚洲一区三区| 中文字幕在线观看不卡| 国产一区美女在线| 欧美另类高清zo欧美| 亚洲精品v日韩精品| 国产69精品久久777的优势| 欧美一区二区黄| 亚洲欧美综合色| 精品一二线国产| 欧美大片一区二区三区| 一区二区三区蜜桃网| 99re热视频这里只精品| 国产精品久久久久久久久快鸭 | 蜜桃视频一区二区三区在线观看| 色香蕉成人二区免费| 亚洲第一狼人社区| 欧美一区二区三区在线| 亚洲一区视频在线观看视频| 成人动漫视频在线| 国产日韩影视精品| 精品影院一区二区久久久| 色av成人天堂桃色av| 亚洲欧洲精品一区二区三区不卡| 国产精品一品二品| 成人欧美一区二区三区在线播放| 国产高清精品网站| 精品国产一区久久| 大陆成人av片| 亚洲自拍偷拍欧美| 91.xcao| 国产一区二区三区免费| 国产午夜精品在线观看| 91最新地址在线播放| 亚洲男人的天堂在线观看| 欧美日韩一区视频| 国产中文一区二区三区| 国产精品国产三级国产有无不卡 | 色偷偷一区二区三区| 免费的成人av| 亚洲欧美一区二区三区极速播放| 91成人看片片| 国产一区二区免费看| 亚洲一区二区三区三| 国产精品久久久久久久浪潮网站| 精品视频色一区| 不卡视频在线观看| 精品一区二区免费在线观看| 中文字幕 久热精品 视频在线| 日本韩国视频一区二区| 国产成人精品1024| 日本麻豆一区二区三区视频| 欧美激情资源网| 91精品国产91热久久久做人人| a4yy欧美一区二区三区| 国产在线精品不卡| 亚洲影视资源网| 亚洲另类春色校园小说| 欧美国产成人精品| 国产日韩欧美制服另类| 国产欧美综合在线观看第十页 |