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

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

?? fastcopy.cpp

?? FastCopy 利用緩沖技術加快文件拷貝
?? CPP
?? 第 1 頁 / 共 4 頁
字號:
		subStat->lastError = ::GetLastError();
		return	FALSE;
	}
	::BackupRead(stat->hFile, 0, 0, 0, TRUE, FALSE, &context);
#endif

	return	TRUE;
}

BOOL FastCopy::ReadMultiFilesProc(void)
{
	for (int i=0; i < openFilesCnt; i++) {
		if (ReadFileProc(openFiles[i]), isAbort)
			break;
	}
	return	!isAbort;
}

BOOL FastCopy::CloseMultiFilesProc(void)
{
	if ((info.flags & LISTING_ONLY) == 0) {
		for (int i=0; i < openFilesCnt; i++) {
			if (openFiles[i]->hFile != INVALID_HANDLE_VALUE)
				::CloseHandle(openFiles[i]->hFile);
		}
	}
	openFilesCnt = 0;

	return	!isAbort;
}

BOOL FastCopy::ReadFileProc(FileStat *stat)
{
	BOOL	ret = TRUE;
	_int64	file_size = stat->FileSize();
	DWORD	trans_size;
	ReqBuf	req_buf;

	if (file_size == 0 || (info.flags & LISTING_ONLY))
		return	SendRequest(WRITE_FILE, 0, stat);

	if (stat->hFile == INVALID_HANDLE_VALUE) {
		total.errFiles++;
		::SetLastError(stat->lastError);
		if (ConfirmErr("OpenFile", MakeAddr(src, srcPrefixLen)) == Confirm::CONTINUE_RESULT) {
			stat->SetFileSize(0);
			if (info.flags & CREATE_OPENERR_FILE)
				SendRequest(WRITE_FILE, 0, stat);
		}
		return	FALSE;
	}

	for (_int64 remain_size=file_size; remain_size > 0; remain_size -= trans_size) {
		BOOL	isFirst = remain_size == file_size;
		if ((ret = PrepareReqBuf(offsetof(ReqHeader, stat) + (isFirst ? stat->minSize : 0), remain_size, stat->fileID, &req_buf)) == FALSE)
			break;
		if ((ret = ::ReadFile(stat->hFile, req_buf.buf, req_buf.bufSize, &trans_size, NULL)) == FALSE || trans_size == 0) {
			total.errFiles++;
			if (ConfirmErr(ret && !trans_size ? "ReadFile(truncate)" : "ReadFile", MakeAddr(src, srcPrefixLen)) == Confirm::CONTINUE_RESULT || remain_size != file_size) {
				stat->SetFileSize(0);
				req_buf.bufSize = 0;
				SendRequest(isFirst ? WRITE_FILE : WRITE_ABORT, &req_buf, isFirst ? stat : 0);
			}
			break;
		}
		else
			total.readTrans += trans_size;
		SendRequest(isFirst ? WRITE_FILE : WRITE_FILE_CONT, &req_buf, isFirst ? stat : 0);

		if (autoSlow) {
			::Sleep(autoSlow);
		}
	}

	return	ret && !isAbort;
}

void FastCopy::ReadDestStatRequest(void)
{
	cv.Lock();
	readDestStatQueue = TRUE;
	cv.Notify();
	cv.UnLock();
}

BOOL FastCopy::WaitReadDestStat(void)
{
	cv.Lock();
	while (readDestStatQueue && !isAbort)
		cv.Wait();
	cv.UnLock();
	return	readDestStatResult;
}

