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

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

?? obj_tbl.c

?? 開源的防火墻代碼
?? C
字號:
/* 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: obj_tbl.c,v 1.12 2005/03/14 18:28:26 vlad Exp $

/*
* Working with connection objects, address objects and links between them
*/

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

#include "conn_state.h"
#include "memtrack.h"
#include "obj_tbl.h"
#include "sids.h"
#include "tdi_fw.h"

// for searching objects information by file object

#define HASH_SIZE	0x1000
#define CALC_HASH(fileobj)  (((ULONG)(fileobj) >> 5) % HASH_SIZE)

static struct ot_entry **g_ot_hash;
KSPIN_LOCK g_ot_hash_guard;

// for searching connection objects by address object & connection context

struct ctx_entry
{
	struct ctx_entry *next;
	PFILE_OBJECT addrobj;
	CONNECTION_CONTEXT conn_ctx;
	PFILE_OBJECT connobj;
};

static struct ctx_entry **g_cte_hash;
KSPIN_LOCK g_cte_hash_guard;

//----------------------------------------------------------------------------

NTSTATUS	ot_init(void)
{
	g_ot_hash = (struct ot_entry **)malloc_np(sizeof(*g_ot_hash) * HASH_SIZE);
	if (g_ot_hash == NULL)
		{
		KdPrint(("[tdi_fw] ot_init: malloc_np\n"));
		return STATUS_INSUFFICIENT_RESOURCES;
		}
	memset(g_ot_hash, 0, sizeof(*g_ot_hash) * HASH_SIZE);
	
	KeInitializeSpinLock(&g_ot_hash_guard);
	
	g_cte_hash = (struct ctx_entry **)malloc_np(sizeof(*g_cte_hash) * HASH_SIZE);
	if (g_cte_hash == NULL)
		{
		KdPrint(("[tdi_fw] ot_init: malloc_np\n"));
		free(g_ot_hash);
		return STATUS_INSUFFICIENT_RESOURCES;
		}
	memset(g_cte_hash, 0, sizeof(*g_cte_hash) * HASH_SIZE);
	
	KeInitializeSpinLock(&g_cte_hash_guard);
	
	return STATUS_SUCCESS;
}

