3atv精品不卡视频,97人人超碰国产精品最新,中文字幕av一区二区三区人妻少妇,久久久精品波多野结衣,日韩一区二区三区精品

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

MPQ技术内幕__

發布時間:2023/12/14 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MPQ技术内幕__ 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

翻譯前聲明:
本翻譯對于原文進行了適量刪節和修改。
本翻譯只做為學習參考使用,不得用于任何商業目的。
原文地址:http://www.campaigncreations.org/starcraft/inside_mopaq/

第一章 關于MPQ的歷史


MPQ,也稱MoPaQ,是Mike O'Brien發明的一種壓縮文件格式。
在1996作為,MPQ應用在Diablo(暗黑破壞神)游戲中。
然而它的版權屬于 Blizzard 的父公司 Havas Interactive,并且在Mike O'Brien離開暴雪后繼續使用。 正是MPQs由于在Diablo(暗黑破壞神)中的出色表現,使其繼續應用在Starcraft(星際爭霸), Warcraft 2(魔獸爭霸2), Diablo 2(暗黑破壞神2), Lords of Magic(魔法大帝)中。

第二章 關于MPQ的介紹


MPQ內部包含了許多文件,包括坐標算法、聲音、動畫、字符串、數字數據和故事情節信息。
明顯地,MPQ的潛力很大。要想利用MPQ,那么您就需要了解它。

在有MPQ格式之前,一直使用的是WAR格式,在Warcraft 2,甚至在Warcraft1中存放游戲數據。然而WAR格式是簡單的,不精制的,是由缺乏經驗的程序員所編寫的文件格式(相信我,我知道)。文件在檔案中僅使用參考序數和是否被壓縮做為唯一可選擇調用的方法。
盡管如此它仍然完成了它的任務。它提供了壓縮格式下的文件調用。但是,很快缺點開始出現。調用時使用參考序數,意味著一長傳文件接口的名單必須被保留和被咨詢,當程序員需要使用其中一個文件,那么則需要級長的時間,工作變得越來越繁瑣。
當時這些問題并沒有那么嚴重,所以有人堅持使用WAR格式,但是一切在使用Battle.net(網絡對戰)后,問題變得不能接受。


MPQ的特點
如被提及以前,MPQ格式一直被用做修正WAR的設計缺陷。但是現在他們也想增加一些全新的特點到MPQ。在暴雪的游戲中,MPQ格式的特點總結為以下幾點:

Security. 安全

暴雪一定不希望在游戲中玩家可以修改數據。或許他們提早知道MPQ格式可以為Starcraft使用。 不管怎樣,安全是最重要的,由此他們顯然做了級大的努力去維護游戲的安全性。

Efficiency. 效率

MPQs要求執行時先簡單預先輸入的各種各樣的任務數據然后實時放出。對于預先輸入數據,時間并不重要。 但是實時放出就是另一件事了,其中的數據必須快速地被解壓使用。

Multilinguality.多語言的計算機處理

在最開始的時候,暴雪就計劃發布其游戲在全球游戲市場,因此他們盡可能的做到多語言。 在創新時,他們決定設計多語種能寫入MPQ格式。

Expandability.擴展

顯然的,在游戲中需要使用獨立的數據。太大的數據不僅是效率低并且減慢游戲速度,如果補丁修改了,也是很麻煩的。暴雪明白這個道理,因而MPQ格式的要求就是有能力完全,高效率的,從多個檔案數據中調用需要的數據。


什么是strom
相比在程序模塊中復制函數,多數程序員喜歡把相同代碼放到shared libraries(共享程序庫)里。shared libraries是包含了任意程序功能的函數模塊。不僅能避免多余,并且能縮小程序大小。
正因為如此,暴雪使用一個稱為Storm的共享程序庫(PC機上為Storm.dll,MAC機為Storm.bin)。
所有現代的暴雪游戲中都使用strom存放重要功能,比如讀取MPQ,Battle.net和一些圖形化例程。
當暴雪要發布新版本的游戲,只需要增加功能到strom,無需改變原有功能。 這意味著舊版本的游戲只用升級新版本strom就可以了,這就是我們俗稱的安裝補丁。
就像所有共享程序庫,任何想使用它的程序都可以訪問到它的函數。這就是為什么strom只包含MPQ讀取功能。


什么是 MPQ API Library DLL