BOOL FastCopy::ReadDestStat(void)
{
	HANDLE		fh;
	int			num = 0, len;
	FileStat	*dstStat, **dstStatIdx;
	WIN32_FIND_DATAW	fdat;

	if (!isSameDrv)
		cv.UnLock();
	readDestStatResult = TRUE;
	dstStat = (FileStat *)dstStatBuf.Buf();
	dstStatIdx = (FileStat **)dstStatIdxBuf.Buf();
	dstStatBuf.SetUsedSize(0);
	dstStatIdxBuf.SetUsedSize(0);

	if ((fh = FindFirstFileV(confirmDst, &fdat)) == INVALID_HANDLE_VALUE) {
		if (::GetLastError() != ERROR_FILE_NOT_FOUND && strcmpV(MakeAddr(confirmDst, dstBaseLen), ASTERISK_V) == 0) {
			readDestStatResult = FALSE;
			total.errDirs++;
			ConfirmErr("FindFirstFile(stat)", MakeAddr(confirmDst, dstPrefixLen));
		}	// 僼傽僀儖柤傪巜掕偟偰偺僐僺乕偱丄僐僺乕愭偑尒偮偐傜側偄応崌偼丄
			// 僄儞僩儕側偟偱偺惉岟偲傒側偡
		goto END;
	}
	do {
		if (IsParentOrSelfDirs(fdat.cFileName))
			continue;
		dstStatIdx[num++] = dstStat;
		len = FdatToFileStat(&fdat, dstStat, TRUE);
		dstStatBuf.AddUsedSize(len);

		// 師偺 stat 梡 buffer 偺僙僢僩
		dstStat = (FileStat *)(dstStatBuf.Buf() + dstStatBuf.UsedSize());
		dstStatIdxBuf.AddUsedSize(sizeof(FileStat *));

		if (dstStatBuf.RemainSize() <= maxStatSize && dstStatBuf.Grow(MIN_ATTR_BUF) == FALSE) {
			ConfirmErr("Can't alloc memory(dstStatBuf)", NULL, FALSE);
			break;
		}
		if (dstStatIdxBuf.RemainSize() <= sizeof(FileStat *) && dstStatIdxBuf.Grow(MIN_ATTRIDX_BUF) == FALSE) {
			ConfirmErr("Can't alloc memory(dstStatIdxBuf)", NULL, FALSE);
			break;
		}
	}
	while (!isAbort && FindNextFileV(fh, &fdat));

	if (!isAbort && ::GetLastError() != ERROR_NO_MORE_FILES) {
		total.errFiles++;
		readDestStatResult = FALSE;
		ConfirmErr("FindNextFile(stat)", MakeAddr(confirmDst, dstPrefixLen));
	}
	::FindClose(fh);

END:
	if (readDestStatResult)
		readDestStatResult = MakeHashTable();

	if (!isSameDrv) {
		cv.Lock();
		cv.Notify();
	}
	readDestStatQueue = FALSE;
	return	readDestStatResult;
}

BOOL FastCopy::MakeHashTable(void)
{
	int		num = dstStatIdxBuf.UsedSize() / sizeof(FileStat *);
	int		require_size = hash.RequireSize(num), grow_size;

	if ((grow_size = require_size - dstStatIdxBuf.RemainSize()) > 0 && dstStatIdxBuf.Grow(ALIGN_SIZE(grow_size, MIN_ATTRIDX_BUF)) == FALSE) {
		ConfirmErr("Can't alloc memory(dstStatIdxBuf2)", NULL, FALSE);
		return	FALSE;
	}

	return	hash.Init((FileStat **)dstStatIdxBuf.Buf(), num, dstStatIdxBuf.Buf() + dstStatIdxBuf.UsedSize());
}

int StatHash::HashNum(int data_num)
{
	return	data_num | 1;
}

BOOL StatHash::Init(FileStat **data, int data_num, void *tbl_buf)
{
	hashNum = HashNum(data_num);
	hashTbl = (FileStat **)tbl_buf;
	memset(hashTbl, 0, hashNum * sizeof(FileStat *));

	for (int i=0; i < data_num; i++) {
		for (FileStat **stat = hashTbl+(data[i]->hashVal % hashNum); *stat; stat = &(*stat)->next)
			;
		*stat = data[i];
	}
	return	TRUE;
}

FileStat *StatHash::Search(void *upperName, DWORD hash_val)
{
	for (FileStat *target = hashTbl[hash_val % hashNum]; target; target = target->next) {
		if (target->hashVal == hash_val && strcmpV(target->upperName, upperName) == 0)
			return	target;
	}

	return	NULL;
}