void	ot_free(void)
{
	KIRQL irql;
	int i;
	struct ot_entry *ote;
	
	if (g_ot_hash == NULL)
		return;					// have nothing to do
	
	// do cleanup for address & connection objects
	for (i = 0; i < HASH_SIZE; i++)
		{
		
		for (;;){			// do it again and again
			PFILE_OBJECT connobj = NULL, event_addrobj;
			PVOID event_handler = NULL, event_context;
			int event_type;
			PDEVICE_OBJECT devobj;
			
			KeAcquireSpinLock(&g_ot_hash_guard, &irql);
			
			for (ote = g_ot_hash[i]; ote != NULL; ote = ote->next)
				{
				
				if (ote->fileobj == NULL)
					continue;				// skip processed items
				
#ifdef _USE_TDI_HOOKING
				devobj = ote->devobj;
#else
				devobj = get_original_devobj(ote->devobj, NULL);
#endif
				
				if (ote->type == FILEOBJ_ADDROBJ)
					{
					// find at least one event handler & remove it @ PASSIVE level
					int j;
					
					event_addrobj = ote->fileobj;
					
					for (j = 0; j < MAX_EVENT; j++)
						if (ote->ctx[j].old_handler != NULL)
						{
						
						event_type = j;
						event_handler = ote->ctx[j].old_handler;
						event_context = ote->ctx[j].old_context;
						
						KdPrint(("[tdi_fw] ot_free: got event handler to restore (addrobj: 0x%x; type: %d; handler: 0x%x; context: 0x%x\n",
							event_addrobj,
							event_type,
							event_handler,
							event_context));
						
						ote->ctx[j].old_handler = NULL;
						
						break;
						}
					
					if (event_handler != NULL)
						break;
					
					KdPrint(("[tdi_fw] ot_free: no event handlers for addrobj: 0x%x\n",
						ote->fileobj));
					
					// remove this addrobj from "LISTEN" state
					if (ote->listen_entry != NULL)
						{
						del_listen_obj(ote->listen_entry, FALSE);
						ote->listen_entry = NULL;
						}
					
					// no event handlers
					ote->fileobj = NULL;
					
					}
				else if (ote->type == FILEOBJ_CONNOBJ)
					{
					// check connobj is connected (remote addr is not 0)
					TA_ADDRESS *remote_addr = (TA_ADDRESS *)(ote->remote_addr);
					
					if (((TDI_ADDRESS_IP *)(remote_addr->Address))->in_addr == 0)
						{
						KdPrint(("[tdi_fw] ot_free: connobj 0x%x is not connected\n", connobj));
						
						}
					else	{
						// disconnect this connection using TDI_DISCONNECT @ PASSIVE level
						connobj = ote->fileobj;
						
						KdPrint(("[tdi_fw] ot_free: got connobj 0x%x (%x:%x) to disconnect\n",
							connobj,
							((TDI_ADDRESS_IP *)(remote_addr->Address))->in_addr,
						((TDI_ADDRESS_IP *)(remote_addr->Address))->sin_port));
						}
					
					// remove this connobj from "CONNECTED" state
					if (ote->conn_entry != NULL)
						{
						del_tcp_conn_obj(ote->conn_entry, FALSE);
						ote->conn_entry = NULL;
						
						// TODO: check if state TCP_STATE_TIME_WAIT don't delete it
						}
					
					// skip this object next time
					ote->fileobj = NULL;
					}
				}
			
			KeReleaseSpinLock(&g_ot_hash_guard, irql);
			
			// we're at PASSIVE level
			
			if (event_handler != NULL)
				{
				// set old event handler
				PIRP query_irp;
				NTSTATUS status;
				
				KdPrint(("[tdi_fw] ot_free: got event handler to restore (addrobj: 0x%x; type: %d; handler: 0x%x; context: 0x%x\n",
					event_addrobj,
					event_type,
					event_handler,
					event_context));
				
				query_irp = TdiBuildInternalDeviceControlIrp(TDI_SET_EVENT_HANDLER,
									     devobj, event_addrobj, NULL, NULL);
				if (query_irp == NULL)
					{
					KdPrint(("[tdi_fw] ot_free: TdiBuildInternalDeviceControlIrp\n"));
					continue;
					}
				
				TdiBuildSetEventHandler(query_irp, devobj, event_addrobj, NULL, NULL,
							event_type,	event_handler, event_context);
				
				status = IoCallDriver(devobj, query_irp);
				if (status != STATUS_SUCCESS)
					KdPrint(("[tdi_fw] ot_free: IoCallDriver(set_event_handler): 0x%x\n", status));
				
				}
			else if (connobj != NULL)
				{
				// disconnect connection
				PIRP query_irp;
				NTSTATUS status;
				
				KdPrint(("[tdi_fw] ot_free: disconnecting connobj 0x%x\n", connobj));
				
				query_irp = TdiBuildInternalDeviceControlIrp(TDI_DISCONNECT,
									     devobj, connobj, NULL, NULL);
				if (query_irp == NULL)
					{
					KdPrint(("[tdi_fw] ot_free: TdiBuildInternalDeviceControlIrp\n"));
					continue;
					}
				
				// using TDI_DISCONNECT_RELEASE to make ClientEventDisconnect to be called
				TdiBuildDisconnect(query_irp, devobj, connobj, NULL, NULL, NULL,
						   TDI_DISCONNECT_RELEASE, NULL, NULL);
				
				status = IoCallDriver(devobj, query_irp);
				if (status != STATUS_SUCCESS)
					KdPrint(("[tdi_fw] ot_free: IoCallDriver(disconnect): 0x%x\n", status));
				
				}
			else	{
				
				// no objects to process. break!
				
				break;
				}
			}
		}
	
	// clear it!
	KeAcquireSpinLock(&g_ot_hash_guard, &irql);
	
	for (i = 0; i < HASH_SIZE; i++)
		{
		struct ot_entry *ote = g_ot_hash[i];
		while (ote != NULL)
			{
			struct ot_entry *ote2 = ote->next;
			
			KdPrint(("[tdi_fw] ot_free: Warning! fileobj 0x%x type %d exists!\n",
				ote->fileobj, ote->type));
			
			if (ote->sid_a != NULL)
				free(ote->sid_a);
			free(ote);
			
			ote = ote2;
			}
		}
	free(g_ot_hash);
	g_ot_hash = NULL;
	
	KeReleaseSpinLock(&g_ot_hash_guard, irql);
	
	// and cleanup cte_hash
	if (g_cte_hash != NULL)
		{
		KeAcquireSpinLock(&g_cte_hash_guard, &irql);
		
		for (i = 0; i < HASH_SIZE; i++)
			{
			struct ctx_entry *cte = g_cte_hash[i];
			while (cte)
				{
				struct ctx_entry *cte2 = cte->next;
				free(cte);
				cte = cte2;
				}
			}
		free(g_cte_hash);
		g_cte_hash = NULL;
		
		KeReleaseSpinLock(&g_cte_hash_guard, irql);
		}
}