雖然 Storm 沒有包含任何編寫MPQ的功能。
但是 StarEdit 包含,因為 SCM/SCX 文件也是 MoPaQ文件。
但是這些函數被加密了,所以只有知識淵博的黑客們才可以使用。
對于Blizzard 來說不幸的是,有一個這樣的黑客,他的名字是 Andrey Lelikov(aka Lelik)。
他發現了一種訪問這些寶貴的函數的途徑,并把這個復雜的過程封裝在
LMPQAPI.DLL(Lelik's MPQ API Library DLL)文件中。該文件自動破解
StarEdit,將這些函數展示在所有的程序員面前。

第三章 MPQ的基本原理

通過整個計算機發展史來看,絕大多數的進步都是在求解問題中發生的。
那么在這一章中,我們將采取看看一些涉及到MPQ的問題及其解決辦法。

HASH (散列或哈希)

問題:你有一個非常大的字符串數組,和一個字符串
怎么知道字符串是否在數組中?

你可能會開始在數組中與其他字符串比較每個字符串,但是,當進行應用后,你會發現,這種方法在實際使用時是特別慢的。在此之前,你又怎能在沒有與其他字符串比較的情況下,確定這個字符串是否存在?

解決方法:hash
hash是規模較小的數據類型(例如數字)能指向其他較大的數據類型(通常是字符串) 。在這種情況下,您可以在數組中先存儲hash。然后再計算其他字符串的hash,并比較它存儲的hash。通過字符串比較,如果hash在數組相匹配的新的hash,就可以核實存在。這就是所謂的索引查找,可以加快對于不同大小的數組和平均長度的字符串的搜索速度約100倍。

unsigned long HashString(char *lpszString)
{
?unsigned long ulHash = 0xf1e2d3c4;

while (*lpszString != 0)
{
??ulHash <<= 1;
ulHash += *lpszString++;
?}

return ulHash;
}


上面的代碼,體現了一個很簡單的散列算法。
功能是在每個字符添加前,把哈希值向左移動1bit,并總計字符串中的字符。
使用這種算法,字符串“arr\ units.dat ”將散列為0x5a858026,“unit\neutral\ acritter.grp ”將散列為0x694cd020 。
無可否認,這是一個很簡單的算法,但是不是非常實用。因為在較低的數字范圍內會產生一個相對可預見的輸出,以及出現大量的沖突。當多于一個字符串散列為相同值就會出現沖突。
MPQ格式使用一個非常復雜的散列算法(如下所示),產生完全不可預測的哈希值,這個算法十分有效,這就是所謂的單向散列。
就是把任意長度的輸入(又叫做預映射, pre-image),通過散列算法,變換成固定長度的輸出,該輸出就是散列值。這種轉換是一種壓縮映射,也就是,散列值的空間通常遠小于輸入的空間,不同的輸入可能會散列成相同的輸出,而不可能從散列值來唯一的確定輸入值。從預映射,能夠簡單迅速的得到散列值,而在計算上不可能構造一個預映射,使其散列結果等于某個特定的散列值。
即構造相應的任意長度明文=固定長度散列值-1(固定長度散列值)不可行。
故此使用特別算法,文件名“arr\ units.dat ”將散列為0xf4e6c69d ,和“unit\neutral\ acritter.grp ”將散列為0xa26067f3 。

unsigned long HashString(char *lpszFileName, unsigned long dwHashType)
{
?unsigned char *key = (unsigned char *)lpszFileName;
unsigned long seed1 = 0x7FED7FED, seed2 = 0xEEEEEEEE;
int ch;

while(*key != 0)
{
??ch = toupper(*key++);

seed1 = cryptTable[(dwHashType << 8) + ch] ^ (seed1 + seed2);
seed2 = ch + seed1 + seed2 + (seed2 << 5) + 3;
?}
return seed1;
}

HASH TABLES(散列表或哈希表)

問題:您嘗試在前面的示例中使用相同索引,您的程序一定會有中斷現象發生,而且不夠快。
您能做的只有讓程序不去查詢數組中的所有散列值。或者 您可以只做一次對比就可以得出在列表 中是否存在字符串。
聽起來不錯,真的么?
騙你的啦!!!

解決方案:a hash table

哈希表是數組中的一種特殊類型,也就是設定指定字符串的偏移量為那個字符串的散列值。
我的意思是,假如您設置一個字符串列表,使用一個單獨的固定大小的數組作為哈希表。
您想查看新的字符串是否在前面的哈希表里。
那么您需要先計算要查看字符串的散列值,然后以哈希表大小的散列值為模求余數。
因此,如果您使用上面列出的簡單散列算法,"arr\units.dat"將散列為0x5A858026,使其偏移量
0x26(0x5A858026 divided by 0x400 is 0x16A160, with a remainder of 0x26)。
假如這個地方有字符串,那么就會與被添加的字符串比較。
假如字符串在0x26不匹配,或直接不存在,那說明該添加的字符并不在在數組中。
下面的代碼說明了這:

int GetHashTablePos(char *lpszString, SOMESTRUCTURE *lpTable, int nTableSize)

{
?int nHash = HashString(lpszString), nHashPos = nHash % nTableSize;

if (lpTable[nHashPos].bExists && !strcmp(lpTable[nHashPos].pString, lpszString))
??return nHashPos;
?else
??return -1; //Error value
}



現在在這方面的解釋有一個明顯的缺陷。您認為發生沖突時(兩個不同的字符串哈希以同等價值的) ?顯然,他們不能在哈希表占用相同的接口。通常,解決的方法是在哈希表每個接口作為一個指針到一個鏈表,然后將鏈表里所有接口的散列值設置相同。
MPQ使用一個關于文件名稱的哈希表記錄內部文件,但是這個哈希表的格式與普通哈希表有所不同。
首先,MPQ根本不保存文件名,用三個散列值代替保存散列值的偏移量和為了核查文件名保存真實的文件名。
而是使用三個不同哈希值:一個做為哈希表的偏移量,兩個是做為核查。
兩個做為核查的哈希值被用來代替真實的文件名稱。當然,也有可能兩個不同文件名稱的散列值相同,
不過這種情況發生的可能性為平均1:18889465931478580854784 ,對于任何人來說這應該足夠安全了。


另一種方法:不同于常規的執行情況的mpq哈希表。
代替使用每個接口的鏈接表。當沖突發生時,把接口移動動下一個序列,并且重復動作,直到找到空閑空間。
下面的代碼是在MPQ設置讀取的基本方法:

int GetHashTablePos(char *lpszString, MPQHASHTABLE *lpTable, int nTableSize)
{
?const int HASH_OFFSET = 0, HASH_A = 1, HASH_B = 2;
int nHash = HashString(lpszString, HASH_OFFSET), nHashA = HashString(lpszString, HASH_A), nHashB = HashString(lpszString, HASH_B), nHashStart = nHash % nTableSize, nHashPos = nHashStart;

while (lpTable[nHashPos].bExists)
{
??if (lpTable[nHashPos].nHashA == nHashA && lpTable[nHashPos].nHashB == nHashB)
???return nHashPos;
??else
???nHashPos = (nHashPos + 1) % nTableSize;
??if (nHashPos == nHashStart)
???break;
?}

return -1; //Error value
}

每條代碼反復研究,理論的背后是不難的。
它基本上是如下這個過程:

1.計算3個散列值(一個沖突和兩個檢查)并將其存儲在變量。
2.移動沖突散列值的接口
3.接口未使用的嗎?如果是的話,停止搜尋,并傳回'文件沒有被發現' 。
4.兩個檢查是否匹配檢查我們正在尋找文件的散列值呢?如果是的話,停止搜尋,并傳回目前的接口。
5.如果在最后一個接口,移動到列表中的下一個接口,(wrapping around to the beginning ??)。
6.剛移動的借口是否和沖突時的散列值相同(是否檢查了整個哈希表? ) ?如果是的話,停止搜尋,并傳回'文件沒有被發現' 。
7.回到第3步。
如果您很仔細的話,您可能會從我的解釋和示例代碼注意到,是因為mpq的哈希表已保留所有文件接口在MPQ 。那么您認為每一個哈希表項如何得到填補?答案可能出乎您的意料卻顯而易見:您不能繼續添加文件。幾個人都問我為什么有一個上限(所謂的檔案限制),在一個MPQ中可以有多少檔案, ,是否有任何的方式解決這個限制。那么,您已經有了第一個問題的答案。至于第二項;沒有,您不能繞開該文件的限制。對這個問題,哈希表,甚至不能調整大小,除非您重新改造MPQ。在哈希表每個接口因為重新設置大小不同位置可能會改變。而且導致無法獲得新的地址,因為地址是文件名的散列值,并且我們還可能不知道檔案名稱。


Compression 壓縮
問題:您有一個很大的程序(比如說, 50 megs ) ,您要分發在互聯網上。但50 megs是一個非常大的下載量,而且別人未必有興趣等待四個半小時去下載這個程序。

解決方法:壓縮。
壓縮是一門藝術。是在更小的內存中重新放置等量的數據。
有數以百計不同的壓縮算法,使用不同的方式。
MPQ實際使用的算法是the Data Compression Library, licensed from PKWare (one of the leaders in applied compression),在此解釋太過于復雜。相反,我會嘗試解釋一個更簡單的壓縮算法的例子。

本章節并不完全 ,因為作者沒寫完


Encryption 加密

這個世界上總是有喜歡剽竊的人存在,所以我們需要有一個保護資料安全的系統。
千百年來人們一直試圖傳遞信息給他人。從手寫的信件進行,信使徒步穿越古希臘,納粹潛艇的無線電傳輸,在第二次世界大戰,使用信用卡交易,到網絡應用的今天,有能力去確保別人無法獲得您的信息是必要的。
所謂的加密是復雜的藝術的保護,然而我們不知道設計第一個算法的人,我們也不知道到底有多少的算法。一切從簡單的數據加擾,嬗變,甚至算法,其中有解密密鑰(有時也稱為密碼)是不同的加密密鑰(在一個方法所謂非對稱加密) ,已做了一次又一次。
做為一個全面的權威加密方法,本文章肯定從來沒有索賠,也不期望。
您只需要知道加密是你與MPQ直接相關的。
讓我們從一個簡單的加密算法開始,這是刊登在《Basic Lab Notes》 (為了可讀性本人改變了一些變數名稱,評論刪除) :

void EncryptBlock(void *lpvBlock, int nBlockLen, char *lpszPassword)
{
?int nPWLen = strlen(lpszPassword), nCount = 0;
char *lpsPassBuff = (char *)_alloca(nPWLen);

memcpy(lpsPassBuff, lpszPassword, nPWLen);

for (int nChar = 0; nCount < nBlockLen; nCount++)
{
??char cPW = lpsPassBuff[nCount];

lpvBlock[nChar] ^= cPW;

lpsPassBuff[nCount] = cPW + 13;

nCount = (nCount + 1) % nPWLen;
?}

return;
}


這是非常簡單的哈希代碼,不應被用來在一個實際的程序中使用。
即使代碼是隱藏的(沒有雙關語意),這也是簡單的 。
不言而喻,這是通過塊進行加密的,把每個字節與相應的字節的密碼轉換為二進制。然后修改字節的密碼,加入13 ( 選擇13是因為這是一個素數)。這樣做是為了使代碼的模式,更難以識別。
那么,用此算法,加密字符串“encryption” ( 65 6E 63 72 79 70 74 69 6F 6E),加密的密碼“ mpq ” (4D 50 51 ),這樣會得到一個無法讀取字符串(28 3E 32 28 24 2E 13 03 04 1A)。
現在,這個算法是對稱的。這意味著密碼是用來加密有相同密碼的塊。事實上,由于轉換為二進制是一個對稱的運作,完全相同的算法可以用來解密。請注意,大多數的對稱加密算法是不完全對稱,所以他們要求加密和解密的功能有所不同。

好吧,下面就就是關鍵的地方。
如果您想要編寫,就必須在哪里都知道加密算法。
教導給您這個方法是我的使命。

MPQ的加密算法混合其他加密技術。它創建了一個加密表(這也是用在散列函數) ,并使用一個文件的加密密鑰,以挑選出某些成員的加密表。然后對表中的成員進行轉換成二進制數據加密。現在,用一個相當奇怪的方法來做,所以或許有些代碼將顯示您it is overcomplicated :-p。以下代碼生成密碼表數組長度為0x500:

void prepareCryptTable()
{
?unsigned long seed = 0x00100001, index1 = 0, index2 = 0, i;

for(index1 = 0; index1 < 0x100; index1++)
{
??for(index2 = index1, i = 0; i < 5; i++, index2 += 0x100)
{
???unsigned long temp1, temp2;

seed = (seed * 125 + 3) % 0x2AAAAB;
temp1 = (seed & 0xFFFF) << 0x10;

seed = (seed * 125 + 3) % 0x2AAAAB;
temp2 = (seed & 0xFFFF);

cryptTable[index2] = (temp1 | temp2);
??}
?}
}


你是不是越來越覺得暴雪聘請了一名心懷不滿的微積分教授寫這些算法?還好對與我這不是問題,如果你不明白此代碼。如果您想要編寫,您需要這些功能,你不一定要了解他們。無論如何,在密碼表初始化后,我們可以解密MPQ數據,具有下列功能(不要期望我向您解釋,我不想知道如何運作自己! ) :

void DecryptBlock(void *block, long length, unsigned long key)
{
?unsigned long seed = 0xEEEEEEEE, unsigned long ch;
unsigned long *castBlock = (unsigned long *)block;

// Round to longs
length >>= 2;

while(length-- > 0)
{
??seed += stormBuffer[0x400 + (key & 0xFF)];
ch = *castBlock ^ (key + seed);

key = ((~key << 0x15) + 0x11111111) | (key >> 0x0B);
seed = ch + seed + (seed << 5) + 3;
*castBlock++ = ch;
?}

}



?

第四章 STROM

稱為STROM庫函數,或者簡稱為STROM。
它是對于本身的運行系統,擁有龐大的功能庫函數。甚至不需要Microsoft支持。
它本身包含了足夠強大的功能,甚至不需要調用本地API函數。
事實上,STROM包含了所有暴雪編寫的可以重復使用的功能。
但它也擁有一些操作系統特殊的要求 比如那些在GDI,DirectX,QuickDraw等等。
原因很簡單,就是為了減輕從一個系統到另一個系統的接口問題。
畢竟,這就是為什么花成千上萬的工作時間把數以千計的操作系統函數從Windows源調用Mac一樣,為什么在不花時間去做調用,而去改寫功能?

根據STROM的多個版本,大約累計了275個實際有用的功能。
正如您看到的,沒更新STROM時,仍然使用STROM庫函數。同樣,更新后依然是舊的STROM庫函數,
只是做了更新。這是為了保證游戲在不同版本的兼容性。
這些275個使用功能分為約20個功能集(通常在Windows環境下稱為subsystems,在MAC環境下稱為managers。
下面所示部分清單:
Memory Subsystem -記憶體子系統-例行的共同記憶功能,包括分配新的內存,釋放分配內存,灌裝記憶體,以及更多。STROM沒有自己的內存管理,包括內置的錯誤檢查和其他強大的功能。該子系統功能與在PC上與'mem'前綴相等。

String Subsystem - 字符串子系統-功能是使用字符串,如復制,合并,搜索等這些職能是大多數部分,相等于'str'的功能。

File Subsystem - 文件子系統-功能是存取文件系統。有能力讀出(但不包括寫入)無論是在磁盤上的可靠文件,還是mpq檔案。撇開mpq讀取的功能,其他功能都是高級系統功能運行方式。

Network Subsystem -網絡子系統-功能是接入遠端的電腦系統,通過使用IPX,調制解調器, TCP/IP和直接電纜。職能是與服務器或在游戲中玩家的通訊。使用高級系統特殊調用。

Error Subsystem -錯誤子系統- 功能是捕捉和處理錯誤。這些職能大部分沒有與任何操作系統的等值。

Registry Subsystem -登錄子系統- 功能是持久性儲存數據到計算機中。使用注冊表在Windows系統,或MACS系統上。

Bitmap Subsystem -位圖系統-功能是位圖文件裝載和顯示。使用系統特殊調用。

目前為止,大約只記錄了40種功能,因為我手邊沒有足夠時間來做,認真來做的話大約需要幾個月。
此外這里只只討論MPQ。



Using the Strom API 使用STROM API函數

說明:其余的這一章是針對Windows平臺的!

正如我以前說過,STROM功能任何人都可使用它們。不過,暴雪并不希望如此。
我花了最近兩天時間,總結出來:STROM使用一個非常邪惡的方法來對付我們這種想使用它的人。
我花了至少10個小時的努力,試圖解除愚蠢的事,而我現在可以很驕傲的說我成功了,我會全力為您解釋冗長而復雜的細節。
經過我和Mike O'Brien所謂的the Storm Interface Library(接口庫)斗智斗勇。發現這是由一個頭文件和導入庫組成,所以我做了Storm booby-traps這個工具 。要記得DLLs 101 ,是包含被用來當程序編譯連接程序DLL的導入表的導入庫 。這意味著什么,就是所有您需要做的就是storm.lib (在STROM接口庫)與模塊連接在您的程序和#include storm.h頭文件。這真令我瘋狂,我不得不讓您可以輕松使用the Storm Interface Library。
現在,為了以后少點麻煩,讓我們現在就看看STROM的功能。

Opening an MPQ Archive- SFileOpenArchive
打開MPQ存檔函數—SFileOpenArchive

?
BOOL WINAPI SFileOpenArchive(LPCSTR lpFileName, DWORD dwMPQID, DWORD dwUnknown, HANDLE *lphMPQ);
?ParameterWhat it is?
?lpFileName[in] A pointer to NULL terminated string that holds the path of the MPQ to open. SFileOpenArchive will crash if this is NULL.?
?dwMPQID[in] An ID value that is saved internally in Storm for the MPQ. What this parameter is used for is not clear at this time.?
?dwUnknownUnknown. Should always be NULL.?
?lphMPQ[out] Pointer to a HANDLE variable that, upon successful completion, will hold the HANDLE of the MPQ. SFileOpenArchive will fail if this is NULL.


在此之前,您可以先看一個MPQ文件,您必須先打開它。
為此每您必須使用SFileOpenArchive。它會打開一個存檔,并給你一個HANDLE,您可以稍后調用SFileOpenFileEx和SFileCloseArchive 。
第一個參數,lpFileName,只不過是mpq公開的名稱,絕不能為空。
第二個參數,dwMPQID 是將指派給mpq內部的ID。這并不改變mpq ,目前還不清楚為什么這樣做。
第三個參數,dwUnknown,這是唯一我們認為沒用的,但是不容忽視。
最后一個參數,lphMPQ,是一個HADLE的指針(您必須先聲明)。
如果SFileOpenArchive成功完成,this HANDLE will be that of the MPQ。
如果SFileOpenArchive成功,其返回值將為零。
但是,有幾種情況可能導致SFileOpenArchive失敗。
如果它失敗,將返回一個值是假的。在這種情況下,您可以調用GetLastError獲得更進一步的信息,為什么失敗。如果lpFileName是一個零長度字符串或phMPQ是Null ,GetLastError 將返回ERROR_INVALID_PARAMETER 。如果該文件lpFileName不存在, GetLastError 將返回 ERROR_FILE_NOT_FOUND。在一些非常罕見的情況下, GetLastError可能會返回其他一些潛錯誤值。


Closing an Archive - SFileCloseArchive
關閉存檔函數 - SFileCloseArchive

BOOL WINAPI SFileCloseArchive(HANDLE hMPQ);
?ParameterWhat it is?
?hMPQ[in] The HANDLE of the MPQ to close, which was acquired earlier with SFileOpenArchive. SFileCloseArchive will fail (or worse) if this is NULL or a HANDLE not obtained with SFileOpenArchive.


一旦您開啟一個mpq存檔,你必須記住它關閉時,您就大功告成了!SFileCloseArchive 是SFileOpenArchive 的產物。
作為與SFileOpenArchive ,SFileCloseArchive返回一個非零值,那就是成功的
如果返回一個假值,那就失敗了。
然而,在這種情況下,GetLastError不會提供任何有用的信息。
-所以你只能假設原因是hMPQ參數是無效的。

Opening a File Inside an MPQ - SFileOpenFileEx
打開MPQ內的文件函數 - SFileOpenFileEx


?
BOOL WINAPI SFileOpenFileEx(HANDLE hMPQ, LPCSTR lpFileName, DWORD dwSearchScope, HANDLE *lphFile);
?ParameterWhat it is?
?hMPQ[in] The HANDLE of the MPQ previously opened with SFileOpenArchive that contains the file you want to open. SFileOpenFileEx will fail or crash if this is NULL or a HANDLE not obtained with SFileOpenArchive.?
?lpFileName[in] A pointer to a NULL terminated string that holds name of the file within the MPQ to be opened. SFileOpenFileEx will crash if this is NULL.?
?dwSearchScope[in] Specifies where to look for a file when opening a file on the hard drive. Must be NULL when working with MPQs.?
?lphFile[out] A pointer to a HANDLE variable that, upon successful completion, will hold the HANDLE of the requested file. SFileOpenFileEx will fail if this is NULL.


只是因為你用SFileOpenArchive并不意味著您就可以從它立即開始讀取。請記住,MPQ只不過是包含其他文件的多檔案文件。在您可以閱讀任何一個mpq ,您必須打開一個(或多個)的MPQ內部檔案。 SFileOpenFileEx就是讓您使用這一任務的函數;它將打開在一個mpq所請求的文件并對其返回一個HANDLE。
再次, sfileopenfileex將返回一個非零值就成功,是假值的就失敗,您可以調用getlasterror獲得的原因。如果lpfilename是一個零長度字符串或lphfile是Null , getlasterror將返回error_invalid_parameter 。如果該文件不存在于mpq , getlasterror會報告error_file_not_found 。在一些罕見的情況下, getlasterror可能會報告error_file_invalid ,并就極為罕見的情況下,它可能會返回其他一些模糊的錯誤值。
重要注意事項:當您調用sfileclosearchive關閉mpq ,同樣會關閉所有MPQ內部打開的文件,您獲取到來自sfileopenfileex的HANDLEs成為無效。如果您調用sfilereadfile , sfilegetfilesize , sfilesetfilepointer ,或sfileclosefile,這些其中一個無效的HANDL,調用將失敗,并且STROM甚至可能崩潰。

Closing a File Inside an MPQ - SFileCloseFile
關閉MPQ內的文件函數 - SFileCloseFile

BOOL WINAPI SFileCloseFile(HANDLE hFile);
?ParameterWhat it is?
?hFile[in] The HANDLE of the file to close, which was acquired earlier with SFileOpenFileEx. SFileCloseFile will fail (or worse) if this is NULL or a HANDLE not obtained with SFileOpenFileEx.

就像SFileCloseArchive is to SFileOpenArchive, SFileCloseFile is the natural compliment of SFileOpenFileEx, 用來關閉一個已經打開的文件.
也想sfileclosearchive , sfileclosefile將返回一個非零值說明成功的,假值的就失敗, getlasterror將不提供幫助。所幸的是,多于sfileclosearchive , sfileclosefile只在hFlie是NULL或一個無效的HANDLE。

Reading from a File in an MPQ - SFileReadFile
讀取MPQ內文件函數 - SFileReadFile

BOOL WINAPI SFileReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped);
?ParameterWhat it is?
?hFile[in] The HANDLE of the file to read from, which was acquired earlier with SFileOpenFileEx. SFileReadFile will crash if this is NULL or a HANDLE not obtained with SFileOpenFileEx.?
?lpBuffer[out] A pointer to a buffer in memory where SFileReadFile will place the data read from the file. This buffer must be at least as large as nNumberOfBytesToRead. SFileReadFile will fail if this is NULL.?
?nNumberOfBytesToRead[in] The number of bytes for SFileReadFile to read from the file. SFileReadFile may crash if this is larger than the size of lpBuffer.?
?lpNumberOfBytesRead[out] A pointer to a DWORD that will hold the number of bytes actually read from the file. The number of bytes read will never be more than nNumberOfBytesToRead, but may be less if the number of unread bytes in the file is less than nNumberOfBytesToRead. It is not recommended to let this be NULL.?
?lpOverlapped[in] A pointer to an OVERLAPPED structure. This is used for asynchronous reading of files on a disk, and must be NULL when reading files in MPQs.


當然,您要先打開再讀取文件。
一旦你獲得一個有效的文件HANDLE從sfileopenfileex ,這就是這個函數的功能。 sfilereadfile會讀取指定的字節數,然后推進文件指針。這意味著,如果您有一個文件,您調用sfilereadfile會讀取的一半的檔案,當您再次調用sfilereadfile,你會得到另一半的檔案。如果您需要再次讀取上半部分的文件,你會需要調用sfilesetfilepointer 。
sfilereadfile將提供一個非零的返回值就成功,或虛假的就失敗。不過,你必須記住,只是因為它返回一個非零值,并不等于它實際上讀取了什么,這只是說明沒有錯誤發生。
如果在該文件hfile有不足未讀字節(字節從文件指針到文件結束)比要求數量少, sfilereadfile會讀不到的數目要求字節;
如果檔案hfile的文件指針是在該文件的末尾, sfilereadfile會讀什么,設置lpnumberofbytesread為0 ,返回真。因此,檢查lpnumberofbytesread 是非常重要的。

Getting a File's Size - SFileGetFileSize
獲得文件大小函數- SFileGetFileSize

?
DWORD WINAPI SFileGetFileSize(HANDLE hFile, LPDWORD lpFileSizeHigh);
?ParameterWhat it is?
?hFile[in] The HANDLE of the file whose size is to be determined. SFileGetFileSize will crash if this is NULL or a HANDLE not obtained with SFileOpenFileEx.?
?lpdwFileSizeHigh[out] A pointer to a DWORD that, upon successful completion, will hold the high 32-bits (a DWORD) of the file's size. However, it is not possible for a file in an MPQ to be this large (over 4 gigabytes), so this is virtually unused, and may safely be NULL.


這是普遍認為是最壞的編程實踐,因為完全可以進行修改,在開始讀取時讓不明長度的文件不會造成崩潰。sfilegetfilesize在這里只是把戲,因為它在用sfileopenfileex打開文件后才可以擷取文件的大小 。
也有一些重大的故障點在sfilegetfilesize 。首先是含糊不清錯誤。當sfilegetfilesize成功,它將返回文件的大小(可0 ! ) 。但是,當發生錯誤時,它將返回0xFFFFFFFF的,而且同一件事,它會返回為4294967295字節( 4 GB的) 。所幸的是,這不是一個很大的問題,正如您可能從未真正看到一個文件這么大。第二個問題,更危險的是sfilegetfilesize缺乏錯誤檢查。 sfilegetfilesize不檢查是否hfile是有效或是否為零。這意味著,如果你給它一個hfile的無效的HANDLE ,程序崩潰,電腦也會崩潰。因此,底線是這樣的:無比謹慎使用此功能。


Moving the File Pointer - SFileSetFilePointer
移動文件指針函數- SFileSetFilePointer

DWORD WINAPI SFileSetFilePointer(HANDLE hFile, long nDistanceToMove, long *lpDistanceToMoveHigh, DWORD dwMoveMethod);
?ParameterWhat it is?
?hFile[in] The HANDLE of the file whose file pointer is to be moved. SFileSetFilePointer will crash if this is NULL or a HANDLE not obtained with SFileOpenFileEx.?
?nDistanceToMove[in] The low-order 32-bits of the number of bytes for SFileSetFilePointer to move the file pointer, with positive numbers moving the pointer forward and negative numbers moving the pointer backward. This value can also be 0.?
?lpDistanceToMoveHigh[in] A pointer to the high-order 32-bits of the distance for SFileSetFilePointer to move the file pointer. But, because MPQs do not support files this large, this is unused and must be NULL or SFileSetFilePointer will fail.?
?dwMoveMethod[in] Specifies the relative location the file pointer will be moved to. Must be one of these following values in Windows.h:
FILE_BEGINThe file pointer will be set to nDistanceToMove bytes from the beginning of the file. nDistanceToMove must be positive.
FILE_CURRENTThe file pointer will be set to nDistanceToMove bytes from the current location of the file pointer.
FILE_ENDThe file pointer will be set to nDistanceToMove bytes from the end of the file. nDistanceToMove must be negative.


要想從文件任意位置讀取,就要先在該文件提出移動指針,這個功能函數就是sfilesetfilepointer。
文件指針指向了下次讀取時的讀取位置。每次讀取和編寫將會移動文件指針到讀寫區域的最底部。

sfilesetfilepointer實際上并不移動文件指針,只是在文件中對應ndistancetomove。相反, sfilesetfilepointer移動文件指針到一個相對位置,無論是開頭或結尾的文件。
舉例來說,假設您有一個千字節的文件。當文件第一次打開,它的文件指針設置為0 ,則指的是第一個字節。然后,您讀100個字節從該文件。然后,您調用sfilesetfilepointer設置ndistancetomove 500 。如果您調用dwmovemethod 設置為file_begin,文件指針將被設定為500 。如果你曾dwmovemethod作為file_current ,文件指針將是600 ,因為文件指針被轉移到了當您從檔案讀取后100字節。但如果設置dwmovemethod以file_end , sfilesetfilepointer會失敗,因為它將嘗試設置檔案指針一千四百九十九(文件中的最后字節, 999 ,加500 )不存在。如果您多用幾次,會發現這是個非常簡單的函數。

假如失敗, sfilesetfilepointer返回0xFFFFFFFF ,作為sfilegetfilesize也有同樣的陷阱 。但是,當圓滿完成, sfilesetfilepointer會返回檔案hfile新的絕對位置的文件指針 。這意味著您可以簡單地獲取當前的立場文件指針調用sfilesetfilepointer設置ndistancetomove 0 , dwmovemethod設置為file_current 。事實上,這是為什么說不存在sfilegetfileposition功能。

就像sfilegetfilesize , sfilesetfilepointer會肆無忌憚地使用任何你給它hfile的HANDLE,不會進行任何錯誤檢查。這意味著,確保獲得一個有效的文件處理,您必須謹慎,否則,您的電腦又會崩潰。


Choosing a Language - SFileSetLocale
選擇語言- SFileSetLocale

LCID WINAPI SFileSetLocale(LCID lcNewLocale);
?ParameterWhat it is?
?lcNewLocale[in] The language code (LCID) that SFileSetLocale will make the new default. The following codes are ones that I've found in Starcraft MPQs:
0Language Neutral/English
0x407German
0x409English
0x40aSpanish
0x40cFrench
0x410Italian
0x416Portuguese

SFileSetLocale 是功能簡單,背后復雜的代表.它使用了暴雪的multilinguality系統。感謝它,一個單一的函數調用,保證所有文件讀出一個mpq的語言。它的唯一參數是the entire Storm MPQ subsystem。它絕不會失敗,并且它傳回的語言代碼你給它,不過其返回值毫無價值。

multilinguality系統原理是這樣的:每個MPQ檔案有一個語言代碼,并只要他們有不同的語言代碼就可以有多個文件具有相同名稱的。當調用sfileopenfileex時, sfileopenfileex尋找一個文件具有相同的語言代碼儲存,然后調用sfilesetlocale (如果sfilesetlocale從來沒有被調用,語言的代碼為0 ) 。如果一個文件匹配的語言代碼無法找到, sfileopenfileex將打開中立語言(有一個語言代碼0 )版本的文件。

第五章
THE STARCRAFT CAMPAIGN EDITOR AND THE MPQ API LIBRARY
星際爭霸編輯器和MPQ API LIBRARY

Starcraft Campaign Editor 是什么呢?其實就是一個能讓您自己作出星際爭霸地圖的程序。
并把地圖以SCM格式保存,或者保存為SCX文件。
可是這些個SCM/SCXs文件 和Warcraft 2是一樣的原始文件?
假如您用hex editor 看過這些文件,那么您會得到一個否定的答案。
實際上SCM/SCXs就是MPQ文件!!
那么你也許認為很簡單,那你就錯了,StarEdit使用了一套難以捉摸的MPQ編寫套路。
不過在您仔細閱讀下面的內容,您將會得到答案。
Using StarEdit - The MPQ API Library
使用編輯器- The MPQ API Library

注意:這章是針對WINDOWS平臺的,適用于THE MPQ API LIBRARY 2.0或更高!


在這里我們并不能很快的編譯,因為編輯器有的功能我們并不能直接使用。
不像STROM之類的shared libraries ,StarEdit擁有復雜的操作系統保護機智,而不只是對于文件的保護。就算您是一位很好的程序員,您一樣無法直接修改它。對于這種高難度的熟練的對運行系統的改寫,還沒有人能完成過。 就在這個時候Andrey Lelikov (簡稱Lelik)橫空出世。

Lelik是一位熟悉系統內部工作機制的俄羅斯程序員。他設計了一個能夠使用 StarEdit MPQ 的方法。
他把自己寫的詳細功能放進了MPQ API Library 。

就像STROM,MPQ API Library(又名LMPQAPI),它包含了共享庫(可惜的是,像STROM接口庫,現在在MAC機上還沒有)。LMPQAPI不僅包括了StarEdit的MPQ編寫功能,而且提供接口讀寫STROM。
如果您想同時使用STROM和StarEdit,您不需要同時使用LMPQAPI和STROM接口庫。
一個LMPQAPI足已。

好吧。我提醒您一件事,您想在使用LMPQAPI的時候區分是用STROM還是StarEdit么?
STROM功能有就像使用STROM接口庫時一樣有一個前綴'SFile',在使用StarEdit時,前綴是'Mpq'。
這是很重要的,因為這說明了STROM和StarEdit的功能不兼容。
這意味著您無法用SFileOpenArchive獲得的MPQ HANDLE去在StarEdit('Mpq'前綴的函數)里調用,反之亦然。 如果您還是調用的話,調用會失敗,程序會崩潰。記住這點。

?Sé Habla Espa?ol?
讓人講西班牙語?

因為75%以上的星際爭霸或暗黑的玩家是以英語為母語,所以大多數MPQ開發測試都基于這些游戲的英文版。對于使用英文版游戲的玩家,MPQ會運行良好。但事實上,98%的標準MPQ文件使用的是language-neutral (比如圖象文件等等)。甚至有人用全非英語的MPQ玩游戲也沒有問題。
不過,很明顯這里是有問題的,只是還要等些時間才有人能發現吧。


做為上面兩章的解釋,MPQ格式具有強大的多國語言功能。
但是,您完全沒必要做多語言的SCM/SCXs。
這就是說,您完全不必要讓StarEdit支持多語言功能,就連暴雪的程序員都懶的做。
但是我們都有興趣研究MPQ,除非沒必要,其中的許多語言功能還是有用的。

在技術方面說,所有的StarEdit功能都只運行有語言代碼為0或language-neutral代碼的文件。
也就是說,MpqAddFileToArchive和MpqAddWAVToArchive只增加language- neutral files, MpqDeleteFile只刪除language-neutral files, MpqRenameFile 只會重命名language-neutral files.

這種設計決定了,執行結果并不明顯。在前一章也提到過,假如在打開有相同名稱不同語言的文件時,STROM使用了SFileSetLocale做為語言過濾器,用來決定到底打開哪個文件。
假設在StarEdit使用一個MPQ文件代替patch_rt.mpq ,而且在那個MPQ文件里有英語/language-neutral解析度文件rez\gluAll.tbl (這文件內有多個語言版本),但是不能有葡萄牙語版本(選定任意語言)。
當您運行這個游戲的葡萄牙語版時,程序會查詢在您MPQ文件中的該語言版。結果就是失敗,而且默認又為英語版本的,對不對?
好吧,不是這樣的。STROM允許您同時打開幾個MPQ文件,并且STROM會搜索已經加載的MPQ,然后自動加載最新的MPQ到文件里。但是在這個過程中,STROM在系統為language-neutral以前,會檢查已經打開的所有特殊語言的MPQ。
這意味著,前面STROM從broodat.mpq 載入葡萄牙語版本,而不是您自己的language-neutral 版本。
很不幸,現在還沒有解決的辦法,希望新版本的LMPQAPI能被解決吧。



Initializing the MPQ API Library - MpqInitialize
初始化MPQ API Library函數- MpqInitialize

BOOL WINAPI MpqInitialize();

不像STROM,LMPQAPI在控制StarEdit時有巨大的復雜的任務要做。
因此,無法在啟動LMPQAPI時做完一切。你必須告訴LMPQAPI什么時候運行。所幸,這很簡單。
你要做的就是在您啟動程序前調用MpqInitialize,LMPQAPI會自動做完剩下的。
請確定在調用LMPQAPI其他函數前,您調用了MpqInitialize。此外,即使您對STROM接口庫什么都不做,也必須在任何STROM函數調用前被調用。
一次調用會同時初始化STROM和STAREIDT。

1.Starcraft/Brood War 1.07 必須已經安裝,Storm.dll和StarEdit.exe必須在程序目錄中
2.StarEdit不能和LMPQAPI一起運行.

為了調用MpqInitialize初始化上面的兩個要求必須滿足。盡管還有其他原因,上面兩個卻是最常見的。
不管什么原因,MpqInitialize調用失敗后,都會返回FLASH,您可以檢索GetLastError設置一個錯誤值。
如果LMPQAPI無法在游戲目錄或在您程序的目錄里無法找到StarEdit.exe ,那么GetLastError會返回MPQ_ERROR_NO_STAREDIT;
如果StarEdit.exe的版本不匹配,GetLastError會返回MPQ_ERROR_BAD_STAREDIT;
如果StarEdit已經運行GetLastError會返回MPQ_ERROR_STAREDIT_RUNNING;
如果是因為其他原因GetLastError通常會返回MPQ_ERROR_INIT_FAILED。

但是,無論為什么GetLastError調用失敗,返回了什么,您要做的就是盡快的關閉程序。
不要調用任何LMPQAPI功能(STROM或者StarEdit的功能),當然也不要在調用MpqInitialize了。


Opening an MPQ for Editing - MpqOpenArchiveForUpdate
打開MPQ- MpqOpenArchiveForUpdate

HANDLE WINAPI MpqOpenArchiveForUpdate(LPCSTR lpFileName, DWORD dwCreationDisposition, DWORD dwHashTableSize);
?ParameterWhat it is?
?lpFileName[in] A pointer to NULL-terminated string that holds the path of the MPQ to open. MpqOpenArchiveForUpdate will fail if this is NULL.?
?dwCreationDisposition[in] Specifies what MpqOpenArchiveForUpdate should do with the archive if it does/doesn't exist. Must be one of the following values defined in lmpqapi.h:
MOAU_CREATE_NEWMpqOpenArchiveForUpdate will create a brand new archive. If lpFileName already exists, MpqOpenArchiveForUpdate will fail.
MOAU_CREATE_ALWAYSMpqOpenArchiveForUpdate will create a new archive if lpFileName doesn't exist. If lpFileName does exist, it will be deleted and overwritten.
MOAU_OPEN_EXISTINGMpqOpenArchiveForUpdate will open the archive lpFileName. MpqOpenArchiveForUpdate will fail if lpFileName does not exist.
MOAU_OPEN_ALWAYSIf lpFileName exists, MpqOpenArchiveForUpdate will open it. If it doesn't, MpqOpenArchiveForUpdate will create a new archive.
MOAU_MAINTAIN_LISTFILEThis flag specifies that as MpqOpenArchiveForUpdate uses the archive lpFileName, it should update the internal listfile, if one exists. This is a flag, and must be ORed (with the | operator) with one of the other options for dwCreationDisposition
?
?dwHashTableSize[in] Whenever MpqOpenArchiveForUpdate creates a new archive (see the dwCreationDisposition for details on when this occurs), dwHashTableSize specifies how large the hash table for the new archive will be, with a minimum size of 16, and a maximum size of 262,144 (if dwHashTableSize is not within these values, MpqOpenArchiveForUpdate will change it). This parameter does not affect archives that already exist.

與STROM一樣,您在使用前必須先打開它.
MpqOpenArchiveForUpdate 打開(或創建)一個存檔,這是為了您使用其他StarEdit功能的,并返回存檔的HANDLE.

但是不像SFileOpenArchive,MpqOpenArchiveForUpdate需要您在時間上做出選擇.
第一選擇是dwcreationdisposition參數。它告訴mpqopenarchiveforupdate是否應該創建一個新的存檔還是打開一個現有的,或兩者之間。其他的決定性參數是dwhashtablesize 。 dwhashtablesize告訴mpqopenarchiveforupdate創建什么大小存檔的哈希表(這也是該文件限制),在
mpqopenarchiveforupdate事件中必須創建要一個新的存檔。
做為一個存檔的哈希表大小差不多是1000,除非你知道存檔一定會超過1000個文件。
但同時請記住,每個哈希表項和存檔文件將新增16個字節,(見第2章的哈希表,或第5章關于mpq哈希表的更多信息) 。


在上面的進程中MpqOpenArchiveForUpdate可能調用失敗.
MpqOpenArchiveForUpdate將返回INVALID_HANDLE_VALUE或者NULL.
我們根據調用GetLastError通常可以獲取有用的信息,但不是絕對.
如果lpfilename參數為空, getlasterror將返回error_invalid_parameter 。
如果dwcreationdisposition返回moau_open_existing或者lpfilename不存在, getlasterror將返回error_file_not_found 。反過來說,如果dwcreationdisposition返回moau_create_new和檔案lpfilename已經存在, getlasterror將返回error_already_exists 。
最后,如果mpq存檔存在,但是是無效或損壞的, getlasterror將返回mpq_error_mpq_invalid 。
在一些罕見的情況下, getlasterror將返回其他一些錯誤代碼。

Closing a Modified Archive - MpqCloseUpdatedArchive
關閉修改過的存檔- MpqCloseUpdatedArchive

?
BOOL WINAPI MpqCloseUpdatedArchive(HANDLE hMPQ, DWORD dwUnknown);
?ParameterWhat it is?
?hMPQ[in] The HANDLE of the MPQ to close, which was acquired earlier with MpqOpenArchiveForUpdate. MpqCloseUpdatedArchive will fail (or worse) if this is NULL or a HANDLE not obtained with MpqOpenArchiveForUpdate.?
?dwUnknownUnknown. Should always be NULL.

這里和在STROM中一樣,您在哪用SFileOpenArchive打開MPQ,那么就在修改它的地方用SFileCloseArchive 關閉.
那么MPQ存檔打開時用MpqOpenArchiveForUpdate,關閉時用MpqCloseUpdatedArchive.
然而在這時候有一點區別.STROM不會修改實際MPQ,所以關閉MPQ HANDLE時沒有什么特別需要做的.
但是StarEdit 確實修改了MPQ.而且MPQ的散列值和文件表是在沒有調用MpqCloseUpdatedArchive關閉MPQ HANDLE前不能寫在MPQ分區的.
這意味著要快速關閉StarEdit MPQ HANDLEs,要不然您有可能再次程序崩潰,而無法保存修改的MPQ.


Adding a File - MpqAddFileToArchive
添加文件函數- MpqAddFileToArchive

?
BOOL WINAPI MpqAddFileToArchive(HANDLE hMPQ, LPCSTR lpSourceFileName, LPCSTR lpDestFileName, DWORD dwFlags);
?ParameterWhat it is?
?hMPQ[in] The HANDLE of the MPQ to add the file to, which was acquired earlier with MpqOpenArchiveForUpdate. MpqAddFileToArchive will fail if this is NULL or a HANDLE not obtained with MpqOpenArchiveForUpdate.?
?lpSourceFileName[in] A pointer to a NULL-terminated string containing the path of the file on disk to add. MpqAddFileToArchive will crash if this is NULL.?
?lpDestFileName[in] A pointer to a NULL-terminated string containing the name that the file will be given in the MPQ. MpqAddFileToArchive will crash if this is NULL.?
?dwFlags[in] Flags specifying properties that MpqAddFileToArchive will apply to the file inside the MPQ. Must be a combination of the following flags specified in lmpqapi.h:
MAFA_ENCRYPTThe file will be encrypted.
MAFA_COMPRESSThe file will be compressed.
MAFA_REPLACE_EXISTINGIf the file lpDestFileName already exists in the MPQ, it will be replaced with the new file to be added

往往大約 95%的時候會在使用 StarEdit MPQ功能時候添加文件. 對于這個任務, 您會用到的函數有MpqAddFileToArchive和它的姊妹功能MpqAddWAVToArchive (稍后討論).
MpqAddFileToArchive在MPQ hMPQ分區添加文件lpSourceFileName 使用名稱lpDestFileName, 并在這個過程中壓縮 或/和 加密它.

由于一些設計上的疏漏,在您并沒有完全明白前,MpqAddFileToArchive會是個大麻煩.
1.MpqAddFileToArchive并不檢查lpSourceFileName和lpDestFileName是否為空.
就是說假如任一參數為空,您會再次看到程序崩潰.
2.覆蓋MPQ中已有文件時MpqAddFileToArchive的運行機制.
當您調用MpqAddFileToArchive去添加的文件已經存在MPQ中(在這種情況下,你就不得不指定dwflags為mafa_replace_existing ),MpqAddFileToArchive會在不確定文件lpSourceFileName是否存在前就不分青紅皂白地刪除存在的文件lpDestFileName.
解決的辦法很簡單:確保lpsourcefilename和lpdestfilename是有效的(非空) ,以及確保lpsourcefilename存在之前,調用mpqaddfiletoarchive 。

現在您應該可以饒過所有的障礙,用mpqaddfiletoarchive成功添加文件了吧.
這時mpqaddfiletoarchive將允許返回TURE.
如果有錯誤,它將返回FALSE 。在這種情況下,少量的信息可調用getlasterror 。
如果該文件lpsourcefilename不存在, getlasterror將返回error_file_not_found (盡管它的有點晚) 如果哈希表是FULL(見第2章) , getlasterror將返回mpq_error_hash_table_full 。
如果該文件lpdestfilename已經存在 和在dwflags中未指定mafa_replace_existing , getlasterror將返回mpq_error_already_exists 。
但是,在很多情況下getlasterror將返回其他一些錯誤代碼或沒有代碼。



Adding a File with WAV Compression - MpqAddWAVToArchive
添加WAV壓縮文件函數- MpqAddWAVToArchive

?
BOOL WINAPI MpqAddWAVToArchive(HANDLE hMPQ, LPCSTR lpSourceFileName, LPCSTR lpDestFileName, DWORD dwFlags, DWORD dwQuality);
?ParameterWhat it is?
?hMPQ[in] The HANDLE of the MPQ to add the file to, which was acquired earlier with MpqOpenArchiveForUpdate. MpqAddWAVToArchive will fail if this is NULL or a HANDLE not obtained with MpqOpenArchiveForUpdate.?
?lpSourceFileName[in] A pointer to a NULL-terminated string containing the path of the file on disk to add. MpqAddWAVToArchive will crash if this is NULL.?
?lpDestFileName[in] A pointer to a NULL-terminated string containing the name that the file will be given in the MPQ. MpqAddWAVToArchive will crash if this is NULL.?
?dwFlags[in] Flags specifying properties that MpqAddWAVToArchive will apply to the file inside the MPQ. Must be a combination of the following flags specified in lmpqapi.h:
MAFA_ENCRYPTThe file will be encrypted.
MAFA_REPLACE_EXISTINGIf the file lpDestFileName already exists in the MPQ, it will be replaced with the new file to be added
?
?dwQuality[in] Specifies the quality the WAV file will be compressed to. Must be one of the following values defined in lmpqapi.h:
MAWA_QUALITY_HIGHBest sound quality, least compression. WAV lpDestFileName in MPQ will occupy the most space after compression (but still less space than if you had added the file with MpqAddFileToArchive instead)
MAWA_QUALITY_MEDIUMMedium sound quality, medium compression. Balance between quality and compression.
MAWA_QUALITY_LOWHighest compression, worst sound quality. WAV lpDestFileName in MPQ will occupy the least space after compression.

毫無疑問,最流行的新功能的lmpqapi 2.0版(就是我做的) ,便有功能 mpqaddwavtoarchive 。
雖然mpqaddfiletoarchive能壓縮約80 %的文件(非wav文件) ,它對WAV文件的壓縮只有平均約5 % 。這是由于wav數據性質和它的不可壓縮性。
在這里,對于wav壓縮的壓縮是必要的,而 mpqaddwavtoarchive就實現了這個功能。
盡管工作原理不同,MpqAddWAVToArchive的界面與 MpqAddFileToArchive卻是幾乎相同的。
唯一的區別就是多了一個新函數dwQuality。
參數設置后WAV將會被壓縮。
不過不像mpqaddfiletoarchive的標準壓縮, mpqaddwavtoarchive的wav壓縮,實際上降低了wav的質量 。質量降低多少依賴于dwquality 。
如果您有一個音樂WAV而又想保證質量,那您就使用mawa_quality_high ,因為它最好的保留wav的質量;而同一個聲音wav , mawa_quality_low通常是不行的,因為聲調比較容易壓縮失真; mawa_quality_medium往往是最有效的。


Deleting a File - MpqDeleteFile
刪除文件函數 - MpqDeleteFile


?
BOOL WINAPI MpqDeleteFile(HANDLE hMPQ, LPCSTR lpFileName);
?ParameterWhat it is?
?hMPQ[in] The HANDLE of the MPQ to close, which was acquired earlier with MpqOpenArchiveForUpdate. MpqDelete will fail (or worse) if this is NULL or a HANDLE not obtained with MpqOpenArchiveForUpdate.?
?lpFileName[in] A pointer to a NULL-terminated name of the file in the MPQ to delete. MpqDeleteFile will crash if this is NULL.

少數情況下,您可能需要刪除MPQ中的某個文件,那么您就需要用到MpqDeleteFile。
MpqDeleteFile能從已經打開的存檔hMPQ中刪除文件lpFileName。
不過這不是看上去那么簡單的。
mpqdeletefile為lpfilename刪除哈希和文件表項 ,使其無法進入。
但是除非文件在MPQ的physical end ,否則MpqDeleteFile無法清除內存。
這就是說,通常情況下MPQ文件是不會減小大小的。
不過空間可以添加新文件循環再利用。稍后為您介紹MpqAddFileToArchive 和MpqAddWAVToArchive.

就像STROM和STAREDIT幾乎所有的功能一樣,調用MpqDeleteFile成功就返回TURE,失敗就返回FALSE。
失敗的話,您可以調用GetLastError去獲得一些關于失敗原因的信息(假如有的話)。
在這種情況下GetLastError是驚人的有效。
因為幾乎只有一種會造成MpqDeleteFile失敗的原因(除了hMPQ無效):
該文件lpFileName不存在于MPQ,GetLastError將返回MPQ_ERROR_FILE_NOT_FOUND。


Renaming a File - MpqRenameFile
重命名文件函數- MpqRenameFile


BOOL WINAPI MpqRenameFile(HANDLE hMPQ, LPCSTR lpOldFileName, LPCSTR lpNewFileName);
?ParameterWhat it is?
?hMPQ[in] The HANDLE of the MPQ that holds the file to be renamed, and was acquired earlier with MpqOpenArchiveForUpdate. MpqRenameFile will fail if this is NULL or a HANDLE not obtained with MpqOpenArchiveForUpdate.?
?lpOldFileName[in] A pointer to a NULL-terminated string containing the name of the file in the MPQ to be renamed. MpqRenameFile will fail if this is NULL.?
?lpNewFileName[in] A pointer to a NULL-terminated string containing the name that the file lpOldFileName will be changed to. MpqRenameFile will fail if this is NULL

在我慢慢研究MPQ后發現StarEdit缺少一對非常有用的功能。
而且那個時候我對與STROM和StarEdit的運做有了相當的了解,所以我決定寫個自己的功能。
MpqRenameFile 非常的簡單;它重新把hMPQ中的文件名 由lpOldFileName變為lpNewFileName.

mpqrenamefile返回給您的依舊是簡單的信息。
mpqrenamefile返回true就成功,FLASH失敗,并讓您調用getlasterror獲得失敗的原因 。
如果hMPQ HANDLE 是NULL或無效,lpoldfilename或lpnewfilename是Null , getlasterror將返回error_invalid_parameter 。
如果該文件lpoldfilename不存在于MPQ hMPQ中, getlasterror將返回mpq_error_file_not_found 。
如果該文件lpnewfilename已經存在mpq中 , getlasterror將返回mpq_error_already_exists 。

Compacting an MPQ - MpqCompactArchive
壓縮MPQ函數- MpqCompactArchive

?
BOOL WINAPI MpqCompactArchive(HANDLE hMPQ, BOOL bFailOnBadFile);
?ParameterWhat it is?
?hMPQ[in] The HANDLE of the MPQ to compact, which was acquired earlier with MpqOpenArchiveForUpdate. MpqCompactArchive will fail if this is NULL or a HANDLE not obtained with MpqOpenArchiveForUpdate.?
?bFailOnBadFile[in] Explained below. Should usually be FALSE



記得我剛才說過調用mpqdeletefile實際上并不刪除文件;它只是使它們無法使用。那么, mpqaddfiletoarchive和mpqaddwavtoarchive也是一樣。
當您添加一個已經存在的文件或添加比舊文件大的新文件,新的文件將附加,和原來被占用的空間不會被釋放。正因為如此,每當您建立一個大的復雜的包含許多覆蓋/刪除的檔案的mpq,將會有很大的體積,并且沒有辦法從零重建MPQ。

解決這個問題的方法是調用mpqcompactarchive :這是我設計的第三個,也是最后一個,最困難的mpq功能。 mpqcompactarchive的功能是把數據壓縮到一個緩沖文件,然后再傳回。這就是說在壓縮的時候,在磁盤上的緩沖文件必須有足夠的可用空間(這取決于MPQ的大小)。

雖然mpqcompactarchive可以讓幾乎所有的文件變得緊湊,但是還是有不能成功的類型:有mafa_encrypt和mafa_modcryptkey屬性,但缺乏mafa_compress和mafa_compress2屬性的文件(如需詳細資訊,請參閱第5章) 。當mpqcompactarchve調用這種文件,getlasterror會返回錯誤代碼mpq_error_compact_error ,然后刪除違規檔案,并繼續壓縮過程。

mpqcompactarchive返回TURE就成功,FLASH就失敗。您可以調用getlasterror獲得錯誤信息 。
如果hmpq是Null或無效的staredit HANDLE, getlasterror將返回error_invalid_parameter 。
如果沒有足夠的可用記憶體為mpqcompactarchive撥出2.5 MB的讀取緩沖區, getlasterror將返回error_outofmemory 。
如果沒有足夠的可用磁盤空間mpqcompactarchive分配緩沖文件, GetLastError返回error_disk_full 。在某些特殊的情況下, getlasterror可能會返回其他一些奇怪的錯誤代碼。


Getting Information About a File - SFileGetFileInfo
獲取文件有關信息函數 - SFileGetFileInfo


DWORD WINAPI SFileGetFileInfo(HANDLE hMPQorFile, DWORD dwInfoType);
?ParameterWhat it is?
?hMPQorFile[in] The HANDLE of the either the MPQ or file inside an MPQ to obtain info about, which was acquired earlier with either SFileOpenArchive or SFileOpenFileEx. SFileGetFileInfo will fail (or worse) if this is NULL or a HANDLE not obtained with SFileOpenArchive or SFileOpenFileEx.?
?dwInfoType[in] The type of info to obtain about the file or MPQ. Must be one of the following values defined in lmpqapi.h:
SFILE_INFO_HASH_TABLE_SIZESFileGetFileInfo will return the hash table size of hMPQorFile (see chapters 2 and 5 for more info). hMPQorFile must be a HANDLE of an MPQ.
SFILE_INFO_NUM_FILESSFileGetFileInfo will return the number of files inside hMPQorFile. hMPQorFile must be a HANDLE of an MPQ.
SFILE_INFO_SIZESFileGetFileInfo will return the size of the MPQ hMPQorFile or the uncompressed size of the file hMPQorFile. This is functionally equivalent to the SFileGetFileSize function. hMPQorFile can be either a HANDLE of an MPQ or a HANDLE of a file inside.
SFILE_INFO_COMPRESSED_SIZESFileGetFileInfo will return the compressed size (or uncompressed size if the file isn't compressed) of the file hMPQorFile in an MPQ. hMPQorFile must be a HANDLE of a file inside an MPQ.
SFILE_INFO_FLAGSSFileGetFileInfo will return the flags (see chapter 5 for the meaning of specific flags) of the file hMPQorFile in an MPQ. hMPQorFile must be a HANDLE of a file inside an MPQ.
SFILE_INFO_POSITIONSFileGetFileInfo will return the absolute position of the file pointer for the file hMPQorFile in an MPQ. hMPQorFile must be a HANDLE of a file inside an MPQ.



SFileGetFileInfo 是 LMPQAPI中最古怪的功能函數.
不僅是唯一可以通過LMPQAPI而不能通過STROM接口庫的STROM功能。
它唯一的函數就是能夠接受MPQ或者文件HANDLE,但在大多數情況下它根本不存在于STROM里。
為了補救這個,我自己寫了了這個SFileGetFileInfo。

sfilegetfileinfo是專門設計來提供有用的mpq和其內檔案的信息;包括mpq中壓縮文件的大小,文件指針的位置。它使用簡單,但相當有效。它使用已經打開了的mpq或文件的HANDLE,以獲取有關hmpqorfile的信息 ,以及在dwinfotype中需要的信息類型代碼。

如果sfilegetfileinfo成功,返回值就是有關文件或MPQ的資料 。
但是,如果失敗的話,它會返回0xFFFFFFFF,并設置一個錯誤代碼,您可以調用getlasterror查看 。
如果因為hmpqorfile HANDLE是無效的, getlasterror將返回error_invalid_parameter 。
如果因為dwinfotype是一個無效的信息代碼,getlasterror將返回error_unknown_property 。 sfilegetfileinfo只在一種情況下會調用失敗(除了嚴重的內部lmpqapi錯誤)。
因為一個mpq HANDLE和dwinfotype指定的信息只能得到一個文件HANDLE,或反之亦然,在這種情況下, getlasterror將返回error_unknown_property。

原文作者就寫了這么多。。
所以本文到此結束了。。
有點遺憾 第5,6章估計我這輩子看不到了
不過由于興趣原因 我會在后面繼續翻譯些文章
(其實已經找到了,只是太長。。長。。。長。。長了)



總結

以上是生活随笔為你收集整理的MPQ技术内幕__的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

久久久中文久久久无码 | 兔费看少妇性l交大片免费 | 久久精品女人天堂av免费观看 | 乱人伦中文视频在线观看 | 在线 国产 欧美 亚洲 天堂 | 中文字幕无码乱人伦 | 亚洲精品成人福利网站 | 亚洲男人av香蕉爽爽爽爽 | 日本精品高清一区二区 | 国产乡下妇女做爰 | 成人亚洲精品久久久久 | аⅴ资源天堂资源库在线 | 久热国产vs视频在线观看 | 中文字幕人妻无码一夲道 | 2019nv天堂香蕉在线观看 | 玩弄人妻少妇500系列视频 | 国产特级毛片aaaaaaa高清 | 乱码av麻豆丝袜熟女系列 | 亚洲小说图区综合在线 | 亚洲色在线无码国产精品不卡 | 在教室伦流澡到高潮hnp视频 | 国产成人一区二区三区别 | 人妻少妇精品视频专区 | 久久久婷婷五月亚洲97号色 | 久久熟妇人妻午夜寂寞影院 | 亚洲成av人片天堂网无码】 | 国产农村妇女高潮大叫 | 性欧美videos高清精品 | 一本加勒比波多野结衣 | 无码一区二区三区在线观看 | 久久精品女人天堂av免费观看 | 欧美一区二区三区视频在线观看 | 曰韩少妇内射免费播放 | 久久精品无码一区二区三区 | 久久亚洲中文字幕精品一区 | 国产免费久久久久久无码 | 成人亚洲精品久久久久软件 | 人人妻人人藻人人爽欧美一区 | 成人无码精品1区2区3区免费看 | 久久国产精品萌白酱免费 | 亚洲 激情 小说 另类 欧美 | 精品久久久中文字幕人妻 | 国产精品自产拍在线观看 | 无码人妻精品一区二区三区下载 | 亚洲男人av天堂午夜在 | 女人被爽到呻吟gif动态图视看 | 国产精品人妻一区二区三区四 | 男女爱爱好爽视频免费看 | 国产精品99爱免费视频 | 色情久久久av熟女人妻网站 | 亚洲欧美日韩国产精品一区二区 | 精品国偷自产在线视频 | 欧洲熟妇精品视频 | 老熟妇仑乱视频一区二区 | 99久久人妻精品免费一区 | 国产精品亚洲lv粉色 | 国产婷婷色一区二区三区在线 | 欧美老熟妇乱xxxxx | 中文字幕av伊人av无码av | 国产深夜福利视频在线 | 特黄特色大片免费播放器图片 | 东京热男人av天堂 | 久久久av男人的天堂 | 日韩av无码一区二区三区不卡 | 国产又粗又硬又大爽黄老大爷视 | 欧美人与善在线com | 在线看片无码永久免费视频 | 久久久久免费精品国产 | 人妻熟女一区 | 蜜臀av无码人妻精品 | 伊人久久婷婷五月综合97色 | 欧美精品无码一区二区三区 | 夜夜夜高潮夜夜爽夜夜爰爰 | 欧美怡红院免费全部视频 | 国产婷婷色一区二区三区在线 | 中文字幕无码av激情不卡 | 国精产品一品二品国精品69xx | 国产人妖乱国产精品人妖 | 国产精品高潮呻吟av久久 | 国产熟女一区二区三区四区五区 | 激情内射亚州一区二区三区爱妻 | 97夜夜澡人人双人人人喊 | 免费无码的av片在线观看 | 中文字幕乱码中文乱码51精品 | 欧美一区二区三区视频在线观看 | 国产免费久久久久久无码 | 精品一二三区久久aaa片 | 久久国产36精品色熟妇 | 激情五月综合色婷婷一区二区 | 一本久道高清无码视频 | 妺妺窝人体色www在线小说 | 国产内射老熟女aaaa | 性啪啪chinese东北女人 | 午夜性刺激在线视频免费 | 欧美三级a做爰在线观看 | 亚洲日韩一区二区 | 欧美人与禽zoz0性伦交 | 久久成人a毛片免费观看网站 | 亚洲区欧美区综合区自拍区 | 国产av无码专区亚洲a∨毛片 | www一区二区www免费 | 99久久婷婷国产综合精品青草免费 | 久久国产精品偷任你爽任你 | 一本色道久久综合亚洲精品不卡 | 久久99精品久久久久久动态图 | 国产乱人伦偷精品视频 | 风流少妇按摩来高潮 | 亚洲乱码中文字幕在线 | 亚洲人成人无码网www国产 | 无码av中文字幕免费放 | 少女韩国电视剧在线观看完整 | 小鲜肉自慰网站xnxx | 夜夜躁日日躁狠狠久久av | 亚洲精品一区二区三区在线观看 | 亚洲码国产精品高潮在线 | 国产一区二区三区日韩精品 | 国产精品亚洲综合色区韩国 | 国产无遮挡又黄又爽免费视频 | 九九热爱视频精品 | 99久久亚洲精品无码毛片 | 中文字幕精品av一区二区五区 | 精品厕所偷拍各类美女tp嘘嘘 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 在线观看免费人成视频 | 少妇太爽了在线观看 | 少妇愉情理伦片bd | 国内揄拍国内精品人妻 | 成人综合网亚洲伊人 | 97人妻精品一区二区三区 | 夜精品a片一区二区三区无码白浆 | 男人的天堂2018无码 | 亚洲va欧美va天堂v国产综合 | 在线播放免费人成毛片乱码 | 欧美乱妇无乱码大黄a片 | 国产成人人人97超碰超爽8 | 亚洲中文字幕无码一久久区 | 亚洲日韩乱码中文无码蜜桃臀网站 | 国产精品美女久久久久av爽李琼 | 日日噜噜噜噜夜夜爽亚洲精品 | 国产欧美精品一区二区三区 | 亚洲国产综合无码一区 | 久久精品女人的天堂av | 老司机亚洲精品影院无码 | 久久久国产一区二区三区 | 无码播放一区二区三区 | 噜噜噜亚洲色成人网站 | 国产又爽又猛又粗的视频a片 | 中文字幕 人妻熟女 | 麻豆国产丝袜白领秘书在线观看 | 日日橹狠狠爱欧美视频 | 久久 国产 尿 小便 嘘嘘 | 波多野结衣一区二区三区av免费 | 波多野42部无码喷潮在线 | 国产免费久久久久久无码 | 国内精品九九久久久精品 | 亚洲码国产精品高潮在线 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 国产成人一区二区三区别 | 亚洲国产精品成人久久蜜臀 | 99精品视频在线观看免费 | 国产亚洲欧美在线专区 | 2019nv天堂香蕉在线观看 | 美女扒开屁股让男人桶 | 97精品人妻一区二区三区香蕉 | 欧美日韩一区二区免费视频 | 日产精品高潮呻吟av久久 | 波多野42部无码喷潮在线 | 人人爽人人爽人人片av亚洲 | 色婷婷欧美在线播放内射 | 亚洲中文字幕久久无码 | 色情久久久av熟女人妻网站 | 国产成人av免费观看 | 色情久久久av熟女人妻网站 | 亚洲国产精品美女久久久久 | 国产香蕉尹人综合在线观看 | 精品国产乱码久久久久乱码 | 欧美精品在线观看 | 国产精品久久久久久无码 | 亚洲高清偷拍一区二区三区 | 久久精品女人天堂av免费观看 | 色综合视频一区二区三区 | 97无码免费人妻超级碰碰夜夜 | 我要看www免费看插插视频 | 老子影院午夜伦不卡 | 久久久久久九九精品久 | 国产精品va在线观看无码 | 亚洲精品国产a久久久久久 | 玩弄人妻少妇500系列视频 | 久久久久亚洲精品男人的天堂 | 国产成人无码a区在线观看视频app | 久久久中文久久久无码 | 狂野欧美性猛xxxx乱大交 | 影音先锋中文字幕无码 | 熟妇人妻无码xxx视频 | 99久久精品午夜一区二区 | 亚洲理论电影在线观看 | 成人影院yy111111在线观看 | 一本无码人妻在中文字幕免费 | 亚洲国产精品毛片av不卡在线 | 乱人伦人妻中文字幕无码久久网 | 精品欧美一区二区三区久久久 | 国产成人精品无码播放 | 男女性色大片免费网站 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 国产精品亚洲专区无码不卡 | 欧美日韩一区二区免费视频 | 国产精品久久福利网站 | 永久黄网站色视频免费直播 | 粗大的内捧猛烈进出视频 | 成人无码视频免费播放 | 欧美日韩精品 | 狂野欧美激情性xxxx | 欧美日韩视频无码一区二区三 | 内射爽无广熟女亚洲 | 国产av人人夜夜澡人人爽麻豆 | 在线欧美精品一区二区三区 | 免费人成在线观看网站 | 少妇无码av无码专区在线观看 | 中文字幕av伊人av无码av | 丰满诱人的人妻3 | 九九综合va免费看 | 国产午夜视频在线观看 | 亚洲中文字幕在线观看 | 成人一在线视频日韩国产 | 国产综合在线观看 | 国产成人综合在线女婷五月99播放 | 国产精品资源一区二区 | 中文字幕无码av波多野吉衣 | 狠狠色欧美亚洲狠狠色www | 老司机亚洲精品影院无码 | 露脸叫床粗话东北少妇 | 国产精品免费大片 | 老子影院午夜伦不卡 | 日日摸天天摸爽爽狠狠97 | 国产精品免费大片 | 欧美丰满老熟妇xxxxx性 | 一本无码人妻在中文字幕免费 | 亚洲精品综合一区二区三区在线 | 亚洲s码欧洲m码国产av | 国产精品久久久久久亚洲影视内衣 | 亚洲乱码中文字幕在线 | 爆乳一区二区三区无码 | 精品久久久中文字幕人妻 | 国产成人无码一二三区视频 | 亚洲男人av香蕉爽爽爽爽 | 奇米影视7777久久精品 | 天天拍夜夜添久久精品大 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 东京热无码av男人的天堂 | 狠狠色噜噜狠狠狠狠7777米奇 | 2020久久香蕉国产线看观看 | 国产一区二区三区精品视频 | 无遮无挡爽爽免费视频 | 久久精品国产亚洲精品 | 久久综合激激的五月天 | 四虎国产精品一区二区 | 欧洲vodafone精品性 | 国产成人精品必看 | 黑人大群体交免费视频 | 亚洲精品成人av在线 | 在线成人www免费观看视频 | 人人妻人人澡人人爽欧美精品 | 给我免费的视频在线观看 | 亚洲男人av香蕉爽爽爽爽 | 免费人成在线观看网站 | 一二三四在线观看免费视频 | аⅴ资源天堂资源库在线 | 国产色在线 | 国产 | 亚洲人成影院在线观看 | 国产精品毛多多水多 | 日日噜噜噜噜夜夜爽亚洲精品 | 两性色午夜免费视频 | 夜夜躁日日躁狠狠久久av | 蜜臀av在线播放 久久综合激激的五月天 | 四虎影视成人永久免费观看视频 | а√天堂www在线天堂小说 | 久久五月精品中文字幕 | 欧美三级不卡在线观看 | 国产欧美精品一区二区三区 | 国产精品久久久久久久9999 | 成年女人永久免费看片 | 蜜桃av抽搐高潮一区二区 | 国产免费久久精品国产传媒 | 九九久久精品国产免费看小说 | 国产人妻精品午夜福利免费 | 四虎4hu永久免费 | av香港经典三级级 在线 | 午夜精品一区二区三区在线观看 | 乱码av麻豆丝袜熟女系列 | 国内精品人妻无码久久久影院蜜桃 | 亚洲 另类 在线 欧美 制服 | 色婷婷av一区二区三区之红樱桃 | 日韩欧美中文字幕公布 | 精品国产一区二区三区四区 | 97资源共享在线视频 | 国产综合久久久久鬼色 | 大地资源中文第3页 | 精品一区二区三区无码免费视频 | 精品亚洲韩国一区二区三区 | 色综合久久久无码中文字幕 | 国产精品久久久久7777 | 亚洲精品久久久久久一区二区 | 欧美日韩在线亚洲综合国产人 | 精品久久久无码人妻字幂 | 国产成人久久精品流白浆 | av在线亚洲欧洲日产一区二区 | 国产精品久久久久久亚洲影视内衣 | 国产无遮挡又黄又爽又色 | 国产成人精品一区二区在线小狼 | 亚洲毛片av日韩av无码 | 在线精品国产一区二区三区 | 免费中文字幕日韩欧美 | 无码人妻精品一区二区三区下载 | 扒开双腿疯狂进出爽爽爽视频 | 男人扒开女人内裤强吻桶进去 | 精品无码国产自产拍在线观看蜜 | 亚洲中文字幕av在天堂 | 丁香啪啪综合成人亚洲 | 久久精品中文字幕一区 | 蜜桃臀无码内射一区二区三区 | 久久国产36精品色熟妇 | 无码免费一区二区三区 | 欧美激情内射喷水高潮 | 亚洲精品综合一区二区三区在线 | 亚洲精品无码人妻无码 | 免费国产黄网站在线观看 | 亚洲爆乳精品无码一区二区三区 | 亚洲成a人一区二区三区 | 国产亚洲欧美日韩亚洲中文色 | 少妇高潮喷潮久久久影院 | 欧美色就是色 | 人人爽人人澡人人高潮 | 国产精品人人爽人人做我的可爱 | 牲交欧美兽交欧美 | 亚洲精品午夜无码电影网 | 国内少妇偷人精品视频免费 | 中文毛片无遮挡高清免费 | 国产精品久久久久久久9999 | 成人精品视频一区二区三区尤物 | 亚洲熟妇色xxxxx欧美老妇y | 双乳奶水饱满少妇呻吟 | 婷婷色婷婷开心五月四房播播 | 亚洲一区二区三区偷拍女厕 | 亚洲国产精品一区二区第一页 | 成人女人看片免费视频放人 | 97无码免费人妻超级碰碰夜夜 | 高清国产亚洲精品自在久久 | 色狠狠av一区二区三区 | 大肉大捧一进一出视频出来呀 | 欧美性猛交内射兽交老熟妇 | 午夜理论片yy44880影院 | 久久精品中文闷骚内射 | 色综合久久88色综合天天 | 在线看片无码永久免费视频 | 日韩精品一区二区av在线 | 98国产精品综合一区二区三区 | 国产亚洲精品精品国产亚洲综合 | 中文字幕乱码人妻二区三区 | 精品无码国产自产拍在线观看蜜 | 欧美老妇与禽交 | 成人无码视频免费播放 | 少妇邻居内射在线 | 中文字幕无码日韩专区 | 国产精品亚洲五月天高清 | 一个人看的www免费视频在线观看 | 国产精品久久久午夜夜伦鲁鲁 | 中文字幕人妻无码一夲道 | 丰满少妇弄高潮了www | 国产超级va在线观看视频 | 国产精品美女久久久网av | 亚洲成a人片在线观看无码 | 西西人体www44rt大胆高清 | 2020久久香蕉国产线看观看 | 日本精品少妇一区二区三区 | 丝袜美腿亚洲一区二区 | aⅴ在线视频男人的天堂 | 久久久精品456亚洲影院 | 黑森林福利视频导航 | 亚洲va中文字幕无码久久不卡 | 夜夜夜高潮夜夜爽夜夜爰爰 | 国产欧美熟妇另类久久久 | 国产精品爱久久久久久久 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 国产人妻精品一区二区三区不卡 | 成 人 免费观看网站 | 国产小呦泬泬99精品 | 18禁黄网站男男禁片免费观看 | 国产精品无码成人午夜电影 | 久久久婷婷五月亚洲97号色 | 婷婷丁香六月激情综合啪 | 久久精品丝袜高跟鞋 | 大地资源中文第3页 | 性啪啪chinese东北女人 | 在线天堂新版最新版在线8 | 无套内谢的新婚少妇国语播放 | 国产两女互慰高潮视频在线观看 | 国产人妻大战黑人第1集 | 亚洲国产av美女网站 | 午夜无码人妻av大片色欲 | 亚洲熟妇色xxxxx亚洲 | 牛和人交xxxx欧美 | 久久97精品久久久久久久不卡 | 人人爽人人爽人人片av亚洲 | 国产在线无码精品电影网 | 久青草影院在线观看国产 | 欧洲熟妇精品视频 | 成人欧美一区二区三区黑人免费 | 欧美日韩在线亚洲综合国产人 | 国产精华av午夜在线观看 | 日本va欧美va欧美va精品 | 国产免费无码一区二区视频 | 亚拍精品一区二区三区探花 | 自拍偷自拍亚洲精品被多人伦好爽 | 人人澡人摸人人添 | 国产精品对白交换视频 | 欧洲vodafone精品性 | 免费中文字幕日韩欧美 | 麻豆精品国产精华精华液好用吗 | 女人被男人爽到呻吟的视频 | 久久久久久亚洲精品a片成人 | 成人综合网亚洲伊人 | 亚洲伊人久久精品影院 | 丝袜 中出 制服 人妻 美腿 | 国产色xx群视频射精 | 我要看www免费看插插视频 | 99久久99久久免费精品蜜桃 | 国产69精品久久久久app下载 | 伊人久久大香线焦av综合影院 | 精品无码国产自产拍在线观看蜜 | a在线观看免费网站大全 | 粗大的内捧猛烈进出视频 | 国产午夜无码精品免费看 | 乱人伦人妻中文字幕无码久久网 | 国产麻豆精品精东影业av网站 | 宝宝好涨水快流出来免费视频 | 人妻天天爽夜夜爽一区二区 | 日本高清一区免费中文视频 | 亚洲区小说区激情区图片区 | 黑人巨大精品欧美一区二区 | 国产超碰人人爽人人做人人添 | 亚洲综合久久一区二区 | 国产精品99爱免费视频 | 亚洲成av人片天堂网无码】 | 黑人大群体交免费视频 | 日本大香伊一区二区三区 | 秋霞成人午夜鲁丝一区二区三区 | 一个人看的www免费视频在线观看 | 久久人妻内射无码一区三区 | 久久久久久a亚洲欧洲av冫 | 国产 精品 自在自线 | 久久综合网欧美色妞网 | 天堂亚洲免费视频 | 国产精品a成v人在线播放 | 任你躁在线精品免费 | 亚洲码国产精品高潮在线 | 妺妺窝人体色www婷婷 | 亚洲欧美综合区丁香五月小说 | 亚洲中文字幕乱码av波多ji | 天堂亚洲免费视频 | 丰满妇女强制高潮18xxxx | 又粗又大又硬又长又爽 | 欧美老妇交乱视频在线观看 | 日日橹狠狠爱欧美视频 | 内射欧美老妇wbb | аⅴ资源天堂资源库在线 | 免费观看又污又黄的网站 | 荫蒂添的好舒服视频囗交 | 一二三四在线观看免费视频 | 激情亚洲一区国产精品 | 在线欧美精品一区二区三区 | 亚洲国产成人av在线观看 | 国产午夜手机精彩视频 | 久久精品成人欧美大片 | 亚洲性无码av中文字幕 | 男人的天堂av网站 | 无码毛片视频一区二区本码 | 成熟人妻av无码专区 | 日韩精品成人一区二区三区 | 精品久久久久久人妻无码中文字幕 | 天天燥日日燥 | 水蜜桃色314在线观看 | 亚洲成a人片在线观看无码 | 一本色道婷婷久久欧美 | 欧美变态另类xxxx | 日本xxxx色视频在线观看免费 | 欧美刺激性大交 | 少妇厨房愉情理9仑片视频 | 国产极品视觉盛宴 | 一本大道久久东京热无码av | 无码人妻出轨黑人中文字幕 | 日韩精品成人一区二区三区 | 亚无码乱人伦一区二区 | 午夜福利试看120秒体验区 | 国产色xx群视频射精 | av无码电影一区二区三区 | 亚洲日韩av片在线观看 | 性色欲网站人妻丰满中文久久不卡 | 秋霞成人午夜鲁丝一区二区三区 | 亚洲无人区午夜福利码高清完整版 | 欧美黑人巨大xxxxx | 亚洲熟妇色xxxxx亚洲 | 国产精品久久久久7777 | 久久精品中文字幕大胸 | 两性色午夜免费视频 | 伊人久久大香线蕉av一区二区 | 欧美一区二区三区视频在线观看 | 成人无码视频免费播放 | 国产另类ts人妖一区二区 | 国产精品久久久久久久影院 | 成人免费视频视频在线观看 免费 | 人妻少妇精品视频专区 | 精品国精品国产自在久国产87 | 成人精品天堂一区二区三区 | 久久精品视频在线看15 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 国产又爽又猛又粗的视频a片 | 久久亚洲中文字幕精品一区 | 少妇无码吹潮 | 无人区乱码一区二区三区 | 国精产品一区二区三区 | 性欧美疯狂xxxxbbbb | 日本精品高清一区二区 | 亚洲另类伦春色综合小说 | 毛片内射-百度 | 久久久国产精品无码免费专区 | 亚洲日本在线电影 | 欧美xxxx黑人又粗又长 | 成人性做爰aaa片免费看不忠 | 国产精品人人爽人人做我的可爱 | 久久综合九色综合欧美狠狠 | 亚洲综合色区中文字幕 | 午夜精品一区二区三区的区别 | 亚洲第一网站男人都懂 | 呦交小u女精品视频 | 久久久久久久人妻无码中文字幕爆 | 国产精品.xx视频.xxtv | 精品一区二区三区无码免费视频 | 九月婷婷人人澡人人添人人爽 | 成人性做爰aaa片免费看 | 蜜桃视频韩日免费播放 | 国产亚洲tv在线观看 | 暴力强奷在线播放无码 | 国内精品九九久久久精品 | 久久久精品456亚洲影院 | 老子影院午夜伦不卡 | 久久精品国产日本波多野结衣 | 鲁一鲁av2019在线 | 成年美女黄网站色大免费视频 | 日日摸天天摸爽爽狠狠97 | 丰满人妻被黑人猛烈进入 | 久久精品女人天堂av免费观看 | 男人和女人高潮免费网站 | 久久精品成人欧美大片 | 中文字幕 亚洲精品 第1页 | 夜先锋av资源网站 | 国产内射爽爽大片视频社区在线 | 久久久久99精品成人片 | 天堂亚洲免费视频 | 国产精品.xx视频.xxtv | 99国产精品白浆在线观看免费 | av人摸人人人澡人人超碰下载 | 亚洲va欧美va天堂v国产综合 | 亚洲欧美精品aaaaaa片 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 免费男性肉肉影院 | 久久精品视频在线看15 | 国产免费无码一区二区视频 | 无码一区二区三区在线观看 | 娇妻被黑人粗大高潮白浆 | 国产xxx69麻豆国语对白 | 蜜桃无码一区二区三区 | 亚洲国产一区二区三区在线观看 | 国产精品二区一区二区aⅴ污介绍 | 啦啦啦www在线观看免费视频 | 97se亚洲精品一区 | 蜜桃视频插满18在线观看 | 日本一卡二卡不卡视频查询 | 成人亚洲精品久久久久软件 | aa片在线观看视频在线播放 | 国产亚洲tv在线观看 | 蜜臀av无码人妻精品 | 国产舌乚八伦偷品w中 | 久久精品女人的天堂av | 国产xxx69麻豆国语对白 | 漂亮人妻洗澡被公强 日日躁 | 精品国产aⅴ无码一区二区 | 特级做a爰片毛片免费69 | 日本精品少妇一区二区三区 | 无码国产乱人伦偷精品视频 | 成人欧美一区二区三区黑人免费 | 2019nv天堂香蕉在线观看 | 亚洲精品综合五月久久小说 | 正在播放东北夫妻内射 | 亚洲精品成a人在线观看 | 成年美女黄网站色大免费全看 | 免费无码av一区二区 | 天天拍夜夜添久久精品大 | 青青草原综合久久大伊人精品 | 欧美精品无码一区二区三区 | 亚洲国产欧美国产综合一区 | 呦交小u女精品视频 | 日韩精品无码免费一区二区三区 | 亚洲欧洲中文日韩av乱码 | 亚洲国产精品一区二区美利坚 | 美女扒开屁股让男人桶 | 亚洲国产精品一区二区第一页 | 久久国产劲爆∧v内射 | 自拍偷自拍亚洲精品10p | 宝宝好涨水快流出来免费视频 | 18精品久久久无码午夜福利 | 一本精品99久久精品77 | 欧美野外疯狂做受xxxx高潮 | 日日鲁鲁鲁夜夜爽爽狠狠 | 欧洲欧美人成视频在线 | 最近免费中文字幕中文高清百度 | 人妻互换免费中文字幕 | 丰满少妇熟乱xxxxx视频 | 人妻插b视频一区二区三区 | 成人一在线视频日韩国产 | 乱人伦中文视频在线观看 | 国产精品久久福利网站 | 亚洲综合伊人久久大杳蕉 | 中文字幕av日韩精品一区二区 | 天下第一社区视频www日本 | 国产办公室秘书无码精品99 | 亚洲中文字幕无码中文字在线 | 亚洲成av人在线观看网址 | 国产精品久久久久9999小说 | 国产黑色丝袜在线播放 | 女人被爽到呻吟gif动态图视看 | 国产人妻精品一区二区三区 | 欧美熟妇另类久久久久久不卡 | 丰满少妇女裸体bbw | 国产另类ts人妖一区二区 | 国产av无码专区亚洲awww | 久久人人爽人人爽人人片ⅴ | 伊人色综合久久天天小片 | 国产凸凹视频一区二区 | 亚洲自偷精品视频自拍 | 国产在线精品一区二区高清不卡 | 国内精品久久毛片一区二区 | 欧美丰满熟妇xxxx | 国产精品资源一区二区 | 欧美精品无码一区二区三区 | 日韩av激情在线观看 | 狠狠躁日日躁夜夜躁2020 | 台湾无码一区二区 | 国产激情无码一区二区app | 国内精品久久毛片一区二区 | 久久zyz资源站无码中文动漫 | 久久精品国产99精品亚洲 | 亚洲天堂2017无码 | 国产99久久精品一区二区 | 一本久久a久久精品vr综合 | 狂野欧美性猛xxxx乱大交 | 欧美日韩久久久精品a片 | 亚洲午夜久久久影院 | 亚洲小说春色综合另类 | 亚洲の无码国产の无码影院 | 午夜福利不卡在线视频 | 国产激情一区二区三区 | 久久国产精品_国产精品 | 熟女少妇在线视频播放 | 国产免费久久精品国产传媒 | 国产极品美女高潮无套在线观看 | 国产手机在线αⅴ片无码观看 | 夜夜夜高潮夜夜爽夜夜爰爰 | 玩弄中年熟妇正在播放 | 国产熟妇另类久久久久 | 亚洲小说图区综合在线 | 久久国产精品偷任你爽任你 | 欧美国产日产一区二区 | 国产乱子伦视频在线播放 | 亚洲成a人片在线观看无码 | 亚洲日韩av片在线观看 | 色综合久久中文娱乐网 | 精品国产乱码久久久久乱码 | 亚洲男女内射在线播放 | 无码av免费一区二区三区试看 | 九月婷婷人人澡人人添人人爽 | 国产无遮挡又黄又爽又色 | 性色欲网站人妻丰满中文久久不卡 | 成人精品视频一区二区三区尤物 | 久久久久99精品成人片 | 人人妻人人澡人人爽欧美精品 | 久久婷婷五月综合色国产香蕉 | 国产性生大片免费观看性 | 又大又硬又黄的免费视频 | a片在线免费观看 | 亚洲精品一区二区三区在线观看 | 免费观看又污又黄的网站 | 欧美丰满少妇xxxx性 | 国产在线精品一区二区高清不卡 | 午夜精品久久久内射近拍高清 | 丰满少妇高潮惨叫视频 | 精品无码av一区二区三区 | 亚洲国产高清在线观看视频 | 午夜性刺激在线视频免费 | 亚洲精品一区二区三区在线 | 色老头在线一区二区三区 | 高潮毛片无遮挡高清免费视频 | 久久精品视频在线看15 | 内射爽无广熟女亚洲 | 无码av岛国片在线播放 | 国产成人午夜福利在线播放 | 久久zyz资源站无码中文动漫 | 中文字幕人妻无码一区二区三区 | 无码精品人妻一区二区三区av | 女人被爽到呻吟gif动态图视看 | 欧美老人巨大xxxx做受 | 午夜精品久久久内射近拍高清 | 中文字幕无码人妻少妇免费 | 美女毛片一区二区三区四区 | 欧美日本免费一区二区三区 | 国产成人一区二区三区在线观看 | 国产精品va在线播放 | 人人妻人人澡人人爽精品欧美 | 亚洲国产精品无码久久久久高潮 | 人妻夜夜爽天天爽三区 | 精品亚洲成av人在线观看 | 无码任你躁久久久久久久 | 久久国语露脸国产精品电影 | 99久久精品国产一区二区蜜芽 | 久久99精品久久久久婷婷 | 亚洲国产精品久久人人爱 | 亚洲国产精品无码久久久久高潮 | 玩弄人妻少妇500系列视频 | 欧美性色19p | 少妇人妻大乳在线视频 | 久久久久成人片免费观看蜜芽 | 呦交小u女精品视频 | 国精产品一区二区三区 | 国产尤物精品视频 | 精品无人区无码乱码毛片国产 | 国产凸凹视频一区二区 | 中文字幕无线码 | 日韩精品成人一区二区三区 | 色综合久久久无码网中文 | 欧美高清在线精品一区 | 水蜜桃色314在线观看 | 国内少妇偷人精品视频免费 | 亚洲精品欧美二区三区中文字幕 | 少妇人妻大乳在线视频 | 中文字幕无码热在线视频 | 天天摸天天透天天添 | 丰满少妇女裸体bbw | 国产精品人妻一区二区三区四 | 亚洲中文字幕无码中文字在线 | 青草青草久热国产精品 | 欧美xxxxx精品 | 久久精品国产大片免费观看 | 无码一区二区三区在线观看 | 国产超级va在线观看视频 | 成人性做爰aaa片免费看不忠 | 99国产精品白浆在线观看免费 | 天天躁日日躁狠狠躁免费麻豆 | 久久久久人妻一区精品色欧美 | 国产亚洲视频中文字幕97精品 | 在线播放无码字幕亚洲 | 丰满妇女强制高潮18xxxx | 少妇厨房愉情理9仑片视频 | 亚洲日韩av一区二区三区四区 | 亚洲中文字幕乱码av波多ji | 亚无码乱人伦一区二区 | 99久久人妻精品免费二区 | 亚洲一区二区三区香蕉 | 高潮毛片无遮挡高清免费视频 | 欧美精品无码一区二区三区 | 亚洲国产精品一区二区第一页 | 欧美三级a做爰在线观看 | 国产猛烈高潮尖叫视频免费 | 亚洲欧洲中文日韩av乱码 | 亚洲 欧美 激情 小说 另类 | 性欧美熟妇videofreesex | 伊人久久大香线蕉午夜 | 国产精品福利视频导航 | 色欲人妻aaaaaaa无码 | 无码av最新清无码专区吞精 | 久久国产精品二国产精品 | 亚洲男女内射在线播放 | 久久成人a毛片免费观看网站 | 国产在线精品一区二区三区直播 | 亚洲一区二区三区播放 | 无码人妻丰满熟妇区毛片18 | 夜精品a片一区二区三区无码白浆 | 国产疯狂伦交大片 | 国精产品一品二品国精品69xx | 国产xxx69麻豆国语对白 | 欧美人与物videos另类 | 国产日产欧产精品精品app | 亚洲国产精品久久久天堂 | 精品国产精品久久一区免费式 | 亚洲成a人片在线观看无码 | 18无码粉嫩小泬无套在线观看 | 乌克兰少妇xxxx做受 | 丁香花在线影院观看在线播放 | 免费无码肉片在线观看 | 亚洲欧美精品aaaaaa片 | 亚洲男女内射在线播放 | 乱人伦中文视频在线观看 | 欧美一区二区三区 | 97色伦图片97综合影院 | 无码人妻黑人中文字幕 | 午夜精品久久久久久久久 | 国产亚洲视频中文字幕97精品 | 亚洲成a人片在线观看日本 | 天堂久久天堂av色综合 | 久激情内射婷内射蜜桃人妖 | 成人无码精品1区2区3区免费看 | 乌克兰少妇性做爰 | 亚洲高清偷拍一区二区三区 | 野狼第一精品社区 | 日本一区二区三区免费播放 | 国产在线一区二区三区四区五区 | aⅴ在线视频男人的天堂 | 波多野结衣av一区二区全免费观看 | 国产亚洲精品久久久久久 | 全黄性性激高免费视频 | 久久99久久99精品中文字幕 | ass日本丰满熟妇pics | 亚洲人成网站在线播放942 | 狂野欧美性猛xxxx乱大交 | 人人爽人人澡人人高潮 | 无码国产色欲xxxxx视频 | 国产精品美女久久久网av | 乱人伦中文视频在线观看 | 一个人免费观看的www视频 | 97久久超碰中文字幕 | 亚洲综合无码久久精品综合 | 天天做天天爱天天爽综合网 | 亚洲无人区一区二区三区 | 欧美日韩亚洲国产精品 | 亚洲人成影院在线无码按摩店 | 久久综合给合久久狠狠狠97色 | 久久99精品国产麻豆蜜芽 | 色婷婷久久一区二区三区麻豆 | 国产三级精品三级男人的天堂 | 无码人妻出轨黑人中文字幕 | 国产精品久久久久无码av色戒 | 亚拍精品一区二区三区探花 | 国产猛烈高潮尖叫视频免费 | 国产亚洲精品久久久久久久 | 天堂а√在线地址中文在线 | 亚洲日韩精品欧美一区二区 | 国产精品多人p群无码 | 免费人成网站视频在线观看 | 国产无套粉嫩白浆在线 | 欧美乱妇无乱码大黄a片 | 国产精品无码一区二区桃花视频 | 色偷偷人人澡人人爽人人模 | 久久 国产 尿 小便 嘘嘘 | 国内揄拍国内精品少妇国语 | 天堂无码人妻精品一区二区三区 | 国产精品美女久久久 | 免费人成在线视频无码 | 国内少妇偷人精品视频免费 | 无码国产激情在线观看 | 欧美黑人性暴力猛交喷水 | aa片在线观看视频在线播放 | 青草视频在线播放 | 少妇无码一区二区二三区 | 激情五月综合色婷婷一区二区 | 丰满少妇熟乱xxxxx视频 | 色婷婷综合激情综在线播放 | 成人精品视频一区二区 | 青青青手机频在线观看 | 麻豆国产人妻欲求不满谁演的 | 国产极品视觉盛宴 | 377p欧洲日本亚洲大胆 | 国产另类ts人妖一区二区 | 欧美激情内射喷水高潮 | 无码人中文字幕 | 精品国产国产综合精品 | 毛片内射-百度 | 蜜桃视频韩日免费播放 | 国产亚洲精品久久久久久久 | 亚洲人成网站色7799 | 台湾无码一区二区 | 丰满妇女强制高潮18xxxx | 初尝人妻少妇中文字幕 | 久久久久成人精品免费播放动漫 | 欧洲vodafone精品性 | 久久久久久久女国产乱让韩 | 国产偷自视频区视频 | 性开放的女人aaa片 | 图片区 小说区 区 亚洲五月 | 国产免费久久久久久无码 | 亚洲色偷偷男人的天堂 | 国产精品va在线观看无码 | 一区二区传媒有限公司 | 国产高潮视频在线观看 | 国产一区二区三区四区五区加勒比 | 男女爱爱好爽视频免费看 | 又黄又爽又色的视频 | 中国女人内谢69xxxx | 精品国产麻豆免费人成网站 | 西西人体www44rt大胆高清 | 在线播放无码字幕亚洲 | 精品国精品国产自在久国产87 | 亚洲成a人片在线观看无码3d | 无码福利日韩神码福利片 | 欧美国产亚洲日韩在线二区 | 人妻有码中文字幕在线 | 国产精品高潮呻吟av久久4虎 | 丁香啪啪综合成人亚洲 | 国产乱子伦视频在线播放 | 55夜色66夜色国产精品视频 | 久久99精品国产麻豆 | 亚洲国产精品久久人人爱 | а√天堂www在线天堂小说 | 美女极度色诱视频国产 | 扒开双腿疯狂进出爽爽爽视频 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 亚洲欧美精品aaaaaa片 | 俺去俺来也www色官网 | 中文字幕乱码亚洲无线三区 | 日韩人妻少妇一区二区三区 | 人妻天天爽夜夜爽一区二区 | 亚洲欧洲中文日韩av乱码 | 麻豆国产97在线 | 欧洲 | 欧美丰满老熟妇xxxxx性 | 乱人伦中文视频在线观看 | 久久精品丝袜高跟鞋 | 欧美午夜特黄aaaaaa片 | 亚无码乱人伦一区二区 | 精品水蜜桃久久久久久久 | 天天躁日日躁狠狠躁免费麻豆 | 亚洲va欧美va天堂v国产综合 | 97无码免费人妻超级碰碰夜夜 | 骚片av蜜桃精品一区 | 成人欧美一区二区三区黑人免费 | 久久精品国产大片免费观看 | 久久久久久亚洲精品a片成人 | 久久久久人妻一区精品色欧美 | 亚洲国产精品无码久久久久高潮 | 2020久久超碰国产精品最新 | 精品厕所偷拍各类美女tp嘘嘘 | 少妇性荡欲午夜性开放视频剧场 | 蜜臀av在线播放 久久综合激激的五月天 | 天堂在线观看www | 亚洲精品综合一区二区三区在线 | 欧美老妇交乱视频在线观看 | 久久97精品久久久久久久不卡 | 国产免费久久久久久无码 | 日韩av无码中文无码电影 | 亚洲の无码国产の无码步美 | 亚洲综合精品香蕉久久网 | 2020久久超碰国产精品最新 | 国产亚洲视频中文字幕97精品 | 少妇无码一区二区二三区 | 日本一区二区三区免费高清 | 日韩少妇内射免费播放 | 久久人妻内射无码一区三区 | a在线亚洲男人的天堂 | 天天拍夜夜添久久精品大 | 久久亚洲精品成人无码 | 成人片黄网站色大片免费观看 | 亚洲小说春色综合另类 | 精品熟女少妇av免费观看 | 国产精品毛片一区二区 | 日本护士xxxxhd少妇 | 一本大道久久东京热无码av | 久久精品无码一区二区三区 | 国产乱人伦偷精品视频 | 奇米影视7777久久精品 | 欧美人与禽猛交狂配 | 色婷婷av一区二区三区之红樱桃 | 亚洲欧美日韩国产精品一区二区 | 国产在线一区二区三区四区五区 | 久久午夜无码鲁丝片午夜精品 | 久久精品人人做人人综合 | 日本在线高清不卡免费播放 | 成人免费视频视频在线观看 免费 | 国产无遮挡吃胸膜奶免费看 | 亚洲综合在线一区二区三区 | a片在线免费观看 | 中文字幕人妻丝袜二区 | 国产av无码专区亚洲a∨毛片 | 少妇无套内谢久久久久 | 国产精品无码成人午夜电影 | 欧美 日韩 人妻 高清 中文 | 亚洲の无码国产の无码步美 | 亚洲色偷偷偷综合网 | 亚洲va欧美va天堂v国产综合 | 欧美放荡的少妇 | 亚洲第一网站男人都懂 | 亚洲第一网站男人都懂 | 亚洲春色在线视频 | 欧美 日韩 人妻 高清 中文 | 欧美国产日韩亚洲中文 | 99久久久国产精品无码免费 | 欧美激情内射喷水高潮 | 亚洲午夜无码久久 | 欧美熟妇另类久久久久久多毛 | 亚洲熟妇自偷自拍另类 | 麻豆蜜桃av蜜臀av色欲av | 亚洲欧美日韩国产精品一区二区 | 黑人巨大精品欧美一区二区 | 99精品无人区乱码1区2区3区 | aa片在线观看视频在线播放 | 免费无码av一区二区 | 久久精品女人天堂av免费观看 | 精品少妇爆乳无码av无码专区 | 亚洲日韩av一区二区三区四区 | 国产精品永久免费视频 | av无码电影一区二区三区 | 在线看片无码永久免费视频 | 亚洲熟悉妇女xxx妇女av | 丁香啪啪综合成人亚洲 | 人人妻人人澡人人爽人人精品浪潮 | 国产乱码精品一品二品 | 自拍偷自拍亚洲精品10p | 日日夜夜撸啊撸 | 欧美日韩久久久精品a片 | 人人妻人人澡人人爽欧美一区九九 | 国产精华av午夜在线观看 | 三上悠亚人妻中文字幕在线 | 毛片内射-百度 | 国内揄拍国内精品少妇国语 | 国产特级毛片aaaaaaa高清 | 99久久无码一区人妻 | 强伦人妻一区二区三区视频18 | 久久天天躁狠狠躁夜夜免费观看 | 国产在线一区二区三区四区五区 | 欧美 亚洲 国产 另类 | 亚洲自偷精品视频自拍 | 中文字幕av日韩精品一区二区 | 中文字幕色婷婷在线视频 | 国产又爽又黄又刺激的视频 | 国产精品国产三级国产专播 | 久青草影院在线观看国产 | 狠狠综合久久久久综合网 | 国产精品自产拍在线观看 | 精品国产一区av天美传媒 | 1000部啪啪未满十八勿入下载 | 国内精品人妻无码久久久影院 | 天天拍夜夜添久久精品大 | 日韩精品无码一本二本三本色 | 人人妻人人澡人人爽人人精品浪潮 | 成人av无码一区二区三区 | 老熟女重囗味hdxx69 | 国产精品美女久久久久av爽李琼 | 日韩成人一区二区三区在线观看 | 午夜精品久久久久久久久 | 国产激情一区二区三区 | 性生交大片免费看女人按摩摩 | 国产精品无码永久免费888 | 夜夜高潮次次欢爽av女 | √天堂资源地址中文在线 | 欧美刺激性大交 | 无码av免费一区二区三区试看 | 无码人妻丰满熟妇区毛片18 | 午夜肉伦伦影院 | 国产精品久久国产三级国 | 精品夜夜澡人妻无码av蜜桃 | 亚欧洲精品在线视频免费观看 | 亚洲国产精品久久久天堂 | 人人澡人摸人人添 | 久久99精品久久久久久动态图 | 一本精品99久久精品77 | 又大又紧又粉嫩18p少妇 | 精品熟女少妇av免费观看 | 人人妻人人澡人人爽欧美一区九九 | 亚洲成av人片在线观看无码不卡 | 免费国产黄网站在线观看 | 东北女人啪啪对白 | 大肉大捧一进一出好爽视频 | 无码免费一区二区三区 | 成人免费视频一区二区 | 色婷婷久久一区二区三区麻豆 | 无码人中文字幕 | 人人妻人人澡人人爽欧美一区 | 内射欧美老妇wbb | 精品aⅴ一区二区三区 | 国产色在线 | 国产 | 99久久人妻精品免费二区 | 无遮挡国产高潮视频免费观看 | 亚洲成a人一区二区三区 | 国产在线aaa片一区二区99 | 无码人妻丰满熟妇区五十路百度 | 久久精品国产99精品亚洲 | 欧美黑人乱大交 | 欧美日本日韩 | 国产成人综合在线女婷五月99播放 | 天堂а√在线中文在线 | 色欲久久久天天天综合网精品 | 亚洲精品中文字幕久久久久 | 精品无码国产一区二区三区av | 国产成人综合色在线观看网站 | 少妇无码一区二区二三区 | 日本xxxx色视频在线观看免费 | 日韩精品无码一本二本三本色 | 午夜理论片yy44880影院 | 亚洲a无码综合a国产av中文 | 久久精品中文字幕大胸 | 久久精品中文字幕一区 | 久久精品中文闷骚内射 | 76少妇精品导航 | 国产精品办公室沙发 | 在线视频网站www色 | 国产精品多人p群无码 | 麻豆精产国品 | 国产精品人妻一区二区三区四 | 欧美黑人巨大xxxxx | 天海翼激烈高潮到腰振不止 | 色五月丁香五月综合五月 | 日本www一道久久久免费榴莲 | 国产亚洲视频中文字幕97精品 | 国产精品va在线播放 | 狠狠色噜噜狠狠狠狠7777米奇 | 精品国产福利一区二区 | 亚洲中文无码av永久不收费 | 国产精品va在线观看无码 | 中文字幕人妻丝袜二区 | 5858s亚洲色大成网站www | 成年女人永久免费看片 | 荫蒂被男人添的好舒服爽免费视频 | 成人女人看片免费视频放人 | 亚洲国产一区二区三区在线观看 | 中文久久乱码一区二区 | 欧美放荡的少妇 | 国产特级毛片aaaaaaa高清 | 麻豆md0077饥渴少妇 | 少妇人妻偷人精品无码视频 | 国产精品美女久久久 | 国产精品亚洲专区无码不卡 | 国产在线aaa片一区二区99 | 精品一区二区三区波多野结衣 | 久久综合给久久狠狠97色 | 中文字幕人妻丝袜二区 | 久久亚洲中文字幕无码 | 国产激情精品一区二区三区 | 国产亚洲精品久久久久久久久动漫 | 对白脏话肉麻粗话av | 欧美野外疯狂做受xxxx高潮 | 粉嫩少妇内射浓精videos | 男女作爱免费网站 | 日本又色又爽又黄的a片18禁 | 熟女少妇在线视频播放 | 亚洲成av人片天堂网无码】 | 亚洲欧洲日本无在线码 | 呦交小u女精品视频 | 国产激情无码一区二区 | 爱做久久久久久 | 亚洲乱码国产乱码精品精 | 国产精品鲁鲁鲁 | 精品无码国产自产拍在线观看蜜 | 亚洲精品一区二区三区在线 | 久久国产精品精品国产色婷婷 | 亚洲国产精品一区二区美利坚 | 国产精品无码一区二区三区不卡 | 国产av剧情md精品麻豆 | 麻豆精品国产精华精华液好用吗 | 精品一区二区不卡无码av | 99精品国产综合久久久久五月天 | 日韩精品一区二区av在线 | 亚洲理论电影在线观看 | 国产乱码精品一品二品 | 青青青爽视频在线观看 | 国产内射老熟女aaaa | 国产成人无码a区在线观看视频app | 真人与拘做受免费视频一 | 亚洲成av人在线观看网址 | 成人无码精品1区2区3区免费看 | 亚洲爆乳无码专区 | 麻豆国产丝袜白领秘书在线观看 | 国产精品亚洲综合色区韩国 | 人妻互换免费中文字幕 | 亚洲中文字幕无码中文字在线 | 日本成熟视频免费视频 | 精品人人妻人人澡人人爽人人 | 国产超碰人人爽人人做人人添 | 久久亚洲精品中文字幕无男同 | 午夜性刺激在线视频免费 | 久久www免费人成人片 | 久久国产36精品色熟妇 | 国产精品资源一区二区 | 亚欧洲精品在线视频免费观看 | 少妇无码av无码专区在线观看 | 日本xxxx色视频在线观看免费 | 国产成人久久精品流白浆 | 鲁一鲁av2019在线 | av香港经典三级级 在线 | 亚洲精品成人福利网站 | 中文无码伦av中文字幕 | 强伦人妻一区二区三区视频18 | 国产美女精品一区二区三区 | 色偷偷人人澡人人爽人人模 | 成人无码视频在线观看网站 | 成 人 网 站国产免费观看 | 中文毛片无遮挡高清免费 | 丰满妇女强制高潮18xxxx | 成人动漫在线观看 | 国内精品久久毛片一区二区 | 最近中文2019字幕第二页 | 免费网站看v片在线18禁无码 | 日本精品少妇一区二区三区 | 欧美精品国产综合久久 | 免费观看的无遮挡av | 黑人玩弄人妻中文在线 | 日韩成人一区二区三区在线观看 | 一本色道婷婷久久欧美 | 狠狠综合久久久久综合网 | 男女猛烈xx00免费视频试看 | 99久久精品国产一区二区蜜芽 | 全黄性性激高免费视频 | 色窝窝无码一区二区三区色欲 | 日产国产精品亚洲系列 | 久久无码专区国产精品s | 乌克兰少妇xxxx做受 | 台湾无码一区二区 | 黑人巨大精品欧美黑寡妇 | 国产真实伦对白全集 | 99精品无人区乱码1区2区3区 | 亚洲综合久久一区二区 | 亚洲人交乣女bbw | 欧美午夜特黄aaaaaa片 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 午夜福利一区二区三区在线观看 | 国产亚洲人成在线播放 | 亚洲色欲色欲天天天www | 性做久久久久久久久 | 色狠狠av一区二区三区 | 国产极品美女高潮无套在线观看 | 欧美日韩人成综合在线播放 | 中文字幕无码免费久久9一区9 | 未满小14洗澡无码视频网站 | 窝窝午夜理论片影院 | 亚洲自偷精品视频自拍 | 无码国产激情在线观看 | 真人与拘做受免费视频一 | 少妇无码吹潮 | 亚洲欧美综合区丁香五月小说 | 人妻无码αv中文字幕久久琪琪布 | 国产精品99爱免费视频 | 东京热一精品无码av | 中文无码成人免费视频在线观看 | 人人妻人人澡人人爽欧美一区 | 欧美黑人性暴力猛交喷水 | 精品久久久久香蕉网 | 国产偷抇久久精品a片69 | 国产9 9在线 | 中文 | 国产午夜亚洲精品不卡下载 | 日本饥渴人妻欲求不满 | 综合网日日天干夜夜久久 | 大色综合色综合网站 | 好屌草这里只有精品 | 正在播放东北夫妻内射 | 免费视频欧美无人区码 | 男女爱爱好爽视频免费看 | 国产亚洲精品久久久久久久久动漫 | 夜精品a片一区二区三区无码白浆 | 黑人巨大精品欧美黑寡妇 | 水蜜桃亚洲一二三四在线 | 国产激情无码一区二区 | 大乳丰满人妻中文字幕日本 | 男女猛烈xx00免费视频试看 | 青草青草久热国产精品 | 中文字幕无码人妻少妇免费 | 精品国产福利一区二区 | 国产精品久久久久久久影院 | 人人澡人摸人人添 | 国产精品多人p群无码 | 成 人 网 站国产免费观看 | 内射欧美老妇wbb | 99精品无人区乱码1区2区3区 | 国产精品亚洲一区二区三区喷水 | 久久亚洲日韩精品一区二区三区 | 国产suv精品一区二区五 | 国产一区二区三区日韩精品 | 久久久久se色偷偷亚洲精品av | 人人澡人人透人人爽 | 国产极品美女高潮无套在线观看 | 色爱情人网站 | 国产人妻精品一区二区三区不卡 | 成人动漫在线观看 | 小泽玛莉亚一区二区视频在线 | 日韩 欧美 动漫 国产 制服 | 日韩少妇白浆无码系列 | 日韩人妻无码中文字幕视频 | 国产精品亚洲专区无码不卡 | 国产真实伦对白全集 | 久久aⅴ免费观看 | 日本大香伊一区二区三区 | 国产一区二区三区精品视频 | 青草青草久热国产精品 | 熟妇女人妻丰满少妇中文字幕 | 亚洲综合在线一区二区三区 | 国产一区二区不卡老阿姨 | 久久99精品久久久久久动态图 | 欧美丰满熟妇xxxx性ppx人交 | 久久精品国产大片免费观看 | 性啪啪chinese东北女人 | 久久综合狠狠综合久久综合88 | 亚洲成色在线综合网站 | 亚洲理论电影在线观看 | 大地资源网第二页免费观看 | 中文字幕av无码一区二区三区电影 | 日韩精品无码一本二本三本色 | 久久伊人色av天堂九九小黄鸭 | 亚洲中文字幕无码中字 | 国产激情艳情在线看视频 | 久久人人爽人人爽人人片ⅴ | 成人免费视频一区二区 | 欧美 亚洲 国产 另类 | 国语精品一区二区三区 | 成人免费无码大片a毛片 | 波多野结衣av一区二区全免费观看 | 最近免费中文字幕中文高清百度 | 伊人久久大香线蕉av一区二区 | 性生交大片免费看l | 欧洲美熟女乱又伦 | 十八禁视频网站在线观看 | 国产69精品久久久久app下载 | 国产精品久久久久久亚洲影视内衣 | 亚洲一区二区三区无码久久 | 婷婷综合久久中文字幕蜜桃三电影 | 亚洲一区av无码专区在线观看 | 日日夜夜撸啊撸 | √8天堂资源地址中文在线 | 国产亚洲精品久久久久久国模美 | 精品无码av一区二区三区 | 全黄性性激高免费视频 | 国产口爆吞精在线视频 | 丰满少妇高潮惨叫视频 | 无码精品国产va在线观看dvd | 亚洲精品久久久久中文第一幕 | 日日橹狠狠爱欧美视频 | 中文精品无码中文字幕无码专区 | 亚洲色偷偷男人的天堂 | 亚洲一区二区三区 | 欧美黑人性暴力猛交喷水 | 国产精品二区一区二区aⅴ污介绍 | 亚洲s色大片在线观看 | 欧美国产亚洲日韩在线二区 | 日韩精品成人一区二区三区 | 亚洲精品成人福利网站 | 久久午夜夜伦鲁鲁片无码免费 | 强伦人妻一区二区三区视频18 | 领导边摸边吃奶边做爽在线观看 | а√资源新版在线天堂 | 波多野结衣乳巨码无在线观看 | 熟妇女人妻丰满少妇中文字幕 | 性欧美熟妇videofreesex | 88国产精品欧美一区二区三区 | 十八禁视频网站在线观看 | 2020久久香蕉国产线看观看 | 欧美大屁股xxxxhd黑色 | 国产香蕉97碰碰久久人人 | 国产在线无码精品电影网 | 十八禁真人啪啪免费网站 | 欧美丰满少妇xxxx性 | 国产 精品 自在自线 | 亚洲一区二区三区含羞草 | 亚洲a无码综合a国产av中文 | 67194成是人免费无码 | 久久精品国产99久久6动漫 | 好男人社区资源 | 美女黄网站人色视频免费国产 | 欧美老熟妇乱xxxxx | 中文无码伦av中文字幕 | 久久99精品久久久久久 | 人人爽人人澡人人高潮 | 国产av无码专区亚洲awww | 亚洲欧美国产精品专区久久 | 未满成年国产在线观看 | 成人免费无码大片a毛片 | 亚洲成a人一区二区三区 | 377p欧洲日本亚洲大胆 | 久热国产vs视频在线观看 | 免费播放一区二区三区 | 日韩人妻无码一区二区三区久久99 | 久久亚洲日韩精品一区二区三区 | 秋霞特色aa大片 | 亚洲日韩乱码中文无码蜜桃臀网站 | 中文无码伦av中文字幕 | 亚洲综合伊人久久大杳蕉 | 国产乱码精品一品二品 | 88国产精品欧美一区二区三区 | 亚洲综合久久一区二区 | 久久久国产精品无码免费专区 | 亚洲一区二区三区偷拍女厕 | 少妇邻居内射在线 | 黑人玩弄人妻中文在线 | 中文字幕亚洲情99在线 | 丝袜人妻一区二区三区 | 午夜性刺激在线视频免费 | 少妇高潮喷潮久久久影院 | 久久综合网欧美色妞网 | 国产午夜视频在线观看 | 精品久久久久香蕉网 | 大屁股大乳丰满人妻 | 在线播放亚洲第一字幕 | 精品日本一区二区三区在线观看 | 99国产精品白浆在线观看免费 | 国产午夜福利100集发布 | 亚洲gv猛男gv无码男同 | 亚洲熟妇色xxxxx欧美老妇 | 国产精品美女久久久久av爽李琼 | 一本久道久久综合婷婷五月 | 久久精品人人做人人综合试看 | 亚洲中文字幕无码中文字在线 | 人妻少妇精品视频专区 | 亚洲综合精品香蕉久久网 | 永久免费观看美女裸体的网站 | 中文字幕人妻丝袜二区 | 成人av无码一区二区三区 | 欧美激情内射喷水高潮 | 亚洲国产精品无码一区二区三区 | 少妇愉情理伦片bd | 精品偷自拍另类在线观看 | 亚洲va欧美va天堂v国产综合 | 成熟人妻av无码专区 | 狂野欧美性猛交免费视频 | 波多野结衣一区二区三区av免费 | 久久久亚洲欧洲日产国码αv | 国产特级毛片aaaaaaa高清 | 欧美激情内射喷水高潮 | 亚洲成av人片天堂网无码】 | 欧美xxxxx精品 | 最近中文2019字幕第二页 | 少妇人妻av毛片在线看 | 久久亚洲中文字幕无码 | 日本爽爽爽爽爽爽在线观看免 | 成人无码精品一区二区三区 | 中文字幕乱码人妻二区三区 | 亚洲va中文字幕无码久久不卡 | 亚洲精品成人福利网站 | 性开放的女人aaa片 | 日日麻批免费40分钟无码 | 国产特级毛片aaaaaa高潮流水 | 中文字幕精品av一区二区五区 | 蜜桃视频韩日免费播放 | 18禁黄网站男男禁片免费观看 | 最近的中文字幕在线看视频 | 中文精品无码中文字幕无码专区 | 双乳奶水饱满少妇呻吟 | 欧美黑人乱大交 | 一本无码人妻在中文字幕免费 | 在线播放无码字幕亚洲 | 2020久久超碰国产精品最新 | 国产区女主播在线观看 | 乌克兰少妇xxxx做受 | 亚洲啪av永久无码精品放毛片 | 日韩人妻少妇一区二区三区 | 精品欧洲av无码一区二区三区 | 欧洲欧美人成视频在线 | 国产激情艳情在线看视频 | 欧美freesex黑人又粗又大 | 色偷偷av老熟女 久久精品人妻少妇一区二区三区 | 又紧又大又爽精品一区二区 | 亚洲精品美女久久久久久久 | 丰腴饱满的极品熟妇 | 国产亲子乱弄免费视频 | 国产精品国产三级国产专播 | 水蜜桃亚洲一二三四在线 | 欧美人与牲动交xxxx | 熟女少妇人妻中文字幕 | 兔费看少妇性l交大片免费 | 亚洲乱码日产精品bd | 亚洲熟妇色xxxxx欧美老妇 | 97夜夜澡人人爽人人喊中国片 | 国产成人av免费观看 | 久久精品国产一区二区三区肥胖 | 网友自拍区视频精品 | 日日噜噜噜噜夜夜爽亚洲精品 | 初尝人妻少妇中文字幕 | 国产精品国产自线拍免费软件 | 国产精品无码久久av | 极品尤物被啪到呻吟喷水 | 97久久超碰中文字幕 | 激情国产av做激情国产爱 | 天堂在线观看www | 99久久精品午夜一区二区 | 日韩欧美成人免费观看 | 日日鲁鲁鲁夜夜爽爽狠狠 | 日本精品人妻无码免费大全 | 一本精品99久久精品77 | 色窝窝无码一区二区三区色欲 | 国产av一区二区精品久久凹凸 | 精品久久久久久亚洲精品 | 人人妻人人澡人人爽欧美一区九九 | 亚洲午夜久久久影院 | 久久久久免费看成人影片 | 美女黄网站人色视频免费国产 | 黑人巨大精品欧美一区二区 | 一二三四社区在线中文视频 | 亚洲精品一区二区三区婷婷月 | 国产激情无码一区二区 | 亚洲综合色区中文字幕 | 人妻插b视频一区二区三区 | 欧美老妇交乱视频在线观看 | 国产成人无码午夜视频在线观看 | 国产人妻精品一区二区三区不卡 | 国产熟女一区二区三区四区五区 | 亚洲高清偷拍一区二区三区 | 精品国产av色一区二区深夜久久 | 亚洲精品综合一区二区三区在线 | 麻豆蜜桃av蜜臀av色欲av | 国产亚洲欧美在线专区 | aⅴ亚洲 日韩 色 图网站 播放 | 黑森林福利视频导航 | 日本精品人妻无码77777 天堂一区人妻无码 | 亚洲精品欧美二区三区中文字幕 | 久久亚洲日韩精品一区二区三区 | 午夜成人1000部免费视频 | 久久国语露脸国产精品电影 | 丰满护士巨好爽好大乳 | 99久久久无码国产精品免费 | 久久久久99精品国产片 | 亚洲娇小与黑人巨大交 | 乱码午夜-极国产极内射 | 久久精品女人的天堂av | 国产av无码专区亚洲awww | 亚洲s码欧洲m码国产av | 鲁一鲁av2019在线 | 熟妇人妻激情偷爽文 | 国产无遮挡又黄又爽免费视频 | аⅴ资源天堂资源库在线 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 国产一区二区三区影院 | 亚洲熟悉妇女xxx妇女av | 99riav国产精品视频 | 国产成人精品三级麻豆 | 中文精品久久久久人妻不卡 | 人妻少妇精品无码专区二区 | 夜夜躁日日躁狠狠久久av | 日日噜噜噜噜夜夜爽亚洲精品 | 免费播放一区二区三区 | 久在线观看福利视频 | 在线视频网站www色 | 午夜丰满少妇性开放视频 | 精品无码国产一区二区三区av | 久久亚洲国产成人精品性色 | 波多野结衣一区二区三区av免费 | 国产免费久久精品国产传媒 | 亚洲人成影院在线观看 | 夜夜躁日日躁狠狠久久av | 无码人妻精品一区二区三区下载 | 无码人妻久久一区二区三区不卡 | 国产精品无码永久免费888 | 亚洲精品国产品国语在线观看 | 偷窥村妇洗澡毛毛多 | 欧美日韩人成综合在线播放 | 狠狠色丁香久久婷婷综合五月 | 成人片黄网站色大片免费观看 | 天天做天天爱天天爽综合网 | 久久zyz资源站无码中文动漫 | 亚洲熟妇色xxxxx欧美老妇y | 无码av最新清无码专区吞精 | 精品熟女少妇av免费观看 | 免费视频欧美无人区码 | 日韩少妇白浆无码系列 | 强奷人妻日本中文字幕 | 国产av人人夜夜澡人人爽麻豆 | 丰满人妻翻云覆雨呻吟视频 | 中文字幕乱妇无码av在线 | 欧美刺激性大交 | 三上悠亚人妻中文字幕在线 | 亚洲色在线无码国产精品不卡 | 久久精品中文字幕一区 | 亚洲精品一区二区三区四区五区 | 四虎4hu永久免费 | 国产午夜福利100集发布 | 国产人妖乱国产精品人妖 | 亚洲国产精华液网站w | 午夜福利不卡在线视频 | 国产亚洲日韩欧美另类第八页 | 日日摸夜夜摸狠狠摸婷婷 | 十八禁真人啪啪免费网站 | 欧美日韩精品 | 日日鲁鲁鲁夜夜爽爽狠狠 | 亚洲色www成人永久网址 | 欧美黑人巨大xxxxx | 青青草原综合久久大伊人精品 | 波多野结衣高清一区二区三区 | 久久精品国产99久久6动漫 | 中文字幕无码视频专区 | 欧美野外疯狂做受xxxx高潮 | 99久久久无码国产aaa精品 | 黑人巨大精品欧美黑寡妇 | 好爽又高潮了毛片免费下载 | 国产成人精品三级麻豆 | 亚洲精品久久久久久久久久久 | 国产成人无码a区在线观看视频app | 国产成人无码午夜视频在线观看 | 亚洲另类伦春色综合小说 | 九九久久精品国产免费看小说 | 综合人妻久久一区二区精品 | а√天堂www在线天堂小说 | 1000部啪啪未满十八勿入下载 | 永久免费观看国产裸体美女 | 日韩精品无码免费一区二区三区 | 骚片av蜜桃精品一区 | 内射巨臀欧美在线视频 | 亚洲一区av无码专区在线观看 | 性生交大片免费看女人按摩摩 | 国产精品va在线观看无码 | 我要看www免费看插插视频 | 久久人妻内射无码一区三区 | 欧美日韩综合一区二区三区 | 久久精品人妻少妇一区二区三区 | 国产精品久久精品三级 | 国产精品免费大片 | 中文字幕乱码中文乱码51精品 | 老子影院午夜精品无码 | 日本大香伊一区二区三区 | 亚洲精品一区二区三区在线观看 | 女人和拘做爰正片视频 | 国产高清不卡无码视频 | 一个人看的www免费视频在线观看 | 无码任你躁久久久久久久 | 国产乱码精品一品二品 | 国产av无码专区亚洲awww | 亚欧洲精品在线视频免费观看 | 成人试看120秒体验区 | 无码人妻精品一区二区三区不卡 | 一个人看的www免费视频在线观看 | 久久五月精品中文字幕 | 色综合久久久无码中文字幕 | 综合人妻久久一区二区精品 | 亚洲自偷自偷在线制服 | 国内丰满熟女出轨videos | 色一情一乱一伦一视频免费看 | 国语精品一区二区三区 | 4hu四虎永久在线观看 | 亚洲精品一区三区三区在线观看 | 在线观看国产一区二区三区 | 99久久亚洲精品无码毛片 | 精品人人妻人人澡人人爽人人 | 性欧美牲交xxxxx视频 | 国产av久久久久精东av | 国产超级va在线观看视频 | 成年美女黄网站色大免费视频 | 日日橹狠狠爱欧美视频 | 人妻aⅴ无码一区二区三区 | 久久综合香蕉国产蜜臀av | 熟妇人妻中文av无码 | 狠狠亚洲超碰狼人久久 | 伊人久久大香线蕉午夜 | 色偷偷人人澡人人爽人人模 | 亚洲最大成人网站 | 国产福利视频一区二区 | 水蜜桃色314在线观看 | 曰韩少妇内射免费播放 | 国产成人久久精品流白浆 | 少妇性l交大片 | 十八禁真人啪啪免费网站 | 久久精品一区二区三区四区 | 性色欲网站人妻丰满中文久久不卡 | 高潮毛片无遮挡高清免费视频 | 曰韩少妇内射免费播放 | 少妇激情av一区二区 | 久久久精品国产sm最大网站 | 人妻少妇被猛烈进入中文字幕 | 丰腴饱满的极品熟妇 | 麻豆av传媒蜜桃天美传媒 | 久久亚洲a片com人成 | 久久久精品人妻久久影视 | 午夜精品一区二区三区的区别 | 欧美zoozzooz性欧美 | 国产精品国产三级国产专播 | 国产美女精品一区二区三区 | 骚片av蜜桃精品一区 | 日韩精品无码一区二区中文字幕 | 少妇性荡欲午夜性开放视频剧场 | 亚洲va中文字幕无码久久不卡 | 综合人妻久久一区二区精品 | 香港三级日本三级妇三级 | 偷窥村妇洗澡毛毛多 | 无码av最新清无码专区吞精 | 亚洲欧洲中文日韩av乱码 | 日本在线高清不卡免费播放 | 中文字幕无码免费久久9一区9 | 亚洲欧美综合区丁香五月小说 | 黑人玩弄人妻中文在线 |