黄色网页视频 I 影音先锋日日狠狠久久 I 秋霞午夜毛片 I 秋霞一二三区 I 国产成人片无码视频 I 国产 精品 自在自线 I av免费观看网站 I 日本精品久久久久中文字幕5 I 91看视频 I 看全色黄大色黄女片18 I 精品不卡一区 I 亚洲最新精品 I 欧美 激情 在线 I 人妻少妇精品久久 I 国产99视频精品免费专区 I 欧美影院 I 欧美精品在欧美一区二区少妇 I av大片网站 I 国产精品黄色片 I 888久久 I 狠狠干最新 I 看看黄色一级片 I 黄色精品久久 I 三级av在线 I 69色综合 I 国产日韩欧美91 I 亚洲精品偷拍 I 激情小说亚洲图片 I 久久国产视频精品 I 国产综合精品一区二区三区 I 色婷婷国产 I 最新成人av在线 I 国产私拍精品 I 日韩成人影音 I 日日夜夜天天综合

Win32 結構化異常處理(SEH)探秘

系統 1618 0

原著:Matt Pietrek

翻譯: VCKBASE


譯注:本文都翻譯了一大半了,才發現網上已經有一篇董巖的譯本( http://www.diybl.com/course/3_program/c++/cppsl/200866/122881.html ),
看完他的譯文,感覺所有涉及關鍵技術的地方董巖翻譯得非常到位,所以自己就沒有再花時間往下譯,本文后面的部分基本上都是采用了董巖的譯文。此外,董巖在譯文后面附帶有一篇附錄,專門解釋“prolog 和 epilog”,后來我發現 MSDN 庫中對此有專門的解釋,內容也更豐富,所以就用微軟文檔中的內容取而代之了。特此說明。


原文出處: A Crash Course on the Depths of Win32? Structured Exception Handling

下載源代碼

本文假設你熟悉 C++,Win32

摘要

  Win32 結構化異常處理其核心是操作系統提供的服務,你能找到的關于 SEH 的所有文檔都是描述一個特定的編譯器運行時庫,這個運行庫包裝著操作系統實現。在本文中,我將一層一層對 SEH 進行剝離,以便展現其最基本的概念。

  在 Win32 操作系統提供的所有功能中,使用最廣泛但最缺乏文檔描述的也許就是結構化異常處理了(SEH),當你考慮 Win32 結構化異常處理時,你也許會想到諸如 _try,_finally 以及 _except 這些術語。你能在任何有關 Win32 的書中發現對 SEH 很好的描述(即使是 remedial)。即便是 Win32 SDK 也具備有相當完整的使用 _try,_finally 和 _except 進行結構化異常處理的概述。
  有了這些文檔,那為何還說 SEH 缺乏文檔呢?其實,Win32 結構化異常處理是操作系統提供的一個服務。你能找到的關于 SEH 的所有文檔都是描述特定編譯器的運行時庫,這個運行庫對操作系統實現進行包裝。_try,_finally 和 _except 這些關鍵字沒有任何神奇的地方。微軟的操作系統及其編譯器系列定義這些關鍵字和用法。其他的編譯器提供商則只是沿用這些語義。雖然借助編譯器層的 SEH 可以挽回一些原始操作系統級 SEH 處理不良口碑,但在大眾眼里對原始操作系統 SEH 細節的處理感覺依舊。
  我收到人們大量的e-mail,都是想要實現編譯器級的 SEH 處理,又無法找到操作系統功能提供的相關文檔。通常我都是建議參考 Visual C++ 或者 Borland C++ 運行庫源代碼。唉,出于一些未知的原因,編譯器級的 SEH 似乎是一個大的秘密,微軟和 Borland 都不提供其對 SEH 支持的核心層源代碼。
  在本文中,我將一層一層對 SEH 進行解剖,以便展現其最基本的概念。我打算通過代碼產生和運行時庫支持將操作系統提供的功能和編譯器提供的功能分開。當我深入代碼考察關鍵的操作系統例程時,我將使用 Intel 平臺上的 Windows NT4.0 作為基礎。但我將要描述的大多數內容同樣適用于其它處理器上運行的應用。
  我打算避免涉及到真正的 C++ 異常處理,它們使用 catch(),而不是 _except。其實,真正的 C++ 異常處理實現非常類似于本文中描述的內容。但是 C++ 異常處理有一些額外的復雜性會影響我想要涉及的概念。
  通過深入研究晦澀的 .H 和 .INC 文件來歸納 Win32 SEH 構成,我發現有一個信息源之一就是 IBM OS/2 頭文件(尤其是 BSEXCPT.H)。為此你不要覺得大驚小怪。。此處描述的 SEH 機制在其源頭被定義時,微軟仍然開發 OS/2 平臺(譯注: OS/2 平臺起初是IBM 和 微軟共同研發的,后來由于種種原因兩個公司沒有再繼續下去)。所以你會發現Win32 下的 SEH 和 OS/2 下的 SEH 極其相似。

SEH 淺析

  從整體來看,SEH 的可謂不可一世,絕對壓倒一切,我將從細微之處開始,用我自己的方式一層一層研究。如果你是一張白紙,以前從沒接觸過結構化異常處理,那就最好不過了。如果你以前使用過 SEH。那就嘗試清理你頭腦中的 _try,GetExceptionCode 和 EXCEPTION_EXECUTE_HANDLER 等諸如此類的詞,權當自己是個新手。做一個深呼吸,準備好了嗎?好,我們開始。
  想象一下,我告訴你某個線程出錯了,操作系統給你一個機會通知了這個線程錯誤,或者再具體一點,當線程出錯后,操作系統調用某個用戶定義的回調函數。這個回調函數可以所任何它想做的事情。例如,它可以修復任何原因導致的錯誤,或者播放一個 .wav 文件。不管回調函數做什么,其最后總是返回一個值,這個值告訴系統下一步做什么。(這里描述的情況不一定完全一樣,但足夠接近。)
  假定當你的代碼出現了混亂,你不得不回來,想看看回調函數是什么樣子的?換句話說,你想知道什么樣的異常信息呢?其實這無關緊要,因為 Win32 已經幫你決定了。一個異常回調函數就象下面這樣:

    EXCEPTION_DISPOSITION
__cdecl _except_handler(
struct _EXCEPTION_RECORD *ExceptionRecord,
void * EstablisherFrame,
struct _CONTEXT *ContextRecord,
void * DispatcherContext
);
  

  該原型出自標準的 Win32 頭文件 EXCPT.H,初看就有那么一點不同凡響。如果你慢慢研究,其實并沒有那么糟。例如,忽略返回類型(EXCEPTION_DISPOSITION)。基本上你看到的就是一個叫做 _except_handler 的函數,這個函數帶有四個參數。
  第一個參數是指向 EXCEPTION_RECORD 結構指針,該結構在 WINNT.H 中定義如下:

    typedef struct _EXCEPTION_RECORD {
DWORD ExceptionCode;
DWORD ExceptionFlags;
struct _EXCEPTION_RECORD *ExceptionRecord;
PVOID ExceptionAddress;
DWORD NumberParameters;
DWORD ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
} EXCEPTION_RECORD;
  

  ExceptionCode 參數是由操作系統賦值給異常的一個數。你可以在 WINNT.H 文件中搜一下“STATUS_”開始的 #defines 內容便可以得到一系列不同的異常編碼。例如 STATUS_ACCESS_VIOLATION 是大家再熟悉不過的異常編碼了,其值是 0xC0000005。更復雜的異常編碼可以從 Windows NT DDK 的 NTSTATUS.H 文件中找到。EXCEPTION_RECORD 結構中的第四個元素是異常發生的地址。剩下的 EXCEPTION_RECORD 域現在可以忽略,不用管它。
  _except_handler 回調函數的第二個參數是指向建立者框架(establisher frame)結構的指針,在 SEH 中它是一個至關重要的參數,但現在可以不用關心它。
  _except_handler 回調函數的第三個參數是 CONTEXT 結構的指針。CONTEXT 結構在 WINNT.H 中定義,它表示特定線程異常發生時寄存器的值:

    typedef struct _CONTEXT
{
DWORD ContextFlags;
DWORD Dr0;
DWORD Dr1;
DWORD Dr2;
DWORD Dr3;
DWORD Dr6;
DWORD Dr7;
FLOATING_SAVE_AREA FloatSave;
DWORD SegGs;
DWORD SegFs;
DWORD SegEs;
DWORD SegDs;
DWORD Edi;
DWORD Esi;
DWORD Ebx;
DWORD Edx;
DWORD Ecx;
DWORD Eax;
DWORD Ebp;
DWORD Eip;
DWORD SegCs;
DWORD EFlags;
DWORD Esp;
DWORD SegSs;
} CONTEXT;
  

此外,這個 CONTEXT 結構與 GetThreadContext 和 SetThreadContext API 函數使用的結構是相同的。
_except_handler 回調函數的第四個參數是 DispatcherContext。現在也可以忽略它。
  為了簡化起見,當異常發生時,你有一個回調函數被調用。此回調函數帶四個參數,其中三個是結構指針。在這些結構中,某些域是很重要的,其余的不是那么重要。關鍵是 _except_handler 回調函數接收
很多信息,比如發生了什么類型的異常,在哪里發生的。利用這些信息,異常回調機制需要確定要做什么。
  雖然我迫不急但地想拋出例子程序示范 _except_handler 回調的運行,但還有一些事情不能漏掉,需要說明。特別是當錯誤發生時,操作系統如何知道到哪里調用?答案仍然涉及另外一個結構 EXCEPTION_REGISTRATION。你將自始自終在本文中看到這個結構,所以不要掠過這部分內容。我能找到正式定義 EXCEPTION_REGISTRATION 結構的唯一地方是 EXSUP.INC 文件,該文件來自 Visual C++ 運行庫的源:

    _EXCEPTION_REGISTRATION struc
prev dd ?
handler dd ?
_EXCEPTION_REGISTRATION ends
  

  你還將看到該結構在 WINNT.H 文件中定義的 NT_TIB 結構中被引用為 _EXCEPTION_REGISTRATION_RECORD。唉,除此之外,沒有什么地方能找到 _EXCEPTION_REGISTRATION_RECORD 的定義,所以我只能使用 EXSUP.INC 文件中定義的匯編語言結構。這也是我為什么在本文前述內容中說過的 SEH 缺乏文檔的一個例證。
  不管怎樣,讓我們回到手頭的問題,當某個異常發生時,OS 如何知道到哪里調用回調函數?EXCEPTION_REGISTRATION 由兩個域構成,第一個你現在可以忽略。第二個域是句柄,它包含 _except_handler 回調函數的指針。這讓你更接近一點了,但目前問題來了,OS 在哪里查找并發現 EXCEPTION_REGISTRATION 結構?
  為了回答這個問題,回想一下結構化異常處理是以線程為基礎,并作用在每個線程上,明白這一點是有助于理解的。也就是說,每個線程具備其自己的異常處理回調函數。在我 1996年5月的專欄文章 中,我描述了一個關鍵的 Win32 數據結構——線程信息塊(即 TEB 和 TIB)。該數據結構的某些域在 Windows NT、Windows 95、Win32s 和 OS/2 平臺上是一樣的。TIB 中的第一個 DWORD 是指向線程 EXCEPTION_REGISTRATION 結構的指針。在 Intel Win32 平臺上,FS 寄存器總是指向當前的 TIB。因此,在 FS:[0]位置,你能找到 EXCEPTION_REGISTRATION 結構的指針。
  現在我們知道了,當異常發生時,系統檢查出錯線程的 TIB 并獲取 EXCEPTION_REGISTRATION 結構的指針。這個結構中就有一個 _except_handler 回調函數的指針。這些信息足以讓操作系統知道在哪里以及如何調用 _except_handler 函數,如圖二所示:

Win32 結構化異常處理(SEH)探秘
圖二 _except_handler 函數

  通過前面的描述,我寫了一個小程序來對操作系統層的結構化異常進行示范。程序代碼如下:

     //==================================================
 // MYSEH - Matt Pietrek 1997
 // Microsoft Systems Journal, January 1997
 // FILE: MYSEH.CPP
 // To compile: CL MYSEH.CPP
 //==================================================
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <stdio.h>

DWORD  scratch;

EXCEPTION_DISPOSITION
__cdecl
_except_handler(
    struct _EXCEPTION_RECORD *ExceptionRecord,
    void * EstablisherFrame,
    struct _CONTEXT *ContextRecord,
    void * DispatcherContext )
{
    unsigned i;

    // Indicate that we made it to our exception handler
    printf( "Hello from an exception handler/n" );

    // Change EAX in the context record so that it points to someplace
    // where we can successfully write
    ContextRecord->Eax = (DWORD)&scratch;

    // Tell the OS to restart the faulting instruction
    return ExceptionContinueExecution;
}

int main()
{
    DWORD handler = (DWORD)_except_handler; 
    __asm
    { 
        // 創建 EXCEPTION_REGISTRATION 結構:
        push handler 	// handler函數的地址
        push FS:[0] 	// 前一個handler函數的地址
        mov FS:[0],ESP 	// 裝入新的EXECEPTION_REGISTRATION結構
    } 
    __asm
    {
        mov eax,0     	// EAX清零
        mov [eax], 1 	// 寫EAX指向的內存從而故意引發一個錯誤
    } 
    printf( "After writing!/n" ); 
    __asm
    { 
        // 移去我們的 EXECEPTION_REGISTRATION 結構記錄
        mov eax,[ESP]    	// 獲取前一個結構
        mov FS:[0], EAX 	// 裝入前一個結構
        add esp, 8       	// 將 EXECEPTION_REGISTRATION 彈出堆棧
    } 
    return 0; 
} 

  

  代碼中只有兩個函數,main 函數使用了三部分內聯匯編塊 ASM。第一個 ASM 塊通過兩個 PUSH 指令(即:“PUSH handler”和“PUSH FS:[0]”)在堆棧上建立一個 EXCEPTION_REGISTRATION 結構。PUSH FS:[0] 保存以前 FS:[0] 的值,它是結構的一部分,但目前這個值對我們不重要。重要的是在堆棧上有一個 8-byte 的 EXCEPTION_REGISTRATION 結構。緊接著的指令(MOV FS:[0],ESP)是讓線程信息塊中的第一個 DWORD 指到新的 EXCEPTION_REGISTRATION 指令。
  如果你想知道為什么我要在堆棧上建立這個 EXCEPTION_REGISTRATION 結構,而不是使用全局變量,有一個很好的理由。當你使用編譯器的 _try/_except 時,編譯器也會在堆棧上建立 EXCEPTION_REGISTRATION 結構。我只是向你簡要地揭示你使用 _try/_except 時編譯器所做的事情。讓我們回到 main 函數,下一個 __asm 塊是通過把 EAX 寄存器清零(MOV EAX,0),然后把此寄存器的值作為內存地址讓下一條指令(MOV [EAX],1)向此地址寫入數據而故意引發一個錯誤。最后一個 __asm 塊是清除這個簡單的異常處理例程:首先它恢復以前的 FS:[0] 內容,然后它將 EXCEPTION_REGISTRATION 結構記錄從堆棧中彈出(ADD ESP,8)。
現在,假設你正在運行 MYSEH.EXE 并會看到所發生的事情。當 MOV [EAX],1 指令執行時,它導致一個數據訪問違例。系統察看 TIB 中的 FS:[0] 并找到 EXCEPTION_REGISTRATION 結構指針。此結構中則有一個指向 MYSEH.CPP 中 _except_handler 函數的指針。系統則將四個必須的參數(我在前面描述過這四個參數)壓入堆棧并調用 _except_handler 函數。
  一旦進入 _except_handler,代碼首先通過 printf 指示“哈!這里是我干的!”。接著,_except_handler 修復導致出錯的問題。即 EAX 寄存器指向某個不能寫入的內存地址(地址 0)。修復方法是在改變 CONTEXT 結構中的 EAX 的值,以便它指向某個允許進行寫入操作的位置。在這個簡單的程序中,DWORD 變量(scratch)是故意為此而設計的。_except_handler 函數最后一個動作時返回 ExceptionContinueExecution 值,它在標準的 EXCPT.H 文件中定義。
  當操作系統看到返回值為 ExceptionContinueExecution。它就認為你已經修復了問題,并且引起錯誤的指令應該被重新執行。因為我的 _except_handler 函數強制 EAX 寄存器指向合法內存,MOV EAX,1 指令再次執行,函數 main 一切正常。看,這并不復雜,不是嗎?


進一步深入

  有了前面的最簡單的例子,讓我們再回過頭去填補一些空白。雖然這個異常回調機制很棒,但它并不是一個完美的解決方案。對于稍微復雜一些的應用程序來說,僅用一個函數就能處理程序中任何地方都可能發生的異常是相當困難的。一個更實用的方案應該是有多個異常處理例程,每個例程針對程序的特定部分。不知你是否知道,實際上,操作系統提供的正是這個功能。
  還記得系統用來查找異常回調函數的 EXCEPTION_REGISTRATION 結構嗎?這個結構的第一個成員,稱為 prev,前面我們曾把它忽略掉了。它實際上是一個指向另外一個 EXCEPTION_REGISTRATION 結構的指針。這第二個 EXCEPTION_REGISTRATION 結構可以有一個完全不同的處理函數。然后呢,它的 prev 域可以指向第三個 EXCEPTION_REGISTRATION 結構,依次類推。簡單地說,就是有一個 EXCEPTION_REGISTRATION 結構鏈表。線程信息塊的第一個 DWORD(在基于 Intel CPU 的機器上是 FS:[0])總是指向這個鏈表的頭部。
  操作系統要這個 EXCEPTION_REGISTRATION 結構鏈表做什么呢?原來,當異常發生時,系統遍歷這個鏈表以便查找其中的一個EXCEPTION_REGISTRATION 結構,其例程回調(異常處理程序)同意處理該異常。在 MYSEH.CPP 的例子中,異常處理程序通過返回ExceptionContinueExecution 表示它同意處理這個異常。異常回調函數也可以拒絕處理這個異常。在這種情況下,系統移向鏈表的下一個EXCEPTION_REGISTRATION 結構并詢問它的異常回調函數,看它是否愿意處理這個異常。圖四顯示了這個過程:

Win32 結構化異常處理(SEH)探秘

圖四 查找處理異常的 EXCEPTION_REGISTRATION 結構

一旦系統找到一個處理該異常的某個回調函數,它就停止遍歷結構鏈表。

  下面的代碼 MYSEH2.CPP 就是一個異常處理函數不處理某個異常的例子。為了使代碼盡量簡單,我使用了編譯器層面的異常處理。main 函數只設置了一個 __try/__except塊。在__try 塊內部調用了 HomeGrownFrame 函數。這個函數與前面的 MYSEH 程序非常相似。它也是在堆棧上創建一個 EXCEPTION_REGISTRATION 結構,并且讓 FS:[0] 指向此結構。在建立了新的異常處理程序之后,這個函數通過向一個 NULL 指針所指向的內存處寫入數據而故意引發一個錯誤:

    *(PDWORD)0 = 0; 
  

  這個異常處理回調函數,同樣被稱為_except_handler,卻與前面的那個截然不同。它首先打印出 ExceptionRecord 結構中的異常代碼和標志,這個結構的地址是作為一個指針參數被這個函數接收的。打印出異常標志的原因稍后就會明白。因為_except_handler 函數并沒有打算修復出錯的代碼,因此它返回 ExceptionContinueSearch。這導致操作系統繼續在 EXCEPTION_REGISTRATION 結構鏈表中搜索下一個 EXCEPTION_REGISTRATION結構。接下來安裝的異常回調函數是針對 main 函數中的__try/__except塊的。__except 塊簡單地打印出“Caught the exception in main()”。此時我們只是簡單地忽略這個異常來表明我們已經處理了它。 以下是 MYSEH2.CPP:

    //=================================================
// MYSEH2 - Matt Pietrek 1997
// Microsoft Systems Journal, January 1997
// FILE: MYSEH2.CPP
// 使用命令行CL MYSEH2.CPP編譯
//================================================= 
#define WIN32_LEAN_AND_MEAN 
#include <windows.h>
#include <stdio.h> 
EXCEPTION_DISPOSITION
__cdecl _except_handler(
struct _EXCEPTION_RECORD *ExceptionRecord,
	void * EstablisherFrame,
struct _CONTEXT *ContextRecord,
	void * DispatcherContext )
{ 
	printf( "Home Grown handler: Exception Code: %08X Exception Flags %X",
		ExceptionRecord->ExceptionCode, ExceptionRecord->ExceptionFlags ); 
	if ( ExceptionRecord->ExceptionFlags & 1 )
		printf( " EH_NONCONTINUABLE" ); 
	if ( ExceptionRecord->ExceptionFlags & 2 )
		printf( " EH_UNWINDING" ); 
	if ( ExceptionRecord->ExceptionFlags & 4 )
		printf( " EH_EXIT_UNWIND" ); 
	if ( ExceptionRecord->ExceptionFlags & 8 ) 	// 注意這個標志
		printf( " EH_STACK_INVALID" ); 
	if ( ExceptionRecord->ExceptionFlags & 0x10 )   // 注意這個標志
		printf( " EH_NESTED_CALL" ); 
	printf( "/n" ); 
	// 我們不想處理這個異常,讓其它函數處理吧
	return ExceptionContinueSearch; 
} 
void HomeGrownFrame( void )
{ 
	DWORD handler = (DWORD)_except_handler; 
	__asm
	{
		// 創建EXCEPTION_REGISTRATION結構:
		push handler       	// handler函數的地址
			push FS:[0]        // 前一個handler函數的地址
		mov FS:[0],ESP     	// 安裝新的EXECEPTION_REGISTRATION結構
	} 
	*(PDWORD)0 = 0; 			// 寫入地址0,從而引發一個錯誤 
	printf( "I should never get here!/n" ); 
	__asm
	{
		// 移去我們的EXECEPTION_REGISTRATION結構
		mov eax,[ESP]     		// 獲取前一個結構
		mov FS:[0], EAX 		// 安裝前一個結構
			add esp, 8        // 把我們EXECEPTION_REGISTRATION結構彈出堆棧
	} 
} 
int main()
{ 
	__try
	{
		HomeGrownFrame();
	} 
	__except( EXCEPTION_EXECUTE_HANDLER )
	{
		printf( "Caught the exception in main()/n" );
	} 
	return 0; 
} 

  

  這里的關鍵是執行流程。當一個異常處理程序拒絕處理某個異常時,它實際上也就拒絕決定流程最終將從何處恢復。只有接受某個異常的異常處理程序才能決定待所有異常處理代碼執行完畢之后流程將從何處繼續執行。這個規則暗含的意義非常重大,雖然現在還不是顯而易見。
  當使用結構化異常處理時,如果一個函數有一個異常處理程序但它卻不處理某個異常,這個函數就有可能非正常退出。例如在 MYSEH2中 HomeGrownFrame 函數就不處理異常。由于在鏈表中后面的某個異常處理程序(這里是 main 函數中的)處理了這個異常,因此出錯指令后面的 printf 就永遠不會執行。從某種程度上說,使用結構化異常處理與使用 setjmp 和 longjmp 運行時庫函數有些類似。
  如果你運行 MYSEH2,會發現其輸出有些奇怪。看起來好像調用了兩次 _except_handler 函數。根據你現有的知識,第一次調用當然可以完全理解。但是為什么會有第二次呢?

    Home Grown handler: Exception Code: C0000005 Exception Flags 0
Home Grown handler: Exception Code: C0000027 Exception Flags 2 EH_UNWINDING
Caught the Exception in main() 
  

  比較一下以“Home Grown Handler”開頭的兩行,就會看出它們之間有明顯的區別。第一次異常標志是0,而第二次是2。這個問題說來話就長了。實際上,當一個異常處理回調函數拒絕處理某個異常時,它會被再一次調用。但是這次回調并不是立即發生的。這有點復雜。我需要把異常發生時的情形好好梳理一下。
  當異常發生時,系統遍歷 EXCEPTION_REGISTRATION 結構鏈表,直到它找到一個處理這個異常的處理程序。一旦找到,系統就再次遍歷這個鏈表,直到處理這個異常的結點為止。在這第二次遍歷中,系統將再次調用每個異常處理函數。關鍵的區別是,在第二次調用中,異常標志被設置為2。這個值被定義為 EH_UNWINDING。(EH_UNWINDING 的定義在 Visual C++ 運行時庫源代碼文件 EXCEPT.INC 中,但 Win32 SDK 中并沒有與之等價的定義。)
  EH_UNWINDING 表示什么意思呢?原來,當一個異常處理回調函數被第二次調用時(帶 EH_UNWINDING 標志),操作系統給這個函數一個最后清理的機會。什么樣的清理呢?一個絕好的例子是 C++ 類的析構函數。當一個函數的異常處理程序拒絕處理某個異常時,通常執行流程并不會正常地從那個函數退出。現在,想像一下定義了一個C++類的實例作為局部變量的函數。C++規范規定析構函數必須被調用。這帶 EH_UNWINDING 標志的第二次回調就給這個函數一個機會去做一些類似于調用析構函數和__finally 塊之類的清理工作。
  在異常已經被處理完畢,并且所有前面的異常幀都已經被展開之后,流程從處理異常的那個回調函數決定的地方開始繼續執行。一定要記住,僅僅把指令指針設置到所需的代碼處就開始執行是不行的。流程恢復執行處的代碼的堆棧指針和棧幀指針(在Intel CPU上是 ESP 和EBP)也必須被恢復成它們在處理這個異常的函數的棧幀上的值。因此,這個處理異常的回調函數必須負責把堆棧指針和棧幀指針恢復成它們在包含處理這個異常的 SEH 代碼的函數的堆棧上的值。
  通常,展開操作導致堆棧上處理異常的幀以下的堆棧區域上的所有內容都被移除了,就好像我們從來沒有調用過這些函數一樣。展開的另外一個效果就是 EXCEPTION_REGISTRATION 結構鏈表上處理異常的那個結構之前的所有 EXCEPTION_REGISTRATION 結構都被移除了。這很好理解,因為這些 EXCEPTION_REGISTRATION 結構通常都被創建在堆棧上。在異常被處理后,堆棧指針和棧幀指針在內存中比那些從 EXCEPTION_REGISTRATION 結構鏈表上移除的 EXCEPTION_REGISTRATION 結構高。圖六顯示了我說的情況。

Win32 結構化異常處理(SEH)探秘
圖六 從異常展開

幫幫我!沒有人處理它!

  迄今為止,我實際上一直在假設操作系統總是能在 EXCEPTION_REGISTRATION 結構鏈表中 的某個地方找到一個異常處理程序。如果找不到怎么辦呢?實際上,這幾乎不可能發生。因為操作系統暗中已經為每個線程都提供了一個默認的異常處理程序。這個默認的異常處理程序總是鏈表的最后一個結點,并且它總是選擇處理異常。它進行的操作與其它正常的異常處理回調函數有些不同,下面我會說明。
  讓我們來看一下系統是在什么時候插入了這個默認的、最后一個異常處理程序。很明顯它需要在線程執行的早期,在任何用戶代碼開始執行之前。
  下面是我為 BaseProcessStart 函數寫的偽代碼。它是 Windows NT KERNEL32.DLL 的一個內部例程。這個函數帶一個參數——線程入口點函數的地址。BaseProcessStart 運行在新進程的上下文環境中,并且從該進程的第一個線程的入口點函數開始執行。

     BaseProcessStart 偽碼 
 BaseProcessStart( PVOID lpfnEntryPoint )
 {
     DWORD retValue
     DWORD currentESP;
     DWORD exceptionCode;
 
     currentESP = ESP;
 
     _try
     {
         NtSetInformationThread( GetCurrentThread(),
                                 ThreadQuerySetWin32StartAddress,
                                 &lpfnEntryPoint, sizeof(lpfnEntryPoint) );
 
         retValue = lpfnEntryPoint();
 
         ExitThread( retValue );
     }
     _except(// 過濾器-表達式代碼
             exceptionCode = GetExceptionInformation(),
             UnhandledExceptionFilter( GetExceptionInformation() ) )
     {
         ESP = currentESP;
 
         if ( !_BaseRunningInServerProcess )         // 常規進程
             ExitProcess( exceptionCode );
         else                                        // 服務
             ExitThread( exceptionCode );
     }
 }
  

  在這段偽碼中,注意對 lpfnEntryPoint 的調用被封裝在一個__try 和 __except 塊中。正是此__try 塊安裝了默認的、異常處理程序鏈表上的最后一個異常處理程序。所有后來注冊的異常處理程序都被安裝在此鏈表中這個結點的前面。如果 lpfnEntryPoint 函數返回,那么表明線程一直運行到完成并且沒有引發異常。這時 BaseProcessStart 調用 ExitThread 使線程退出。
  另一方面,如果線程引發了一個異常但是沒有異常處理程序來處理它時,該怎么辦呢?這時,執行流程轉到 __except 關鍵字后面的括號中。在 BaseProcessStart 中,這段代碼調用 UnhandledExceptionFilter 這個 API,稍后我會講到它。現在對于我們來說,重要的是 UnhandledExceptionFilter 這個API包含了默認的異常處理程序。
  如果 UnhandledExceptionFilter 返回 EXCEPTION_EXECUTE_HANDLER,這時 BaseProcessStart 中的__except 塊開始執行。而__except塊所做的只是調用 ExitProcess 函數去終止當前進程。稍微想一下你就會理解了。常識告訴我們,如果一個進程引發了一個錯誤而沒有異常處理程序去處理它,這個進程就會被系統終止。你在偽代碼中看到的正是這些。
  對于上述內容我還有一點要補充。如果引發錯誤的線程是作為服務來運行的,并且是基于線程的服務,那么__except 塊并不調用 ExitProcess,而是調用 ExitThread。不能僅僅因為一個服務出錯就終止整個服務進程。
  UnhandledExceptionFilter 中的默認異常處理程序都做了什么呢?當我在一個技術講座上問起這個問題時,響應者寥寥無幾。幾乎沒有人知道當未處理異常發生時,到底操作系統的默認行為是什么。簡單地演示一下這個默認的行為也許會讓很多人豁然開朗。我運行一個故意引發錯誤的程序,其結果如下(如圖八)。

Win32 結構化異常處理(SEH)探秘
圖八 未處理異常對話框

  表面上看,UnhandledExceptionFilter 顯示了一個對話框告訴你發生了一個錯誤。這時,你被給予了一個機會要么終止出錯進程,要么調試它。但是幕后發生了許多事情,我會在文章最后詳細講述它。
  正如我讓你看到的那樣,當異常發生時,用戶寫的代碼可以(并且通常是這樣)獲得機會執行。同樣,在操作過程中,用戶寫的代碼可以執行。此用戶編寫的代碼也可能有缺陷并可能引發另一個異常。由于這個原因,異常處理回調函數也可以返回另外兩個值: ExceptionNestedException 和 ExceptionCollidedUnwind。很明顯,它們很重要。但這是非常復雜的問題,我并不打算在這里詳細講述它們。要想理解其基本概念真的太困難了。

編譯器級的SEH

  雖然我在前面偶爾也使用了__try 和__except,但迄今為止幾乎我寫的所有內容都是關于操作系統方面對 SEH 的實現。然而看一下我那兩個使用操作系統的原始 SEH 的小程序別扭的樣子,編譯器對這個功能進行封裝實在是非常有必要的。現在讓我們來看一下 Visual C++ 是如何在操作系統對 SEH 功能實現的基礎上來創建它自己的結構化異常處理支持的。
  在繼續往下討論之前,記住其它編譯器可以使用原始的系統 SEH 來做一些完全不同的事情這一點是非常重要的。沒有誰規定編譯器必須實現 Win32 SDK 文檔中描述的__try/__except 模型。例如 Visual Basic 5.0 在它的運行時代碼中使用了結構化異常處理,但是那里的數據結構和算法與我這里要講的完全不同。
  如果你把 Win32 SDK 文檔中關于結構化異常處理方面的內容從頭到尾讀一遍,一定會遇到下面所謂的“基于幀”的異常處理程序模型:

    __try {
// 這里是被保護的代碼
}
__except (過濾器表達式) { 
// 這里是異常處理程序代碼
} 
  

  簡單地說,某個函數__try 塊中的所有代碼是由 EXCEPTION_REGISTRATION 結構來保護的,該結構建立在此函數的堆棧幀上。在函數的入口處,這個新的 EXCEPTION_REGISTRATION 結構被放在異常處理程序鏈表的頭部。在__try 塊結束后,相應的 EXCEPTION_REGISTRATION 結構從這個鏈表的頭部被移除。正如我前面所說,異常處理程序鏈表的頭部被保存在 FS:[0] 處。因此,如果你在調試器中單步跟蹤時能看到類似下面的指令

    MOV DWORD PTR FS:[00000000],ESP
或者
MOV DWORD PTR FS:[00000000],ECX 
  

就能非常確定這段代碼正在進入或退出一個__try/__except塊。

  既然一個__try 塊對應著堆棧上的一個 EXCEPTION_REGISTRATION 結構,那么 EXCEPTION_REGISTRATION 結構中的回調函數又如何呢?使用 Win32 的術語來說,異常處理回調函數對應的是過濾器表達式(filter-expression)代碼。事實上,過濾器表達式就是__except 關鍵字后面的小括號中的代碼。就是這個過濾器表達式代碼決定了后面的大括號中的代碼是否執行。
  由于過濾器表達式代碼是你自己寫的,你當然可以決定在你的代碼中的某個地方是否處理某個特定的異常。它可以簡單的只是一句 “EXCEPTION_EXECUTE_HANDLER”,也可以先調用一個把p計算到20,000,000位的函數,然后再返回一個值來告訴操作系統下一步做什么。隨你的便。關鍵是你的過濾器表達式代碼必須是我前面講的有效的異常處理回調函數。
  我剛才講的雖然相當簡單,但那只不過是隔著有色玻璃看世界罷了。現實是非常復雜的。首先,你的過濾器表達式代碼并不是被操作系統直接調用的。事實上,各個 EXCEPTION_REGISTRATION 結構的 handler 域都指向了同一個函數。這個函數在 Visual C++ 的運行時庫中,它被稱為__except_handler3。正是這個__except_handler3 調用了你的過濾器表達式代碼,我一會兒再接著說它。
  對我前面的簡單描述需要修正的另一個地方是,并不是每次進入或退出一個__try 塊時就創建或撤銷一個 EXCEPTION_REGISTRATION 結構。相反,在使用 SEH 的任何函數中只創建一個 EXCEPTION_REGISTRATION 結構。換句話說,你可以在一個函數中使用多個 __try/__except 塊,但是在堆棧上只創建一個 EXCEPTION_REGISTRATION 結構。同樣,你可以在一個函數中嵌套使用 __try 塊,但 Visual C++ 仍舊只是創建一個 EXCEPTION_REGISTRATION 結構。
  如果整個 EXE 或 DLL 只需要單個的異常處理程序(__except_handler3),同時,如果單個的 EXCEPTION_REGISTRATION 結構就能處理多個__try 塊的話,很明顯,這里面還有很多東西我們不知道。這個技巧是通過一個通常情況下看不到的表中的數據來完成的。由于本文的目的就是要深入探索結構化異常處理,那就讓我們來看一看這些數據結構吧。

擴展的異常處理幀

  Visual C++ 的 SEH 實現并沒有使用原始的 EXCEPTION_REGISTRATION 結構。它在這個結構的末尾添加了一些附加數據。這些附加數據正是允許單個函數(__except_handler3)處理所有異常并將執行流程傳遞到相應的過濾器表達式和__except 塊的關鍵。我在 Visual C++ 運行時庫源代碼中的 EXSUP.INC 文件中找到了有關 Visual C++ 擴展的 EXCEPTION_REGISTRATION 結構格式的線索。在這個文件中,你會看到以下定義(已經被注釋掉了):

    ;struct _EXCEPTION_REGISTRATION{
; struct _EXCEPTION_REGISTRATION *prev;
; void (*handler)( PEXCEPTION_RECORD,
; PEXCEPTION_REGISTRATION,
; PCONTEXT,
; PEXCEPTION_RECORD);
; struct scopetable_entry *scopetable;
; int trylevel;
; int _ebp;
; PEXCEPTION_POINTERS xpointers;
;}; 
  

  在前面你已經見過前兩個域:prev 和 handler。它們組成了基本的 EXCEPTION_REGISTRATION 結構。后面三個域:scopetable(作用域表)、trylevel 和_ebp 是新增加的。scopetable 域指向一個 scopetable_entry 結構數組,而 trylevel 域實際上是這個數組的索引。最后一個域_ebp,是 EXCEPTION_REGISTRATION 結構創建之前棧幀指針(EBP)的值。
  _ebp 域成為擴展的 EXCEPTION_REGISTRATION 結構的一部分并非偶然。它是通過 PUSH EBP 這條指令被包含進這個結構中的,而大多數函數開頭都是這條指令(通常編譯器并不為使用FPO優化的函數生成標準的堆棧幀,這樣其第一條指令可能不是 PUSH EBP。但是如果使用了SEH的話,那么無論你是否使用了FPO優化,編譯器一定生成標準的堆棧幀)。這條指令可以使 EXCEPTION_REGISTRATION 結構中所有其它的域都可以用一個相對于棧幀指針(EBP)的負偏移來訪問。例如 trylevel 域在 [EBP-04]處,scopetable 指針在[EBP-08]處,等等。(也就是說,這個結構是從[EBP-10H]處開始的。)
  緊跟著擴展的 EXCEPTION_REGISTRATION 結構下面,Visual C++ 壓入了另外兩個值。緊跟著(即[EBP-14H]處)的一個DWORD,是為一個指向 EXCEPTION_POINTERS 結構(一個標準的Win32 結構)的指針所保留的空間。這個指針就是你調用 GetExceptionInformation 這個API時返回的指針。盡管SDK文檔暗示 GetExceptionInformation 是一個標準的 Win32 API,但事實上它是一個編譯器內聯函數。當你調用這個函數時,Visual C++ 生成以下代碼:

    MOV EAX,DWORD PTR [EBP-14] 
  

  GetExceptionInformation 是一個編譯器內聯函數,與它相關的 GetExceptionCode 函數也是如此。此函數實際上只是返回 GetExceptionInformation 返回的數據結構(EXCEPTION_POINTERS)中的一個結構(EXCEPTION_RECORD)中的一個域(ExceptionCode)的值。當 Visual C++ 為 GetExceptionCode 函數生成下面的指令時,它到底是想干什么?我把這個問題留給讀者。(現在就能理解為什么SDK文檔提醒我們要注意這兩個函數的使用范圍了。)

    MOV EAX,DWORD PTR [EBP-14] ; 執行完畢,EAX指向EXCEPTION_POINTERS結構
MOV EAX,DWORD PTR [EAX] ; 執行完畢,EAX指向EXCEPTION_RECORD結構
MOV EAX,DWORD PTR [EAX] ; 執行完畢,EAX中是ExceptionCode的值 
  

  現在回到擴展的 EXCEPTION_REGISTRATION 結構上來。在這個結構開始前的8個字節處(即[EBP-18H]處),Visual C++ 保留了一個DWORD來保存所有prolog代碼執行完畢之后的堆棧指針(ESP)的值(實際生成的指令為MOV DWORD PTR [EBP-18H],ESP)。這個DWORD中保存的值是函數執行時ESP寄存器的正常值(除了在準備調用其它函數時把參數壓入堆棧這個過程會改變 ESP寄存器的值并在函數返回時恢復它的值外,函數在執行過程中一般不改變ESP寄存器的值)。
  看起來好像我一下子給你灌輸了太多的信息,我承認。在繼續下去之前,讓我們先暫停,來回顧一下 Visual C++ 為使用結構化異常處理的函數生成的標準異常堆棧幀,它看起來像下面這個樣子:

    EBP-00 _ebp
EBP-04 trylevel
EBP-08 scopetable數組指針
EBP-0C handler函數地址
EBP-10指向前一個EXCEPTION_REGISTRATION結構
EBP-14 GetExceptionInformation
EBP-18 棧幀中的標準ESP 
  

  在操作系統看來,只存在組成原始 EXCEPTION_REGISTRATION 結構的兩個域:即[EBP-10h]處的prev指針和[EBP-0Ch]處的handler函數指針。棧幀中的其它所有內容是針對于Visual C++的。把這個Visual C++生成的標準異常堆棧幀記到腦子里之后,讓我們來看一下真正實現編譯器層面SEH的這個Visual C++運行時庫例程——__except_handler3。

__except_handler3 和 scopetable

  我真的很希望讓你看一看Visual C++運行時庫源代碼,讓你自己好好研究一下__except_handler3函數,但是我辦不到。因為 Microsoft并沒有提供。在這里你就將就著看一下我為__except_handler3函數寫的偽代碼吧:。

圖九 __except_handler3函數的偽代碼:

    int __except_handler3(
struct _EXCEPTION_RECORD * pExceptionRecord,
struct EXCEPTION_REGISTRATION * pRegistrationFrame,
struct _CONTEXT *pContextRecord,
void * pDispatcherContext ) 
{ 
	LONG filterFuncRet;
	LONG trylevel;
	EXCEPTION_POINTERS exceptPtrs;
	PSCOPETABLE pScopeTable; 
	CLD // 將方向標志復位(不測試任何條件!) 
		// 如果沒有設置EXCEPTION_UNWINDING標志或EXCEPTION_EXIT_UNWIND標志
		// 表明這是第一次調用這個處理程序(也就是說,并非處于異常展開階段)
		if ( ! (pExceptionRecord->ExceptionFlags
			& (EXCEPTION_UNWINDING | EXCEPTION_EXIT_UNWIND)) )
		{
			// 在堆棧上創建一個EXCEPTION_POINTERS結構
			exceptPtrs.ExceptionRecord = pExceptionRecord;
			exceptPtrs.ContextRecord = pContextRecord; 
			// 把前面定義的EXCEPTION_POINTERS結構的地址放在比
			// establisher棧幀低4個字節的位置上。參考前面我講
			// 的編譯器為GetExceptionInformation生成的匯編代
			// 碼*(PDWORD)((PBYTE)pRegistrationFrame - 4) = &exceptPtrs; 
			// 獲取初始的“trylevel”值
			trylevel = pRegistrationFrame->trylevel; 
			// 獲取指向scopetable數組的指針 
			scopeTable = pRegistrationFrame->scopetable; 

	search_for_handler:
			if ( pRegistrationFrame->trylevel != TRYLEVEL_NONE )
			{
				if ( pRegistrationFrame->scopetable[trylevel].lpfnFilter )
				{
					PUSH EBP // 保存這個棧幀指針 
						// !!!非常重要!!!切換回原來的EBP。正是這個操作才使得
						// 棧幀上的所有局部變量能夠在異常發生后仍然保持它的值不變。
						EBP = &pRegistrationFrame->_ebp; 
					// 調用過濾器函數
					filterFuncRet = scopetable[trylevel].lpfnFilter(); 
					POP EBP // 恢復異常處理程序的棧幀指針 
						if ( filterFuncRet != EXCEPTION_CONTINUE_SEARCH )
						{
							if ( filterFuncRet < 0 ) // EXCEPTION_CONTINUE_EXECUTION
								return ExceptionContinueExecution; 
							// 如果能夠執行到這里,說明返回值為EXCEPTION_EXECUTE_HANDLER
							scopetable = pRegistrationFrame->scopetable; 
							// 讓操作系統清理已經注冊的棧幀,這會使本函數被遞歸調用
							__global_unwind2( pRegistrationFrame ); 
							// 一旦執行到這里,除最后一個棧幀外,所有的棧幀已經
							// 被清理完畢,流程要從最后一個棧幀繼續執行
							EBP = &pRegistrationFrame->_ebp; 
							__local_unwind2( pRegistrationFrame, trylevel ); 
							// NLG = "non-local-goto" (setjmp/longjmp stuff)
							__NLG_Notify( 1 ); // EAX = scopetable->lpfnHandler 
							// 把當前的trylevel設置成當找到一個異常處理程序時
							// SCOPETABLE中當前正在被使用的那一個元素的內容
							pRegistrationFrame->trylevel = scopetable->previousTryLevel; 
							// 調用__except {}塊,這個調用并不會返回
							pRegistrationFrame->scopetable[trylevel].lpfnHandler();
						} 
				} 
				scopeTable = pRegistrationFrame->scopetable;
				trylevel = scopeTable->previousTryLevel;
				goto search_for_handler; 
			}
			else // trylevel == TRYLEVEL_NONE
			{
				return ExceptionContinueSearch;
			} 
		}
		else // 設置了EXCEPTION_UNWINDING標志或EXCEPTION_EXIT_UNWIND標志
		{
			PUSH EBP // 保存EBP
				EBP = &pRegistrationFrame->_ebp; // 為調用__local_unwind2設置EBP
			__local_unwind2( pRegistrationFrame, TRYLEVEL_NONE )
				POP EBP // 恢復EBP
				return ExceptionContinueSearch;
		} 
}	

  

  雖然__except_handler3的代碼看起來很多,但是記住一點:它只是一個我在文章開頭講過的異常處理回調函數。它同MYSEH.EXE和 MYSEH2.EXE中的異常回調函數都帶有同樣的四個參數。__except_handler3大體上可以由第一個if語句分為兩部分。這是由于這個函數可以在兩種情況下被調用,一次是正常調用,另一次是在展開階段。其中大部分是在非展開階段的回調。
  __except_handler3一開始就在堆棧上創建了一個EXCEPTION_POINTERS結構,并用它的兩個參數來對這個結構進行初始化。我在偽代碼中把這個結構稱為 exceptPrts,它的地址被放在[EBP-14h]處。你回憶一下前面我講的編譯器為 GetExceptionInformation和 GetExceptionCode 函數生成的匯編代碼就會意識到,這實際上初始化了這兩個函數使用的指針。
  接著,__except_handler3從EXCEPTION_REGISTRATION幀中獲取當前的trylevel(在[EBP-04h]處)。 trylevel變量實際是scopetable數組的索引,而正是這個數組才使得一個函數中的多個__try塊和嵌套的__try塊能夠僅使用一個 EXCEPTION_REGISTRATION結構。每個scopetable元素結構如下:

    typedef struct _SCOPETABLE
{
DWORD previousTryLevel;
DWORD lpfnFilter;
DWORD lpfnHandler;
} SCOPETABLE, *PSCOPETABLE; 
  

  SCOPETABLE結構中的第二個成員和第三個成員比較容易理解。它們分別是過濾器表達式代碼的地址和相應的__except塊的地址。但是prviousTryLevel成員有點復雜。總之一句話,它用于嵌套的__try塊。這里的關鍵是函數中的每個__try塊都有一個相應的SCOPETABLE結構。
  正如我前面所說,當前的 trylevel 指定了要使用的scopetable數組的哪一個元素,最終也就是指定了過濾器表達式和__except塊的地址。現在想像一下兩個__try塊嵌套的情形。如果內層__try塊的過濾器表達式不處理某個異常,那外層__try塊的過濾器表達式就必須處理它。那現在要問,__except_handler3是如何知道SCOPETABLE數組的哪個元素相應于外層的__try塊的呢?答案是:外層__try塊的索引由 SCOPETABLE結構的previousTryLevel域給出。利用這種機制,你可以嵌套任意層的__try塊。previousTryLevel 域就好像是一個函數中所有可能的異常處理程序構成的線性鏈表中的結點一樣。如果trylevel的值為0xFFFFFFFF(實際上就是-1,這個值在 EXSUP.INC中被定義為TRYLEVEL_NONE),標志著這個鏈表結束。
  回到__except_handler3的代碼中。在獲取了當前的trylevel之后,它就調用相應的SCOPETABLE結構中的過濾器表達式代碼。如果過濾器表達式返回EXCEPTION_CONTINUE_SEARCH,__exception_handler3 移向SCOPETABLE數組中的下一個元素,這個元素的索引由previousTryLevel域給出。如果遍歷完整個線性鏈表(還記得嗎?這個鏈表是由于在一個函數內部嵌套使用__try塊而形成的)都沒有找到處理這個異常的代碼,__except_handler3返回DISPOSITION_CONTINUE_SEARCH(原文如此,但根據_except_handler函數的定義,這個返回值應該為ExceptionContinueSearch。實際上這兩個常量的值是一樣的。我在偽代碼中已經將其改正過來了),這導致系統移向下一個EXCEPTION_REGISTRATION幀(這個鏈表是由于函數嵌套調用而形成的)。
  如果過濾器表達式返回EXCEPTION_EXECUTE_HANDLER,這意味著異常應該由相應的__except塊處理。它同時也意味著所有前面的EXCEPTION_REGISTRATION幀都應該從鏈表中移除,并且相應的__except塊都應該被執行。第一個任務通過調用__global_unwind2來完成的,后面我會講到這個函數。跳過這中間的一些清理代碼,流程離開__except_handler3轉向__except塊。令人奇怪的是,流程并不從__except塊中返回,雖然是 __except_handler3使用CALL指令調用了它。
  當前的trylevel值是如何被設置的呢?它實際上是由編譯器隱含處理的。編譯器非常機靈地修改這個擴展的EXCEPTION_REGISTRATION 結構中的trylevel域的值(實際上是生成修改這個域的值的代碼)。如果你檢查編譯器為使用SEH的函數生成的匯編代碼,就會在不同的地方都看到修改這個位于[EBP-04h]處的trylevel域的值的代碼。
  __except_handler3是如何做到既通過CALL指令調用__except塊而又不讓執行流程返回呢?由于CALL指令要向堆棧中壓入了一個返回地址,你可以想象這有可能破壞堆棧。如果你檢查一下編譯器為__except塊生成的代碼,你會發現它做的第一件事就是將EXCEPTION_REGISTRATION結構下面8個字節處(即[EBP-18H]處)的一個DWORD值加載到ESP寄存器中(實際代碼為MOV ESP,DWORD PTR [EBP-18H]),這個值是在函數的 prolog 代碼中被保存在這個位置的(實際代碼為MOV DWORD PTR [EBP-18H],ESP)。

ShowSEHFrames 程序

  如果你現在覺得已經被EXCEPTION_REGISTRATION、scopetable、trylevel、過濾器表達式以及展開等等之類的詞搞得暈頭轉向的話,那和我最初的感覺一樣。但是編譯器層面的結構化異常處理方面的知識并不適合一點一點的學。除非你從整體上理解它,否則有很多內容單獨看并沒有什么意義。當面對大堆的理論時,我最自然的做法就是寫一些應用我學到的理論方面的程序。如果它能夠按照預料的那樣工作,我就知道我的理解(通常)是正確的。
  下面是ShowSEHFrame.EXE的源代碼。它使用__try/__except塊設置了好幾個 Visual C++ SEH 幀。然后它顯示每一個幀以及Visual C++為每個幀創建的scopetable的相關信息。這個程序本身并不生成也不依賴任何異常。相反,我使用了多個__try塊以強制Visual C++生成多個 EXCEPTION_REGISTRATION 幀以及相應的 scopetable。

    //ShowSEHFrames.CPP 
//=========================================================
// ShowSEHFrames - Matt Pietrek 1997
// Microsoft Systems Journal, February 1997
// FILE: ShowSEHFrames.CPP
// 使用命令行CL ShowSehFrames.CPP進行編譯
//========================================================= 
#define WIN32_LEAN_AND_MEAN 
#include <windows.h>
#include <stdio.h> 
#pragma hdrstop 
//-------------------------------------------------------------------
// 本程序僅適用于Visual C++,它使用的數據結構是特定于Visual C++的
//------------------------------------------------------------------- 
#ifndef _MSC_VER
#error Visual C++ Required (Visual C++ specific information is displayed)
#endif 
//-------------------------------------------------------------------
// 結構定義
//------------------------------------------------------------------- 

// 操作系統定義的基本異常幀
struct EXCEPTION_REGISTRATION
{
	EXCEPTION_REGISTRATION* prev;
	FARPROC handler;
}; 
// Visual C++擴展異常幀指向的數據結構
struct scopetable_entry
{
	DWORD previousTryLevel;
	FARPROC lpfnFilter;
	FARPROC lpfnHandler;
}; 
// Visual C++使用的擴展異常幀
struct VC_EXCEPTION_REGISTRATION : EXCEPTION_REGISTRATION
{
	scopetable_entry * scopetable;
	int trylevel;
	int _ebp;
}; 
//----------------------------------------------------------------
// 原型聲明
//---------------------------------------------------------------- 
// __except_handler3是Visual C++運行時庫函數,我們想打印出它的地址
// 但是它的原型并沒有出現在任何頭文件中,所以我們需要自己聲明它。
extern "C" int _except_handler3(PEXCEPTION_RECORD,
			EXCEPTION_REGISTRATION *,
			PCONTEXT,
			PEXCEPTION_RECORD); 
//-------------------------------------------------------------
// 代碼
//------------------------------------------------------------- 
//
// 顯示一個異常幀及其相應的scopetable的信息
//
void ShowSEHFrame( VC_EXCEPTION_REGISTRATION * pVCExcRec )
{
	printf( "Frame: %08X Handler: %08X Prev: %08X Scopetable: %08X/n",
		pVCExcRec, pVCExcRec->handler, pVCExcRec->prev,
		pVCExcRec->scopetable ); 
	scopetable_entry * pScopeTableEntry = pVCExcRec->scopetable; 
	for ( unsigned i = 0; i <= pVCExcRec->trylevel; i++ )
	{
		printf( " scopetable[%u] PrevTryLevel: %08X "
			"filter: %08X __except: %08X/n", i,
			pScopeTableEntry->previousTryLevel,
			pScopeTableEntry->lpfnFilter,
			pScopeTableEntry->lpfnHandler ); 
		pScopeTableEntry++;
	} 
	printf( "/n" ); 
} 

//
// 遍歷異常幀的鏈表,按順序顯示它們的信息
//
void WalkSEHFrames( void )
{
	VC_EXCEPTION_REGISTRATION * pVCExcRec; 
	// 打印出__except_handler3函數的位置
	printf( "_except_handler3 is at address: %08X/n", _except_handler3 );
	printf( "/n" ); 
	// 從FS:[0]處獲取指向鏈表頭的指針
	__asm mov eax, FS:[0]
	__asm mov [pVCExcRec], EAX 
		// 遍歷異常幀的鏈表。0xFFFFFFFF標志著鏈表的結尾
		while ( 0xFFFFFFFF != (unsigned)pVCExcRec )
		{
			ShowSEHFrame( pVCExcRec );
			pVCExcRec = (VC_EXCEPTION_REGISTRATION *)(pVCExcRec->prev);
		} 
} 

void Function1( void )
{
	// 嵌套3層__try塊以便強制為scopetable數組產生3個元素
	__try
	{
		__try
		{
			__try
			{
				WalkSEHFrames(); // 現在顯示所有的異常幀的信息
			} __except( EXCEPTION_CONTINUE_SEARCH )
			{}
		} __except( EXCEPTION_CONTINUE_SEARCH )
		{}
	} __except( EXCEPTION_CONTINUE_SEARCH )
	{} 
} 

int main() 
{
	int i; 
	// 使用兩個__try塊(并不嵌套),這導致為scopetable數組生成兩個元素
	__try
	{
		i = 0x1234;
	} __except( EXCEPTION_CONTINUE_SEARCH )
	{
		i = 0x4321;
	} 
	__try
	{
		Function1(); // 調用一個設置更多異常幀的函數
	} __except( EXCEPTION_EXECUTE_HANDLER )
	{
		// 應該永遠不會執行到這里,因為我們并沒有打算產生任何異常
		printf( "Caught Exception in main/n" );
	} 
	return 0; 
} 	
  

  ShowSEHFrames程序中比較重要的函數是WalkSEHFrames和ShowSEHFrame。WalkSEHFrames函數首選打印出 __except_handler3的地址,打印它的原因很快就清楚了。接著,它從FS:[0]處獲取異常鏈表的頭指針,然后遍歷該鏈表。此鏈表中每個結點都是一個VC_EXCEPTION_REGISTRATION類型的結構,它是我自己定義的,用于描述Visual C++的異常處理幀。對于這個鏈表中的每個結點,WalkSEHFrames都把指向這個結點的指針傳遞給ShowSEHFrame函數。
  ShowSEHFrame函數一開始就打印出異常處理幀的地址、異常處理回調函數的地址、前一個異常處理幀的地址以及scopetable的地址。接著,對于每個 scopetable數組中的元素,它都打印出其priviousTryLevel、過濾器表達式的地址以及相應的__except塊的地址。我是如何知道scopetable數組中有多少個元素的呢?其實我并不知道。但是我假定VC_EXCEPTION_REGISTRATION結構中的當前trylevel域的值比scopetable數組中的元素總數少1。
  圖十一是 ShowSEHFrames 的運行結果。首先檢查以“Frame:”開頭的每一行,你會發現它們顯示的異常處理幀在堆棧上的地址呈遞增趨勢,并且在前三個幀中,它們的異常處理程序的地址是一樣的(都是004012A8)。再看輸出的開始部分,你會發現這個004012A8不是別的,它正是 Visual C++運行時庫函數__except_handler3的地址。這證明了我前面所說的單個回調函數處理所有異常這一點。

Win32 結構化異常處理(SEH)探秘
圖十一 ShowSEHFrames運行結果

  你可能想知道為什么明明 ShowSEHFrames 程序只有兩個函數使用SEH,但是卻有三個異常處理幀使用__except_handler3作為它們的異常回調函數。實際上第三個幀來自 Visual C++ 運行時庫。Visual C++ 運行時庫源代碼中的 CRT0.C 文件清楚地表明了對 main 或 WinMain 的調用也被一個__try/__except 塊封裝著。這個__try 塊的過濾器表達式代碼可以在 WINXFLTR.C文 件中找到。
  回到 ShowSEHFrames 程序,注意到最后一個幀的異常處理程序的地址是 77F3AB6C,這與其它三個不同。仔細觀察一下,你會發現這個地址在 KERNEL32.DLL 中。這個特別的幀就是由 KERNEL32.DLL 中的 BaseProcessStart 函數安裝的,這在前面我已經說過。

展開

  在挖掘展開(Unwinding)的實現代碼之前讓我們先來搞清楚它的意思。我在前面已經講過所有可能的異常處理程序是如何被組織在一個由線程信息塊的第一個DWORD(FS:[0])所指向的鏈表中的。由于針對某個特定異常的處理程序可能不在這個鏈表的開頭,因此就需要從鏈表中依次移除實際處理異常的那個異常處理程序之前的所有異常處理程序。
  正如你在Visual C++的__except_handler3函數中看到的那樣,展開是由__global_unwind2這個運行時庫(RTL)函數來完成的。這個函數只是對RtlUnwind這個未公開的API進行了非常簡單的封裝。(現在這個API已經被公開了,但給出的信息極其簡單,詳細信息可以參考最新的Platform SDK文檔。)

    __global_unwind2(void * pRegistFrame)
{
	_RtlUnwind( pRegistFrame, &__ret_label, 0, 0 );
__ret_label:
} 	
  

  雖然從技術上講RtlUnwind是一個KERNEL32函數,但它只是轉發到了NTDLL.DLL中的同名函數上。下面是我為此函數寫的偽代碼。

RtlUnwind 函數的偽代碼:

      void _RtlUnwind( PEXCEPTION_REGISTRATION pRegistrationFrame,
		  PVOID returnAddr, // 并未使用!(至少是在i386機器上)
		  PEXCEPTION_RECORD pExcptRec,
		  DWORD _eax_value) 
  { 
	  DWORD stackUserBase;
	  DWORD stackUserTop;
	  PEXCEPTION_RECORD pExcptRec;
	  EXCEPTION_RECORD exceptRec;
	  CONTEXT context; 
	  // 從FS:[4]和FS:[8]處獲取堆棧的界限
	  RtlpGetStackLimits( &stackUserBase, &stackUserTop ); 
	  if ( 0 == pExcptRec ) // 正常情況
	  {
		  pExcptRec = &excptRec;
		  pExcptRec->ExceptionFlags = 0;
		  pExcptRec->ExceptionCode = STATUS_UNWIND;
		  pExcptRec->ExceptionRecord = 0;
		  pExcptRec->ExceptionAddress = [ebp+4]; // RtlpGetReturnAddress()—獲取返回地址
		  pExcptRec->ExceptionInformation[0] = 0;
	  } 
	  if ( pRegistrationFrame )
		  pExcptRec->ExceptionFlags |= EXCEPTION_UNWINDING;
	  else             // 這兩個標志合起來被定義為EXCEPTION_UNWIND_CONTEXT
		  pExcptRec->ExceptionFlags|=(EXCEPTION_UNWINDING|EXCEPTION_EXIT_UNWIND); 
	  context.ContextFlags =( CONTEXT_i486 | CONTEXT_CONTROL |
		  CONTEXT_INTEGER | CONTEXT_SEGMENTS); 
	  RtlpCaptureContext( &context ); 
	  context.Esp += 0x10;
	  context.Eax = _eax_value; 
	  PEXCEPTION_REGISTRATION pExcptRegHead;
	  pExcptRegHead = RtlpGetRegistrationHead(); // 返回FS:[0]的值 
	  // 開始遍歷EXCEPTION_REGISTRATION結構鏈表
	  while ( -1 != pExcptRegHead )
	  {
		  EXCEPTION_RECORD excptRec2; 
		  if ( pExcptRegHead == pRegistrationFrame )
		  {
			  NtContinue( &context, 0 );
		  }
		  else
		  {
			  // 如果存在某個異常幀在堆棧上的位置比異常鏈表的頭部還低
			  // 說明一定出現了錯誤
			  if ( pRegistrationFrame && (pRegistrationFrame <= pExcptRegHead) )
			  {
				  // 生成一個異常
				  excptRec2.ExceptionRecord = pExcptRec;
				  excptRec2.NumberParameters = 0;
				  excptRec2.ExceptionCode = STATUS_INVALID_UNWIND_TARGET;
				  excptRec2.ExceptionFlags = EXCEPTION_NONCONTINUABLE;
				  RtlRaiseException( &exceptRec2 );
			  }
		  } 
		  PVOID pStack = pExcptRegHead + 8; // 8 = sizeof(EXCEPTION_REGISTRATION) 
		  // 確保pExcptRegHead在堆棧范圍內,并且是4的倍數
		  if ( (stackUserBase <= pExcptRegHead )
			  && (stackUserTop >= pStack )
			  && (0 == (pExcptRegHead & 3)) )
		  {
			  DWORD pNewRegistHead;
			  DWORD retValue; 
			  retValue = RtlpExecutehandlerForUnwind(pExcptRec, pExcptRegHead, &context,
				  &pNewRegistHead, pExceptRegHead->handler ); 
			  if ( retValue != DISPOSITION_CONTINUE_SEARCH )
			  {
				  if ( retValue != DISPOSITION_COLLIDED_UNWIND )
				  {
					  excptRec2.ExceptionRecord = pExcptRec;
					  excptRec2.NumberParameters = 0;
					  excptRec2.ExceptionCode = STATUS_INVALID_DISPOSITION;
					  excptRec2.ExceptionFlags = EXCEPTION_NONCONTINUABLE;
					  RtlRaiseException( &excptRec2 );
				  }
				  else
					  pExcptRegHead = pNewRegistHead;
			  } 
			  PEXCEPTION_REGISTRATION pCurrExcptReg = pExcptRegHead;
			  pExcptRegHead = pExcptRegHead->prev;
			  RtlpUnlinkHandler( pCurrExcptReg ); 
		  }
		  else // 堆棧已經被破壞!生成一個異常
		  {
			  excptRec2.ExceptionRecord = pExcptRec;
			  excptRec2.NumberParameters = 0;
			  excptRec2.ExceptionCode = STATUS_BAD_STACK;
			  excptRec2.ExceptionFlags = EXCEPTION_NONCONTINUABLE;
			  RtlRaiseException( &excptRec2 );
		  } 
	  } 
	  // 如果執行到這里,說明已經到了EXCEPTION_REGISTRATION
	  // 結構鏈表的末尾,正常情況下不應該發生這種情況。
	  //(因為正常情況下異常應該被處理,這樣就不會到鏈表末尾)
	  if ( -1 == pRegistrationFrame )
		  NtContinue( &context, 0 );
	  else
		  NtRaiseException( pExcptRec, &context, 0 ); 
  } 

  RtlUnwind函數的偽代碼到這里就結束了,以下是它調用的幾個函數的偽代碼: 
	  PEXCEPTION_REGISTRATION RtlpGetRegistrationHead( void )
  {
	  return FS:[0];
  } 
  RtlpUnlinkHandler( PEXCEPTION_REGISTRATION pRegistrationFrame )
  {
	FS:[0] = pRegistrationFrame->prev;
  } 
  void RtlpCaptureContext( CONTEXT * pContext )
  {
	  pContext->Eax = 0;
	  pContext->Ecx = 0;
	  pContext->Edx = 0;
	  pContext->Ebx = 0;
	  pContext->Esi = 0;
	  pContext->Edi = 0;
	  pContext->SegCs = CS;
	  pContext->SegDs = DS;
	  pContext->SegEs = ES;
	  pContext->SegFs = FS;
	  pContext->SegGs = GS;
	  pContext->SegSs = SS;
	  pContext->EFlags = flags; // 它對應的匯編代碼為__asm{ PUSHFD / pop [xxxxxxxx] }
	  pContext->Eip = 此函數的調用者的調用者的返回地址    // 讀者看一下這個函數的
		  pContext->Ebp = 此函數的調用者的調用者的EBP        // 匯編代碼就會清楚這一點
		  pContext->Esp = pContext->Ebp + 8;
  } 		
  

  雖然 RtlUnwind 函數的規模看起來很大,但是如果你按一定方法把它分開,其實并不難理解。它首先從FS:[4]和FS:[8]處獲取當前線程堆棧的界限。它們對于后面要進行的合法性檢查非常重要,以確保所有將要被展開的異常幀都在堆棧范圍內。
  RtlUnwind 接著在堆棧上創建了一個空的EXCEPTION_RECORD結構并把STATUS_UNWIND賦給它的ExceptionCode域,同時把 EXCEPTION_UNWINDING標志賦給它的 ExceptionFlags 域。指向這個結構的指針作為其中一個參數被傳遞給每個異常回調函數。然后,這個函數調用RtlCaptureContext函數來創建一個空的CONTEXT結構,這個結構也變成了在展開階段調用每個異常回調函數時傳遞給它們的一個參數。
  RtlUnwind函數的其余部分遍歷EXCEPTION_REGISTRATION結構鏈表。對于其中的每個幀,它都調用 RtlpExecuteHandlerForUnwind 函數,后面我會講到這個函數。正是這個函數帶 EXCEPTION_UNWINDING 標志調用了異常處理回調函數。每次回調之后,它調用RtlpUnlinkHandler 移除相應的異常幀。
  RtlUnwind 函數的第一個參數是一個幀的地址,當它遍歷到這個幀時就停止展開異常幀。上面所說的這些代碼之間還有一些安全性檢查代碼,它們用來確保不出問題。如果出現任何問題,RtlUnwind 就引發一個異常,指示出了什么問題,并且這個異常帶有EXCEPTION_NONCONTINUABLE 標志。當一個進程被設置了這個標志時,它就不允許再運行,必須終止。

未處理異常

  在文章的前面,我并沒有全面描述 UnhandledExceptionFilter 這個 API。通常情況下你并不直接調用它(盡管你可以這么做)。大多數情況下它都是由 KERNEL32 中進行默認異常處理的過濾器表達式代碼調用。前面 BaseProcessStart 函數的偽代碼已經表明了這一點。
  圖十三是我為 UnhandledExceptionFilter 函數寫的偽代碼。這個API有點奇怪(至少在我看來是這樣)。如果異常的類型是 EXCEPTION_ACCESS_VIOLATION,它就調用_BasepCheckForReadOnlyResource。雖然我沒有提供這個函數的偽代碼,但可以簡要描述一下。如果是因為要對 EXE 或 DLL 的資源節(.rsrc)進行寫操作而導致的異常,_BasepCurrentTopLevelFilter 就改變出錯頁面正常的只讀屬性,以便允許進行寫操作。如果是這種特殊的情況,UnhandledExceptionFilter 返回 EXCEPTION_CONTINUE_EXECUTION,使系統重新執行出錯指令。

圖十三 UnHandledExceptionFilter 函數的偽代碼

    UnhandledExceptionFilter( STRUCT _EXCEPTION_POINTERS *pExceptionPtrs )
{ 
	PEXCEPTION_RECORD pExcptRec;
	DWORD currentESP;
	DWORD retValue;
	DWORD DEBUGPORT;
	DWORD dwTemp2;
	DWORD dwUseJustInTimeDebugger;
	CHAR szDbgCmdFmt[256]; // 從AeDebug這個注冊表鍵值返回的字符串
	CHAR szDbgCmdLine[256]; // 實際的調試器命令行參數(已填入進程ID和事件ID)
	STARTUPINFO startupinfo;
	PROCESS_INFORMATION pi;
	HARDERR_STRUCT harderr; // ???
	BOOL fAeDebugAuto;
	TIB * pTib; // 線程信息塊


	pExcptRec = pExceptionPtrs->ExceptionRecord; 
	if ( (pExcptRec->ExceptionCode == EXCEPTION_ACCESS_VIOLATION)
		&& (pExcptRec->ExceptionInformation[0]) )
	{
		retValue=BasepCheckForReadOnlyResource(pExcptRec->ExceptionInformation[1]); 
		if ( EXCEPTION_CONTINUE_EXECUTION == retValue )
			return EXCEPTION_CONTINUE_EXECUTION; 
	} 
	// 查看這個進程是否運行于調試器下
	retValue = NtQueryInformationProcess(GetCurrentProcess(), ProcessDebugPort,
		&debugPort, sizeof(debugPort), 0 ); 
	if ( (retValue >= 0) && debugPort ) // 通知調試器
		return EXCEPTION_CONTINUE_SEARCH; 
	// 用戶調用SetUnhandledExceptionFilter了嗎?
	// 如果調用了,那現在就調用他安裝的異常處理程序
	if ( _BasepCurrentTopLevelFilter )
	{
		retValue = _BasepCurrentTopLevelFilter( pExceptionPtrs );
		if ( EXCEPTION_EXECUTE_HANDLER == retValue )
			return EXCEPTION_EXECUTE_HANDLER;
		if ( EXCEPTION_CONTINUE_EXECUTION == retValue )
			return EXCEPTION_CONTINUE_EXECUTION; 
		// 只有返回值為EXCEPTION_CONTINUE_SEARCH時才會繼續執行下去
	} 
	// 調用過SetErrorMode(SEM_NOGPFAULTERRORBOX)嗎?
	{
		harderr.elem0 = pExcptRec->ExceptionCode;
		harderr.elem1 = pExcptRec->ExceptionAddress; 
		if ( EXCEPTION_IN_PAGE_ERROR == pExcptRec->ExceptionCode )
			harderr.elem2 = pExcptRec->ExceptionInformation[2]; 
		else
			harderr.elem2 = pExcptRec->ExceptionInformation[0]; 
		dwTemp2 = 1;
		fAeDebugAuto = FALSE;
		harderr.elem3 = pExcptRec->ExceptionInformation[1];
		pTib = FS:[18h];
		DWORD someVal = pTib->pProcess->0xC; 
		if ( pTib->threadID != someVal )
		{
			__try
			{
				char szDbgCmdFmt[256];
				retValue = GetProfileStringA( "AeDebug", "Debugger", 0,
					szDbgCmdFmt, sizeof(szDbgCmdFmt)-1 ); 
				if ( retValue )
					dwTemp2 = 2; 
				char szAuto[8];
				retValue = GetProfileStringA( "AeDebug", "Auto", "0",
					szAuto, sizeof(szAuto)-1 ); 
				if ( retValue )
					if ( 0 == strcmp( szAuto, "1" ) )
						if ( 2 == dwTemp2 )
							fAeDebugAuto = TRUE; 
			}
			__except( EXCEPTION_EXECUTE_HANDLER )
			{
				ESP = currentESP;
				dwTemp2 = 1;
				fAeDebugAuto = FALSE;
			} 
		} 
		if ( FALSE == fAeDebugAuto )
		{
			retValue=NtRaiseHardError(STATUS_UNHANDLED_EXCEPTION | 0x10000000,
				4, 0, &harderr,_BasepAlreadyHadHardError ? 1 : dwTemp2,
				&dwUseJustInTimeDebugger ); 
		}
		else
		{
			dwUseJustInTimeDebugger = 3;
			retValue = 0;
		} 
		if (retValue >= 0 && (dwUseJustInTimeDebugger == 3)
			&& (!_BasepAlreadyHadHardError)&&(!_BaseRunningInServerProcess)) 
		{
			_BasepAlreadyHadHardError = 1;
			SECURITY_ATTRIBUTES secAttr = { sizeof(secAttr), 0, TRUE };
			HANDLE hEvent = CreateEventA( &secAttr, TRUE, 0, 0 );
			memset( &startupinfo, 0, sizeof(startupinfo) );
			sprintf(szDbgCmdLine, szDbgCmdFmt, GetCurrentProcessId(), hEvent);
			startupinfo.cb = sizeof(startupinfo);
			startupinfo.lpDesktop = "Winsta0/Default" 
				CsrIdentifyAlertableThread(); // ??? 
			retValue = CreateProcessA( 0,           // 應用程序名稱
				szDbgCmdLine, // 命令行
				0, 0,          // 進程和線程安全屬性
				1,             // bInheritHandles
				0, 0,          // 創建標志、環境
				0,             // 當前目錄
				&statupinfo, // STARTUPINFO
				&pi);          // PROCESS_INFORMATION 
			if ( retValue && hEvent )
			{
				NtWaitForSingleObject( hEvent, 1, 0 );
				return EXCEPTION_CONTINUE_SEARCH;
			} 
		} 
		if ( _BasepAlreadyHadHardError )
			NtTerminateProcess(GetCurrentProcess(), pExcptRec->ExceptionCode); 
	} 
	return EXCEPTION_EXECUTE_HANDLER; 
} 

LPTOP_LEVEL_EXCEPTION_FILTER
SetUnhandledExceptionFilter(
		LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter )
{
	// _BasepCurrentTopLevelFilter是KERNEL32.DLL中的一個全局變量
	LPTOP_LEVEL_EXCEPTION_FILTER previous= _BasepCurrentTopLevelFilter; 
	// 設置為新值
	_BasepCurrentTopLevelFilter = lpTopLevelExceptionFilter; 
	return previous; // 返回以前的值 
} 	
  

  UnhandledExceptionFilter接下來的任務是確定進程是否運行于Win32調試器下。也就是進程的創建標志中是否帶有標志DEBUG_PROCESS或DEBUG_ONLY_THIS_PROCESS。它使用NtQueryInformationProcess函數來確定進程是否正在被調試,我在本月的Under the Hood專欄中講解了這個函數。如果正在被調試,UnhandledExceptionFilter就返回 EXCEPTION_CONTINUE_SEARCH,這告訴系統去喚醒調試器并告訴它在被調試程序(debuggee)中產生了一個異常。
  UnhandledExceptionFilter接下來調用用戶安裝的未處理異常過濾器(如果存在的話)。通常情況下,用戶并沒有安裝回調函數,但是用戶可以調用 SetUnhandledExceptionFilter這個API來安裝。上面我也提供了這個API的偽代碼。這個函數只是簡單地用用戶安裝的回調函數的地址來替換一個全局變量,并返回替換前的值。
  有了初步的準備之后,UnhandledExceptionFilter就開始做它的主要工作:用一個時髦的應用程序錯誤對話框來通知你犯了低級的編程錯誤。有兩種方法可以避免出現這個對話框。第一種方法是調用SetErrorMode函數并指定SEM_NOGPFAULTERRORBOX標志。另一種方法是將AeDebug子鍵下的Auto的值設為1。此時UnhandledExceptionFilter跳過應用程序錯誤對話框直接啟動AeDebug 子鍵下的Debugger的值所指定的調試器。如果你熟悉“即時調試(Just In Time Debugging,JIT)”的話,這就是操作系統支持它的地方。接下來我會詳細講。
大多數情況下,上面的兩個條件都為假。這樣UnhandledExceptionFilter就調用NTDLL.DLL中的 NtRaiseHardError函數。正是這個函數產生了應用程序錯誤對話框。這個對話框等待你單擊“確定”按鈕來終止進程,或者單擊“取消”按鈕來調試它。(單擊“取消”按鈕而不是“確定”按鈕來加載調試器好像有點顛倒了,可能這只是我個人的感覺吧。)
  如果你單擊“確定”,UnhandledExceptionFilter就返回EXCEPTION_EXECUTE_HANDLER。調用UnhandledExceptionFilter 的進程通常通過終止自身來作為響應(正像你在BaseProcessStart的偽代碼中看到的那樣)。這就產生了一個有趣的問題——大多數人都認為是系統終止了產生未處理異常的進程,而實際上更準確的說法應該是,系統進行了一些設置使得產生未處理異常的進程將自身終止掉了。
  UnhandledExceptionFilter執行時真正有意思的部分是當你單擊應用程序錯誤對話框中的“取消”按鈕,此時系統將調試器附加(attach)到出錯進程上。這段代碼首先調用 CreateEvent來創建一個事件內核對象,調試器成功附加到出錯進程之后會將此事件對象變成有信號狀態。這個事件句柄以及出錯進程的ID都被傳到 sprintf函數,由它將其格式化成一個命令行,用來啟動調試器。一切就緒之后,UnhandledExceptionFilter就調用 CreateProcess來啟動調試器。如果CreateProcess成功,它就調用NtWaitForSingleObject來等待前面創建的那個事件對象。此時這個調用被阻塞,直到調試器進程將此事件變成有信號狀態,以表明它已經成功附加到出錯進程上。UnhandledExceptionFilter函數中還有一些其它的代碼,我在這里只講重要的。

進入地獄

  如果你已經走了這么遠,不把整個過程講完對你有點不公平。我已經講了當異常發生時操作系統是如何調用用戶定義的回調函數的。我也講了這些回調的內部情況,以及編譯器是如何使用它們來實現__try和__except的。我甚至還講了當某個異常沒有被處理時所發生的情況以及系統所做的掃尾工作。剩下的就只有異常回調過程最初是從哪里開始的這個問題了。好吧,讓我們深入系統內部來看一下結構化異常處理的開始階段吧。
  圖十四是我為 KiUserExceptionDispatcher 函數和一些相關函數寫的偽代碼。這個函數在NTDLL.DLL中,它是異常處理執行的起點。為了絕對準確起見,我必須指出:剛才說的并不是絕對準確。例如在Intel平臺上,一個異常導致CPU將控制權轉到ring 0(0特權級,即內核模式)的一個處理程序上。這個處理程序由中斷描述符表(Interrupt Descriptor Table,IDT)中的一個元素定義,它是專門用來處理相應異常的。我跳過所有的內核模式代碼,假設當異常發生時CPU直接將控制權轉到了 KiUserExceptionDispatcher 函數。

圖十四 KiUserExceptionDispatcher 的偽代碼:

    KiUserExceptionDispatcher( PEXCEPTION_RECORD pExcptRec, CONTEXT * pContext )
{
	DWORD retValue; 
	// 注意:如果異常被處理,那么 RtlDispatchException 函數就不會返回
	if ( RtlDispatchException( pExceptRec, pContext ) )
		retValue = NtContinue( pContext, 0 );
	else
		retValue = NtRaiseException( pExceptRec, pContext, 0 ); 
	EXCEPTION_RECORD excptRec2;
	excptRec2.ExceptionCode = retValue;
	excptRec2.ExceptionFlags = EXCEPTION_NONCONTINUABLE;
	excptRec2.ExceptionRecord = pExcptRec;
	excptRec2.NumberParameters = 0; 
	RtlRaiseException( &excptRec2 );
} 

int RtlDispatchException( PEXCEPTION_RECORD pExcptRec, CONTEXT * pContext )
{
	DWORD stackUserBase;
	DWORD stackUserTop;
	PEXCEPTION_REGISTRATION pRegistrationFrame;
	DWORD hLog; 
	// 從FS:[4]和FS:[8]處獲取堆棧的界限
	RtlpGetStackLimits( &stackUserBase, &stackUserTop ); 
	pRegistrationFrame = RtlpGetRegistrationHead();
	while ( -1 != pRegistrationFrame )
	{
		PVOID justPastRegistrationFrame = &pRegistrationFrame + 8;
		if ( stackUserBase > justPastRegistrationFrame )
		{
			pExcptRec->ExceptionFlags |= EH_STACK_INVALID;
			return DISPOSITION_DISMISS; // 0
		} 
		if ( stackUsertop < justPastRegistrationFrame )
		{
			pExcptRec->ExceptionFlags |= EH_STACK_INVALID;
			return DISPOSITION_DISMISS; // 0
		} 
		if ( pRegistrationFrame & 3 ) // 確保堆棧按DWORD對齊
		{
			pExcptRec->ExceptionFlags |= EH_STACK_INVALID;
			return DISPOSITION_DISMISS; // 0
		} 
		if ( someProcessFlag )
		{
			hLog = RtlpLogExceptionHandler( pExcptRec, pContext, 0,
				pRegistrationFrame, 0x10 );
		} 
		DWORD retValue, dispatcherContext; 
		retValue= RtlpExecuteHandlerForException(pExcptRec, pRegistrationFrame,
			pContext, &dispatcherContext,
			pRegistrationFrame->handler ); 
		if ( someProcessFlag )
			RtlpLogLastExceptionDisposition( hLog, retValue ); 
		if ( 0 == pRegistrationFrame )
		{
			pExcptRec->ExceptionFlags &= ~EH_NESTED_CALL; // 關閉標志
		} 
		EXCEPTION_RECORD excptRec2;
		DWORD yetAnotherValue = 0; 
		if ( DISPOSITION_DISMISS == retValue )
		{
			if ( pExcptRec->ExceptionFlags & EH_NONCONTINUABLE )
			{
				excptRec2.ExceptionRecord = pExcptRec;
				excptRec2.ExceptionNumber = STATUS_NONCONTINUABLE_EXCEPTION;
				excptRec2.ExceptionFlags    = EH_NONCONTINUABLE;
				excptRec2.NumberParameters = 0;
				RtlRaiseException( &excptRec2 );
			}
			else
				return DISPOSITION_CONTINUE_SEARCH;
		}
		else if ( DISPOSITION_CONTINUE_SEARCH == retValue )
		{}
		else if ( DISPOSITION_NESTED_EXCEPTION == retValue )
		{
			pExcptRec->ExceptionFlags |= EH_EXIT_UNWIND;
			if ( dispatcherContext > yetAnotherValue )
				yetAnotherValue = dispatcherContext;
		}
		else // DISPOSITION_COLLIDED_UNWIND
		{
			excptRec2.ExceptionRecord = pExcptRec;
			excptRec2.ExceptionNumber = STATUS_INVALID_DISPOSITION;
			excptRec2.ExceptionFlags    = EH_NONCONTINUABLE;
			excptRec2.NumberParameters = 0;
			RtlRaiseException( &excptRec2 );
		} 
		pRegistrationFrame = pRegistrationFrame->prev; // 轉到前一個幀
	} 
	return DISPOSITION_DISMISS;
} 
_RtlpExecuteHandlerForException: // 處理異常(第一次) 
MOV EDX,XXXXXXXX
JMP ExecuteHandler 
RtlpExecutehandlerForUnwind: // 處理展開(第二次) 
MOV EDX,XXXXXXXX 

int ExecuteHandler( PEXCEPTION_RECORD pExcptRec,
		   PEXCEPTION_REGISTRATION pExcptReg,
		   CONTEXT * pContext,
		   PVOID pDispatcherContext,
		   FARPROC handler ) // 實際上是指向_except_handler()的指針
{
	// 安裝一個EXCEPTION_REGISTRATION幀,EDX指向相應的handler代碼
	PUSH EDX
		PUSH FS:[0]
	MOV FS:[0],ESP 
		// 調用異常處理回調函數
		EAX = handler( pExcptRec, pExcptReg, pContext, pDispatcherContext ); 
	// 移除EXCEPTION_REGISTRATION幀
	MOV ESP,DWORD PTR FS:[00000000]
	POP DWORD PTR FS:[00000000] 
	return EAX;
} 
_RtlpExecuteHandlerForException使用的異常處理程序:
{
	// 如果設置了展開標志,返回DISPOSITION_CONTINUE_SEARCH
	// 否則,給pDispatcherContext賦值并返回DISPOSITION_NESTED_EXCEPTION 
	return pExcptRec->ExceptionFlags & EXCEPTION_UNWIND_CONTEXT ?
DISPOSITION_CONTINUE_SEARC : ( *pDispatcherContext = 
			 pRegistrationFrame->scopetable,
			 DISPOSITION_NESTED_EXCEPTION );
} 

_RtlpExecuteHandlerForUnwind使用的異常處理程序:
{
	// 如果設置了展開標志,返回DISPOSITION_CONTINUE_SEARCH
	// 否則,給pDispatcherContext賦值并返回DISPOSITION_COLLIDED_UNWIND 
	return pExcptRec->ExceptionFlags & EXCEPTION_UNWIND_CONTEXT ?
DISPOSITION_CONTINUE_SEARCH : ( *pDispatcherContext = 
			  pRegistrationFrame->scopetable,
			  DISPOSITION_COLLIDED_UNWIND );
} 

  

  KiUserExceptionDispatcher 的核心是對 RtlDispatchException 的調用。這拉開了搜索已注冊的異常處理程序的序幕。如果某個處理程序處理這個異常并繼續執行,那么對 RtlDispatchException 的調用就不會返回。如果它返回了,只有兩種可能:或者調用了NtContinue以便讓進程繼續執行,或者產生了新的異常。如果是這樣,那異常就不能再繼續處理了,必須終止進程。
  現在把目光對準 RtlDispatchException 函數的代碼,這就是我通篇提到的遍歷異常幀的代碼。這個函數獲取一個指向EXCEPTION_REGISTRATION 結構鏈表的指針,然后遍歷此鏈表以尋找一個異常處理程序。由于堆棧可能已經被破壞了,所以這個例程非常謹慎。在調用每個EXCEPTION_REGISTRATION結構中指定的異常處理程序之前,它確保這個結構是按DWORD對齊的,并且是在線程的堆棧之中,同時在堆棧中比前一個EXCEPTION_REGISTRATION結構高。
  RtlDispatchException并不直接調用EXCEPTION_REGISTRATION結構中指定的異常處理程序。相反,它調用 RtlpExecuteHandlerForException來完成這個工作。根據RtlpExecuteHandlerForException的執行情況,RtlDispatchException或者繼續遍歷異常幀,或者引發另一個異常。這第二次的異常表明異常處理程序內部出現了錯誤,這樣就不能繼續執行下去了。
  RtlpExecuteHandlerForException的代碼與RtlpExecuteHandlerForUnwind的代碼極其相似。你可能會回憶起來在前面討論展開時我提到過它。這兩個“函數”都只是簡單地給EDX寄存器加載一個不同的值然后就調用ExecuteHandler函數。也就是說,RtlpExecuteHandlerForException和RtlpExecuteHandlerForUnwind都是 ExecuteHanlder這個公共函數的前端。
  ExecuteHandler查找EXCEPTION_REGISTRATION結構的handler域的值并調用它。令人奇怪的是,對異常處理回調函數的調用本身也被一個結構化異常處理程序封裝著。在SEH自身中使用SEH看起來有點奇怪,但你思索一會兒就會理解其中的含義。如果在異常回調過程中引發了另外一個異常,操作系統需要知道這個情況。根據異常發生在最初的回調階段還是展開回調階段,ExecuteHandler或者返回DISPOSITION_NESTED_EXCEPTION,或者返回DISPOSITION_COLLIDED_UNWIND。這兩者都是“紅色警報!現在把一切都關掉!”類型的代碼。
  如果你像我一樣,那不僅理解所有與SEH有關的函數非常困難,而且記住它們之間的調用關系也非常困難。為了幫助我自己記憶,我畫了一個調用關系圖(圖十五)。

圖十五 在SEH中是誰調用了誰

    KiUserExceptionDispatcher()
	RtlDispatchException()
		RtlpExecuteHandlerForException()
			ExecuteHandler() // 通常到 __except_handler3

__except_handler3()
	scopetable filter-expression()
	__global_unwind2()
		RtlUnwind()
			RtlpExecuteHandlerForUnwind()
	scopetable __except block()
  

  現在要問:在調用ExecuteHandler之前設置EDX寄存器的值有什么用呢?這非常簡單。如果ExecuteHandler在調用用戶安裝的異常處理程序的過程中出現了什么錯誤,它就把EDX指向的代碼作為原始的異常處理程序。它把EDX寄存器的值壓入堆棧作為原始的 EXCEPTION_REGISTRATION結構的handler域。這基本上與我在MYSEH和MYSEH2中對原始的結構化異常處理的使用情況一樣。

結論

  結構化異常處理是Win32一個非常好的特性。多虧有了像Visual C++之類的編譯器的支持層對它的封裝,一般的程序員才能付出比較小的學習代價就能利用SEH所提供的便利。但是在操作系統層面上,事情遠比Win32文檔說的復雜。
  不幸的是,由于人人都認為系統層面的SEH是一個非常困難的問題,因此至今這方面的資料都不多。在本文中,我已經向你指出了系統層面的SEH就是圍繞著簡單的回調在打轉。如果你理解了回調的本質,在此基礎上分層理解,系統層面的結構化異常處理也不是那么難掌握。


附錄:關于 “prolog 和 epilog ”

在 Visual C++ 文檔中,微軟對 prolog 和 epilog 的解釋是:“保護現場和恢復現場” 此附錄摘自微軟 MSDN 庫,詳細信息參見:

    
      http://msdn.microsoft.com/en-us/library/tawsa7cb(VS.80).aspx
    
    (英文)
  
    
      http://msdn.microsoft.com/zh-cn/library/tawsa7cb(VS.80).aspx
    
    (中文)
  

  每個分配堆棧空間、調用其他函數、保存非易失寄存器或使用異常處理的函數必須具有 Prolog,Prolog 的地址限制在與各自的函數表項關聯的展開數據中予以說明(請參見異常處理 (x64))。Prolog 將執行以下操作:必要時將參數寄存器保存在其內部地址中;將非易失寄存器推入堆棧;為局部變量和臨時變量分配堆棧的固定部分;(可選)建立幀指針。關聯的展開數據必須描述 Prolog 的操作,必須提供撤消 Prolog 代碼的影響所需的信息。
  如果堆棧中的固定分配超過一頁(即大于 4096 字節),則該堆棧分配的范圍可能超過一個虛擬內存頁,因此在實際分配之前必須檢查分配情況。為此,提供了一個特殊的例程,該例程可從 Prolog 調用,并且不會損壞任何參數寄存器。
  保存非易失寄存器的首選方法是:在進行固定堆棧分配之前將這些寄存器移入堆棧。如果在保存非易失寄存器之前執行了固定堆棧分配,則很可能需要 32 位位移以便對保存的寄存器區域進行尋址(據說寄存器的壓棧操作與移動操作一樣快,并且在可預見的未來一段時間內都應該是這樣,盡管壓棧操作之間存在隱含的相關性)。可按任何順序保存非易失寄存器。但是,在 Prolog 中第一次使用非易失寄存器時必須對其進行保存。

典型的 Prolog 代碼可以為:

    mov [RSP + 8], RCX
push R15
push R14
push R13
sub RSP, fixed-allocation-size
lea R13, 128[RSP]
...
  

  此 Prolog 執行以下操作:將參數寄存器 RCX 存儲在其標識位置;保存非易失寄存器 R13、R14、R15;分配堆棧幀的固定部分;建立幀指針,該指針將 128 字節地址指向固定分配區域。使用偏移量以后,便可以通過單字節偏移量對多個固定分配區域進行尋址。
  如果固定分配大小大于或等于一頁內存,則在修改 RSP 之前必須調用 helper 函數。此 __chkstk helper 函數負責探測待分配的堆棧范圍,以確保對堆棧進行正確的擴展。在這種情況下,前面的 Prolog 示例應變為:

    mov [RSP + 8], RCX
push R15
push R14
push R13
mov RAX, fixed-allocation-size
call __chkstk
sub RSP, RAX
lea R13, 128[RSP]
..
  

  .除了 R10、R11 和條件代碼以外,此 __chkstk helper 函數不會修改任何寄存器。特別是,此函數將返回未更改的 RAX,并且不會修改所有非易失寄存器和參數傳遞寄存器。
  Epilog 代碼位于函數的每個出口。通常只有一個 Prolog,但可以有多個 Epilog。Epilog 代碼執行以下操作:必要時將堆棧修整為其固定分配大小;釋放固定堆棧分配;從堆棧中彈出非易失寄存器的保存值以還原這些寄存器;返回。
  對于展開代碼,Epilog 代碼必須遵守一組嚴格的規則,以便通過異常和中斷進行可靠的展開。這樣可以減少所需的展開數據量,因為描述每個 Epilog 不需要額外數據。通過向前掃描整個代碼流以標識 Epilog,展開代碼可以確定 Epilog 正在執行。
如果函數中沒有使用任何幀指針,則 Epilog 必須首先釋放堆棧的固定部分,彈出非易失寄存器,然后將控制返回調用函數。例如,

    add RSP, fixed-allocation-size
pop R13
pop R14
pop R15
ret
  

  如果函數中使用了幀指針,則在執行 Epilog 之前必須將堆棧修整為其固定分配。這在技術上不屬于 Epilog。例如,下面的 Epilog 可用于撤消前面使用的 Prolog:

    lea RSP, -128[R13]
; epilogue proper starts here
add RSP, fixed-allocation-size
pop R13
pop R14
pop R15
ret
  

在實際應用中,使用幀指針時,沒有必要分兩個步驟調整 RSP,因此應改用以下 Epilog:

    lea RSP, fixed-allocation-size – 128[R13]
pop R13
pop R14
pop R15
ret
  

  以上是 Epilog 的唯一合法形式。它必須由 add RSP,constant 或 lea RSP,constant[FPReg] 組成,后跟一系列零或多個 8 字節寄存器 pop、一個 return 或一個 jmp。(Epilog 中只允許 jmp 語句的子集。僅限于具有 ModRM 內存引用的 jmp 類,其中 ModRM mod 字段值為 00。在 ModRM mod 字段值為 01 或 10 的 Epilog 中禁止使用 jmp。有關允許使用的 ModRM 引用的更多信息,請參見“AMD x86-64 Architecture Programmer’s Manual Volume 3: General Purpose and System Instructions”(AMD x86-64 結構程序員手冊第 3 卷:通用指令和系統指令)中的表 A-15。)不能出現其他代碼。特別是,不能在 Epilog 內進行調度,包括加載返回值。
  請注意,未使用幀指針時,Epilog 必須使用 add RSP,constant 釋放堆棧的固定部分,而不能使用 lea RSP,constant[RSP]。由于此限制,在搜索 Epilog 時展開代碼具有較少的識別模式。
  通過遵守這些規則,展開代碼便可以確定某個 Epilog 當前正在執行,并可以模擬該 Epilog 其余部分的執行,從而允許重新創建調用函數的上下文。

Win32 結構化異常處理(SEH)探秘


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 天堂中文在线网 | 午夜激情剧场 | 欧洲日韩在线 | 欧美饥渴熟妇高潮喷水水 | 丁香五月激情缘综合区 | 国产成人av电影在线观看第一页 | 成人福利一区 | 人妻av中文字幕一区二区三区 | 亚洲一区二区三区成人网站 | 亚洲第一综合网站 | 国产三级午夜理伦三级连载时间 | www日本在线观看 | 黑人性猛交 | 一级片免费在线播放 | 亚洲成人在线视频观看 | 91精品国产美女在线观看 | 日韩女同强女同hd | 2020国产激情视频在线观看 | 中文字幕在线观看网站 | 人妻无码一区二区三区 | 亚洲成人第一页 | 偷窥 亚洲 另类 图片 熟女 | 欧美午夜激情在线 | 污污污www精品国产网站 | 极品人妻少妇一区二区三区 | 91视频免费| 丁香一区二区三区 | 丁香花中文字幕mv在线免费观看 | 国产成人精品高清在线观看99 | 中文字幕成人 | 国产少妇高潮视频 | 亚洲国产精品久久久久婷蜜芽 | 在线免费黄色片 | 一本色道久久综合狠狠躁篇 | 羞羞色院91精品网站 | 亚洲成熟少妇视频在线观看 | 西西午夜无码大胆啪啪国模 | 少妇扒开双腿让我看个够 | 日本精品三级 | www毛片| 丝袜+亚洲+另类+欧美+变态 | 福利一级片 | 44444kk在线观看三免费 | www.chengren.com | 九七人人爽 | 国产三级久久久久 | 人伦片无码中文字 | 久久精品人人做人人爽电影蜜月 | 亚洲国产精品久久久久久无码 | 高潮内射免费看片 | 精品国产成人国产在线观看 | 欧美变态口味重另类在线视频 | 婷婷夜色潮精品综合在线 | 国产偷久久一级精品60部 | 欧美日韩在线观看一区 | 亚洲国产精品久久久久久久久久久 | 日韩视频在线观看免费视频 | 成人奭片免费观看 | 欧美亚洲另类图片 | 欧美老熟妇506070乱子 | 欧美巨大巨粗黑人性aaaaaa | 好男人在线社区www在线播放 | 国产精品午夜福利麻豆 | 日本午夜网站 | 亚洲中文字幕国产综合 | 巨爆乳中文字幕巨爆区巨爆乳无码 | 久久久久人妻精品一区蜜桃网站 | xxxxx在线观看 | 亚洲激情黄色 | 天天色综合天天 | 亚洲国产精品久久久久秋霞 | 欧美精品亚洲精品日韩专区 | 欧美在线一二区 | 伊人婷婷六月狠狠狠去 | av中文字幕一区人妻 | 精品视频免费在线观看 | 国产在线拍| 日本高清免费的不卡视频 | 日日摸日日碰夜夜爽无码 | 亚洲人成色77777在线观看大战p | av网站的免费观看 | 黄色欧美视频 | 久久免费精品国自产拍网站 | 男人看片 | 日韩精品久久久久久久 | 精人妻无码一区二区三区 | 粉嫩粉嫩一区性色av片 | 辟里啪啦国语版免费观看 | 网址色 | 酒店大战丝袜高跟鞋人妻 | 久久乐国产精品亚洲综合 | 亚洲国产日韩一区三区 | 亚洲国产成人精品激情姿源 | 青青草官网 | 怡红院亚洲第一综合久久 | 五月婷婷视频在线 | 国产综合视频一区二区三区 | 狠狠色噜噜狠狠狠狠97首创麻豆 | 91视频这里只有精品 | 永久免费精品精品永久-夜色 | 人人狠狠综合久久亚洲爱咲 | 浪荡女天天不停挨cao日常视频 | 最新精品视频2019在线视频 | 亚洲第一成人网站 | 一区二区三区入口 | 久久艹国产 | 日本精品视频一区二区三区四区 | 在线观看不卡一区 | 苏小妍直播漏内裤 | 久久网站精品 | 色综合1| 国产福利日本一区二区三区 | 日本免费精品视频 | 国产精品后入内射日本在线观看 | 久久精品视频在线看4 | 伊人久久综合给合综合久久 | 女人摸下面自熨视频在线播放 | 乌克兰少妇videos高潮 | 成人作爱视频 | 欧美性插b在线视频网站 | 日本道中文字幕 | av在线不卡免费看 | 国产精品丝袜黑色高跟鞋 | 日韩免费码中文在线观看 | 久久精品亚洲精品国产色婷 | 亚洲不卡在线视频 | 激情视频网站在线观看 | 乱肉合集乱高h久久爱 | 午夜内射高潮视频 | 午夜精品久久久久久久99老熟妇 | 少妇粉嫩小泬白浆流出 | 天堂在/线中文在线资源 官网 | 久久国产露脸精品国产 | 无码精品人妻一区二区三区av | 天天曰天天躁天天摸孕妇 | 黄色三级网站 | av免费观看网站 | 亚洲午夜精品在线观看 | www.999精品| 亚洲乱码日产精品bd | 又爽又黄又无遮掩的免费视频 | 色偷偷激情日本亚洲一区二区 | 欧美精品中文 | av专区在线 | 黄色特级毛片 | 国产拍揄自揄免费观看 | 日韩免费成人 | 国产又黄又爽又猛免费视频播放 | 久久精品九九热无码免贵 | 精品久久人人 | 玩弄白嫩少妇xxxxx性 | 少妇被粗大的猛进69视频 | 日本一本到道免费一区二区 | 人人爽人人模人人人爽人人爱 | 日韩精品视频在线播放 | 久久久精品人妻一区二区三区四 | 无码人妻精品一区二区三区东京热 | 四虎永久在线高清国产精品 | 成人日韩av | 久久精品国产2020观看福利 | 国产男女猛烈视频在线观看 | 女色婷婷网 | 久久亚洲一区二区三区舞蹈 | 国产高清午夜人成在线观看 | 国产成人精品电影在线观看 | 国产91精品一区二区麻豆亚洲 | 在线免费观看日韩 | 亚洲成人在线视频观看 | 国产婷婷色一区二区三区四区 | 国产变态口味重另类 | 极品少妇被啪到呻吟喷水 | 国产男女精品视频 | 男人女人黄 色视频一级香蕉 | 成人午夜精品无码一区二区三区 | 女教师淫辱の教室蜜av臀 | 少妇做爰免费视频了 | 成人午夜无码专区性视频性视频 | 国产毛片高清 | 亚洲国产欧美国产综合久久 | 成人18aa黄漫免费观看 | 国产成人av在线影院 | 少妇无码一区二区三区免费 | 日韩欧美在线视频观看 | 国产精品a无线 | 在线视频观看一区 | 日韩va视频 | 成人午夜电影福利免费 | www久久久久 | 天天射日日操 | 久久99亚洲网美利坚合众国 | www.天堂在线 | 91免费版看片 | 日韩精品网站 | 91精品国产综合久久国产大片 | 国产深夜福利视频在线 | 在线播放免费人成视频在线观看 | 成人免费xxxxx在线观看 | 丰满诱人的少妇3伦理 | 国产又黄又猛又粗又爽的a片动漫 | 成人亚洲一区二区三区在线 | 久久精品国产一区二区无码 | 欧美在线看 | 无翼乌工口肉肉无遮挡无码18 | 久久九九久精品国产 | 天天艹天天 | 成本人h无码播放私人影院 动漫一品二品精区在线 | 日本三级黄色中文字幕 | 亚洲国产精品国语在线 | 新普新京亚洲欧美日韩国产 | 国产午夜男女爽爽爽爽爽 | 欧美成人一区二区三区在线观看 | 亚洲国产精品隔壁老王 | 国产偷抇久久精品a片69麻豆 | 国产精品久久久久久久久久久久 | 美女黄频久久 | 久久久精品午夜免费不卡 | 白峰美羽一区二区三区 | 91片黄在线观看 | 666av视频在线观看 | 成人区人妻精品一区二区不卡网站 | 黑人性较视频免费视频 | 日韩欧美偷拍高跟鞋精品一区 | 少妇高潮大片免费观看 | 久草热久草在线 | 三级全黄的视频在线观看 | 日韩porn | 五码亚洲 | 五月激情开心网 | 欧洲少妇bbbbb曰曰 | 久久不见久久见www免费视频 | a三级三级成人网站在线视频 | 久久精品无码一区二区三区不卡 | 精品女同一区二区免费播放 | 欧美 亚洲 丝袜 清纯 中文 | 字幕网在线观看 | 中文字幕视频网 | 色天天干| 波多野结衣久久精品99e | 国产偷人视频免费 | 成人无码视频在线观看大全 | 午夜伦理视频 | 成人必看www. | 欧美成人精品第一区二区三区 | 激情网站免费 | 亚洲毛片不卡av在线播放一区 | 日韩免费视频一区二区 | 国产精品久久久久久久久齐齐 | 五月香 | 午夜色综合 | 亚洲欧洲国产综合aⅴ无码 自拍视频第一页 | 黑人精品一区二区 | 国内精品免费久久久久电影院97 | 亚洲欧美牲交 | 久久夜av | 国产成人久久综合第一区 | 白嫩无码人妻丰满熟妇啪啪区百度 | 国产美女无遮挡免费软件 | 色诱亚洲精品久久久久久 | 亚洲龙腾yy精品小说网 | 无遮挡男女激烈动态图 | 亚洲中文字幕无线无码毛片 | 亚洲欧美午夜理论电影在线观看 | 鸭子tv国产在线永久播放 | 乌克兰av在线 | av免费网 | 精品综合久久久久久888蜜芽 | 少妇白浆呻吟爽 | 亚洲鲁丝片一区二区三区 | 久久久人人爽 | 亚洲精品视频一区二区三区 | xxx偷拍撒尿xxxx | 亚洲女同吃奶 | 国产高清不卡无码视频 | 国产精品色午夜免费视频 | 人妻av无码专区久久 | 成人激情av在线 | 操批网站| 人妻精品动漫h无码网站 | 91爱国产| 东京热无码一区二区三区av | 中文字幕第三页 | 亚洲日韩欧美一区久久久久我 | 热の综合热の国产热の潮在线 | 亚洲国产综合久久久 | 大香网伊人久久综合网2018 | 亚洲电影区图片区小说区 | 国产自偷自拍视频 | 青青av | 国av在线| 亚洲天天影视 | 18禁肉肉无遮挡无码网站 | 久久r视频 | 日本免费一区二区三区 | www.麻豆视频 | 黄色毛片网站 | 日本熟妇大屁股人妻 | 日韩欧美加勒比 | 国产色婷婷久久99精品91 | 中文字幕一区二 | 99视频在线精品免费观看2 | 在线高清亚洲精品二区 | www.youjizz.com亚洲| 欧美精品在线免费 | 精品人妻少妇一区二区三区 | 97人人超人人超免费国产 | 中文字幕热久久久久久久 | 免费日韩毛片 | 欧美人与动人物牲交免费观看久久 | 国产一区视频免费在线观看 | 91精品视频免费观看 | 亚洲国产成人综合精品 | 亚洲中文字幕无线无码毛片 | 男ji大巴进入女人的视频 | 免费人成自慰网站 | 亚洲高清在线观看视频 | 亚洲欧美人成网站aaa | 九九热这里只有精品6 | 乱中年女人伦 | 中文字幕久久精品无码 | 无码国产精品久久一区免费 | 五月婷婷丁香六月 | 国产日本一级二级三级 | 亚洲国产亚洲 | 婷婷久久综合网 | 国产理论影院 | 97在线播放视频 | 中文字幕视频在线观看10页 | 深夜成人福利视频 | 欧美人成精品网站播放 | 瑟瑟视频在线免费观看 | 蝌蚪自拍网站 | 一区色| 久草福利在线视频 | 日皮视频免费看 | 肥婆av | 91在线精品秘密一区二区 | 天天干夜夜操 | 亚洲美女爱爱视频 | 成人精品一区二区三区电影免费 | 欧美三级大片 | 91秒拍国产福利一区 | 91在线观 | 天堂99| 免费看一级视频 | 波多野结衣乳巨码无在线观看 | 免费a黄色 | 亚洲∧v久久久无码精品 | 久久精品av一区二区免费 | 婷婷欧美 | 亚洲国产精品久久亚洲精品 | 国产精品1区2区 | 一本一道色欲综合网中文字幕 | 又粗又色又爽一区二区三区 | 亚洲熟妇无码爱v在线观看 久久久av男人的天堂 | 婷婷夜色潮精品综合在线 | 精品福利一区二区三区免费视频 | 国产精品久久久久久久福利竹菊 | 国产八十老太另类视频 | 亚洲国产精品热久久 | 日韩国产成人无码av毛片 | 99久在线| 欧美3p两根一起进高清免费视频 | 久久久看片 | eeuss鲁片一区二区三区在线观看 | 国产午夜成人无码免费看 | 欧洲亚洲视频 | 欧美性bbw | 亚洲人成网站在线播放大全 | 日本一卡二卡不卡视频查询 | 日韩无码电影 | 免费午夜视频 | 精品三级在线 | 国产精品美女久久久 | 黑人巨大精品欧美一区二区 | 国产精品999. | 中文字幕人妻熟女人妻洋洋 | 日本在线播放一区二区 | 婷婷五月六月激情综合色中文字幕 | 久热免费 | 久草视频免费播放 | 国产一级手机毛片 | 狠狠色丁香婷婷综合欧美 | 中文无遮挡h肉视频在线观看 | 国产麻豆一区二区三区在线观看 | 人妻人人做人碰人人添 | 懂色av懂色aⅴ精彩av | 操操网av| 一本在线道 | 日韩三区四区 | 欧洲丰满大乳人妻无码欧美 | 一边摸一边吃奶一边做爽 | 日本国产三级xxxxxx | 成人免费无码精品国产电影 | 欧美顶级少妇做爰高跟 | 欧美精品1 | 曰本丰满熟妇xxxx性 | 热久久av | 九九综合九九综合 | 亚洲专区中文字幕 | 免费观看黄色一级视频 | 亚洲中文字幕无码久久2017 | 久久老子午夜精品无码怎么打 | 无码国产精品一区二区免费i6 | 中文字幕自拍偷拍 | 亚洲娇小与黑人巨大交 | 欧美色人阁 | 亚洲天堂免费视频 | 黄av在线 | 偷拍亚洲另类 | 国产私人影院 | 免费毛片无需任何播放器 | 日韩精品无码一区二区三区四区 | 亚洲欧美国产另类视频 | 久久久久久久久久久久福利 | 国产第一福利 | 午夜视频在线观看免费完整版 | 欧美高清性色生活片 | 亚洲r成人av久久人人爽澳门赌 | 亚洲人成电影网站色mp4 | 成人乱人伦视频在线观看 | 精品久久久久久久久久国产潘金莲 | 午夜亚洲影院在线观看 | 成人免费一区二区三区视频 | 午夜在线影院 | 亚洲制服有码在线丝袜 | 中文字幕在线观看日本 | 天天骑夜夜操 | 日韩三级免费观看 | 91玉足脚交白嫩脚丫在线播放 | 操碰av| 国产成人一区二区 | 中文天堂在线最新版在线www | 亚洲 欧美 清纯 校园 另类 | 亚洲欧洲日产国码av系列天堂 | 亚洲永久视频 | 人妻有码精品视频在线 | 人成午夜大片免费视频 | 国产天天爽 | 国产女同互磨高潮在线观看 | 欧美网站在线观看 | 亚洲成av 人片在线观看无码 | 夜夜综合 | 免费在线观看毛片网站 | 亚洲天堂| 国产高清在线精品一区 | 日韩欧美网 | 超碰在线进入 | v一区无码内射国产 | 中文字幕免费播放 | 中文字幕日本六区小电影 | 亚洲第一成人网站 | 欧美亚洲另类 丝袜综合网 香蕉久久夜色精品 | 成人一区二区毛片 | 日本在线视频一区 | 久久伊人免费视频 | 亚洲国产v高清在线观看 | 总裁各种姿势顶弄呻吟h1v1 | 成人羞羞国产免费软件小说 | 免费观看成人欧美www色 | 一本一本久久a久久精品 | www.激情网| 在线久| 国产精品黄色大片 | 国产精品国产三级国产aⅴ浪潮 | 久久欧美与黑人双交男男 | 日韩a片无码一区二区五区电影 | 亚洲一区二区二区久久成人婷婷 | 无码专区heyzo色欲av | 91精品国产爱久久丝袜脚 | 久久久久99人妻一区二区三区 | 97精品国产97久久久久久免费 | 国产69精品久久久久久久久久 | 91深夜福利| 久久精品国产欧美日韩99热 | 人妻 丝袜美腿 中文字幕 | 国产69精品久久久久人妻刘玥 | 狠狠草视频 | 四虎精品 在线 成人 影院 | 国产精品国产三级国产剧情 | 亚洲人成绝费网站色www吃脚 | 老司机久久精品视频 | 亚洲成人在线免费 | 欧美乱妇高清无乱码免费 | 亚欧在线免费观看 | 国产精品99久久久久久宅男 | 亚洲妇女自偷自偷图片 | 99热这里| 影音先锋大型av资源 | 欧美成人a猛片 | 少妇放荡的呻吟干柴烈火动漫 | 91久久久久久亚洲精品蜜桃 | 欧美三日本三级少妇99 | 国产妇女乱码一区二区三区 | 天天操2018 | 日韩欧美一区二区三区久久婷婷 | 午夜黄色福利 | 欧美日韩一区二区免费视频 | 日本亚洲欧美综合在线 | 一区二区在线免费播放 | 毛片黄片免费观看 | 国产69精品久久久久9999 | 天堂资源在线观看免费高清视频 | 国产又黄又猛又粗又爽的小说网站 | 国产无限次数成版人视频在线 | 色综合图区 | 久久99久久99小草精品免视看 | 伊人色在线 | 久久新视频 | 女人大荫蒂毛茸茸视频 | 老司机午夜精品视频无码 | 国产成人精品日本亚洲77美色 | 国产乱码精品一区二区三区中文 | 啪视频在线观看 | 国产黄网永久免费视频大全 | 亚洲第一综合网址网址 | 50岁熟妇大白屁股真爽 | 国产性色的免费视频网站 | 亚洲性一区 | 免费三级av | 亚洲精品久久av无码麻 | 狂野欧美性猛交免费视频 | www.伦理少妇 | 五月婷婷之综合激情 | jlzzjlzzjlzz亚洲人 | 欧美极品少妇xxxxⅹ喷水 | av蓝导航精品导航 | 四虎影视在线永久免费观看 | 日韩伦理在线视频 | 日韩区欧美区 | 少妇第一次交换又紧又爽 | 97人妻无码一区二区精品免费 | 国产成人欧美一区二区三区 | 日韩成人av中文字幕 | 亚洲国产拍拍拍拍久久久 | 日韩黄色在线免费观看 | 国产高清无套内谢免费 | 亚洲一区二区三区在线观看网站 | 色婷婷国产精品免费网站 | 国产动作大片中文字幕 | 国产美女亚洲精品久久久99 | 欧美婷婷综合 | 狠狠色丁香婷婷综合尤物 | 久久天天躁夜夜躁狠狠i女人 | 91精品国产综合婷婷香蕉 | 欧美丰腴丰满大屁股熟妇 | 人与鲁性猛交xxxx | 天天躁日日躁狠狠躁av麻豆男男 | 真多人做人爱视频高清免费 | 欧洲性生活片 | 无码人妻丰满熟妇啪啪网不卡 | 天天躁狠狠躁狠狠躁性色牛牛影视 | 国产尤物精品福利视频 | 国产精品无码久久av不卡 | 欧美高清视频一区二区三区 | 国产精品成人免费视频一区 | 久久影院综合精品 | 色一二三区 | 国产极品自拍 | 欧洲美女黑人粗性暴交 | 狠狠色狠狠色综合 | 国产suv精品一区二区88l | 天天av天天干| x88av乱视频| 91视频久久久久久 | 天干啦夜天干天干在线线 | 亚洲第一页综合 | 永久av在线免费观看 | 久久久精品人妻无码专区不卡 | 国产区亚洲一区在线观看 | 日韩内射美女人妻一区二区三区 | 57pao国产精品一区 | 欧美在线免费看 | 精品免费久久久国产一区 | 伊人高清 | 国产偷伦视频片免费视频 | 欧美日韩亚洲一区二区三区 | 亚洲成av人片在线观看天堂无码 | 就操网| 日韩第二页 | avtt天堂在线 | 天天综合色 | 日韩欧美亚洲综合久久影院 | 亚欧美无遮挡hd高清在线视频 | 久久久久se色偷偷亚洲精品av | 97狠狠| 中午字幕无线码一区2020 | 欧美、另类亚洲日本一区二区 | 国产精品入口免费软件 | 国产欧美精品一区二区三区 | 欧美激情第八页 | 美女人妻激情乱人伦 | 极品粉嫩鲍鱼视频在线观看 | 韩日av在线 | 精品亚洲欧美自拍 | 国产成人精品久久久一区二区三区 | 在线а√天堂中文官网 | 国产女精品视频网站免费 | 欧美熟妇乱子伦xx视频 | 亚洲人成色在线观看 | 久草在线视频网 | 亚洲人成色77777在线观看 | 国产国拍亚洲精品永久软件 | 大乳丰满人妻中文字幕日本 | 欧美激情福利 | 日本爽爽爽爽爽爽在线观看免 | 91在线porny国产在线看 | 色又黄又爽18禁免费视频 | 最新中文字幕日本 | 成人午夜精品福利免费 | 韩国所有三级艳星列表 | 精品国产成人亚洲午夜福利 | 欧美 日韩 视频 | 毛片手机在线观看 | 国内精品乱码卡一卡2卡三卡 | 亚洲综合久久一本伊一区 | 91av99| 免费在线观看毛片网站 | 国产理论| 亚洲人女同志奶水 | 国产精品992tv在线观看 | 久久不见久久见免费视频1′ | 啊轻点内射在线视频 | 激情综合网址 | 天堂资源地址在线 | 日本不卡高清一区二区三区 | 婷婷六月久久综合丁香 | 国产强被迫伦姧在线观看无码 | 操综合| 国产传媒自拍 | 97视频热人人精品免费 | 男女裸体影院高潮 | 午夜成人1000部免费视频 | 奇米777四色成人影视 | 香蕉久久av一区二区三区app | 精品国产午夜理论片不卡 | 人与动物黄色大片 | av日韩一区| 亚洲aaa级| 国产suv精二区九色 成人午夜视频网站 | 免费观看成人www动漫视频 | 欧美颜射内射中出口爆在线 | 丝袜无码一区二区三区 | 青青草国产成人99久久 | 九九欧美 | 免费啪视频在线观看 | 777久久久精品一区二区三区 | 久热99 | 中文字幕99页 | 中文字幕亚洲色妞精品天堂 | 国产成人综合美国十次 | 五月婷婷中文字幕 | 日本真人无遮挡啪啪免费 | 日韩精品一区二区三区亚洲综合 | 激情小说dvd | 亚洲日韩在线中文字幕线路2区 | 一本色道久久88一综合免费 | 97zyz成人免费视频 | 国产麻豆精品免费喷白浆视频 | 少妇无码av无码专线区大牛影院 | 国产丝袜视频一区二区三区 | 欧美日韩人妻精品一区二区三区 | 婷婷综合久久中文字幕 | 亚州av久久精品美女模特图片 | 欧美日韩精品一区二区三区不卡 | 日日噜噜大屁股熟妇 | 国产精品久久综合免费 | 亚洲欧洲精品成人久久奇米网 | 国产精品久久久久精k8 | 四虎中文字幕 | 国产精品中文字幕在线观看 | 久久综合一区二区 | 日皮视频免费 | 国产一区二区三区精品av | 亚洲一区精品人人爽人人躁 | 星空大象mv高清在线观看 | 午夜黄色网 | 国产h视频在线观看 | 紧身少妇高跟鞋作爱 | 激情小说图片视频 | 免费99精品国产自在在线 | 欧美一级在线 | 国产色区 | 另类 亚洲 图片 激情 欧美 | 99久久国产综合精麻豆 | 国产无遮挡裸体免费久久 | 国产农村乱人伦精品视频 | 乱码精品一卡2卡二卡三 | 欧美zozo另类特级 | av资源新版在线天堂 | 一级全黄裸体免费观看视频 | 中文字幕有码无码av | av有码在线观看 | 精品国产一区二区三区四区精华液 | 日本福利片在线观看 | 午夜理论片在线观看免费 | 中文字幕亚洲在线 | 真正免费毛片在线播放 | 男人和女人上床视频 | 亚洲婷婷综合色高清在线 | 后入内射无码人妻一区 | 蜜乳av久久久久久久久久久 | av自拍网 | 亚洲日本乱码一区二区产线一∨ | 天堂在线www天堂 | 天天干网| 精品人无码一区二区三区 | 婷婷五月六月综合缴情 | 亚洲精品激情 | 黄色在线观看免费视频 | 77成人网 | 一个人免费观看的www视频 | 成人无码a区在线观看视频 国产偷自视频区视频 | 午夜日韩福利 | 亚洲人成亚洲人成在线观看 | 亚洲日本黄色片 | 欧美日韩中文字幕在线观看 | 蜜臀视频在线一区二区三区 | 久久免费偷拍视频 | 深夜av在线 | 国产视频亚洲一区 | 日本一区二区三区在线播放 | 欧美手机看片 | 午夜寂寞影视 | 妲己丰满人熟妇大尺度人体艺 | 香蕉综合网 | 99视频精品国产免费观看 | 碰超免费人妻中文字幕 | 五月丁香激激情亚洲综合 | 国产99视频精品免视看9 | 亚洲一区二区视频 | 日韩免费视频网站 | 99成人国产综合久久精品 | 极品少妇被后入内射视 | 久久精晶国产99久久6 | 99久久久无码国产精品免费 | 欧美日韩精品一区二区在线观看 | 少妇太爽了在线观看免费视频 | 精品一区二区三区香蕉蜜桃 | 综合五月天 | 人人爽人人爽人人片av东京热 | 国产免费看又黄又粗又硬 | 天天躁日日躁狠狠躁2018 | 国产美女流白浆 | 久久精品国产福利一区二区 | 色极品影院| 欧美成人a在线网站 | 国产亚洲日本精品成人专区 | 开心综合网 | 日韩在线一区二区三区四区 | www.毛片 | 成人免费视频一区二区 | 影音先锋中文字幕无码资源站 | 开心色站| youjizz亚洲 | 亚洲区视频 | 国产明星xxxx色视频 | 亚洲 欧美 变态 另类 综合 | 好色综合 | 国产a级三级三级三级 | 日韩欧美一二三 | 国产精品久久久综合久尹人久久9 | 欧美日韩国产成人精品 | 久久亚洲精品成人av无码网站 | 亚洲精品综合欧美一区二区三区 | 夜夜爽久久揉揉一区 | 在线欧美精品一区二区三区 | 天天色综合色 | 乱老年女人伦免费视频 | 久久精品欧美一区二区三区黑人 | 在线观看你懂的网站 | 在线免费观看小视频 | 久久婷婷五月综合97色 | 哪里有毛片看 | 国产69精品久久久久人妻刘玥 | 热久久视久久精品18 | 色999在线 | 又硬又粗又大一区二区三区视频 | 无码一区二区三区在线 | 日韩久久激情综合啪啪 | 男女性高爱潮免费网站 | 人善交类欧美重口另类 | 欧洲少妇性喷潮 | 国产麻豆一区二区 | 色综合天天综合欧美综合 | 欧美亚洲熟妇一区二区三区 | 亚洲a成人片在线观看 | 九九热这里有精品 | 边吃奶边添下面好爽 | 免费一级欧美 | 青青操国产| 老少配老妇老熟女中文普通话 | 亚色九九九全国免费视频 | 亚洲精品免费在线观看视频 | 日日躁夜夜躁狠狠躁夜夜躁 | 超碰96在线 | 国产女主播精品大秀系列 | 黑人30厘米少妇高潮全部进入 | 国产老妇av | 久久精品人人做人人爱爱漫画 | 亚洲 欧美 唯美 国产 伦 综合 | 欧洲久久久久 | 亚洲人成网77777香蕉 | 美女免费网站 | 一级片久久久 | 色翁荡熄又大又硬又粗又视频图片 | 久久久青草青草免费看 | 毛片大全在线播放 | 日韩人妻无码精品久久 | 小视频在线观看免费 | 亚洲欧美高清在线 | 国产99久9在线视频 | 传媒 | 四虎影院污 | 特级无码毛片免费视频尤物 | jzzijzzij亚洲日本少妇熟 | 日本黄网站免费 | 国产初高中生粉嫩无套第一次 | 男人av影院| 欧美一级色图 | 国产资源在线免费观看 | 美女乱淫免费视频网站 | 无码专区一ⅴa亚洲v专区在线 | 日本黄色网页 | 国产精品9999久久久久仙踪林 | 中字乱码视频 | 亚洲欧美日韩一区二区三区在线 | 日日碰狠狠添天天爽不卡 | 欧美日韩亚洲国产 | 91精品视频一区二区 | 国内久久婷婷五月综合欲色广啪 | 51社区精品视频 | 午夜爽爽爽男女免费观看麻豆国产 | 午夜免费 | 伦埋琪琪电影院久久 | 国产在线视频一区二区三区欧美图片 | 婷婷成人五月综合激情 | 国产第六页 | 又黄又爽又色的免费网站 | 4438xx亚洲最大五色丁香 | 色.www| 精品999久久久久久中文字幕 | 他用舌头给我高潮喷水在线 | 亚洲欧美综合精品成人网站 | 中文字幕在线观看免费视频 | 亚洲天堂2020| 久青草视频 | yy111111少妇无码影院 | 91精品一区二区三区蜜臀 | 69国产成人综合久久精品欧美 | 亚洲精品国产一区二区在线观看 | 中文字幕一精品亚洲无线一区 | 自拍偷区亚洲综合激情 | 岛国av免费在线观看 | 桃花色综合影院 | 六月丁香激情综合 | 精品人妻av区波多野结衣 | 欧美xxx喷水 | 豆国产96在线 | 亚洲 | 丰满白嫩大屁股ass 国产日韩精品一区 | 久久久久久久国产精品美女 | 久久av老司机精品网站导航 | 国产情侣2020免费视频 | 国产精品爽爽ⅴa在线观看 日本偷偷操 | 就爱啪啪网站 | 亚洲国产成人久久综合一区,久久久国产99 | 欧美一级专区免费大片 | 久草欧美视频 | 日韩a区 | 久久精品123 | 日本大片在线看黄a∨免费 炕上如狼似虎的呻吟声 | 蜜桃av一区二区 | 曰韩无码av片免费播放不卡 | 动漫精品专区一区二区三区 | 欧美成人在线免费视频 | 国产粉嫩高中无套进入 | 亚洲日韩欧美一区二区三区 | 蜜臀aⅴ精品一区二区三区 99久久久精品免费观看国产 | 精品久久一区 | 亚洲视频精品在线观看 | 欧美片内射欧美美美妇 | 夜色成人网 | 日韩 亚洲 欧美 国产 精品 | 国产av丝袜一区二区三区 | 天天久| 天堂一区二区在线观看 | 明星大尺度激情做爰视频 | 欧美日韩久久中文字幕 | 亚洲人成色7777在线观看不卡 | 国产精选在线观看 | 亚洲a一区二区 | 香蕉av福利精品导航 | 国产裸体美女永久免费无遮挡 | 综合久久av | 2018天天拍拍天天爽视频 | 国产精品午夜福利麻豆 | 国产成人亚洲精品无码电影不卡 | 伊人天天操 | 婷婷视频网站 | 护士的奶头又大又白又好摸 | 天堂中文在线最新版www | 中文字幕奈奈美抱公侵犯 | 亚洲成av人片一区二区密柚 | 欧美日韩国产色 | 色噜噜一区二区 | 欧美在线看片a免费观看 | 宅女噜噜66国产精品观看免费 | 免费无码又爽又刺激高潮虎虎视频 | www.第四色 | www久久国产 | 亚洲午夜理论片在线观看 | 国产欧美视频在线播放 | 精品国产免费久久久久久桃子图片 | 嫩草影院片 | 日韩草逼 | 91精品久久久久久久久 | 91国精产品新 | 国产尤物在线视频 | 中文字幕天天躁日日躁狠狠躁 | 亚洲六月丁香色婷婷综合久久 | 亚洲免费综合 | 射久久 | 超碰免费视 | 噜噜噜亚洲色成人网站 | 无码av一区二区三区无码 | 无人观看高清视频在线单曲播放 | 国产清纯美女爆白浆视频 | 欧美日本中文字幕 | 日本大片在线看黄a∨免费 炕上如狼似虎的呻吟声 | 少妇被黑人到高潮喷出白浆 | 日本高清视频一区 | 日韩一区二区三区免费看 | 色综合天天综合色综合av | 亚洲做受高潮欧美裸体 | 国产精品久久久久久久久久直播 | 8888四色奇米在线观看 | www.欧美色图 | 人与野鲁交xxxⅹ视频 | 夜夜嗨av一区二区三区四季av | 欧美日韩无砖专区一中文字 | 性欧美bbw | 亚洲伊人成无码综合网 | 国内精品久久久久影院薰衣草 | 直接看毛片 | 久久艹99| 2021精品国产自在现线 | 免费观看成人欧美www色 | 国产精品免费看 | 亚洲综合色区另类aⅴ | 久草国产在线视频 | 一区二区三区四区国产精品 | 激情综合图片 | 青青草97国产精品免费观看 | 天天天色综合a | 一区二区三区高清 | 成人亚洲精品国产www | 亚洲视频精品一区 | 天天插天天插 | 精品乱子伦一区二区 | 精品国产一区二区三区四区阿崩 | 欧美日韩性视频 | 无翼乌18禁全肉肉无遮挡彩色 | 亚洲精品成人 | 在线观看免费人成视频网 | www天堂在线 | 亚洲97视频| 国产精品国产三级国产有见不卡 | 国产精品久久久久久久泡妞 | 日批网址 | 狠狠操狠狠色 | 欧美午夜理伦三级在线观看 | 成·人免费午夜无码视频 | 亚洲国产精品无码久久久秋霞1 | 男女啪啪免费体验区 | 91九色视频网站 | 亚洲国产一区二区三区, | 国产婷婷成人久久av免费高清 | 国产精品乱码一区二区三区四川人 | 2019精品手机国产品在线 | 纯肉无遮挡h肉动漫在线观看国产 | 国产美女裸身网站免费观看视频 | 国产人妻人伦精品欧美 | 久久99亚洲精品久久99果 | 欧美成人午夜一区二区三区 | 日韩高清亚洲日韩精品一区二区三区 | 开心综合网 | 男女视频一区 | 国产亚洲精品97在线视频一 | 欧美在线成人免费 | 免费无码又爽又刺激高潮软件 | 亚洲高清视频网站 | 青青成人| 国产精品白丝喷浆 | 久久午夜国产精品www忘忧草 | 韩国午夜理伦三级在线观看 | 日韩激情一区 | 国产一级手机毛片 | 男女高潮喷水在线观看 | 日韩免费视频 | 午夜国产一级 | 一级持黄录像免费观看 | 91亚洲精品久久久久图片蜜桃 | 天干夜啦天干天干国产免费 | 国产丰满精品伦一区二区三级视频 | 久青草国产97香蕉在线影院 | 亚洲欧美中文日韩v日本 | 国产又色又爽又黄的免费软件 | 亚洲日韩欧美在线成人 | 正在播放强揉爆乳女教师 | 国产日韩欧美亚洲 | 强奷漂亮雪白丰满少妇av | 人人添人人澡人人澡人人人人 | 日韩av免费在线看 | 亚洲美腿丝袜无码专区 | 亚洲永久精品在线观看 | 激情文学av| 国产 日韩 另类 视频一区 | 一区二区久久精品66国产精品 | 欧美性天堂 | 99久久夜色精品国产亚洲 | 国产又黄又湿无遮挡免费视频 | 日韩aⅴ视频| 国产精品久久久久精女同 | 国产精品美女久久久浪潮软件 | 日韩经典在线观看 | 精品日韩一区二区三区 | 少妇人妻激情乱人伦 | 国产成人乱码一二三区18 | 91色多多 | 欧美日韩国产在线一区 | 久久中文字幕乱码久久午夜 | 伊人超碰在线 | 国产精品爱啪在线播放 | 精品国内自产拍在线观看 | 欧美aa级 | 无码成a∧人片在线播放 | 99久久99久久精品免费看蜜桃 | 国产专区在线播放 | 亚洲欧美男人天堂 | 男人的天堂中文字幕熟女人妻 | 福利一区二区三区视频在线观看 | 国产做爰全过程免费视频 | av色欲无码人妻中文字幕 | 久天啪天天久久99久孕妇 | 久久成人国产精品免费 | 欧美视频在线观看一区二区三区 | tickle调教美女丨vk | 伊人黄色软件 | 国产极品美女高潮无套在线观看 | 天堂狼人mv| 午夜影院在线免费观看 | 国产亚洲欧美日韩在线一区二区三区 | 91精品国产综合久久久密闭 | 九色porny丨自拍视频 | 日本久久丰满的少妇三区 | 国产香蕉97碰碰久久人人 | 欧美成人精品高清视频在线观看 | 国产精品无圣光一区二区 | 国语对白乱妇激情视频 | 丰满少妇大叫太大太粗 | 欧美精品成人影院 | 天天操综合 | 强开少妇嫩苞又嫩又紧九色 | 欧美一区二区三区喷汁尤物 | 欧美黄色片一级 | 91日本在线播放 | 国产交换在线播放 | 久久婷婷人人澡人人爽人人爱 | 天天操狠狠操夜夜操 | 久久精品国产一区二区三区不卡 | 男人的天堂影院 | av在线天堂网 | 欧美在线视频免费播放 | 久久久久99精品成人片三人毛片 | 奶头又大又白喷奶水av | 男女日视频 | 国产精品久久久久久久久久三级 | 免费av一区二区三区 | 久久99久久99小草精品免视看 | 在线精品免费视频无码的 | a精品| 狠狠淫xx | 成年美女黄网站色大免费全看 | 开心春色激情网 | 色婷婷色综合激情国产日韩 | 1515hh成人免费看 | 国产成人无码a在线观看不卡 | 成人羞羞国产免费软件小说 | 久草在线视频资源 | 日日日日做夜夜夜夜无码 | 亚洲 欧美 影音先锋 | 久久久国产精品无码免费专区 | 免费国产人成18在线观看 | 天堂在线资源网 | 产后漂亮奶水人妻无码 | 成人爽a毛片免费视频 | 91精品久久久久久久久不卡 | 亚洲www啪成人一区二区麻豆 | 国产精品va尤物在线观看蜜芽 | 又色又爽又黄无遮挡的免费软件 | 国产美女自拍视频 | 玩弄人妻少妇老师美妇厨房 | 亚洲中字幕日产av片在线 | 久久99精品久久久久久动态图 | 亚洲色成人www永久在线观看 | 国产美女流白浆 | 西西人体午夜大胆无码视频 | 国内少妇毛片视频 | 中文字幕日韩精品一区 | 猫咪av网站 | 特黄熟妇丰满人妻无码 | 欧美黑人又大又粗xxxxx | 亚洲精品成人老司机影视 | 亚洲天堂区 | 日韩三级网| 丁香色欲久久久久久综合网 | 精品久久久爽爽久久久av | 亚洲国产精品一区二区手机 | 亚洲精品无码久久千人斩 | 女同啪啪免费网站www | 真人祼交二十三式视频 | 无套内谢的新婚少妇国语播放 | 亚洲午夜精品在线观看 | 一级视频在线观看免费 | 人人干人人上 | 日本欧洲亚洲高清在线 | 亚洲区第一页 | 亚洲男人的天堂www 乱子轮熟睡1区 | 四虎最新在线永久免费 | 少妇交换黑人做爰 | 人妻无码αv中文字幕久久琪琪布 | 你懂的在线网站 | 亚洲大片av毛片免费 | 国产精品无码aⅴ嫩草 | 久久国产劲暴∨内射新川 | 日本又黄又爽gif动态图 | 国产乱子轮xxx农村 国产做受视频 | 国产精品久久久久久久久久大牛 | 狠狠操夜夜操 | 91精品婷婷国产综合久久蝌蚪 | 日韩一卡2卡3卡4卡2021免费观看国色天香 | 人人妻人人澡人人爽偷拍台湾 | 男女午夜啪啪 | 欧美69久成人做爰视频 | 涩涩网站在线观看 | 国精品无码一区二区三区左线 | 国内精品国内精品自线在拍 | 精品国产百合女同互慰 | 丰满少妇被猛烈进入 | 打屁股日本xxxxx变态 | 国产成人无码精品午夜福利a | 曰韩毛片 | 亚洲中文字幕久爱亚洲伊人 | 欧美日韩a | 99久久夜色精品国产亚洲1000部 | 欧美大片在线观看 | av在线免费观看播放 | 黑人jizz60性黑人 | 女人高潮抽搐喷液30分钟视频 | 日本高清免费aaaaa大片视频 | 国产精品久久久久久人妻精品18 | 天天人人综合 | 日日操影院 | 欧美精品乱码久久久久久按摩 | 那里有毛片看 | 国产乱人激情h在线观看 | 欧美色图在线观看 | 久久九九有精品国产23百花影院 | 国产做a爱片久久毛片a片 | 久久亚洲精品久久国产一区二区 | 99久久久无码国产精品动漫 | 久久天天躁狠狠躁夜夜不卡 | 国产成人一区二区三区视频免费 | 成人区精品一区二区不卡 | 国产欧美日韩另类精彩视频 | 妇乱子伦精品小说网 | 免费色网址 | 欧美成人免费在线观看视频 | 侵犯人妻女教师中文字幕 | 丰满女人裸体淫交视频 | 欧美区亚洲区 | 1024香蕉 | 国产又粗又硬又长又爽 | 午夜精品av | 国产精品丝袜久久久久久消防器材 | 在线免费看一级片 | 第四色成人网 | 久久久香蕉视频 | 在线天堂www中文 | 国产精品男女啪啪 | 午夜夜伦鲁鲁片免费无码 | 久久久久久久久久久久久久国产 | 激情av无码后入 | 国产一浮力影院 | 国产美女激情视频 | 自在自线亚洲а∨天堂在线 | 少妇呻吟白浆高潮啪啪69 | 亚洲国产成人久久综合碰碰 | 日韩 另类 综合 自拍 亚洲 | 欧美视频精品在线 | 亚洲激情综合视频 | wwwav国产 | 秋霞av无码一区二区三区试看 | 无码精品a∨在线观看中文 欧美激情视频免费 | 亚洲一区二区三区小说 | 亚洲第一区视频 | 精品熟女少妇av免费观看 | 久久综合给合久久狠狠97色 | 性久久久久久久久久久 | 爱情岛av永久入口 | 无套大战乌克兰白嫩美女 | 日本理伦片午夜理伦片 | 天天摸日日添狠狠添婷婷 | 成在线人免费 | 成人网久久 | 91免费看nba国产91免费看nba国产 | 亚洲精品毛片av一区二区三区 | 日本黄色激情视频 | 日韩欧群交p片内射中文 | 亚洲高清在线观看视频 | 国产免费又黄又爽又刺激蜜月al | 亚欧激情| 成人av综合网 | 国产精品亚洲综合久久系列 | 亚洲精品无码av中文字幕 | 人妻熟女欲求不满在线 | 蜜桃视频无码区在线观看 | 亚洲乱码中文字幕综合 | 国产吞精囗交免费视频网站 | 午夜看片在线 | 黑人精品欧美一区二区蜜桃 | 韩国精品久久久久久无码 | 成人动漫一区二区三区 | 久久99精品国产99久久6不卡 | 亚洲精品欧美激情 | 久久超级碰 | 日本久久综合久久综合 | 日韩欧美一本 | 一中文字幕日产乱码va | 日日噜噜夜夜狠狠视频免费 | 两男一女3p揉着她的奶视频 | 美丽姑娘国语版在线播放 | 日韩午夜在线 | 伊人久久综合给合综合久久 | 欧美三级日本 | 影音先锋亚洲成aⅴ无码 | 在线中文字幕有码中文 | 午夜福利片国产精品 | 成人做爰9片免费视频 | 国产真实自在自线免费精品 | 日韩欧美精品久久 | 久久精品国产国产精 | 久久两性网 | 九九热这里只有 | 小早川怜子久久精品中文字幕 | 国产成人精品无码一区二区老年人 | 国产在线无码视频一区二区三区 | 亚洲一区欧美精品 | 999精品在线 | 玩弄放荡人妻少妇系列 | 尤物193在线人妻精品免费 | 日本精品高清一区二区 | 欧美影院 | 亚洲精品乱码久久久久久金桔影视 | 国产又粗又爽又黄的视频 | 少妇粉嫩无套内谢 | 新91视频在线观看 | 99偷拍视频精品一区二区 | 国产a线 | 久久精品国产99久久丝袜 | 国产成人美女裸体片免费看 | 亚洲国产日产2021 | 夜夜春精品视频 | 中文精品在线 | 无码夫の前で人妻を犯す中字幕 | 一本色综合网久久 | 在线亚洲午夜理论av大片 | 久久国产精品99久久人人澡 | 久久97视频| 久久精品九九 | 少妇久久久久久 | 99精品国产兔费观看久久 | 国产人妻久久精品二区三区老狼 | 亚洲国产成人av在线电影播放 | 中文字幕一区二区三区四区欧美 | 国产又粗又猛又黄视频 | 国语自产拍无码精品视频在线 | 爱情岛论坛自拍亚洲品质极速福利 | 亚洲va欧美va天堂v国产综合 | 在线观看人成视频免费不卡 | 久久综合给久久狠狠97色 | 猫咪av成人永久网站网址 | 亚洲www色 | 台湾佬亚洲色图 | 精品视频网站 | 国产精品久久久久久久久久精爆 | 国产精品高潮呻吟av久久无吗 | 国产精品丝袜久久久久久消防器材 | 天天做天天爱夜夜爽少妇 | h肉动漫无码无修6080动漫网 | vr成人啪啪影视 | 女神西比尔av在线播放 | 日日碰狠狠躁久久躁婷婷 | 国产小视频网站 | 欧美成人高清在线播放 | 久久久亚洲欧洲 | 女人的天堂网站 | 欧美色一区二区三区在线观看 | 久久精品无码一区二区三区不卡 | 天天狠天天添日日拍 | 久久大蕉香蕉免费 | 色狗av| 成人h猎奇视频网站 | 亚洲欧美日韩国产精品一区二区 | 亚洲欧美国产精品久久久久久久 | 国产精品九九九九九 | 欧美日韩午夜爽爽 | 国产精品无码一区二区三区电影 | 久草福利社 | 少妇色欲网 | 色五月五月丁香亚洲综合网 | 久久亚洲精品无码爱剪辑 | 国语女技师按摩服务对白 | 无码区a∨视频体验区30秒 | 国产成人精品免费 | 男人的天堂av网站 | 四库影院永久国产精品地址 | 久久夜夜操 | 亚洲一区欧美在线 | 人妻少妇精品视频无码综合 | 无码精品国产一区二区三区免费 | 亚洲国产2021精品无码 | 中文在线视频观看 | 国产无遮挡又黄又爽又色 | 国产精品麻豆成人av网 | 日本狠狠干 | 日韩高清在线 | 国产精品无码一本二本三本色 | 综合久久给合久久狠狠狠97色 | 精品视频麻豆入口 | 国产人碰人摸人爱免费视频 | 亚洲国产精品天堂 | 欧美一区二区精品 | 亚洲高清无在码在线电影不卡 | 欧美一及片 | 亚洲精品免费在线 | 久久精品九九 | 久久一区精品 | 国产精品欧美激情在线 | 亚洲狠狠婷婷综合久久蜜芽 | 亚洲精品国产字幕久久麻豆 | 性中国少妇熟妇xxxx农村 | 精品久久香蕉国产线看观看亚洲 | 隣の若妻さん 波多野结 | 亚洲一区二区三区四区五区黄 | 亚洲欧洲日韩在线电影 | 亚洲日韩国产av无码无码精品 | 国语自产拍在线观看对白 | 自拍偷拍你懂的 | 欧美激情精品久久久久久大尺度 | 久热这里只有精品12 | 亚洲性在线观看 | 久久国产精品人妻一区二区 | 一级免费黄色大片 | 久久精品99av高久久精品 | 99re热视频 | 色综合色综合色综合色综合 | 偷窥自拍亚洲 | aa视频在线观看 | 欧美成人精品视频在线不卡 | 美女性高潮 | 狠狠亚洲超碰狼人久久 | 国产99视频精品免费视频6 | 中文日韩在线视频 | 宅男噜噜噜666 | 日本中文乱码卡一卡二新区 | 欧美伊人久久久久久久久影院 | 国产裸体免费无遮挡 | 色欲av亚洲一区无码少妇 | 东京干福利 | 国产精品国产亚洲精品看不卡 | 国产一级片免费播放 | 日本高清dvd | www.一区二区三区 | 久久熟妇人妻午夜寂寞影院 | 午夜丁香影院 | 日日躁夜夜躁狠狠躁 | 男人天堂五月天 | 自拍偷自拍亚洲精品偷一 | 无码av无码免费一区二区 | 日日噜噜噜夜夜爽爽狠狠视频97 | 精品1卡二卡三卡四卡老狼 亚洲精品久久30p | 欧美嫩交一区二区三区 | 亚洲欧美另类中文字幕 | www裸玉足久久久 | 久久天天躁狠狠躁夜夜2020一 | 国产欧美国产精品第一区 | 久久国产精品日本波多野结衣 | 国产午夜福利久久精品 | 色护士极品影院 | 红桃17c视频永久免费入口 | 亚洲国产精品无码专区影院 | 国内精品伊人久久久影视 | 操操网av| 老子影院午夜伦不卡无码 | 九色九九九老阿姨 | 两性色午夜视频免费老司机 | 一级一片免费播放 | 中文字幕精品视频 | 2021国产精品香蕉在线观看 | 久艹视频免费看 | 蜜桃狠狠色伊人亚洲综合网站 | 天天爽夜夜爽夜夜爽 | 丝袜 国产 日韩 另类 美女 | wwwxxx美女 | 黄色观看网站 | 国产偷国产偷av亚洲清高 | 国产亚洲欧美日韩夜色凹凸成人 | blacked蜜桃精品一区 | 四虎久久影院 | 日本一区视频在线 | 日韩在线三区 | av在线不卡免费观看 | 日韩精品91 | 成人免费无遮挡无码黄漫视频 | 国产日韩精品欧美一区喷水 | 久久色播 | 日本久久久影视 | 人成午夜大片免费视频77777 | 18禁午夜宅男成年网站 | 亚洲激情黄色小说 | 色综合久久一区二区三区 | 国产精品一二三区成毛片视频 | 午夜大片爽爽爽免费影院 | a√天堂中文字幕在线熟女 国产人妻精品午夜福利免费 | 91手机视频在线观看 | av黄色在线观看 | 日本久久www成人免 天堂资源官网在线资源 | 在线中出| 免费毛片a线观看 | 人人插人人插人人爽 | 精品国精品无码自拍自在线 | 狠狠色丁香婷婷综合久久小说 | av超碰| 天堂av免费在线 | 亚洲人成在线免费观看 | 亚洲第2页 | 亚洲综合色视频在线观看 | 男人的天堂中文字幕 | 美女高潮视频网站 | 国产视频第三页 | 青青久在线视观看视 | 99re在线观看 | 农村少妇一区二区三区蜜桃 | 国产精品无码久久一线 | 国产区二区 | 天美星空大象mv在线观看视频 | 亚洲a∨日韩av高清在线观看 | 日韩内射美女人妻一区二区三区 | 日本不卡在线观看 | 98精品国产综合久久久久久欧美 | 91丨九色丨蝌蚪丨少妇在线观看 | 亚洲高潮毛片无遮挡免费 | 国产精品不卡视频 | 哈尔滨老熟女啪啪嗷嗷叫 | 久久精品国产一区二区电影 | 欧美亚洲另类视频 | 精品在线播放 | 欧美日韩精品人妻狠狠躁免费视频 | 亚洲精品国产免费 | 国产午夜三级 | 情人伊人久久综合亚洲 | 亚洲色一区二区三区四区 | 99久久久无码国产精品古装 | 在线a网| 免费国产自线拍一欧美视频 | 天天爽天天爽天天片a | 久久777国产线看观看精品 | 日韩成av人片在线观看 | 亚洲成人网在线观看 | 最美女人体内射精一区二区 | 亚洲国产v | 4480午夜| 婷婷久久综合九色综合色多多蜜臀 | 精品国产福利 | 国产又粗又猛又大爽老大爷 | 51真实女性私密spa按摩偷拍 | 97久久超碰国产精品最新 | 久久久久久久国产精品影视 | 色偷拍 自怕 亚洲 10p | 亚洲熟妇毛茸茸 | 午夜激情亚洲 | 国产真实交换多p免视频 | 精品欧美一区二区三区精品久久 | 天堂视频免费在线观看 | 久久久精品成人免费看片 | 免费看18禁止观看黄网站 | 国产吞精囗交免费视频网站 | 一本大道区一区二区三乱码八 | 精品久久久久久天美传媒 | xxxxwwww国产| 国产精品亚洲综合一区在线观看 | 91大神探花在线观看 | 亚洲国产在 | 在线精品免费视频 | 波多野结衣av在线无码中文18 | 香蕉在线 亚洲 欧美 专区 | 欧美系列一区二区 | 四虎国产精品免费久久 | 国产精品黄在线观看免费软件 | 色牛影视| 都市激情自拍偷拍 | 国产区图片区小说区亚洲区 | 亚洲精品国产一区二区小泽玛利亚 | 无码一区二区三区av免费蜜桃 | 丰满少妇小早川怜子影片了 | 国产96在线 | 免费 | 亚洲欧美日本中文字不卡 | 导航福利在线 | 综合激情亚洲 | 美女的尿囗网站免费 | 国产黄色片视频 | 亚洲色精品vr一区区三区 | 凹凸日日摸日日碰夜夜 | 久久久久久久久久久久中文字幕 | 无码国产69精品久久久久网站 | 人妻少妇被粗大爽9797pw | 国产无遮挡a片又黄又爽 | 成年男人裸j照无遮挡无码 亚洲国产精品美女久久久久 | 久久久亚洲国产精品 | 内射人妻无套中出无码 | 国产精品国产精品国产专区不片 | 国产精品男同 | 欧美日韩亚洲综合 | 网产贷裸拍视频在线播放 | 强奷乱码中文字幕熟女导航 | 日本道高清 | 国产天堂123在线观看 | 中文在线字幕免费观 | 丰满日韩放荡少妇无码视频 | 内射中出日韩无国产剧情 | 91视频三级 | 久热精品在线 | 日韩h在线| 久草在线播放视频 | 久久精品国产精品亚洲红杏 | 黄色av导航 | 特级黄色毛片视频片子 | 播放灌醉水嫩大学生国内精品 | 国产啪精品视频网站 | 黑人操日本女人视频 | 国产第二专区 | 欧美506070老妇乱子伦 | 午夜在线精品 | 无码成人av在线一区二区 | 日产精品久久久久久久 | 日韩人妻无码精品专区906188 | 欧美日韩精 | 美女诱惑av | 一级日韩一级欧美 | 欧美 日韩 国产 成人 在线 91 | www深夜成人白色液体视频 | 综合久久给合久久狠狠狠97色 | 欧美女人性生活视频 | 久久中文字幕人妻熟女少妇 | 日韩精品自拍 | 亚洲色成人一区二区三区 | 欧美理论在线观看 | 欧美91看片特黄aaaa | 成人区精品一区二区不卡av免费 | 中文在线永久免费观看 | 青青青草网站免费视频在线观看 | 午夜影院福利 | 国产成人综合久久久久久 | 精品亚洲精品 | 国产视频久久久久久 | 久久成人视屏 | 亚洲天堂最新网址 | 中美日韩毛片免费观看 | 亚洲午夜成人精品无码 | 欧美成人免费草草影院视频 | 依人在线免费视频 | 午夜裸体性播放 | www.av.com在线观看 | 亚洲色欧美色2019在线 | 四虎影院精品在线观看 | 亚洲国产精品一区第二页 | 伊人网址 | 欧美大屁股xxxx高潮喷水 | 亚洲精品无码久久毛片波多野吉衣 | 一本au道高清| 正在播放东北夫妻内射 | 色翁荡息又大又硬又粗又爽 | 人妖系列网站在线观看 | 成人亚洲综合av天堂 | 丰满肥臀大屁股熟妇激情视频 | 久久久久国色av免费观看 | 日本韩国一区二区在线观看 | 狠狠色色综合站 | 女人下边被添全过视频的网址 | 88av网站 | 91在线无精精品一区二区 | 伊人久久精品无码av一区 | 久久精品一区二区免费播放 | 亚洲精品美女在线观看 | 漂亮人妻被黑人久久精品 | 国产激情网 | 国产精品嫩草55av | 无码日韩精品一区二区免费暖暖 | 一级片aaa| 欧美激情综合色综合啪啪五月 | 亚洲a∨国产av综合av网站 | 久久久橹橹橹久久久久高清 | 影音先锋中文字幕在线播放 | 国产成人亚洲综合网色欲网 | 亚洲精品无码成人aaa片 | 欧美 日韩 成人 | av无码久久久久不卡网站下载 | 老司机一区二区 | 国产91对白在线播放 | 国产精品久久久久久2021 | 亚洲精品久久久久久久月慰 | 久久视频免费在线观看 | 偷窥少妇久久久久久久久 | 991av | 美艳麻麻诱子乱小说 | 日本香港三级亚洲三级 | 一级片在线免费看 | 精品乱码一区二区 | 久久久噜噜噜久久久精品 | 精品一区二区免费视频 | 永久中文字幕 | 色欲来吧来吧天天综合网 | 久久久久国产精品熟女影院 | 美女黄色免费网站 | 精品一区二区三区av | av色综合网 | 抱起大胸美女扔在床吻胸 | 久草99 | 欧美色偷拍 | 九九视频在线播放 | 亚洲午夜精品久久久久久浪潮 | 黄色一级大片网站 | 国产亚洲高潮精品av久久a | 国产99在线 | 免费 | 国产精品久久精品国产 | 免费1级做爰片在线观看爱 日本精品三级 | 少妇又粗又猛又爽又黄的视频 | 欧美人与动牲交a欧美精品 亚洲v在线观看 | 久久这里只精品热在线18 | 北条麻妃一区二区在线观看视频 | 日本护士后进式高潮 | 久久久久夜色精品国产老牛91 | 精品伊人久久久大香线蕉天堂 | 欧美激情一区在线 | av女在线 | 日本一区中文字幕 | 九色欧美| 未满十八勿入av网免费 | 99精品国产福久久久久久 | 日韩欧美在线视频一区 | 日本老熟妇乱子伦视频 | 国产亚洲精品超碰热 | 中国免费黄色 | 99国产精品久久 | 亚洲欧美日本韩国 | 国产亚洲精品aa片在线爽 | 在线天堂资源 | 亚洲一级精品 | 欧美aaaaaaa | 精品成人一区二区三区四区 | 午夜轮理 | 日本一区二区三区视频在线观看 | 久久综合日本 | 91人人爽人人爽人人精88v | 国产精品卡一卡2卡3卡4 | 小草国产精品情侣 | 日本aaaa级毛片在线看 | 亚洲网av| 久久爽精品区穿丝袜 | 天天色成人| 香蕉1024| 噜噜狠狠狠狠综合久久86 | 色偷偷男人天堂 | 蜜臀少妇人妻在线 | 国产一区二区av | 护士的小嫩嫩好紧好爽 | av无码爆乳护士在线播放 | 国产国产精品人在线视 | www.人人草 | 久久久性视频 | 色综合色综合久久综合频道88 | 国产成人亚洲精品无码不卡 | 亚洲国产天堂 | 色综合色综合久久综合频道88 | 人妻无码一区二区不卡无码av | 国产成人欧美日本在线观看 | 欧美一级黄视频 | 午夜免费一区二区 | 日韩a∨ | 男人天堂2019 | 啪啪免费小视频 | 国产麻豆a毛片 | 欧美猛少妇色xxxxx猛叫 | 91精品网站 | 黄色免费毛片 | 美女网站在线观看 | 六月丁香婷婷网 | 亚洲日韩亚洲另类激情文学一 | 91综合中文字幕乱偷在线 | 亚洲第九十九页 | 国产乱码精品一区二区蜜臀 | 亚洲精品国产欧美一二区 | 老司机成人 | 国产成人无码专区 | 日本不卡精品 | 中国女人做爰视频 | 色诱视频在线观看 | 岛国激情视频 | 成人在线观看不卡 | 亚洲国产精品大学美女久久久爽 | 亚洲精品久久久 | 亚洲国产精品av在线播放 | 国产精品345在线播放 | 亚洲国产欧美日韩 | xxx视频在线观看 | 69av一区 | 久久久亚洲欧洲日产国码是av | 另类 欧美 日韩 国产 在线 | 精品国产综合 | 亚洲天天做日日做天天谢日日欢 | 91看黄| 深夜av福利 | 天堂男人av | 人人超碰人人 | 日本的黄色一级片 | 久视频在线观看 | 99热这里只有精品4 欧美色成人 | 天天看视频 | 91视频专区 | 亚洲精品无码久久久久久 | 97国产精品麻豆性色aⅴ人妻波 | 狠狠操狠狠操狠狠操 | 国产在线操 | 亚洲国产三级 | 日本免费在线播放 | 日韩三区视频 | 亚欧美无遮挡hd高清在线视频 | 大伊香蕉精品视频在线天堂 | 欧美日激情| 亚洲欧美一区久久牛牛 | 99爱国产精品免费高清在线 | 日韩在线观看精品 | 伊人影院视频 | 亚洲精品国产福利一区二区 | 国产精品未满十八禁止观看 | 女教师淫辱の教室蜜av臀 | 无码网站天天爽免费看视频 | 亚洲精品宾馆在线精品酒店 | 国产成人综合久久久久久 | 大香交伊人 | 国产在线拍小情侣国产拍拍偷 | 99国产热| 亚洲理论片| 国产又粗又黄又猛 | 欧美日韩一区二区不卡 | 国产片自拍 | 五月综合在线观看 | 亚洲欧洲日韩极速播放 | 日韩欧美一卡二卡三卡 | 野外少妇被弄到喷水在线观看 | 欧美国产综合色视频 | 人妻精品动漫h无码网站 | 亚洲一线二线三线写真 | 成人资源网 | 丰满爆乳一区二区三区 | 国产熟妇精品高潮一区二区三区 | 992tv精品视频tv在线观看 | 视频久re精品在线观看 | 99日精品| 美女胸又黄又水 | 国产精品偷伦视频免费观看国产 | 日本三级日产三级国产三级 | 国内精品久久久久影院日本资源 | 国产com| 久操视频网站 | 人人射人人| 日本三级欧美三级人妇视频 | 国产又爽又大又黄a片 | 一本大道久久久久精品嫩草 | 亚洲区欧美区综合区自拍区 | 国语对白一区二区三区 | 黄色片观看 | 日本人妻伦在线中文字幕 | 天天看片天天av免费观看 | 高清粉嫩无套内谢国语播放 | 亚洲人a| 99久久精品免费看国产一区二区三区 | 漂亮人妻偷人精品视频 | 国产精品无码一区二区三区在 | 中文字幕人乱码中文 | 亚洲国产精品日韩专区av | 可播放的亚洲男同网站 | 亚洲精品成a人在线 | 国产一区二区三区免费观看网站上 | 青青久久av北条麻妃黑人 | 国产免费黄色录像 | 国产女人高潮抽搐叫床视频 | 国产精品久久一区二区三区 | 欧美久久一区二区 | 夜夜艹av| 亚洲少妇视频 | 女上男下啪啪激烈高潮无遮盖 | 精品视频第一页 | 波多野结衣绝顶大高潮 | 老熟妇午夜毛片一区二区三区 | 北条麻妃一区二区三区 | 69av片| 色偷偷偷久久伊人大杳蕉 | 国产乱肉妇乱免费 | 亚洲精品69 | 亚洲—本道中文字幕东京热 | 尤物tv国产精品看片在线 | 国产99久| www91com国产91 | 女高中生第一次破苞av | 日韩欧美视频免费在线观看 | 亚欧美日韩 | 久久精品99久久香蕉国产色戒 | 日本大片免a费观看视频 | 亚洲中文在线精品国产 | 亚洲欧美日韩综合俺去了 | 国产激情久久久久久熟女老人 | 摸少妇的奶她呻吟不断爽视频 | 欧美成a高清在线观看 | 免费看婬乱a欧美大片 | 成年人午夜视频 | 男女啪啪猛烈无遮挡猛进猛出 | 9|在线观看免费 | 久久夜色精品国产www红杏 | 精品无码久久久久久久久久 | 暗哟交小u女国产精品袍频 午夜yy | 青娱乐极品在线 | 毛片大片| 毛片女人18片毛片女人免费 | 丰满少妇高潮惨叫视频 | 香蕉视频免费 | 亚洲免费成人av | 福利小视频在线播放 | 中文字幕巨乳 | 日本黄色片在线观看 | 影音先锋无码aⅴ男人资源站 | 色窝窝无码一区二区三区色欲 | 国产麻豆剧果冻传媒星空视频 | 国产无套中出学生姝 | 亚洲一区在线日韩在线尤物 | av网址在线| 99色| 欧美色欧美亚洲高清在线视频 | 精品一区二区久久久久久按摩 | 日韩欧美另类在线 | 久草久 | 国产色噜噜 | 久久黄色小说 | 亚洲精品六区 | 日韩一二三区在线 | 永久黄网站色视频免费观看 | 精品一区二区三区四区 | 男人的天堂网在线观看 | 色欲香天天天综合网站小说 | 日韩av无码中文无码电影 | 人妻丰满熟妇ⅴ无码区a片 黄色片观看 | 国产91在线播放 | 国产精品视频网站 | 亚洲欧美国产日韩在线观看 | 国产精品老热丝在线观看 | 91精品久久久久五月天精品 | 四十如虎的丰满熟妇啪啪 | 九九久久国产精品 | 影音av在线 | 四虎成人精品在永久在线 | 好男人中文资源在线观看 | 东京热中文字幕a∨无码 | 国产精品对白久久久久粗 | 成年人在线免费观看av | 亚洲精品人成网线在播放va | 特级毛片a片久久久久久 | 又湿又紧又大又爽a视频 | 国产igao视频网在线观看 | 久久午夜国产精品www忘忧草 | 日本精品啪啪一区二区三区 | 欧美人与动牲交a免费观看 亚洲人成人无码网www国产 | 成人网在线播放 | 99视频在线免费播放 | 国产亚洲精品久久久久婷婷图片 | 国产精品456在线播放 | 欧美日韩一二区 | 国产欧美高清 | 国产黄a三级三级 | 国产69精品久久久久人妻 | 成人免费crm一区二区 | 国产精品无码免费播放 | 国产妇女乱码一区二区三区 | 国产亚洲999精品aa片在线爽 | 日韩欧美在线观看免费 | 日韩精品毛片无码一区到三区 | 男女一边摸一边做爽视频 | 99视频30精品视频在线观看23245 天天性综合 | 2020国产精品久久精品 | 亚洲欧美日韩精品suv | 久久久久偷看国产亚洲87 | 婷婷色国产精品视频一区 | 999亚洲国产精 | 四川丰满妇女毛片四川话 | 国产又黄又猛又粗又爽的小说网站 | 国产在不卡免费一区二区三 | 日本一级中文字幕久久久久久 | 99日本精品永久免费久久 | 伊人伊成久久人综合网小说 | 少女韩国电视剧在线观看完整 | 免费一级特黄特色毛片久久看 | 成熟女人毛片www免费版在线 | 激情福利 | 国产亚洲精品美女久久久m 欧美高清视频在线观看 | 免费看又黄又爽又猛的视频 | 97看片吧| 人妻熟妇乱又伦精品视频 | 国产又粗又硬又黄 | 久久亚洲精品无码gv | 亚洲熟妇中文字幕日产无码 | 佐山爱巨大黑人司机在线观看 | 日本精品免费视频 | 国产精品久久久久久久av | 亚洲欧美自拍色综合图 | 登山的目的在线 | 神马影院午夜理论二 | 久久久久久久久女人体 | 欧美阿v高清资源在线 | 免费人成精品欧美精品 | 欧洲熟妇牲交 | 久久伊人久久 | 无码中文字幕人妻在线一区二区三区 | 欧美激情精品久久久久 | 亚洲 欧美 国产 动漫 综合 | 国产毛1卡2卡3卡4卡网站 | 国内精品国产成人国产三级粉色 | 成人在线视频免费观看 | 欧美一区二区公司 | 成人国产精品秘片多多 | 祥仔av免费一区二区三区四区 | 欧美午夜在线视频 | 亚洲中文字慕日产2021 | 九九热视频在线免费观看 | 91国内揄拍国内精品对白 | 日本人与黑人做爰视频网站 | 九九热精品视频在线播放 | 欧美三级视频在线播放 | 亚洲欧美韩国综合色 | 国产日产亚洲系列最新美使用方法 | 日日摸夜夜添夜夜添亚洲女人 | 欧美毛茸茸 | 九色 在线| 嫩草91影院 | 亚洲一区激情校园小说 | 久久99精品久久久久久齐齐 | 天堂av亚洲 | 国产婷婷一区二区三区 | 国产午夜精品一区二区三区嫩草 | 亚洲精品影院在线观看 | 久久深爱网| 亚洲成aⅴ人在线电影 | 国产一卡2卡3卡四卡精品国色无边 | 久久人人精品 | 国产精品普通话国语对白露脸 | 五月激情视频 | 亚洲午夜久久久久久久久电影网 | 欧美18精品久久久无码午夜福利 | 中文字幕日韩欧美一区二区三区 | 午夜日韩av | 狠狠色噜噜狠狠狠狠av不卡 | 亚洲中文字幕无码中文字在线 | 国产视频手机在线播放 | sm调教av | 91视频免费观看在线看 | 亚洲第一色图 | 精品亚洲永久免费精品 | 日韩影视电视免费观看 | 护士奶头又大又软又好摸 | 亚洲欧美另类激情综合区蜜芽 | 亚洲色成人网站www永久四虎 | 色com| 无码一区二区波多野播放搜索 | 日本猛少妇色xxxxx猛叫 | 黄色片一区二区三区 | 久久最新免费视频 | 亚洲一区二区三区影视 | 在线观看国产欧美 | 一二三av | 自拍偷拍欧美亚洲 | 国产精品综合av一区二区国产馆 | 国产一av| 日韩成人av网址 | 伊人久久大香线蕉av五月天 | 你懂的网址在线 | 欧美精品日韩在线 | 92午夜福利少妇系列 | 在线v片免费观看视频 | 亚洲另类精品无码专区 | 国产精品国产三级区别第一集 | 男女超爽视频免费播放 | 国产成人亚洲精品无码影院bt | 天堂福利 | 污污污污污污www网站免费 | 中文字字幕在线精品乱码 | 日本精品少妇一区二区三区 | 国产人妻精品一区二区三区不卡 | 欧美寡妇性猛交xxx免费 | 国产96在线 | 妺妺窝人体色www在线小说 | 欧美肥婆性猛交xxxx | 九色视频网| 色眯眯影院 | 久久久久黄 | 亚洲第一区欧美国产综合86 | 久久99精品久久久久久吃药 | 精品人妻少妇一区二区三区 | 免费国产人成18在线观看 | 超碰97在线资源 | 天堂av中文网 | 天堂资源中文在线 | 九九热在线视频观看这里只有精品 | 热舞福利精品大尺度视频 | 欧美天堂在线观看 | 高清破外女出血av毛片 | 国产乱淫av片免费观看 | 久久婷婷麻豆国产91天堂 | 国产白丝精品91爽爽久 | 久久久夜色| 东京热无码av男人的天堂 | 丝袜足控免费福利xx | 人妻少妇乱子伦精品无码专区电影 | 日本高清www午色夜com | 国产精品无人区 | 中国内地毛片免费高清 | www.久久婷婷| www天堂在线 | 中文字幕日韩精品在线 | 国产欧美一区二区视频 | 国产三区四区视频 | 久久九九精品国产免费看小说 | 无码av免费一区二区三区试看 | 国产一级黄视频 | 日韩黄色录像 | 日韩免费网址 | 夜色av网 | 欧美成人一区二区三区在线视频 | 国产欧美亚洲精品第一区软件 | 中文字幕欧美亚洲 | 黄色一级免费网站 | 26uuu在线亚洲欧美 | 韩国精品视频一区二区在线播放 | 色香欲天天天影视综合网 | 成人国产网站 | av在线资源网站 | 亚洲色欲色欲www在线看 | 久久久这里只有免费精品 | 97在线视频免费 | 精品丝袜国产自在线拍av | 免费裸体黄网站18禁免费 | 奇米影视在线视频 | 久久www免费人成看片美女图 | 日本特黄特色大片免费视频老年人 | 亚洲国产午夜精品理论片 | 我要色综合网 | 免费人妻av无码专区 | 99国产精品久久久久99打野战 | 久爱无码精品免费视频在线观看 | 无码国产精品久久一区免费 | 黄色av免费网址 | 欧美成人看片一区二三区图文 | 人妻中文字幕在线网站 | 寂寞少妇色按摩bd | 午夜高清免费视频 | 福利视频一区二区 | 欧美亚洲网站 | 北条麻妃一区二区三区在线视频 | 在线视频亚洲一区 | 九色porny丨天天更新 | 拍拍拍无挡免费视频 | 无码人妻一区二区三区免费手机 | 欧洲美女性开放视频 | www久久久天天com | 国产三级做爰在线播放 | 五月天黄色网 | 69国产精品久久久久久人妻 | 亚洲精品免费播放 | 欧美一区二区最爽乱淫视频免费看 | 日韩精品视频网 | 在线成人欧美 | 久久人人97超碰国产精品 | 日韩视频网站在线观看 | av手机网站| 伊人狠狠色 | 日皮视频免费观看 | 天天躁夜夜躁狠狠躁2021牛牛 | 一区二区三区福利 | 国产精品色 | 久久99精品一区二区蜜桃臀 | 久久成人综合 | 亚洲 自拍 欧美 小说 综合 | 夜夜国产亚洲视频香蕉 | 国产av丝袜一区二区三区 | 亚洲日韩在线中文字幕线路2区 | 粉嫩av一区二区三区四区免费 | 天天操综合 | 国产成人8x人网站视频 | 久久国产精品99精品国产 | 天天射夜夜爽 | 午夜激情视频 | 在线观看免费人成视频 | 欧美一区二区三区性视频 | 男女做爰裸体猛烈吻胸摸 | 日本不卡高清一区二区三区 | 天天插天天干天天射 | 亚洲精品一区二区三区福利 | 亚洲欧洲日产无码中文字幕 | 99久视频 | 中文字幕乱码一区二区三区四区 | 天天拍夜夜添久久精品 | 天天射日日射 | 天天舔天天干天天操 | 国产美女视频免费观看的网站 | 亚洲精品视 | 亚洲高潮呻吟xoxo | 国产乱码卡一卡2卡三卡四 另类视频在线观看+1080p | 男女无套免费网站 | 中文字幕无码不卡一区二区三区 | 日韩精品无码久久一区二区三 | 天天做天天爱天天综合网 | 加勒比中文无码久久综合色 | 激情五月激情 | 亚洲中文久久精品无码浏不卡 | 99国精品午夜福利视频不卡99 | 色伊人久久 | 国产内射老熟女aaaa∵ | 亚洲卡一卡二卡三乱草莓 | 中文字幕人妻高清乱码 | 欧美激情欧美激情在线五月 | 亚洲色自偷自拍另类小说 | 欧美日韩一区二区在线 | 国产淫 | 天天干视频在线 | 午夜爽爽爽男女污污污网站 | 少妇69xx| 国产成人a人亚洲精品无码 伊人99在线 | 一级黄色a大片 | 国产无套内射久久久国产 | 免费在线小视频 | 粉嫩小泬视频无码视频软件 | 久久久精品无码中文天美 | 天天干天天操天天干天天操 | 内射欧美老妇wbb | 看全黄大色黄大片美女人 | 国产农村妇女毛片精品久久麻豆 | 国产欧美日韩一区二区加勒比 | 国产精品 欧美 亚洲 制服 | 精品香蕉在线观看视频 | 亚洲成aⅴ人在线观看 | 全部av―极品视觉盛宴亚洲 | 国产美女精品一区二区三区 | 国产精品伦一区二区三区在线观看 | 免费国产黄网站在线观看视频 | 国产精品∧v在线观看 | 中文字幕无码精品亚洲35 | 国产成人愉拍免费视频 | 日韩在线观看中文字幕 | 三上悠亚精品一区二区久久 | 亚洲国产精品一区二区成人片国内 | 无码人妻aⅴ一区二区三区69岛 | 亚洲精品无码永久在线观看男男 | 午夜精品一区二区三区在线视 | 在线视频网站www色 亚洲国产欧美日韩在线 | 97黄色网 | 亚洲综合一区二区三区 | 成人免费无码大片a毛片小说 | 日产精品久久久久 | 国产黑色丝袜呻吟在线91 | 欧美福利视频一区二区 | 三级经典三级日本三级欧美 | 91亚洲视频在线观看 | 欧美一区二区三区久久久 | wwwxxx日韩| 国产成人一区二区三区在线观看 | 99久久精品免费观看国产 | 激情 亚洲| 亚洲最大成人综合网720p | 国产一区视频一区欧美 | 91av成人| 午夜免费无码福利视频麻豆 | 国精产品一区一区三区mba下载 | 国产精品久久久久久久久软件 | 色狠狠色婷婷丁香五月 | 国产xxx18 | 麻豆文化传媒精品一区 | 1区2区视频 | 国产在热线精品视频99公交 | 天堂…中文在线最新版在线 | 尤物国产视频 | 中文字幕国产在线观看 | 五月婷六月婷婷俺也去 | 四色网址 | 久久999精品国产只有精品 | 一区二区动漫 | 国产又色又爽又黄刺激视频免费 | 直接在线观看的三级网址 | 久久亚洲人成电影网 | 农村少妇无套内谢粗又长 | 最新国产精品精品视频 视频 | 男人阁久久 | 亚洲男人第一天堂 | 国产成人av一区二区三区在线观看 | 色欲aⅴ 无码 | 日日夜夜躁 | 成人在线毛片 | 亚洲第一av无码专区 | av一区二区在线观看 | 亚洲人成人天堂h久久 | 1000部无遮挡拍拍拍免费视频观看 | 另类av小说 | 成人av无码国产在线观看 | 黄色三级三级三级三级 | 一道本一区二区 | 中文字幕丰满乱子伦无码专区 | 夜夜夜夜曰天天天天拍国产 | 在线观看免费国产视频 | 少妇人妻无码专区视频免费 | 亚洲性欧美色 | 免费午夜福利在线观看视频 | 国产精品爆乳在线播放 | 明星乱 亚洲合成图.com | 国产靠逼视频 | 国产精品久久久久久久久免费 | 久久久久综合成人免费 | 2020国产精品永久在线 | 日韩成人大屁股内射喷水 | 国产午夜在线视频 | 国产精品99久久免费观看 | 欧美高清视频一区二区 | 久久精品aⅴ无码中文字字幕 | 亚洲乱码国产乱码精品精大量 | 毛片网页 | 丰满少妇被猛烈进入高清播放 | 99精品视频免费看 | 日韩中文一区二区 | 欧美性videostv另类极品 | 国内少妇情人精品av | 乱中年女人伦av一区二区 | 一本久道竹内纱里奈中文字幕 | 77se77亚洲欧美在线 | 艳妇乳肉豪妇荡欧美片堕落 | 欧美性xxxx极品hd大豆行情 | 人妖系列网站在线观看 | 国语对白刺激精品视频 | 夫妻淫语绿帽对白 | 国产成人无码av | 丁香六月激情 | 免费看国产黄色片 | 国变精品美女久久久久av爽 | 婷婷综合六月 | 国自产拍偷拍福利精品免费一 | 九色 porny 蝌蚪 | 天堂√在线中文最新版8 | 又粗又大内射免费视频小说 | 伊人网视频在线 | 亚洲免费观看av | 日韩精品卡通动漫网站 | 91美女片黄| 国产午夜伦理片 | 成年在线观看视频 | 国a产久v久伊人 | 久久99久久99精品免视看婷婷 | 久久99精品久久久久久园产越南 | 免费在线观看毛片网站 | 综合精品在线 | 伊人激情av一区二区三区 | 日本一区二区三区视频在线观看 | 国产露脸精品国产沙发 | 天堂www中文在线资源 | 九九久久精品国产波多野结衣 | 叼嘿在线观看 | 青青青青青手机视频在线观看视频 | 日本丰满少妇黄大片在线观看 | 男女啪啪做爰高潮免费网站 | 欧美亚洲日韩国产综合电影 | 国产亚洲欧洲av综合一区二区三区 | 国产亚洲精品久久久久久无亚洲 | 久久久久久久久久久国产精品 | 久久久精品国产99久久精品麻追 | 国产尤物视频在线观看 | 无码丰满熟妇 | 亚洲综合色区中文字幕 | 99在线免费播放 | 色噜噜日韩精品欧美一区二区 | 国产毛多水多高潮高清 | 久久97人人超人人超碰超国产 | 老司机av福利 | 美女啪啪网 | 国产欧美一区二区久久性色99 | 激情视频综合网 | 精品无码久久久久国产电影 | 天堂中文网 | 久久成人综合网 | 亚洲国产日韩精品二三四区91 | 午夜一本 | 噜噜噜噜狠狠狠7777视频 | 免费观看无遮挡www的视频 | 国内少妇偷人精品视频免费 | 日本黄色aaa | 欧美高清一区二区三区四区 | 国产卡一卡二卡三卡免费 | 中文字幕亚洲乱码熟女在线萌芽 | 久久国产成人午夜av浪潮 | 精品一区二区三区免费毛片爱 | 在线视频一二三区 | 伴郎粗大的内捧猛烈进出视频观看 | 国产无遮挡又黄又爽奶头 | 一本色道久久东京热 | 极品魔鬼身材女神啪啪96 | 欧美aa一级 | 国产亲伦免费视频播放 | 亚洲日本va午夜中文字幕久久 | 中国偷拍老肥熟露脸视频 | 性欧美乱妇高清come | 噼里啪啦动漫在线观看免费 | 免费无码又爽又刺激高潮视频 | 激情内射亚州一区二区三区爱妻 | 精品欧美久久久 | 国产成人无码短视频 | 69免费视频 | 亚洲中文av一区二区三区 | 野狼第一精品社区 | 国内少妇高清露脸精品视频 | 精品国偷自产在线视频九色 | 激性欧美激情在线 | 国模无码大尺度一区二区三区 | 2018中文字幕第一页 | 四虎影院永久免费观看 | 成人性生交大片免费看vr | 网站色| 不卡视频一区二区三区 | 午夜不卡福利 | 丁香五月激情综合亚洲 | 免费一级特黄 | 成年免费视频黄网站在线观看 | av丝袜美腿 | 国产精品久久久久久久网 | 日本舐足脚视频 | 天天摸夜夜 | 人妻少妇不满足中文字幕 | 国产成a人亚洲精v品在线观看 | 国产福利精品在线 | 国产亚洲精品久久久久久久久动漫 | 香蕉视频国产在线 | 欧洲成人午夜免费大片 | 色七七桃花综合影院 | 亚洲国产成人精品无码区宅男? | 亚洲国产av玩弄放荡人妇系列 | 欧美综合77777色婷婷 | 一级特黄少妇高清毛片 | 欧美中文字幕在线视频 | 欧美肥臀大屁股magnet | 国产性一交一伦一色一情 | 国产精品未满十八禁止观看 | 欧美日国产 | 香蕉视频啪啪 | 黑人巨大精品欧美视频一区 | www.久久国产 | 在线观看中文字幕视频 | 国产情侣激情 | 日本精品巨爆乳无码大乳巨 | 国产激情免费 | 一级特黄aa大片欧美 | 97国产露脸精品国产麻豆 | 久久精品视频3 | 国产精品一区二区三区免费视频 | 美女网站免费视频 | 小嫩批日出水视频 | 性欧美激情aa在线看 | 久久久久99精品成人片牛牛影视 | 国产香蕉一区二区三区 | 成人av自拍 | 999久久精品 | 91视频第一页 | 日日干av | 亚洲va天堂va在线va欧美 | 精品国产99久久久久久麻豆 | 天堂va在线 | 4438x全国最大色 | 国产美女午夜视频 | 欧美肉体xxxx裸体137大胆 | 色www永久免费视频首页在线 | 国产精品视频一区二区三区四 | 久久99精品这里精品6 | 亚洲日本黄色片 | 久久久全国免费视频 | 日本一区二区在线视频 | 午夜伦情电午夜伦情电影 | 日本天堂中文字幕 | 亚洲欧美中文日韩v日本 | 中文字幕人妻三级中文无码视频 | 少妇熟女视频一区二区三区 | 欧美成aⅴ人高清免费 | 好男人好资源在线观看免费视频 | 小泽玛利亚一区二区三区视频 | 欧美一级在线播放 | 狂野欧美性猛交xxⅹ李丽珍 | 四虎最新地址 | 亚洲综合无码一区二区三区不卡 | 国产有码在线 | 秋霞在线中文字幕 | 中文天堂网www新版资源在线 | av在线播放一区二区 | 久久av无码aⅴ高潮av喷吹 | 在线精品动漫一区二区无码 | 久久国产精品久久精品国产 | 人妻无码人妻有码中文字幕 | 亚洲精品一区二区三区四区乱码 | 国产女人水真多18毛片18精品视频 | 国产精品自产拍高潮在线观看 | 国产精品揄拍100视频 | 综合网中文字幕 | 男人添女人囗交做爰视频 | 欧美日韩精品久久久免费观看 | 国产九九九九九九九a片 | 日韩欧美一区视频 | 99亚洲精品在线 | 国产青榴视频在线观看 | 国产精品国产a | 夜色综合网 | 饥渴丰满少妇大力进入 | 亚洲欧美日韩国产成人精品影院 | 亚洲免费不卡视频 | 国产制服丝袜亚洲日本在线 | 亚洲午夜久久久影院 | 天天狠天天透天干天天怕∴ | 欧美成人猛交69 | 78亚洲精品久久久蜜桃网 | 日美韩一区二区三区 | 91爽爽 | 男人的天堂亚洲一线av在线观看 | 国产美女自卫慰视频福利 | 欧美日韩精品成人网站二区 | av无码人妻波多野结衣 | 欧美日韩一区二区三区在线观看视频 | 亚洲天堂v| 国产成人精品久久二区二区 | 天天躁日日躁狠狠躁av麻豆男男 | 国产午夜福利久久精品 | 天天操网| 国产精品国产三级国av麻豆 | 国产性色的免费视频网站 | 国产精品午夜视频 | 国产丝袜肉丝视频在线 | 国产精品高潮呻吟久久av郑州 | 又色又污又爽又黄的网站 | 丝袜天堂网 | 亚洲国产午夜 | 色翁荡息又大又硬又粗又爽 | 日韩视频在线免费观看 | 午夜免费视频 | 久草在线3| 欧美自拍视频 | 免费无码又爽又刺激高潮的动漫 | 亚洲色无码专区在线观看精品 | 最近中文字幕mv在线视频看 | 人人干97 | 久久国产亚洲精品赲碰热 | 日本japanese丰满少妇 | 在线观看老湿视频福利 | 中文乱码免费一区二区三区 | 韩国三级中文字幕hd | 精品国产91久久久久 | 日韩特黄| 久久www免费人成看片高清 | 国产福利一区二区麻豆 | 亚洲天堂男人av | 超清无码波多野吉衣中文 | 久久精品一本到东京热 | 99久久精品久久久久久清纯 | 91精品久久久久久久 | 国产成人免费永久播放视频平台 | 国产免费一级一级 | 真实单亲乱l仑对白视频 | 中文字幕视频一区二区 | 国产精品sp调教打屁股 | 韩国精品无码少妇在线观看 | 亚洲国产良家在线观看 | 岛国搬运工av在线播放 | 亭亭五月天网站 | 午夜aaaa| 色婷婷久久综合 | xxx亚洲日本| 国产精品久久久久久久久快鸭 | 最新黄色毛片 | 自拍视频亚洲综合在线精品 | 观看国产色欲色欲色欲www | 成人h在线无码精品动漫网站 | 97碰碰碰 | 欧美精品1 | 亚洲色欲色欲www | 国色天香社区视频手机免费 | 国产精品成人久久小草 | 久久精品国产久精久精 | 免费无码又爽又刺激聊天app | 国产国拍亚洲精品av | 亚洲精品卡2卡三卡4卡2卡乱码 | 中文字幕欧美在线观看 | 呻吟揉丰满对白91乃欧美区 | 大肉大捧一进一出好爽 | 亚洲红桃视频 | 熟女性饥渴一区二区三区 | 无码一区二区三区不卡av | 国产色影院 | 日本黄色特级片 | 亚洲欧美va天堂人熟伦 | 国产精品久久久久久久久久久久久久久久久 | 99re这里只有精品在线观看 | 免费观看在线a毛片 | 嫩草网址 | 亚洲精品久久一区二区无卡 | 国产精品嫩草影院入口日本一区二 | 亚洲爆乳大丰满无码专区 | 久久精品国产99久久无毒不卡 | 色咪咪网站 | 巨胸喷奶水www久久久免费动漫 | 又爽又黄又无遮挡网站 | 国产精品久草 | 午夜两性视频 | 男女一进一出超猛烈的视频 | 国产精品无码无在线观看 | 成人性生交大片免费看r男欢女爱 | 国产欧美日韩精品a在线看 超碰97人人爱 | 欧美顶级metart裸体全部自慰 | 国产精品白丝av网站在线观看 | 中文字幕观看在线 | 91精品麻豆 | 久久黄网| 欧美黑人疯狂性受xxxxx喷水 | 四川少妇xxxx内谢欧美 | 欧美色第一页 | 亚洲美女视频高清在线看 | 日韩欧美中文字幕综合 | 色综合久久88色综合天天6 | 狠狠色丁香久久婷婷综合蜜芽五月 | 国色天香成人一区二区 | 国产精品电影一区二区在线播放 | 亚洲色婷婷久久精品av蜜桃 | 免费观看一级特黄特色大片 | 精品久久伊人99热超碰 | 国产成年无码久久久久下载 | 精品无人国产偷自产在线 | 欧美人妻一区二区三区 | 日本免费一本一二区三区 | 午夜少妇三级全黄 | 国产精品h | 国产嫖妓风韵犹存对白 | 日本sm/羞辱/调教/捆绑视频 | 桃子视频在线www88av | 亚洲国产cao| 亚洲女同性同志熟女 | 一级淫片观看 | 天天操天天舔天天射 | 狠狠色狠狠色综合 | 国内永久福利在线视频图片 | 人妻综合专区第一页 | 五月婷婷,六月丁香 | 亚洲精品网站在线观看 | 亚洲欧美日韩成人综合一区 | 久草在线资源网站 | 国产欧美又粗又猛又爽 | 午夜看片在线 | 午夜天堂精品 | 天天做天天爱夜夜爽 | 日韩av夜夜人人澡人人爽 | 综合在线视频精品专区 | 美女av免费观看 | 免费吃奶摸下激烈视频青青网 | 拍拍拍无挡免费视频 | 青青草国产精品 | 国产无遮挡一区二区三区毛片日本 | 欧美日韩色视频 | 国产午夜精品久久精品电影 | 久久综合给合久久狠狠狠88 | 波多野结衣久久精品 | 国产这里只有精品 | 亚洲精品久久久久中文字幕一福利 | 久久精品这里热有精品 | 日韩一级片在线看 | www欧美日韩 | 最近免费中文字幕大全免费版视频 | 国产精品偷乱视频免费观看了 | 国产精品久久久久久久一区二区 | 国产你懂得 | 日韩少妇精品av一区二区 | 亚洲精品无码一区二区三区四虎 | 无码h肉动漫在线观看免费 午夜免费福利在线观看 | 乱色精品无码一区二区国产盗 | 国产精品99久久免费 | 120秒日本爱爱动态图 | 日韩一区国产 | 97小视频| 国产亚洲成av人片在线观黄桃 | 人人爽人人澡人人高潮 | 国产成人99久久亚洲综合精品 | 亚洲美女网站 | 五月综合缴情婷婷六月 | 午夜精品一区二区三区aa毛片 | 婷婷精品进入 | 无码免费婬av片在线观看 | 国产一区久久 | 中国黄色毛片 大片 | 欧美老妇与zozoz0交 | 一本一道中文字幕无码东京热 | 久久久久久天堂 | 国产微拍精品一区 | 午夜私人影院在线观看 | 色喜国模李晴超大尺度 | 国产三级香港三韩国三级 | 酒店爆操 | 日本久久久久久久久久久久 | 亚洲 自拍 欧美 小说 综合 | 国产md视频一区二区三区 | 成本人无码h无码动漫在线网站 | 国产一区二区三区在线视频 | 欧美喷潮久久久xxxxx | 涩视频在线观看 | 巨大乳做爰视频在线看 | 国产又粗又爽 | 6080一级片| 操日本老妇 | 免费ā片在线观看 | 黄在线看片免费人成视频 | 日韩欧美一中文字暮视频 | 国产97人人超碰caoprom | 免费无码黄十八禁网站在线观看 | 精品视频999 | 美女张开腿让男人桶爽 | 97在线播放 | 日本久久高清免费观看 | www日本在线观看 | 亚洲精品网站在线观看 | 毛片毛片毛片毛片毛片毛片毛片 | 亚洲欧洲日本无在线码 | 国产热re99久久6国产精品首页 | 日韩精品二| 亚洲资源网站 | 狠狠综合久久 | 青青草综合在线 | 18禁亚洲深夜福利入口 | 欧牲交a欧美牲交aⅴ | 国产在线综合网 | 国产欧美日韩一区2区 | 日本亚洲欧美综合在线 | 99国产欧美久久久精品蜜芽 | 国产精品.xx视频.xxtv | 国产∨亚洲v天堂无码久久久 | 日产精品卡一卡二 | 国产粉嫩小泬在线观看泬 | 国内野外强奷在线视频 | 免费无码黄真人影片在线 | 俄罗斯老熟妇性爽xxxx | 黑色超薄丝袜脚交爽91 | 青青草狠狠操 | 美日韩在线 | 国产最新精品 | 亚洲综合成人婷婷五月在线观看 | 亚洲午夜久久久影院伊人 | 1000部又爽又黄无遮挡的视频 | 国精产品一区一区三区mba视频 | 日韩成人伦理 | 天干啦夜天干天干在线线 | 亚洲天堂av线 | 一品道高清一区二区 | 国产精品高清一区二区不卡片 | 欧美片在线观看 | 午夜成人性刺激免费视频在线观看 | 老太婆性杂交视频 | 天堂婷婷 | 国内揄拍国内精品人妻浪潮av | 欧美国产激情18 | 日日噜噜噜夜夜爽爽狠狠视频, | 亚洲欧美日韩一区二区三区在线 | 特级无码毛片免费视频播放 | 99热精品国产 | 自拍偷在线精品自拍偷免费 | 99国产欧美另类久久片 | 亚洲视频综合在线 | 国产婷婷综合 | 国产乱子伦无码精品小说 | 欧洲人免费视频网站在线 | 成人淫片免费视频95视频 | 西西人体午夜视频无码 | 九九re6热在线视频精品66 | 亚洲综合天堂av网站在线观看 | 国产无遮挡性视频免费 | 欧洲女人牲交视频免费 | 亚洲国产不卡久久久久久 | 国产无遮挡18禁网站免费 | 激情五月亚洲综合图区 | 热舞福利精品大尺度视频 | 久久久久无码精品国产不卡 | 大香伊蕉在人线国产最新75 | 久操超碰 | 超h高h污肉多p催奶药h | 无码区a∨视频体验区30秒 | 中文字幕第8页在线资源 | 人妻少妇久久中文字幕一区二区 | 最新中文字幕视频 | 国产一区二区美女 | 超碰免费在 | 亚洲精品香蕉 | 黑人巨茎大战欧美白妇 | 欧美v日韩v亚洲v最新在线观看 | 欧美aa级| 国产精品va无码一区二区 | 日本网站一区 | 无码免费毛片手机在线 | 国产成人精品免高潮在线观看 | tube欧美巨大44 | 欧洲精品免费一区二区三区 | 1000部又爽又黄无遮挡的视频 | 日本一级做a爱片 | 国产精品人妻熟女男人的天堂 | 国产av天堂无码一区二区三区 | 日日夜夜撸啊撸 | 亚洲精品国产高清一线久久 | 国产chinesehdxxxx实拍 | 超清无码熟妇人妻av在线电影 | 少妇无套高潮一二三区 | 日韩精品一区二区三区中文在线 | 双性娇软美人诱受h1v1 | 羞羞影院午夜男女爽爽免费 | 国产人妻久久精品二区三区老狼 | 国语对白自产 | 日日射视频 | 精品欧美一区二区三区精品久久 | 18禁男女污污污午夜网站免费暖暖 | 一区二区我不卡 | 久久噜噜噜精品国产亚洲综合 | 久久久久免费 | 国产精品美女av | 国产拍拍拍无遮挡免费 | 久久婷婷综合色 | 日日摸日日添日日碰9学生露脸 | 精品无码一区二区三区水蜜桃 | 欧美激情一二区 | 日韩欧美自拍偷拍 | 男人天堂tv | 亚洲免费精品 | 一区中文字幕 | 天天做天天添av国产亚洲 | 18禁黄网站禁片免费观看女女 | 久久久成人一区二区免费影院 | 国产又粗又猛又大爽又黄香借 | 国产无套流白浆视频免费 | 欧美日韩亚洲国产 | 欧美亚洲色欲色一欲www | 国产成人精品一区二区不卡 | 毛耸耸性xxxx毛耸耸 | 久久综合给合久久狠狠97色 | 国外av无码精品国产精品 | 97se亚洲综合自在线尤物 | 精品日本一区二区三区免费 | 亚洲作爱网 | 日韩精品视频在线观看免费 | av噜噜在线| aaaaaa亚洲| 欧美综合激情 | 中文字幕欧美日韩 | 日本少妇裸体做爰高潮片 | 国产欧美久久一区二区 | 精品无人乱码一区二区 | 亚洲中文无码mv | 亚洲日韩一中文字暮av | 亚洲日本乱码一区二区在线二产线 | 亚洲色欧美另类 | 国产成人午夜福利电影在线播放 | 亚欧洲精品在线视频免费观看 | 久久国产免费观看精品3 | 黄色三级视频网站 | 韩国午夜理伦三级在线观看仙踪林 | 天堂精品一区二区三区 | 国产好大好爽久久久久久久 | 亚洲精品国产一区二区三区在线观看 | 天天做天天欢摸夜夜摸狠狠摸 | 亚洲乱亚洲乱妇在线观看 | 天天撸日日夜夜 | 日本猛少妇色xxxxx猛交 | 免费在线中文字幕 | 日日好av| 伊人网免费视频 | 国产午夜性爽视频男人的天堂 | 情人知己在线观看普通话版 | 韩国精品一区二区三区无码视频 | 欧美一区免费观看 | 久久成人一区二区三区 | 国产精品伦一区二区三区 | 韩日av在线| 动漫成人无码精品一区二区三区 | av亚欧洲日产国码无码 | 色综合天天综合网天天狠天天 | 黄色片中文字幕 | 国产成a人亚洲精品 | 成人性生交免费大片 | 青青青青国产免费线在线观看 | 日本精品入口免费视频 | 亚洲精品一区二区三区早餐 | 2020精品国产午夜福利在线观看 | 青青青手机视频 | 亚洲日本乱码中文在线电影 | 久久精品一 | 国产精品视频一区二区噜噜 | av不卡网 | 在线精品自偷自拍无码中文 | 成人激情av在线 | 男人下部进女人下部视频 | 久久人人爽人人爽爽久久 | 午夜免费国产体验区免费的 | 麻豆视频一区二区 | 欧美一级特黄aaa | 成人伊人青草久久综合网 | www.亚洲天堂网 | 亚洲日本三级 | 精品美女久久久 | 麻豆一二三区精品蜜桃 | 视频一区在线观看 | 在线看片免费人成视频影院看 | 国产啪精品视频网站丝袜 | 一级国产航空美女毛片内谢 | 最近日本免费观看高清视频 | 国产嫖妓一区二区三区无码 | 国产一级一片免费播放放a 国产人妻精品无码av在线 | 日韩欧美一级二级 | 中文字幕精品一区二区精品绿巨人 | 国产亚洲日韩在线a不卡 | 玖玖爱在线精品视频 | 日本老妇做爰xxx视频 | 在线不卡福利 | 欧美片在线观看 | 无码熟妇人妻av在线网站 | 日韩av不卡在线播放 | 欧美激情五月 | 日本三级短视频 | 亚洲啪啪少妇裸体艺术 | 清纯唯美经典一区二区 | 欧美日韩国产va另类 | 日韩欧美中文字幕在线三区 | 欧美在线观看视频一区二区 | 日韩精品1区| 欧美精品日日鲁夜夜添 | 黑人操欧美人 | 日本激烈吮乳吸乳视频 | 亚洲成a人一区二区三区 | 亚洲精品高清av在线播放 | 人人妻人人澡人人爽欧美精品 | 最新国内精品自在自线视频 | 男女做爰猛烈啪啪吃奶图片 | 尤妮丝大尺度av在线播放 | 亚洲精品一二三区久久伦理中文 | 日韩视频一区二区三区四区 | 中文国产乱码在线人妻一区二区 | 亚洲桃色综合影院 | 军警糙汉1v1高h | 久久久综综合色一本伊人 | 国产91成人 | 精品无码久久久久久尤物 | av第一福利网站 | 911香蕉视频 | 神马午夜av | 亚洲精品图区 | av国産精品毛片一区二区网站 | 男生操男生的小说 | 国产高清-国产av | 国产精品免费久久久 | 亚洲精品一品区二品区三品区 | 日韩欧美高清片 | 国产福利一区二区三区在线视频 | 69av导航| 人妻夜夜添夜夜无码av | 国产亚洲tv在线观看 | 亚洲va无码专区国产乱码 | eeuss鲁片一区二区三区在线观看 | 亚洲日韩中文第一精品 | 亚洲 中文 欧美 日韩 在线观看 | 爽爽影院在线免费观看 | 男人舔女人b视频 | 婷婷激情成人 | 小次郎av最新地址入口 | 五月天综合视频 | 色综合天天综合网天天狠天天 | 亚洲xx网站 | 五月天天色 | 66m—66摸成人免费视频 | 人妻熟女一区 | 伊人天天久大香线蕉av色 | 国产精品国产亚洲精品看不卡15 | 天天做天天爱天天爽天天综合 | 92成人午夜福利一区二区 | 国产黄色免费片 | 九九线精品视频在线观看 | 日本伊人精品一区二区三区 | 精品第一页 | 四虎国产精品永久地址99 | 亚洲图片视频一区 | 少妇人妻无码专区在线视频 | 在线日韩中文字幕 | 国产呻吟久久久久久久92 | 97精品一区二区 | 免费观看黄色 | 久久久一本精品99久久精品66 | 欧美亚洲日韩不卡在线在线观看 | 欧美成人三区 | 成年无码动漫av片在线观看羞羞 | 日韩专区在线 | 国产精品免费观看调教网 | 日本孰妇毛茸茸xxxx | 亚洲欧美另类久久久精品能播放的 | 日日夜夜中文字幕 | 操碰视频在线 | 日本熟妇人妻xxxxx视频 | 精品夜夜澡人妻无码av | а√天堂资源官网在线资源 | 亚洲精品一区二区另类图片 | 亚洲嫩模喷白浆在线观看 | 在线播放福利 | 在线播放国产精品三级 | 久久免费99精品久久久久久 | 131美女爱做视频免费 | 五月婷六月| 日韩内射美女人妻一区二区三区 | 虎白女粉嫩尤物福利视频 | 日日摸天天添天天添破 | 国模少妇无码一区二区三区 | 初音未来爆乳下裸羞羞无码 | 青青草手机视频在线观看 | 1024中文字幕 | 欧美在线视频网 | 国产精品wwwww | 99久久国产综合精品麻豆 | 成年奭片免费观看视频天天看 | 欧美性猛交xxxx免费看久久久 | 日日碰 | 91视频综合| 亚洲国产欧美一区二区三区久久 | 中文av片 | 国产成人啪精品午夜在线观看 | 久久久久久国产精品无码下载 | 天天射天天噜 | 日本高清不卡aⅴ免费网站 欧美色综合天天久久综合精品 | 亚洲自偷自偷图片 | 丰满少妇大乳高潮高清 | 无码一区二区三区亚洲人妻 | 成人黄色小视频 | 亚洲黄视频在线观看 | 亚洲一区精品人人爽人人躁 | 日本加勒比在线视频 | 亚洲成人a v | 国产成人a在线视频免费 | 日韩精品视频在线播放 | 国产精品午夜在线 | 中文字幕色av一区二区三区 | 少妇一级淫片免费观看 | 日韩人妻中文无码一区二区 | 亚洲中文字幕无码av永久 | 国产精品无码a∨果冻传媒 乱码一区二区 | 亚洲永久网址在线观看 | 精品国产依人香蕉在线精品 | 亚洲久久在线观看 | 色成人www精品永久观看 | 麻豆精品精华液 | 九九热只有精品 | 成人乱人乱一区二区三区软件 | 亚洲国产桃花岛一区二区 | 欧产日产国产精品99 | 欧美精品国产aⅴ一区二区在线 | 国产超碰人人做人人爽av牛牛 | 欧美无遮挡很黄裸交视频 | 亚洲第一天堂久久 | 人妻系列无码专区av在线 | 最近中文字幕免费mv在线视频 | 国产日韩在线观看视频 | 日本真人无遮挡啪啪免费 | av在线 亚洲 天堂 | 久久综合九色综合97网 | 国产日韩欧美中文字幕 | 六月婷婷综合网 | 亚洲伊人成无码综合影院 | 成人精品视频 | 乌克兰性欧美精品高清 | 精品久久久爽爽久久男人和男人 | 国产精品午夜免费福利视频 | 丁香五月婷激情综合第九色 | 久草网址 | 拍国产乱人伦偷精品视频 | 国产自在自线午夜精品 | 久久成人18免费网站 | 欧美大逼逼 | 粉嫩av久久一区二区三区 | 尹人综合在线 | 色女人在线 | 一本一本久久a久久精品综合麻豆 | 精品国产乱码久久久久久红粉 | 人操人爽| 免费xxxxxxxx在线播超清 | 四虎国产精品永久在线 | 日韩不卡视频在线观看 | 69福利视频| 欧美a√在线 | 欧美精品在线视频观看 | 欧美另类精品xxxx人妖 | 国产成人综合欧美精品久久 | 中文字幕精品久久一二三区红杏 | 国产精品亚洲综合色区韩国 | 一本久道竹内纱里奈中文字幕 | 国内丰满少妇猛烈精品播 | 亚洲成人网在线 | 国产a精彩视频精品视频下载 | 国产男女猛烈无遮掩视频免费网站 | 日日夜夜国产 | 尤物综合网| 乱码一区二区三区四区 | 91精品国产综合久久久久久久久 | 黑人巨大人精品欧美三区 | 国产又粗又猛又爽又黄视频 | 91精品国产91久久久久福利 | 性欧美视频videos6一9 | 日韩第一页在线观看 | 国产又粗又猛又爽又黄视频 | 精品日本一区二区三区在线观看 | 成在线免费视频 | 亚洲影院在线播放 | 夜鲁鲁鲁夜夜综合视频 | 高清偷自拍第1页 | 欧美精欧美乱码一二三四区 | 成人无码小视频在线观看 | 亚洲成成熟女人专区 | 二区三区四区视频 | 欧美亚洲在线播放 | 精品无码国产自产拍在线观看 | 国产精品免费无码二区 | 国产乱色国产精品免费视频 | 一级黄色香蕉视频 | 就要日就要操 | 亚洲欧美一区二区三区国产精品 | 无码av免费永久免费永久专区 | 亚洲国产精品成人精品无码区在线 | 欧美一区二区三区婷婷月色 | 婷色| 国产人妖视频一区二区 | 亚洲成aⅴ人片久青草影院按摩 |