//----------------------------------------------------------------------------

NTSTATUS	ot_add_fileobj(PDEVICE_OBJECT devobj, PFILE_OBJECT fileobj, int fileobj_type, int ipproto,
		       CONNECTION_CONTEXT conn_ctx)		// must be called at PASSIVE_LEVEL!
{
	ULONG hash = CALC_HASH(fileobj);
	KIRQL irql;
	struct ot_entry *ote;
	NTSTATUS status;
	int i;
	SID_AND_ATTRIBUTES *sid_a;
	ULONG sid_a_size;
	
	if (fileobj == NULL)
		return STATUS_INVALID_PARAMETER_2;
	
	// while we're at PASSIVE_LEVEL get SID & attributes
	sid_a = get_current_sid_a(&sid_a_size);
	
	KeAcquireSpinLock(&g_ot_hash_guard, &irql);
	
	for (ote = g_ot_hash[hash]; ote != NULL; ote = ote->next)
		if (ote->fileobj == fileobj)
		break;
	
	if (ote == NULL)
		{
		ote = (struct ot_entry *)malloc_np(sizeof(*ote));
		if (ote == NULL)
			{
			KdPrint(("[tdi_fw] ot_add_fileobj: malloc_np\n"));
			status = STATUS_INSUFFICIENT_RESOURCES;
			goto done;
			}
		memset(ote, 0, sizeof(*ote));
		
		ote->next = g_ot_hash[hash];
		g_ot_hash[hash] = ote;
		
		ote->fileobj = fileobj;
		for (i = 0; i < MAX_EVENT; i++)
			ote->ctx[i].fileobj = fileobj;
		
		}
	else	{
		KdPrint(("[tdi_fw] ot_add_fileobj: reuse fileobj 0x%x\n", fileobj));
		
		ot_cleanup_ote(ote);
		}
	
	ote->signature = 'OTE ';
	ote->pid = (ULONG)PsGetCurrentProcessId();
	
	// save SID & attributes
	ote->sid_a = sid_a;
	ote->sid_a_size = sid_a_size;
	sid_a = NULL;
	
	ote->devobj = devobj;
	
	ote->type = fileobj_type;
	ote->ipproto = ipproto;
	ote->conn_ctx = conn_ctx;
	
	status = STATUS_SUCCESS;
	
	done:
	// cleanup
	KeReleaseSpinLock(&g_ot_hash_guard, irql);
	if (sid_a != NULL)
		free(sid_a);
	
	return status;
}

NTSTATUS	ot_del_fileobj(PFILE_OBJECT fileobj, int *fileobj_type)
{
	ULONG hash = CALC_HASH(fileobj);
	KIRQL irql;
	struct ot_entry *ote, *prev_ote;
	NTSTATUS status;
	
	if (fileobj == NULL)
		return STATUS_INVALID_PARAMETER_1;
	
	KeAcquireSpinLock(&g_ot_hash_guard, &irql);
	
	prev_ote = NULL;
	for (ote = g_ot_hash[hash]; ote; ote = ote->next)
		{
		if (ote->fileobj == fileobj)
			break;
		prev_ote = ote;
		}
	
	if (ote == NULL)
		{
		KdPrint(("[tdi_fw] ot_del_fileobj: fileobj 0x%x not found!\n", fileobj));
		status = STATUS_OBJECT_NAME_NOT_FOUND;
		goto done;
		}
	
	if (ote->type == FILEOBJ_ADDROBJ && ote->listen_entry != NULL)
		del_listen_obj(ote->listen_entry, FALSE);
	else if (ote->type == FILEOBJ_CONNOBJ && ote->conn_entry != NULL)
		{
		if (ote->ipproto == IPPROTO_TCP && ote->log_disconnect)
			log_disconnect(ote);
		
		del_tcp_conn_obj(ote->conn_entry, FALSE);
		}
	
	if (fileobj_type != NULL)
		*fileobj_type = ote->type;
	
	if (prev_ote != NULL)
		prev_ote->next = ote->next;
	else
		g_ot_hash[hash] = ote->next;
	
	if (ote->sid_a != NULL)
		free(ote->sid_a);
	
	free(ote);
	
	status = STATUS_SUCCESS;
	
	done:
	KeReleaseSpinLock(&g_ot_hash_guard, irql);
	
	return status;
}