/*=========================================================================
  娭  悢 丗 DeleteThread
  奣  梫 丗 DELETE_MODE 張棟
  愢  柧 丗 
  拲  堄 丗 
=========================================================================*/
unsigned WINAPI FastCopy::DeleteThread(void *fastCopyObj)
{
	return	((FastCopy *)fastCopyObj)->DeleteThreadCore();
}

BOOL FastCopy::DeleteThreadCore(void)
{
	if ((info.flags & PRE_SEARCH) && info.mode == DELETE_MODE)
		PreSearch();

	for (int i=0; i < srcArray.Num() && !isAbort; i++) {
		if (InitDeletePath(i))
			DeleteProc(dst, dstBaseLen);
	}
	::PostMessage(info.notifyWnd->hWnd, info.uNotifyMsg, END_NOTIFY, 0);
	return	TRUE;
}

/*
	嶍彍張棟
*/
BOOL FastCopy::DeleteProc(void *path, int dir_len)
{
	HANDLE		hDir;
	BOOL		ret = TRUE;
	FileStat	stat;
	WIN32_FIND_DATAW fdat;

	if ((hDir = FindFirstFileV(path, &fdat)) == INVALID_HANDLE_VALUE) {
		total.errDirs++;
		return	ConfirmErr("FindFirstFile(del)", MakeAddr(path, dstPrefixLen)), FALSE;
	}

	do {
		if (IsParentOrSelfDirs(fdat.cFileName))
			continue;

		// 嶍彍巜掕偟偨僨傿儗僋僩儕帺懱乮儖乕僩乯偱側偔偐偮丄僼傿儖僞乕彍奜懳徾
		if (isFilter && (dstBaseLen != dir_len || isMetaSrc) && !FilterCheck(path, fdat.cFileName, fdat.dwFileAttributes)) {
			total.filterSkips++;
			continue;
		}

		stat.nFileSizeLow		= fdat.nFileSizeLow;
		stat.nFileSizeHigh		= fdat.nFileSizeHigh;
		stat.dwFileAttributes	= fdat.dwFileAttributes;

		if (stat.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
			ret = DeleteDirProc(path, dir_len, fdat.cFileName, &stat);
		else
			ret = DeleteFileProc(path, dir_len, fdat.cFileName, &stat);
	}
	while (!isAbort && FindNextFileV(hDir, &fdat));

	if (!isAbort && ret && ::GetLastError() != ERROR_NO_MORE_FILES) {
		ret = FALSE;
		ConfirmErr("FindNextFile(del)", MakeAddr(path, dstPrefixLen));
	}

	::FindClose(hDir);

	return	ret && !isAbort;
}

BOOL FastCopy::DeleteDirProc(void *path, int dir_len, void *fname, FileStat *stat)
{
	int		new_dir_len = dir_len + sprintfV(MakeAddr(path, dir_len), FMT_CAT_ASTER_V, fname) -1;
	BOOL	ret;
	int		cur_skips = total.filterSkips;

	if ((ret = DeleteProc(path, new_dir_len)), isAbort)
		return	ret;

	if (isFilter && (cur_skips != total.filterSkips || regExp[INC_EXP][FILE_EXP].IsRegistered()))
		return	ret;

	SetChar(path, new_dir_len - 1, 0);

	if (info.flags & LISTING_ONLY) {
		PutList(MakeAddr(path, dstPrefixLen), PL_DIRECTORY|PL_DELETE);
	}
	else {
		if (stat->dwFileAttributes & FILE_ATTRIBUTE_READONLY)
			SetFileAttributesV(path, stat->dwFileAttributes & ~FILE_ATTRIBUTE_READONLY);

		if ((ret = RemoveDirectoryV(path)) == FALSE) {
			total.errDirs++;
			return	ConfirmErr("RemoveDirectory", MakeAddr(path, dstPrefixLen)), FALSE;
		}
	}

	total.deleteDirs++;
	return	ret;
}

BOOL FastCopy::DeleteFileProc(void *path, int dir_len, void *fname, FileStat *stat)
{
	strcpyV(MakeAddr(path, dir_len), fname);

	if (info.flags & LISTING_ONLY) {
		PutList(MakeAddr(path, dstPrefixLen), PL_DELETE);
	}
	else {
		if (stat->dwFileAttributes & FILE_ATTRIBUTE_READONLY)
			SetFileAttributesV(path, FILE_ATTRIBUTE_NORMAL);

		if (DeleteFileV(path) == FALSE) {
			total.errFiles++;
			return	ConfirmErr("DeleteFile", MakeAddr(path, dstPrefixLen)), FALSE;
		}
	}

	total.deleteFiles++;
	total.deleteTrans += stat->FileSize();
	return	TRUE;
}


/*=========================================================================
  娭  悢 丗 WriteThread
  奣  梫 丗 Write 張棟
  愢  柧 丗 
  拲  堄 丗 
=========================================================================*/
unsigned WINAPI FastCopy::WriteThread(void *fastCopyObj)
{
	return	((FastCopy *)fastCopyObj)->WriteThreadCore();
}

BOOL FastCopy::WriteThreadCore(void)
{
	BOOL	ret = WriteProc(dstBaseLen);

	if (info.mode == MOVE_MODE && !isAbort && errBuf.UsedSize() == 0 && total.errFiles == 0 && total.errDirs == 0)
		DeleteThreadCore();	// 僄儔乕偑側偄側傜丄僜乕僗偺嶍彍
	else
		::PostMessage(info.notifyWnd->hWnd, info.uNotifyMsg, END_NOTIFY, 0);

	return	ret;
}

BOOL FastCopy::WriteProc(int dir_len)
{
	BOOL		ret = TRUE;
	int			new_dir_len;
	HANDLE		fh;
	FileStat	sv_stat;
	DWORD		stream_base_len;

	while (!isAbort) {
		if ((ret = RecvRequest()) == FALSE || writeReq->command == REQ_EOF) {
			break;
		}
		if (writeReq->command == WRITE_FILE) {
#ifdef ACL_TEST
			if (writeReq->stat.dwFileAttributes == 0) {
				strcpyV(MakeAddr(dst, stream_base_len), writeReq->stat.cFileName);
				ConfirmErr("Stream", writeReq->stat.cFileName);
			}
			else
#endif
			{
				if (writeReq->stat.renameCount == 0)
					strcpyV(MakeAddr(dst, dir_len), writeReq->stat.cFileName);
				else
					MakeRenameName(MakeAddr(dst, dir_len), writeReq->stat.renameCount, writeReq->stat.cFileName);
				stream_base_len = strlenV(MakeAddr(dst, dir_len)) + dir_len;
			}

			if (mkdirQueueBuf.UsedSize())
				ExecDirQueue();

			if (info.flags & LISTING_ONLY) {
				PutList(MakeAddr(dst, dstPrefixLen), PL_NORMAL);
				total.writeFiles++;
				total.writeTrans += writeReq->stat.FileSize();
			}
			else if ((ret = WriteFileProc()), isAbort)
				break;
		}
		else if (writeReq->command == MKDIR || writeReq->command == INTODIR) {
			memcpy(&sv_stat, &writeReq->stat, offsetof(FileStat, cFileName));

			if (writeReq->stat.renameCount == 0)
				new_dir_len = dir_len + sprintfV(MakeAddr(dst, dir_len), FMT_STR_V, writeReq->stat.cFileName);
			else
				new_dir_len = dir_len + MakeRenameName(MakeAddr(dst, dir_len), writeReq->stat.renameCount, writeReq->stat.cFileName);

			if (writeReq->command == MKDIR) {
				if (info.flags & SKIP_EMPTYDIR) {
					if (mkdirQueueBuf.RemainSize() < sizeof(int) && mkdirQueueBuf.Grow(MIN_MKDIRQUEUE_BUF) == FALSE) {
						ConfirmErr("Can't alloc memory(mkdirQueueBuf)", NULL, FALSE);
						break;
					}
					*(int *)(mkdirQueueBuf.Buf() + mkdirQueueBuf.UsedSize()) = new_dir_len;
					mkdirQueueBuf.AddUsedSize(sizeof(int));
				}
				else {
					if (info.flags & LISTING_ONLY)
						PutList(MakeAddr(dst, dstPrefixLen), PL_DIRECTORY);
					else
						CreateDirectoryV(dst, NULL);
					total.writeDirs++;
				}
			}
			strcpyV(MakeAddr(dst, new_dir_len++), BACK_SLASH_V);

			if ((ret = WriteProc(new_dir_len)), isAbort)	// 嵞婣
				break;

			if (mkdirQueueBuf.UsedSize()) {
				mkdirQueueBuf.AddUsedSize(-(int)sizeof(int));
			}
			else {
				// 僞僀儉僗僞儞僾/懏惈偺僙僢僩
				SetChar(dst, --new_dir_len, 0);	// 枛旜偺 '\\' 傪庢傞
				if ((info.flags & LISTING_ONLY) == 0) {
					if (sv_stat.dwFileAttributes & (FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_SYSTEM))
						SetFileAttributesV(dst, sv_stat.dwFileAttributes);
					if (IS_WINNT_V && (fh = CreateFileV(dst, GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0)) != INVALID_HANDLE_VALUE)
					{
						::SetFileTime(fh, &sv_stat.ftCreationTime, &sv_stat.ftLastAccessTime, &sv_stat.ftLastWriteTime);
						::CloseHandle(fh);
					}
				}
			}
		}
		else if (writeReq->command == DELETE_FILES) {
			if (writeReq->stat.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
				ret = DeleteDirProc(dst, dir_len, writeReq->stat.cFileName, &writeReq->stat);
			else
				ret = DeleteFileProc(dst, dir_len, writeReq->stat.cFileName, &writeReq->stat);
		}
		else if (writeReq->command == RETURN_PARENT) {
			break;
		}
		else if (writeReq->command < WRITE_FILE && writeReq->command > REQ_EOF) {
			ret = FALSE;
			ConfirmErr("Illegal Request (internal error)", NULL, FALSE);
			break;
		}
	}
	return	ret && !isAbort;
}

BOOL FastCopy::ExecDirQueue(void)
{
	for (int offset=0; offset < mkdirQueueBuf.UsedSize(); offset += sizeof(int)) {
		int dir_len = *(int *)(mkdirQueueBuf.Buf() + offset);
		SetChar(dst, dir_len, 0);
		if (info.flags & LISTING_ONLY)
			PutList(MakeAddr(dst, dstPrefixLen), PL_DIRECTORY);
		else
			CreateDirectoryV(dst, NULL);
		SetChar(dst, dir_len, '\\');
		total.writeDirs++;
	}
	mkdirQueueBuf.SetUsedSize(0);
	return	TRUE;
}


BOOL FastCopy::WriteFileProc(void)
{
	HANDLE		fh, fh2;
	BOOL		ret = TRUE;
	_int64		file_size = writeReq->stat.FileSize();
	_int64		remain = file_size;
	DWORD		trans_size;
	FileStat	*stat = &writeReq->stat, sv_stat;
	BOOL		isNonBuf = dstFsType != FSTYPE_NETWORK && (file_size >= nbMinSize || (file_size % dstSectorSize) == 0) && (info.flags & USE_OSCACHE_WRITE) == 0 ? TRUE : FALSE;
	BOOL		isReOpen = isNonBuf && (file_size % dstSectorSize) ? TRUE : FALSE;

	if (autoSlow) {
		Sleep(autoSlow);
	}

#ifdef ACL_TEST
	if ((fh = CreateFileV(dst, GENERIC_WRITE|WRITE_OWNER|WRITE_DAC, FILE_SHARE_WRITE, 0, CREATE_ALWAYS, (isNonBuf ? FILE_FLAG_NO_BUFFERING : 0)|FILE_FLAG_BACKUP_SEMANTICS, 0)) == INVALID_HANDLE_VALUE) {
		SetFileAttributesV(dst, FILE_ATTRIBUTE_NORMAL);
		fh = CreateFileV(dst, GENERIC_WRITE|WRITE_OWNER|WRITE_DAC, FILE_SHARE_WRITE, 0, CREATE_ALWAYS, (isNonBuf ? FILE_FLAG_NO_BUFFERING : 0)|FILE_FLAG_BACKUP_SEMANTICS, 0);
	}
#else
	if ((fh = CreateFileV(dst, GENERIC_WRITE                     , FILE_SHARE_WRITE, 0, CREATE_ALWAYS, (isNonBuf ? FILE_FLAG_NO_BUFFERING : 0)                            , 0)) == INVALID_HANDLE_VALUE) {
		SetFileAttributesV(dst, FILE_ATTRIBUTE_NORMAL);
		fh = CreateFileV(dst, GENERIC_WRITE                      , FILE_SHARE_WRITE, 0, CREATE_ALWAYS, (isNonBuf ? FILE_FLAG_NO_BUFFERING : 0)                           , 0);
	}
#endif

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美精品一卡两卡| 在线观看日韩高清av| **性色生活片久久毛片| 在线不卡免费欧美| 成人av在线网站| 久久av资源网| 亚洲一区二区三区视频在线播放| 国产亚洲综合在线| 日韩久久久久久| 欧美日产在线观看| 91热门视频在线观看| 丰满少妇久久久久久久| 另类欧美日韩国产在线| 亚洲一区二区三区四区中文字幕 | 91蜜桃传媒精品久久久一区二区| 另类人妖一区二区av| 亚洲h在线观看| 亚洲伊人色欲综合网| 国产精品午夜在线| 久久久精品天堂| 日韩欧美在线影院| 欧美剧情电影在线观看完整版免费励志电影| 99久久精品国产一区二区三区 | 日本vs亚洲vs韩国一区三区二区| 成人免费在线视频| 国产无人区一区二区三区| 精品国产在天天线2019| 91精品国产一区二区三区蜜臀| 91久久精品网| 91国偷自产一区二区三区成为亚洲经典| 波多野结衣的一区二区三区| 国产福利精品导航| 福利91精品一区二区三区| 国产乱色国产精品免费视频| 久草中文综合在线| 美腿丝袜亚洲色图| 免费人成在线不卡| 麻豆精品一区二区av白丝在线| 免费高清成人在线| 裸体歌舞表演一区二区| 精品一区二区三区在线播放视频| 免费高清在线一区| 国产在线精品一区二区夜色 | 亚洲宅男天堂在线观看无病毒| 亚洲欧美日韩在线| 亚洲一区二区三区在线| 午夜影院久久久| 日韩va欧美va亚洲va久久| 日日夜夜免费精品| 国产真实乱偷精品视频免| 国产麻豆精品95视频| 成人h动漫精品| 91麻豆自制传媒国产之光| 在线观看亚洲精品| 91精品啪在线观看国产60岁| 精品国产乱码久久久久久久久| 国产亚洲欧美日韩日本| 国产精品国产三级国产有无不卡| 亚洲免费在线视频一区 二区| 亚洲图片欧美综合| 久久99热这里只有精品| 丁香亚洲综合激情啪啪综合| 97精品电影院| 欧美一区二区三区色| 久久一区二区三区四区| 中文字幕一区二区三区在线播放| 一区二区三区四区视频精品免费 | 欧美日韩一区二区不卡| 欧美一区二区三区影视| 久久久久久9999| 亚洲人成伊人成综合网小说| 婷婷久久综合九色综合伊人色| 久久 天天综合| 91免费视频观看| 日韩欧美一区二区不卡| 国产精品无人区| 亚洲mv在线观看| 国产jizzjizz一区二区| 欧美日韩精品系列| 国产亚洲一区二区三区四区| 亚洲丰满少妇videoshd| 国产成人午夜视频| 欧美精品亚洲一区二区在线播放| 久久久久久一级片| 亚洲国产精品自拍| 国产成人免费视频一区| 欧美日韩美少妇 | 免费在线看一区| 91麻豆免费看片| 久久亚洲精精品中文字幕早川悠里| 一区二区在线免费观看| 国内精品在线播放| 欧美天天综合网| 国产欧美精品区一区二区三区| 婷婷久久综合九色综合伊人色| 9色porny自拍视频一区二区| 日韩欧美一级片| 亚洲va天堂va国产va久| a4yy欧美一区二区三区| 欧美精品一区二区三区蜜桃 | 亚洲免费观看高清完整版在线| 狠狠色丁香久久婷婷综| 欧美四级电影网| 中文字幕中文在线不卡住| 精品一区二区三区日韩| 欧美日本一区二区| 亚洲男人电影天堂| youjizz国产精品| 久久夜色精品一区| 美女网站视频久久| 在线综合视频播放| 亚洲国产欧美日韩另类综合| 色综合久久久久综合99| 欧美国产精品中文字幕| 国产自产高清不卡| 欧美mv日韩mv| 久久超碰97中文字幕| 777久久久精品| 三级不卡在线观看| 欧美日韩精品是欧美日韩精品| 一区二区三区四区蜜桃| 色婷婷激情久久| 亚洲美女免费视频| 97精品视频在线观看自产线路二| 国产精品麻豆欧美日韩ww| 国产精品456| 国产午夜亚洲精品午夜鲁丝片 | 91丝袜美腿高跟国产极品老师| 国产精品天干天干在线综合| 国产成人一级电影| 亚洲国产电影在线观看| 国产成人aaa| 国产欧美久久久精品影院| 国产不卡高清在线观看视频| 亚洲国产成人私人影院tom| 国产一区啦啦啦在线观看| 精品久久久久久久久久久久久久久 | 欧美亚洲一区三区| 亚洲在线观看免费视频| 欧美性大战久久久| 丝袜亚洲另类丝袜在线| 日韩欧美国产精品一区| 久久成人久久爱| 国产欧美一区二区三区鸳鸯浴| 国产69精品久久777的优势| 中文字幕色av一区二区三区| 色素色在线综合| 午夜精品久久久久影视| 欧美一区二区在线免费播放 | 欧美伦理影视网| 青青草伊人久久| 久久综合久久综合九色| 国产成人av一区| 一区二区三区自拍| 欧美日韩成人激情| 久久精品免费观看| 国产日韩欧美精品在线| 一本大道久久a久久综合婷婷| 亚洲国产精品影院| 精品日韩在线观看| 成人精品免费看| 亚洲午夜久久久| 精品美女在线播放| 972aa.com艺术欧美| 日韩精品一二区| 国产午夜精品一区二区| 在线精品视频免费播放| 久久国产精品色| 亚洲啪啪综合av一区二区三区| 777久久久精品| 成人黄色免费短视频| 亚洲成av人综合在线观看| 精品国内片67194| 91理论电影在线观看| 日本va欧美va瓶| 日韩美女啊v在线免费观看| 91精品国产美女浴室洗澡无遮挡| 国产老肥熟一区二区三区| 亚洲欧美日韩中文播放| 精品国产麻豆免费人成网站| 日本伦理一区二区| 精品一区二区三区在线观看| 伊人婷婷欧美激情| 国产三级一区二区| 欧美美女喷水视频| 成人av在线播放网站| 久久精品免费看| 亚洲一区二区高清| 久久久九九九九| 欧美精品欧美精品系列| 91丨九色丨蝌蚪丨老版| 紧缚捆绑精品一区二区| 亚洲国产精品欧美一二99| 中日韩免费视频中文字幕| 日韩欧美成人一区| 欧美视频中文一区二区三区在线观看 | 亚洲人成7777| 久久麻豆一区二区| 777久久久精品| 91久久奴性调教|