struct ot_entry *	ot_find_fileobj(PFILE_OBJECT fileobj, KIRQL *irql)
{
	ULONG hash = CALC_HASH(fileobj);
	struct ot_entry *ote;
	
	if (fileobj == NULL)
		return NULL;
	
	if (irql != NULL)
		KeAcquireSpinLock(&g_ot_hash_guard, irql);
	
	for (ote = g_ot_hash[hash]; ote != NULL; ote = ote->next)
		if (ote->fileobj == fileobj)
		break;
	
	if (ote == NULL)
		{
		KdPrint(("[tdi_fw] ot_find_fileobj: fileobj 0x%x not found!\n", fileobj));
		if (irql != NULL)
			KeReleaseSpinLock(&g_ot_hash_guard, *irql);
		}
	
	return ote;
}

void	ot_cleanup_ote(struct ot_entry *ote)
{
	struct ot_entry *saved_next;
	PFILE_OBJECT saved_fileobj;
	unsigned int i;
	
	// set all fields to zero except "next" and "fileobj" (cleanup listen/conn_entry if any)
	
	saved_next = ote->next;
	saved_fileobj = ote->fileobj;
	
	if (ote->type == FILEOBJ_ADDROBJ && ote->listen_entry != NULL)
		{
		
		del_listen_obj(ote->listen_entry, FALSE);
		
		}
	else if (ote->type == FILEOBJ_CONNOBJ && ote->conn_entry != NULL)
		{
		if (ote->ipproto == IPPROTO_TCP && ote->log_disconnect)
			log_disconnect(ote);
		
		del_tcp_conn_obj(ote->conn_entry, FALSE);
		}
	
	memset(ote, 0, sizeof(*ote));
	
	ote->next = saved_next;
	ote->fileobj = saved_fileobj;
	
	// restore fileobjs
	for (i = 0; i < MAX_EVENT; i++)
		ote->ctx[i].fileobj = saved_fileobj;
	
}

//----------------------------------------------------------------------------

#define CALC_HASH_2(addrobj, conn_ctx)	CALC_HASH((ULONG)(addrobj) ^ (ULONG)(conn_ctx))

NTSTATUS	ot_add_conn_ctx(PFILE_OBJECT addrobj, CONNECTION_CONTEXT conn_ctx, PFILE_OBJECT connobj)
{
	ULONG hash = CALC_HASH_2(addrobj, conn_ctx);
	KIRQL irql;
	struct ctx_entry *cte;
	NTSTATUS status;
	
	KeAcquireSpinLock(&g_cte_hash_guard, &irql);
	
	for (cte = g_cte_hash[hash]; cte != NULL; cte = cte->next)
		if (cte->addrobj == addrobj && cte->conn_ctx == conn_ctx)
		break;
	
	if (cte == NULL){
			KdPrint(("[tdi_fw] ot_add_fileobj: reuse addrobj 0x%x, conn_ctx 0x%x\n",
				addrobj, conn_ctx));
			
			cte = (struct ctx_entry *)malloc_np(sizeof(*cte));
			if (cte == NULL)
			{
			KdPrint(("[tdi_fw] ot_add_conn_ctx: malloc_np\n"));
			status = STATUS_INSUFFICIENT_RESOURCES;
			goto done;
			}
		cte->next = g_cte_hash[hash];
		g_cte_hash[hash] = cte;
		
		cte->addrobj = addrobj;
		cte->conn_ctx = conn_ctx;
		}
	
	cte->connobj = connobj;
	
	status = STATUS_SUCCESS;
	done:
	
	KeReleaseSpinLock(&g_cte_hash_guard, irql);
	return status;
}

NTSTATUS	ot_del_conn_ctx(PFILE_OBJECT addrobj, CONNECTION_CONTEXT conn_ctx)
{
	ULONG hash = CALC_HASH_2(addrobj, conn_ctx);
	KIRQL irql;
	struct ctx_entry *cte, *prev_cte;
	NTSTATUS status;
	
	KeAcquireSpinLock(&g_cte_hash_guard, &irql);
	
	prev_cte = NULL;
	for (cte = g_cte_hash[hash]; cte != NULL; cte = cte->next)
		{
		if (cte->addrobj == addrobj && cte->conn_ctx == conn_ctx)
			break;
		prev_cte = cte;
		}
	
	if (cte == NULL)
		{
		KdPrint(("[tdi_fw] ot_del_conn_ctx: addrobj 0x%x not found!\n", addrobj));
		status = STATUS_OBJECT_NAME_NOT_FOUND;
		goto done;
		}
	
	if (prev_cte != NULL)
		prev_cte->next = cte->next;
	else
		g_cte_hash[hash] = cte->next;
	
	free(cte);
	
	status = STATUS_SUCCESS;
	done:
	
	KeReleaseSpinLock(&g_cte_hash_guard, irql);
	return status;
}

PFILE_OBJECT	ot_find_conn_ctx(PFILE_OBJECT addrobj, CONNECTION_CONTEXT conn_ctx)
{
	ULONG hash = CALC_HASH_2(addrobj, conn_ctx);
	KIRQL irql;
	struct ctx_entry *cte;
	PFILE_OBJECT result = NULL;
	
	KeAcquireSpinLock(&g_cte_hash_guard, &irql);
	
	for (cte = g_cte_hash[hash]; cte != NULL; cte = cte->next)
		if (cte->addrobj == addrobj && cte->conn_ctx == conn_ctx)
			{
			result = cte->connobj;
			break;
			}
	
	KeReleaseSpinLock(&g_cte_hash_guard, irql);
	return result;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产乱妇无码大片在线观看| 久久久久免费观看| 日本精品一区二区三区高清 | 欧美一区二区三区色| 欧美亚洲图片小说| 欧美一区二区三区不卡| 欧美一级免费大片| 国产亚洲精品久| 中日韩免费视频中文字幕| 亚洲欧美精品午睡沙发| 一区二区高清免费观看影视大全| 亚洲激情自拍视频| 青青草伊人久久| 成人高清在线视频| 91福利小视频| 国产清纯白嫩初高生在线观看91 | 欧美一区二视频| 国产日韩欧美在线一区| 亚洲欧美日韩中文字幕一区二区三区| 国产精品久久久久婷婷| 日韩高清在线一区| 欧美在线视频日韩| 99久精品国产| 26uuu另类欧美| 最新国产の精品合集bt伙计| 日韩1区2区日韩1区2区| 国产成人av影院| 91精品国产乱码久久蜜臀| 尤物视频一区二区| 成人黄色在线网站| 久久久久国产精品人| 日韩av在线发布| 色天天综合久久久久综合片| 久久久久久电影| 美女免费视频一区| 精品视频1区2区3区| 亚洲精品国产精华液| 成人国产精品视频| ...xxx性欧美| 色婷婷一区二区| 亚洲欧美另类小说| 欧美在线观看禁18| 亚洲五月六月丁香激情| 色婷婷久久久亚洲一区二区三区| 久久久久久久久久久久电影| 国产剧情一区在线| 亚洲精品一区二区精华| 国内精品伊人久久久久av影院| 欧美一三区三区四区免费在线看| 午夜不卡在线视频| 成人小视频在线| 91精品国产aⅴ一区二区| 中文字幕av一区 二区| 99热这里都是精品| 亚洲精品videosex极品| 欧美亚洲国产一区二区三区va | 成人免费视频一区二区| 亚洲丝袜美腿综合| 欧美午夜寂寞影院| 国产精品亚洲第一| 偷拍日韩校园综合在线| 国产清纯美女被跳蛋高潮一区二区久久w| 成人av免费网站| 日韩va欧美va亚洲va久久| 国产欧美精品一区二区三区四区| 99久久综合精品| 国产一区二区在线看| 亚洲国产色一区| 中文字幕制服丝袜一区二区三区| 欧美老女人第四色| 97久久超碰精品国产| 国产精品伊人色| 蜜桃在线一区二区三区| 亚洲另类色综合网站| 欧美激情综合网| 日韩一区二区麻豆国产| 在线视频欧美精品| 91在线视频18| av不卡在线播放| 成人激情视频网站| 国产伦精品一区二区三区在线观看| 香蕉影视欧美成人| 五月天欧美精品| 性做久久久久久久免费看| 午夜婷婷国产麻豆精品| 亚洲综合色噜噜狠狠| 亚洲一区二区影院| 亚洲一区在线播放| 日本最新不卡在线| 美女一区二区久久| 国产真实乱对白精彩久久| 蜜臀99久久精品久久久久久软件 | 99久久精品免费看| av不卡免费电影| 欧美网站一区二区| 欧美一级片在线| 欧美韩国日本一区| 亚洲蜜桃精久久久久久久| 亚洲一级片在线观看| 日本欧美在线看| 国产成人精品三级麻豆| 色综合色综合色综合色综合色综合| 在线精品亚洲一区二区不卡| 欧美日韩电影在线| 久久精品视频免费观看| 亚洲日本青草视频在线怡红院| 亚洲福利一二三区| 国产成人在线视频网站| 欧美久久婷婷综合色| 国产欧美一区二区精品婷婷| 亚洲午夜精品网| 懂色av噜噜一区二区三区av| 欧美男男青年gay1069videost| 久久男人中文字幕资源站| 亚洲国产精品综合小说图片区| 国产在线播放一区三区四| 6080yy午夜一二三区久久| 国产精品区一区二区三区| 韩日精品视频一区| 在线成人小视频| 亚洲中国最大av网站| 国产成人自拍网| 久久新电视剧免费观看| 日韩中文字幕一区二区三区| 色悠悠久久综合| 国产亚洲精品中文字幕| 久久午夜免费电影| 久久精品水蜜桃av综合天堂| 蜜臀精品一区二区三区在线观看| 色哟哟精品一区| 一区二区三区小说| 97久久精品人人澡人人爽| 中文字幕va一区二区三区| 国产精品1区2区| 久久久不卡网国产精品二区| 免费成人美女在线观看| 欧美精品久久一区| 精品亚洲成a人| 国产偷国产偷精品高清尤物| 国产精品综合久久| 中文在线一区二区| 在线视频欧美区| 老司机精品视频在线| 久久综合九色综合97婷婷| 国内国产精品久久| 国产精品国产三级国产aⅴ无密码| 91在线视频在线| 日本欧美一区二区| 久久精品亚洲精品国产欧美 | 国产日韩精品一区二区浪潮av| 国产精品一级二级三级| 亚洲乱码中文字幕| 精品奇米国产一区二区三区| 成人夜色视频网站在线观看| 一区二区三区四区在线播放| 精品久久久久久久久久久久包黑料 | 国产91精品久久久久久久网曝门| 1区2区3区欧美| 精品av综合导航| 欧美另类变人与禽xxxxx| 97se亚洲国产综合自在线不卡 | 日韩色在线观看| 91成人免费在线视频| 国产91精品入口| 久久国产尿小便嘘嘘| 日本不卡123| 五月婷婷久久丁香| 五月天一区二区| 亚洲国产另类精品专区| 亚洲三级免费电影| 中文字幕在线不卡| 国产精品日韩成人| 国产精品美女一区二区| 欧美国产激情二区三区 | 国产xxx精品视频大全| 国产乱色国产精品免费视频| 精品一区二区三区免费视频| 美女视频免费一区| 精品一区二区免费视频| 久久91精品国产91久久小草| 另类欧美日韩国产在线| 久久精品噜噜噜成人av农村| 日本91福利区| 捆绑调教一区二区三区| 国产成人免费在线视频| 国产在线不卡视频| 国产成人在线影院 | 欧美一级久久久久久久大片| 2欧美一区二区三区在线观看视频 337p粉嫩大胆噜噜噜噜噜91av | 亚洲免费在线观看视频| 国产精品伊人色| 日韩欧美在线综合网| 亚洲第一久久影院| 欧美影院一区二区三区| 亚洲女人小视频在线观看| 成人av片在线观看| 自拍偷拍国产亚洲| 99久久99久久精品免费观看| 亚洲欧美日韩成人高清在线一区| 成人免费观看视频|