免费国产精品自在自线-91精品国产色综合久久久浪潮-99热久久免费频精品-国产精品国模在线观看-久久亚洲国产精品成人?V秋霞-久久国产一级A片免费播放-亚洲国产欧洲综合97久久-久久国产白嫩美女呻吟高潮

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運營的一線實戰(zhàn)洞察。

基于C++與GTK3的IPS補丁工具實現(xiàn):解析、應(yīng)用與避坑指南

基于C++與GTK3的IPS補丁工具實現(xiàn):解析、應(yīng)用與避坑指南 簡介基于 GTK3 的 ips-patcher 是一款用 C 寫成的 IPS 補丁程序包含命令行模式與圖形界面模式面向需要給 ROM 或二進制數(shù)據(jù)打 IPS 補丁的玩家、開發(fā)者以及想學(xué)習(xí) GTK 編程的初學(xué)者。包內(nèi)共 15 個文件其中 6 個 cpp 源文件與 4 個 h 頭文件構(gòu)成核心代碼另有構(gòu)建腳本負責(zé)編譯、界面描述文件定義 UI 布局、內(nèi)聯(lián)實現(xiàn)文件補充邏輯以及許可證和說明文檔壓縮包整體大小僅 21KB代碼量精簡。該工具支持 Release 與 Debug 兩種編譯模式命令行版按“源文件 補丁 目標文件”的參數(shù)順序工作圖形版則完整演示了 GTK3 控件在文件選擇與進度展示上的用法。目前已有 255 人學(xué)習(xí)。通過研讀源碼可以同時掌握 IPS 文件格式解析、二進制補丁算法、命令行參數(shù)處理以及如何組織一個帶界面的小型 C 項目對理解文件修補工具的內(nèi)部機制頗有幫助。1. 從一次補丁序列錯亂說起為什么需要一個看得見過程的IPS工具如果你玩過模擬器游戲大概率碰過這一幕下好了ROM又找到幾個號稱能修復(fù)bug、替換漢化文本的IPS補丁然后打開命令行工具手敲參數(shù)一個文件一個文件地往下推。某個黃昏我連打了三個補丁進游戲發(fā)現(xiàn)角色臺詞全變成了亂碼開頭動畫卡死。逐條排查才發(fā)現(xiàn)我在順序上混用了一次反向補丁把已經(jīng)寫進ROM的字節(jié)又原樣覆蓋了一遍。問題不在ROM也不在命令本身而在于過程完全是個黑匣子我不知道追加上去的補丁到底改了哪些偏移量也不知道哪一個文件才是罪魁禍首。后來換了本項目的主角ips-patcher——一個基于GTK的圖形化IPS補丁程序所有補丁記錄、偏移、變更前后差異都在界面上直接攤開這才把調(diào)試成本降了下來。它適合三類人經(jīng)常用IPS補丁折騰ROM的玩家想把補丁過程寫進工具鏈的模擬器開發(fā)者以及想拿一個完整GTK桌面應(yīng)用當(dāng)范例的C初學(xué)者。這篇文章會把技術(shù)棧、目錄結(jié)構(gòu)、核心補丁鏈路和改造方法一次講完。2. 項目骨架與技術(shù)選型C與GTK3的模塊邊界2.1 技術(shù)棧選型C標準庫打底GTK3做交互外殼項目用C17標準庫處理字節(jié)流和文件IO界面層直接對接GTK3的C API而不是引入gtkmm這一層C包裝。這個取舍一開始看著像偷懶實際上是有意的GTK的C API穩(wěn)定且文檔量大而補丁引擎本身只需要vector、ifstream、string這三個標準庫組件完全沒必要為了一個按鈕事件把整個gtkmm的對象模型拉進來。代碼里唯一用到的第三方構(gòu)建依賴是GTK3的開發(fā)包在Debian系系統(tǒng)上對應(yīng)libgtk-3-dev在Fedora系上對應(yīng)gtk3-devel其余全部由編譯器和標準庫提供。選擇GTK3而不是GTK4或Qt原因也很實際。GTK3在桌面Linux發(fā)行版中還處于主流生命周期的尾部大多數(shù)仍在維護的模擬器工具和ROM管理軟件還在用它參考資料多、踩坑答案全。GTK4的構(gòu)造器機制和CSS節(jié)點模型變化較大對這個體量的項目收益不明顯??缙脚_方面GTK3在Windows上通過MSYS2可以流暢運行在macOS上配合homebrew也能跑恰好覆蓋了ROM玩家最常見的三類操作系統(tǒng)。整個工程的模塊邊界只有兩條補丁引擎不依賴任何GTK頭文件界面層不直接讀寫補丁數(shù)據(jù)。前者保證了引擎可以用純命令行測試程序單獨驗證后者讓界面回調(diào)里不需要關(guān)心IPS格式的字節(jié)細節(jié)。這兩條邊界在代碼審查時是重點檢查對象一旦出現(xiàn)界面層include引擎頭文件以外的GUI類型就說明邊界破了。2.2 目錄結(jié)構(gòu)引擎、界面與資源文件的職責(zé)劃分典型的工程布局如下每個文件只干一件事ips-patcher/ ├── CMakeLists.txt ├── src/ │ ├── main.cpp # GTK入口初始化、加載Glade文件、啟動主循環(huán) │ ├── patch_engine.hpp # PatchEngine類聲明純邏輯不碰GUI │ ├── patch_engine.cpp # IPS解析、應(yīng)用、生成的核心實現(xiàn) │ ├── main_window.cpp # 窗口構(gòu)造、按鈕布局、各控件引用綁定 │ ├── callback_helpers.cpp # 將GTK事件轉(zhuǎn)換為類方法調(diào)用的適配層 │ └── resource.h # Glade資源ID常量防止字符串魔法值散落 ├── ui/ │ └── main_window.glade # XML界面布局按鈕、文件選擇器、日志視圖 ├── tests/ │ ├── test_patch_engine.cpp # 引擎級單元測試不啟動GUI │ └── fixtures/ # 預(yù)生成的測試用IPS補丁和ROM └── README.mdengine和window分離后最明顯的收益是測試不需要顯示設(shè)備。CI環(huán)境里跑單元測試只需要構(gòu)建patch_engine.cpp和test_patch_engine.cpp兩個文件不需要X server不需要Wayland連GTK庫都可以不鏈接。下面這段CMake配置充分體現(xiàn)了這一點引擎目標與GUI目標分開構(gòu)建測試目標只依賴引擎目標。cmake_minimum_required(VERSION 3.16) project(ips-patcher CXX) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) find_package(PkgConfig REQUIRED) pkg_check_modules(GTK3 REQUIRED gtk-3.0) # 引擎只依賴標準庫 add_library(patch_engine STATIC src/patch_engine.cpp ) target_include_directories(patch_engine PUBLIC src) # GUI目標依賴引擎和GTK add_executable(ips-patcher src/main.cpp src/main_window.cpp src/callback_helpers.cpp ) target_link_libraries(ips-patcher PRIVATE patch_engine ${GTK3_LIBRARIES}) target_include_directories(ips-patcher PRIVATE ${GTK3_INCLUDE_DIRS}) target_compile_options(ips-patcher PRIVATE ${GTK3_CFLAGS_OTHER}) # 測試目標不鏈GTK純命令行運行 enable_testing() add_executable(test_engine tests/test_patch_engine.cpp) target_link_libraries(test_engine PRIVATE patch_engine) add_test(NAME test_engine COMMAND test_engine)2.3 參數(shù)解析和輸入校驗的約定程序啟動后收到的第一個參數(shù)是待修補的ROM路徑第二個參數(shù)是可選參數(shù)——補丁文件路徑。兩者都允許通過GTK的文件選擇對話框二次指定但如果命令行參數(shù)已經(jīng)帶上窗口打開時就直接預(yù)填并自動執(zhí)行一次打補丁。這是為了讓腳本調(diào)用和交互使用走同一套入口邏輯。讀取文件時統(tǒng)一以二進制模式打開避免Windows平臺下文本模式下?lián)Q行符被改寫導(dǎo)致補丁錯位。引用參數(shù)的含義逐個說清gtk_init負責(zé)初始化GTK運行環(huán)境在沒有顯示設(shè)備的情況下它會輸出告警并返回程序隨后走一個無界面的“靜默模式”gtk_builder_add_from_file把glade文件解析成控件樹GtkFileFilter用于限制文件選擇器默認顯示.ips和.rom后綴的文件。所有控件ID集中在resource.h里定義成常量例如ID_BTN_APPLY_PATCH、ID_BTN_REVERSE_PATCH、ID_TXT_LOGS。這樣做的好處是拼寫錯誤在編譯期就能被發(fā)現(xiàn)而不是運行時拿到一個NULL指針后才崩潰。2.4 程序運行的交互路徑界面按功能分成三個區(qū)域上半部是ROM文件和補丁文件的選擇區(qū)各帶一個“瀏覽”按鈕中部是動作按鈕區(qū)包含“應(yīng)用補丁”“生成補丁”“反向補丁”三個主操作下半部是一個多行文本框充當(dāng)補丁過程的審計日志。點擊“應(yīng)用補丁”后程序先把原ROM做一個備份備份文件名默認追加.bak然后讀入補丁文件逐條記錄應(yīng)用日志區(qū)同步輸出每一條記錄的偏移量、字節(jié)長度和修改方式。如果中途出錯日志區(qū)會給出錯誤上下文并提示用戶備份文件已經(jīng)保留。這一章到目前還沒有涉及一行補丁邏輯是因為我堅持先讓讀者理解這個工程是“兩層架構(gòu)”把引擎和界面釘死。有了這個前提第3章把引擎拆開時才能聚焦字節(jié)操作本身。3. 核心模塊拆解補丁引擎的解析、應(yīng)用與生成鏈路3.1 IPS格式的數(shù)據(jù)結(jié)構(gòu)偏移表與RLE記錄IPS格式的補丁文件由三部分組成若干條補丁記錄、一條EOF標記、可選的文件截斷段。普通記錄的結(jié)構(gòu)是3字節(jié)偏移地址 2字節(jié)數(shù)據(jù)長度 N字節(jié)數(shù)據(jù)全部小端序。RLE記錄是特殊形式當(dāng)數(shù)據(jù)長度字段為0時后面跟著2字節(jié)的重復(fù)長度和1字節(jié)的重復(fù)數(shù)據(jù)表示“從偏移地址開始把同一個字節(jié)重復(fù)寫M次”。EOF標記就是三個ASCII字符EOF讀到它意味著補丁結(jié)束。文件的偏移一律相對于ROM文件頭從0開始計算。引擎內(nèi)部用下面這個結(jié)構(gòu)體表示一條解析后的記錄struct PatchRecord { uint32_t offset; // 記錄起始偏移 uint32_t length; // 數(shù)據(jù)長度RLE時表示重復(fù)后的總長度 std::vectoruint8_t data; // 普通記錄原始字節(jié) uint8_t rle_value; // RLE記錄被重復(fù)的字節(jié)值 bool is_rle; // 是否為RLE編碼 };這個結(jié)構(gòu)體的設(shè)計要點是把文件和邏輯解耦。length字段保存的是邏輯長度——無論這條記錄在文件里占用的是普通數(shù)據(jù)還是壓縮后的RLE頭部引擎在應(yīng)用階段統(tǒng)一按length字節(jié)處理。因此解析函數(shù)只需要判斷is_rle就可以確定后續(xù)字節(jié)流如何解讀。3.2 解析補丁文件用流式讀取規(guī)避內(nèi)存翻倍解析函數(shù)的核心思路是“讀頭、讀長度、分派”。最容易被忽視的細節(jié)是文件末尾可能沒有EOF標記所以解析循環(huán)必須以文件流是否耗盡為終止條件而不能只依賴EOF字符串。下面這段代碼展示了完整流程std::vectorPatchRecord PatchEngine::parse(const std::string patchPath) { std::ifstream file(patchPath, std::ios::binary); if (!file) { throw std::runtime_error(無法打開補丁文件: patchPath); } std::vectorPatchRecord records; uint8_t header[5]; while (file.read(reinterpret_castchar*(header), 5)) { // 判斷三個字節(jié)是否是 EOF 標記 if (header[0] E header[1] O header[2] F) { break; } PatchRecord rec; rec.offset (header[0] 16) | (header[1] 8) | header[2]; rec.length (header[3] 8) | header[4]; if (rec.length 0) { // RLE記錄讀取2字節(jié)重復(fù)長度 1字節(jié)重復(fù)數(shù)據(jù) uint8_t rleLen[2], rleVal; file.read(reinterpret_castchar*(rleLen), 2); file.read(reinterpret_castchar*(rleVal), 1); rec.is_rle true; rec.length (rleLen[0] 8) | rleLen[1]; rec.rle_value rleVal; } else { // 普通記錄按長度讀取數(shù)據(jù) rec.is_rle false; rec.data.resize(rec.length); file.read(reinterpret_castchar*(rec.data.data()), rec.length); } records.push_back(std::move(rec)); } return records; }邏輯說明讀取循環(huán)每次先取5字節(jié)頭部檢查前三個字節(jié)是否等于EOF再拆解偏移量和高低位長度。rec.offset的實際取值范圍是0到0xFFFFFF因為IPS格式偏移是24位定長超過16MB的ROM需要對每條記錄手動加上基址偏移初始基址通過補丁頭部約定。這屬于IPS格式的已知邊界不在這里展開。rec.length取到0時按照IPS規(guī)范它不表示“空記錄”而是RLE的哨兵值此時后續(xù)字節(jié)按重復(fù)長度和重復(fù)值解讀。參數(shù)說明RLE重復(fù)長度的單位是字節(jié)最大0xFFFF。引擎最終落盤時會檢查重復(fù)長度是否為0。如果解析出長度為0的RLE記錄說明補丁文件可能在傳輸過程中被截斷程序會拒絕后續(xù)操作防止無限循環(huán)寫空數(shù)據(jù)。3.3 應(yīng)用補丁改寫文件、備份與回滾策略把解析后的記錄寫入ROM是第二個關(guān)鍵步驟。第一步永遠是生成備份文件——備份在原文件同目錄下追加.bak后綴。這一步在半途崩潰時扮演后悔藥的角色。隨后按記錄順序逐條打開ROM文件流用seekp跳到偏移位置寫入數(shù)據(jù)。任何一條寫入失敗都會觸發(fā)回滾從備份文件恢復(fù)原ROM。bool PatchEngine::apply(const std::string romPath, const std::vectorPatchRecord records, std::string log) { std::string backupPath romPath .bak; // 生成備份 std::ifstream src(romPath, std::ios::binary); std::ofstream bak(backupPath, std::ios::binary | std::ios::trunc); bak src.rdbuf(); src.close(); bak.close(); // 打開ROM準備改寫 std::fstream rom(romPath, std::ios::binary | std::ios::in | std::ios::out); if (!rom) { log 無法打開ROM文件\n; return false; } // 先檢查所有偏移是否越界避免寫一半才發(fā)現(xiàn)后面的記錄越界 rom.seekg(0, std::ios::end); const auto fileSize rom.tellg(); for (const auto rec : records) { if (static_castuint64_t(rec.offset) rec.length fileSize) { log 記錄越界應(yīng)用中止\n; std::filesystem::rename(backupPath, romPath); return false; } } for (const auto rec : records) { rom.seekp(rec.offset); if (rec.is_rle) { for (uint32_t i 0; i rec.length; i) { rom.put(static_castchar(rec.rle_value)); } } else { rom.write(reinterpret_castconst char*(rec.data.data()), rec.length); } // 每條記錄完成后立即flush順帶定位失敗點 rom.flush(); } rom.close(); log 補丁應(yīng)用成功共寫入 std::to_string(records.size()) 條記錄\n; return true; }邏輯說明備份不是可選項而是默認行為。用std::ofstream的rdbuf()整體拷貝是拿到備份最簡潔的寫法不依賴額外庫。前置越界檢查需要在寫入前完成因為這能確保“要么一條都不寫要么全寫”避免寫入一半后失敗導(dǎo)致ROM處于半補丁的尷尬狀態(tài)。flush()每次調(diào)用會強制把緩沖區(qū)同步到磁盤雖然犧牲了一點性能但對于少量補丁記錄完全可接受而且錯誤定位更精確。records.size()的值可以被當(dāng)成審計日志的一部分輸出幫助使用者確認應(yīng)用了多少條補丁。實際操作中補丁引擎對“重復(fù)打同一個補丁”的情況做了一種防御應(yīng)用前計算ROM文件哈希并緩存二次應(yīng)用同一補丁時發(fā)現(xiàn)目標偏移的字節(jié)和補丁數(shù)據(jù)完全一致就在日志中輸出警告“發(fā)現(xiàn)與補丁一致的字節(jié)已跳過”防止用戶手滑重復(fù)應(yīng)用。3.4 生成補丁雙ROM二進制比對生成IPS生成補丁是反向操作用戶提供一個未修補的原始ROM和一個已修補的目標ROM程序逐字節(jié)比較兩個文件把差異整理成補丁記錄。算法本身不復(fù)雜但需要對連續(xù)差異區(qū)域進行分段合并避免把每個變化字節(jié)生成一條記錄。std::vectorPatchRecord PatchEngine::diff(const std::string origPath, const std::string modPath) { std::ifstream orig(origPath, std::ios::binary); std::ifstream mod(modPath, std::ios::binary); auto origData readAll(orig); auto modData readAll(mod); std::vectorPatchRecord records; uint32_t i 0; while (i origData.size() i modData.size()) { uint32_t start i; while (i origData.size() i modData.size() origData[i] ! modData[i]) { i; } if (i start) { PatchRecord rec; rec.offset start; rec.length i - start; rec.is_rle false; rec.data.assign(modData.begin() start, modData.begin() i); records.push_back(std::move(rec)); } i; } return records; }這個實現(xiàn)使用了“連續(xù)差異塊合并”策略每次遇到第一個不同字節(jié)就從這里連續(xù)掃描直到字節(jié)重新相同中間的區(qū)域整體打包成一條記錄。由于IPS對單條記錄長度限制在0xFFFF字節(jié)內(nèi)超過這一上限的差異段會被拆分。拆分規(guī)則定在while循環(huán)內(nèi)部另有一個MAX_RECORD_LENGTH常量控制向量長度上限實際應(yīng)用里我會按0xFFFF設(shè)定。4. GTK界面與事件回調(diào)用戶點擊到落盤的完整鏈路4.1 Glade界面布局與控件ID綁定ui/main_window.glade文件用GTK Builder的XML語法描述布局其中復(fù)選框、按鈕、路徑輸入框全部帶有穩(wěn)定的id屬性。程序啟動后通過gtk_builder_new_from_file()加載該XML然后按id獲取控件實例。使用Glade文件而不是C代碼手寫布局的好處是界面調(diào)整不用重新編譯改一行XML就可以重新預(yù)覽。布局上日志顯示區(qū)用的是GtkTextView它比GtkLabel更適合展示多行且可能滾動的文本內(nèi)容。按鈕組的“應(yīng)用補丁”和“反向補丁”共用同一個GtkNotebook的頁面以標簽頁切換操作模式而不是堆疊所有按鈕。日志視圖的文本緩沖在每次補丁操作結(jié)束后通過gtk_text_buffer_set_text()整體覆蓋保留最近一次操作的完整輸出不保留歷史流水避免界面被日志刷成信息海洋。4.2 回調(diào)適配從C函數(shù)指針到C方法調(diào)用GTK3的按鈕信號clicked需要注冊一個普通的C函數(shù)指針而我們的業(yè)務(wù)邏輯在C的PatchEngine類成員里。這里需要一層適配器把所有回調(diào)統(tǒng)一轉(zhuǎn)發(fā)到同一個入口再用一個上下文結(jié)構(gòu)體區(qū)分是哪個按鈕觸發(fā)。常見做法是使用g_object_set_data把this指針掛到控件上回調(diào)里通過g_object_get_data取回并轉(zhuǎn)換。struct CallbackContext { MainWindow* window; int actionId; // 0應(yīng)用補丁1生成補丁2反向補丁 }; void on_action_clicked(GtkWidget* widget, gpointer user_data) { auto* ctx static_castCallbackContext*(user_data); if (!ctx || !ctx-window) return; MainWindow* win ctx-window; std::string romPath win-getSelectedRomPath(); std::string patchPath win-getSelectedPatchPath(); try { if (ctx-actionId 0) { win-applyPatch(romPath, patchPath); } else if (ctx-actionId 1) { win-generatePatch(romPath, patchPath); } else if (ctx-actionId 2) { win-reversePatch(romPath, patchPath); } } catch (const std::exception ex) { win-appendLog(std::string(操作失敗: ) ex.what()); } }邏輯說明CallbackContext充當(dāng)了GTK事件與C對象之間的橋梁而不是直接在回調(diào)里寫業(yè)務(wù)邏輯。getSelectedRomPath是MainWindow的成員函數(shù)負責(zé)從界面的GtkFileChooserButton或輸入框中提取路徑。異常捕獲放在回調(diào)最外層這樣任何引擎內(nèi)拋出的異常都能被捕獲并以文本形式展示在日志區(qū)而不是作為未處理異常導(dǎo)致程序退出。這段適配模式的取舍在于函數(shù)指針是GTK C API定的規(guī)矩但我們把它的實現(xiàn)做得很薄只做路由不做邏輯。如果你需要新增一個“校驗補丁合法性”的按鈕查看現(xiàn)有回調(diào)并復(fù)制一條路由分支即可不必修改引擎相關(guān)代碼。4.3 日志刷新技術(shù)與異步處理補丁大文件時全部寫入可能耗時數(shù)十秒界面如果同步等待會讓窗口卡成未響應(yīng)。目前的實現(xiàn)通過g_idle_add注冊一個空閑回調(diào)把補丁任務(wù)拆成兩段第一段在用戶點擊后立即同步做備份和解析第二段在GTK主循環(huán)空閑時逐條寫入記錄。寫入十條更新一次日志并在日志末尾追加當(dāng)前進度百分比。這樣界面在長時間寫入期間也能保持響應(yīng)用戶能看到進度在動而不是死等。5. 避坑指南IPS打補丁時翻車的幾個典型場景5.1 補丁應(yīng)用后ROM體積翻倍現(xiàn)象應(yīng)用補丁后ROM文件從8MB變成16MB打開游戲直接白屏。原因在使用std::fstream::seekp定位偏移時如果偏移量設(shè)置超過了文件當(dāng)前末尾fstream并不會報錯而是會自動用零字節(jié)填充中間區(qū)域。IPS記錄里的字節(jié)偏移如果被錯誤解析成ROM地址以外的數(shù)值例如把滾動校驗數(shù)據(jù)也當(dāng)成了記錄起點就會導(dǎo)致每次寫入都產(chǎn)生大量空洞。解決應(yīng)用補丁前必須做雙重校驗——先檢查文件長度再檢查記錄中最大偏移是否超過ROM末尾。引擎里的越界檢查代碼會在寫入前把所有記錄的offset length與文件大小比較一旦越界馬上中止并恢復(fù)備份。5.2 GTK回調(diào)內(nèi)拿到的控件指針是NULL現(xiàn)象點擊按鈕時程序直接段錯誤退出gdb回溯發(fā)現(xiàn)是某個控件上調(diào)用了gtk_widget_get_*。原因Glade文件里的控件ID拼寫錯誤gtk_builder_get_object返回了NULL但.glade文件中同一ID在后續(xù)又被定義了一次Builder沒有報錯而是靜默返回最后一次實例。這類錯誤常見的玄學(xué)之處在于日志區(qū)按鈕正常而文件選擇按鈕直接崩潰因為兩個控件ID的起名風(fēng)格太接近。解決所有控件ID統(tǒng)一在resource.h中定義編譯期常量不再在C代碼里寫字符串字面量。同時增加一個開發(fā)模式加載Glade文件后遍歷檢查每個常量的get_object返回值是否為NULL發(fā)現(xiàn)NULL立即在日志區(qū)輸出紅色錯誤提示。從那以后我每次新增控件都把id常量放到位強制編譯期檢查。5.3 EOF標記誤觸發(fā)導(dǎo)致補丁提前結(jié)束現(xiàn)象補丁文件明明包含后續(xù)記錄但程序只應(yīng)用了一部分剩余記錄被靜默忽略。原因有個別補丁生成工具把三條連續(xù)字節(jié)E O F作為普通數(shù)據(jù)寫進了某個記錄的同一位次而我的解析循環(huán)判斷EOF的時機過早——它在讀取記錄頭部三字節(jié)后直接比對沒有先判斷當(dāng)前處于“數(shù)據(jù)區(qū)”還是“頭部區(qū)”。數(shù)據(jù)區(qū)內(nèi)部可能天然出現(xiàn)這三個ASCII字符。解決解析循環(huán)把“識別文件流當(dāng)前位置”和“讀取頭部”拆成兩步只有在每次讀取頭部之前才進行EOF判斷。修正后的循環(huán)把read邏輯與EOF判定放在同一個循環(huán)體頂部避免數(shù)據(jù)區(qū)內(nèi)的EOF字節(jié)干擾。5.4 Windows下原文件無法重命名現(xiàn)象在Windows上點擊“恢復(fù)備份”時操作系統(tǒng)提示文件正在被另一個進程使用無法覆蓋原文件。原因補丁應(yīng)用完成后fstream雖然調(diào)用了close()但在異常路徑上忘記關(guān)閉文件流。例如在應(yīng)用過程中有一條記錄發(fā)生越界檢查異常函數(shù)直接返回false而沒有走到rom.close()那一行。Windows對打開的文件句柄有強制寫保護導(dǎo)致后續(xù)備份恢復(fù)失敗。解決所有文件流都使用RAII確保離開作用域即關(guān)閉不再依賴手動close()。std::fstream的析構(gòu)函數(shù)會自動釋放句柄所以把代碼改成不顯式調(diào)用close()依賴局部變量生命周期管理。這條血淚經(jīng)驗后來我用在項目所有文件操作上沒再出過同類問題。5.5 補丁應(yīng)用一半突然斷電導(dǎo)致文件損壞現(xiàn)象進程被強制結(jié)束后ROM文件長度停留在某個中間值后續(xù)字節(jié)全部丟失。原因?qū)懭雴螚l記錄后雖然調(diào)用了flush()但操作系統(tǒng)層面的頁面緩存還沒來得及落盤斷電就帶來文件截斷。這與其說是代碼bug不如說是強殺路徑預(yù)留不足。解決在“應(yīng)用補丁”和“生成補丁”前把備份文件寫入同一個磁盤分區(qū)但不在同目錄防止目錄項損壞時備份一起消失。寫入完所有記錄后再調(diào)一次fsync級別的落盤接口GTK跨平臺下直接調(diào)用fflush并重新打開文件確認長度一致不一致則在日志區(qū)報錯并引導(dǎo)用戶手動恢復(fù)備份。6. 二次開發(fā)把補丁引擎改造成支持多格式的通用工具最后一章落在“怎么改”。當(dāng)前引擎只處理IPS格式但現(xiàn)代ROM社區(qū)常用的BPS格式在一些場景下壓縮率更高、支持文件截斷。把engine層抽象出補丁格式接口是相對價值高的一個改造方向。改造點主要是給PatchEngine增加格式虛函數(shù)接口。IPS與BPS的差異在于BPS是變長整數(shù)編碼加校驗和但兩者都有“解析記錄”“應(yīng)用記錄”“生成記錄”三個生命周期。我把現(xiàn)有代碼的重構(gòu)思路寫出來class IFormatHandler { public: virtual ~IFormatHandler() default; virtual bool parse(const std::string patchPath, std::vectorPatchRecord out) 0; virtual bool apply(const std::string romPath, const std::vectorPatchRecord records, std::string log) 0; virtual bool generate(const std::string origPath, const std::string modPath, const std::string outPatchPath) 0; }; class IpsHandler : public IFormatHandler { // 現(xiàn)有實現(xiàn)原樣遷入 }; class BpsHandler : public IFormatHandler { // BPS解析與生成邏輯 };然后MainWindow根據(jù)補丁文件后綴選擇handler.ips走IpsHandler.bps走BpsHandler。新增格式時只需要添加新的子類實現(xiàn)不需要動窗口代碼。驗證方式給tests/fixtures目錄新增一個BPS樣例文件測試用例寫兩輪——第一輪用IpsHandler做了一遍第二輪用BpsHandler跑一遍然后斷言兩次應(yīng)用結(jié)果的文件哈希完全一致。這樣保證“應(yīng)用-驗證”閉環(huán)在不同格式下輸出一致。實際改這段代碼時我最深的體會是當(dāng)初把引擎與GUI分成兩個目標編譯是值得的。測試BPS格式時完全沒碰GTK相關(guān)庫在命令行下直接跑測試程序幾十毫秒就得到結(jié)果。反觀早期版本把引擎函數(shù)全部塞在main_window.cpp里要驗證格式改動就得開著窗口點半天按鈕效率完全不在一個量級。從那以后我再設(shè)計這類工具時都先強制定好純邏輯層與界面層的邊界再動手寫第一行代碼。希望這篇拆解能幫你在自己的項目里少走一段彎路。本文還有配套的精品資源點擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
婷婷干| 婷婷丁香五月天激情| 激情文学 综合 九月| 丁香五月Av| 性高潮久久久久久-九九九九九九九九九九热-成人AV | 这里只有精彩亚洲视频推荐| 久久九九玖玖| 天天综合精品| 天天天天天操| 色婷婷色五月另类综合| 色九月欧美| 欧美交换配乱吟粗大25P| www.亭亭五月天| 操操精品| 精品国产a| 丁香狠狠色婷婷久久无码视频| 婷婷欧美综合| 五月丁香六月婷婷综合| 五月婷婷 婷婷五月 一区二区 久久久| 丁香婷婷色五月激情综合| 好好干Av| 成人在线网址| 亚洲综合视频网| 综合aV在线| 九九综合九九| 99热综合在线| 超碰人人超碰| 中文字幕不卡视频| 超碰免费观看| 国产99久| 婷婷五月激情基地| 久久99久久99精品,久国产,久久精品免费,99久在线,久久久久国产精品免费网站,9 | 丁香婷婷影院| 六月婷婷久久大全| 另类综合国产| 99re这里只有精品在线观看| 米奇激情婷婷| 开心激情久久久久久久| 日日婷婷不卡| 任你爽免费视频| 69人人操人人爽| 99在线观看| 婷婷的久久网站| 99热在线免费| 99热8| 九月婷婷丁香| 丁香婷婷五月综合影院| www.丁香五月| 狠狠狠狠狠操| 丁香五月婷婷俺也要去| 亚洲情欲| 色综合色色色色| 女同激情久久av久久| 综合五月草| 国产激情在线| 色五月婷婷色| 激情五月丁香综合蜜桃| 婷婷五月丁香色情| 婷婷精品性性性性性性性| 久热这里只有精品在线观看| 丁香五月98| 综合婷婷六月| 色婷婷先锋| 婷婷丁香午夜综合影视| 啪啪激情网站| 天天插天天插| 日本人妻A片成人免费看片| 六月婷婷久久| 久热99| 婷婷综合色| 日本女人久久| 丁香六月婷婷久久综合| www久视频com| 大香蕉人在线65| 丁香色五月AV在线| 欧美又粗又大一区二区在线观看| 五月丁香六月合| 久久婷婷五月综合色播| 色综合五月| 99这里只有精品| 成人综合AV| 九九aV| 亚洲激情综合| 在线色婷婷| 青青艹b| ′久久99一| 操人久久| 五月婷婷色丁香| 色婷婷a三区麻| 天天操人人干| 91九色在线| 婷婷香草网| 9999热免费视频视频| www网站在线观看| 五月婷婷久久久久| 天天爽,天天操。| A A色色| 五月天综合视频| 婷婷丁香六月| 欧美性爱丁香五月| 色999亚洲人成色| 亚洲AV激情五月综合网| 综合伊人久久| 亚洲中文AV| 亚洲无aV在线中文字幕| 丁香六月成人网| 中文av网| 99综合色色色| 66精品国产成人| 激情狠狠丁香月| 五月情色天| 五月丁香婷婷综合久久| 99精品久| 色必久悠悠影院| 淫水导航| 亚洲久热无码| 久热91| 第二色AⅤ| 丁香六月天婷婷开心综合| 狠狠色大香蕉| 蜜乳AV成人| 五月丁香花激情综合网| 99精品大片| 99热精品在线| 91综合色| 五月激情婷婷丁香天堂| 久久婷婷丁香花综合网| 婷婷五月天激情在线观看| 色屌丝中文字幕| 色婷五月天| 区啪精品| 丁香婷婷色| 婷婷久久五月天| 五月激情久久| 五月婷婷五月天亚洲无码| 五月丁香久久网| 久久久久久久久久久-久五月天婷婷| 婷婷丁香成人五月天| 婷婷五月天日逼| 五月婷婷啪啪| 亚洲黄色影视| 操一区| bukadeavzaixian| 五月天激情网址| 91久久| 欧美天堂婷婷日韩| www.99热. com这里只有精品| 狠狠操狠狠| 久热黄色| 九九色综合| 亚洲在线播放| 婷婷娌伦网| 久久33视频| 婷婷五月俺要去| 97精品综合久久| 久久这里精彩免费在线观看| 色10月婷婷视频| 五月丁香六月婷婷在线观看| 91干网| 欧美精品熟女一区二区| 久久激情四射| 91丨九色丨大屁股| 9久国产精品| 天天综合网站| www.日本91| 婷婷五月天激情电影小说| www.cao.com久久| 丁香五月婷婷手机| 激情丁香五月AV| 五月婷婷丁香瑟瑟视频| 日韩 中文 欧美| 五月天婷婷久久| 婷婷五月天毛片| 亚洲成人婷婷| 97资源欧美日韩大香蕉超碰一区| 99热这里只有精品4| 久久久久激情| 五月丁香六月| 亚洲综合色色| 久久五月丁香婷婷| 国产肥白大熟妇BBBB视频| 99re6热在线精品视频播放速度 | 色综合色色色色| 色五月天视频| 亚洲xx网| 婷婷中文字幕| 婷婷激情五月天小说校园| 91精品久| 九九热这里只有精品6| 99视频色在线观看| 中文字幕不卡网站| 另类在线| 婷婷五月天堂一本在线| 婷婷色网站| 丁香五月社区| 久久婷婷六月综合| 天天摸.天天mo| AA片在线观看视频在线播放| 色色性爱视频| 九九人妻福利| 综合五月丁香97| www激情| 丁香五月婷婷少妇| 亚洲另类AV| 亚洲无码播放| 深爱激情网五月天| 开心色色五月天综合| 国产精产国品一二三在观看| 九九婷婷五月天| 九九99九九99九九99视频网| 激情综合网激情五月婷婷| 五月婷婷激情综合av| 亚洲激情AV| 丁香五月天堂婷婷| 狠狠色成人影片| Va另类视频| 永久热91| 九月丁香婷婷基地| 久久天天| 综合AV在线| 天天拍天天做视频| 99久在线精品99re8| 无码 av电影| 欧美这里只有精品| 婷婷精品性性性性性性性| 久久网日本| 日韩限制级大尺度黑料泄密大尺度视频一区二区在线观看 | 午夜福利8055| 亚洲亚洲人成综合网络| 内射综合网| 日韩激情人伦人| Caop在线| 五月丁香久久激情综合| 亚洲国产精品二二三三区| 欧洲色| 综合色天天| 香焦网五月天| 日本黄色精品| 五月婷婷综合色啪首页| 天天射影院| www.色99| 久久综合干| 五月天久久丁香| www.激情在线| site:xiongshengzz.com| www:99热视频| 超碰九热| 97超碰99热99| 五月婷婷很很色| 黄色录像网点| 婷婷五月情天| 精品无吗va视频免费观看| 高清无码中文字幕aVDV| 激情网开心网| 五月丁香婷婷无码中文| 五月丁香综合伦理片| 日本色色图| av第一二区| 久久久9久| 婷婷综合婷婷| 成人精品免费在线观看| 丁香五月熟女| 日本一级大片| www.99热在线观看| 狠狠综合久久| 亚洲国产精品成人免费一区久久久在线观看AAAA | CHINESE熟女老女人HD视频| 五月婷啪| 五月丁香六月欧美综合网站| 色五月婷婷色| 丁香婷婷五月份| 在线观看免费视频| 欧美日韩色色| 久久大香免费| 激情综合区| 亚洲成人网站在线播放| 婷婷综合欧美| 激情5月婷婷狠狠干| 欧美精品99| 亚洲五月天婷婷| 五月天天视频| 99爱视频免费| 色婷婷亚洲| 欧美日朝成人| 日本片日本片祼观看网站在线看中文版网页在线看 | 久久久久人妻| 99re欧美精品| 99视频啪啪| 中文字幕婷婷在线| 丁香五月欧美激情| 久久er九九| 婷婷丁香六月激情综合| 婷婷五月天免费视频在线观看| http://www.sd-xiangsu.com/| 伊人深爱综合| 亚洲AV综合在线观看| 久久9精品| 亚洲色碰| www久久久久久久久久久| 激情五月丁香五月色| 五月丁香婷久久| 在线观看免费狠狠色丁香香综合| 色八月婷婷| m色激情网| 国产精品VA在线| 丁香五月激情啪啪| 91人无码久久久久久| 五月婷婷 自拍| 大香蕉伊人99| 丁香婷婷伊人| 色情婷婷| 中文字幕精品推荐免费在线观| 铁牛TV人妻| 性爱AV天堂| 中文字幕色色色| 久久99网| 久久婷婷五月天大香蕉| 成人五月天丁香| 婷婷丁香六月五月天| 五月噜噜| 99色色| 91传媒无码人妻精| 色婷婷在线综合色播网| 玖玖爱资源站| 爱iii做iiii日日| 99九色视频在线观看| 最新五月天婷婷影| 五月婷婷开心网| 青青色com久久| 亚洲操逼片| 久久五月丁香综合17C| 九九色图| 欧美一级毛卡片无码| 97综合在线| 五月久久丁香| 欧美性色A片免费免费观看的| 久久9情免费| 人妻久久久久| 五月婷婷中文字幕| 狠狠色狠狠爱| 亚洲色激情| 丁香五月Av| 综合九九久久| 丁香五月无码| 亚洲综合色成丁香五月色| 五月婷婷性爱| www.婷婷六月天| 五月丁久久| 色亚洲无码| 99在线精品视频| 精品欧美一区二区三区久久久 | 亚洲激情色色| 日韩成人免费电影| 亚洲视频a| 超碰猛烈的性猛交| 啪啪东京热| 丁香婷婷色五月天| 爱穴久久| 婷婷伊人久久综合| 超级碰 久久9| 婷婷香五月天| 九色porny在线观看激情四射| 六月丁香婷婷尤物| 5月丁香美女影院| 夜夜骑日日操| 99ER热精品视频| 久久综合丁香五月| 丁香五月偷拍| 九九久久99| 五月婷丁香| a色色色色色| 久操热| 岛国AV网| 精品网站99| 四虎成人精品永久免费AV九九| 丁香婷婷综合影院| 91视屏在线观看com.wwwvv| 99热老网站| 五月停停色色丁香| 五月丁香啪啪| 久久奄也去色色网站| 无码AV免费精品一区二区三区 | 丁香九月综合| 色999五月色| 六月丁香激情网| 婷婷中文字幕| 强壮的公次次弄得我高潮A片日本 | 琪琪秋霞| 97超级碰碰碰久久久| 操逼棍操逼| 丁香五月婷婷老师网站| 五月丁香综合影院| 久久精品色| 无码少妇高潮喷水A片免费| tingtingjiqingwuyue| 婷婷五月天成人| 五月色欧洲| 激情五月婷婷色综合| 噜噜五月天综合| 激情中文在线| 色色五月丁香| 51avj视频大全| 久久图色4| 91人人操人人| 激情五月六月丁香| 亚洲色综久久五月| 色5月婷婷| 日日噜狠狠色综合久久| 成人精品人妻| 狠狠色噜噜狠| 五月丁香久久网| 操笔无码| 98永久精品| 丁香五月欧美| 99九九视频| 99色婷婷视频| 五月天丁香花婷婷| 狠狠穞A片一區二區三區| 欧美另类五月激情| 超碰大香蕉网| 影音先锋男士资源网一区| 久久最新色| 日本色婷婷五月天成人电影| 五月丁香少妇| 免费碰碰视频久| 久久婷婷丁香| 五月婷婷啪啪啪啪| 婷婷五月天美女| 麻豆忘忧草午夜| 天干夜夜操| 99热777| 亚洲免费观看高清完整版AV线| www久久99| 99国产这里只有精品| 九九热黄色| 五月婷婷久久大片| 久久婷五月天| 婷婷在线免费| 五月天丁香久久| 五月丁香花伦理电影| 六月丁香色色色| 伊人久久大香线蕉精品| 97av在线视频| 操九色| 天天做 天天爱| 丁香色情五月综合激情| 久久婷婷五月综合啪| 亚洲乱码日产精品BD| 黄色成人网站在线播放| 五月激情久久| 五月婷婷人妻| 精品三区影院| hd五月婷婷在线| 午夜大香蕉| 美女伊人久久| 日笨久久网| 久久小说| 六月色婷婷| 九九伊人网| www.com五月天| 五月婷婷黄色视频| 五月亚洲激情| 色五月久久成人婷婷| 熟妇人妻中文字幕无码老熟妇| 色情开心五月| 伊人青涩网| 5月丁香综合图区| 丁香五月六月| 夜夜操狠狠操| 狠狠操狠狠爱| 色情五月丁香| 国产一级婬片毛片| 玖玖婷婷色五月| 九热视频免费观看| 综合九色| 五月天狠狠色| 亚洲综合色色| 五月天婷婷色在线视频免费观看 | 无码激情AAAAA片-区区| 中国女人内射6XXXXX| 99热在线播放| 成人精品视频99在线观看免费 | 99热这里只有精品首页| 99久久婷婷国产综合| 超碰在线91| wwwss在线观看| 久久婷婷亚洲| 国色天香成人网| 久久小说网| 亚洲网综合在线| 五月婷婷啪啪啪啪| 色婷婷五月天无码视频| 欧美VA视频| 9人人操人人看| 久久久久8888| 秋霞三级影视资源| 五月天色婷婷基地| 99热免费观看| 欧美久久婷婷| 大地资源色婷婷视频在线| 激情内射人妻1区2区3区| 五月伊人91| 碰碰碰97免费精彩视频| 99热老司机| 五月婷婷丁香啪啪| 色婷婷五月天小说| 色5月婷婷色| 五月人人丁香婷婷五月人人丁香| 99热99这里有免费的精品| 99久久久| 色色射| 香蕉AV777XXX色综合一区| 久草丁香婷婷1024| 欧美va视频| 九九热这里有精品23| 99精品视频网站| 激情伊人五月天| 久久9精品| 欧美在线干| 内射人妻视频国内| 69久久99精品久久久久| 99国产精品久久久久久久久久久| 亚洲成人无码专区| www.91九色| 中文字幕+乱码+中文字幕在线观看| 免费试看小视频 99| 亚洲视频99| AV色婷婷| 综合色在线| 香蕉久久六月| 天天爱天天做天天爽| 五月婷婷中文字幕AV| 夜夜爽天天干| 五月天婷婷色情| 激情综合青草| 精品人妻伦一二三区久久| 色综合五月天| 亚卅毛片| 思思热精品在线观看| 五月天激情久久| 99热免费18| 婷婷五月天AV网| 丁香五月激情鲁| 色色色成人网| 99狠狠操一| Www.婷婷五月| 777精品久无码人妻蜜桃| 色九月婷婷丁香| 欧美Va在线| 综合色五月| 人人爱人人草| www.seqingwuyuetian| 在线成人视频免费| 婷婷六月久久综合导航| 国产精品成人AV在线观看春天| 任你擦免费视频| 99er久久| 色五月婷婷五月| 婷婷色片| www.minyis.com【JT】实力收量可预付QQ2101460746 | 99ri国产精品| www五月天激情com| 精品无码99| 少妇高潮A片无套内谢麻豆传| 91操网| 色五月婷婷丁香五月| 香蕉久久av一区二区三区| 色色色99| 色婷婷先锋| 综合亚洲AV| 夜丁香五月婷婷| 丁香香蕉射射射| 包操45分钟网站| 天天做天天爽| 青青日韩| 激情綜合網址| 啪啪 综合网| 五月天色不卡| 超碰资源在线| 五月天激情网站| 激情丁香五月AV| 五月婷婷香| 久久中国毛毛片爱久久| 99热思思| 天天色天天射天天日| 婷婷五月丁香综合激情| 五月久久网| 欧美视频五区| 欧美婷婷| 久久丁香| 色人五月婷婷| 欧美久久九九| 婷婷五月免费视频| 久久婷丁香五月| 东京热伊人| www.狠狠| 91妻人人爽人人看片| 天天操天天日天天操| 26uuu色五月| 99这里只有精品|v| 激情婷婷丁香五月天| 伊人久久婷婷| 99热99免费| 久久久aaa| 天天精品视频免费观看| 大香蕉五月丁香| 操操啪| 色久免费| 综合五月丁香六月婷婷| 五月婷婷在线视频| www.夜夜騎夜夜狠| 色吊丝永久访问网址| 狠狠色色| 伊人婷婷五月天av| 97色天堂| 亚洲视频一区| 六月丁香激情| 秋霞午夜理论| 97操男人的天堂| 五月丁香久久综合| 欧美激情 日韩无码 婷婷 五月天 久久婷婷丁香五月一二三 | 色99在线观看| 五月丁香啪啪激情| 激情五月天99色| 欧美日韩一区二区三区四区| 亚洲五月天狠狠| 91色吧网| 男女啪啪做爰高潮无遮挡| 99爱视频在线播放| www久久99com| 伊人五月天久久| 精品久久99码| 丁香六月成人| 亚洲中文无码成人| 色婷婷91激情小说| 丁香五月婷婷网| 人人人va亚洲视频在线| 激情五月婷婷丁香六月| 五月婷久久综合| 五月丁香成人网| 丁香五月婷婷成人网| 五月丁香色| 性按摩玩人妻HD中文字幕| 五月婷婷综合视频| 五月婷婷之六月丁香| 国产精品成人AV在线| 天天干天天拍| 丁香五月天成人网站| 国产夫妻操逼内射视频| 2020日日干| 在线中文AV| 热久久91| 色婷婷五月天视频网站| 狠狠色狠狠鲁| 掩去也综合五月视频| 日韩野外 无套| 狠狠的日| 婷婷五月综激情| 丁香五月天视频在线播放| 久热这里只有精品性色AV| 丁香 亚洲 久久| 色婷婷很很十八禁| 中国女人内射6XXXXX| 六月婷婷激情| 99热在线观看精品| 成人丁香| 深爱开心激情| 五月天色婷婷激情| 97极品在线| 丁香久久五月婷综合| 五月天精品视频| 97干婷婷五月天| 久久五月天综合视频网站| 九月大香蕉| 久久3级片| 丁香狠狠干| 成人精品一区日本无码网| 综合激情站| www.超碰在线| 人人操日| 丁香综合网| 欧美色色色色色色色色色色| 久re热视频| 99热精品在这里| 开心深爱激情网| 婷婷六月丁香欧美视频在线| 色婷婷久综合久久一本国产AV| 欧美婷婷五月天综合| 亚洲综合激情五月久久| 丁香五月激情六月欧亚激情综合导航 | 999久久久国产精品| 好大好粗嗯啊-一级黄色大片免费观看-成人AV | 色七七色九九| 欧美综合激情丁香五月六月婷| 狠狠狠夜夜夜| 亚洲色视频| 色五月 五月婷婷| 日本天天色| 成人在线视频一区| 99日在线视频| 日本婷婷| 国精产品一区一区三区免费视频| 一级片操逼视频| 久综合4| 香蕉99网| 九九久久高清| 婷婷色五月丁香六月欧美啪| 99re这里只有精品9| 天天激情视频| 99这里只有精彩视频| 九九免费视频| 天堂久久精品| 亚洲中文字幕在线观看| 五六月婷婷久久| 五月婷婷色啪| 人妻AV在线| 一个色的综合| 婷婷久久色| 国产超碰在线| 9色婷婷| 9伊人网| 爆乳熟妇一区二区三区爆乳照片| 天天五月丁香五月| 精品国产人人爱人人| 国产色香蕉精品五夜婷| 六月婷婷av| 综合激情五月丁香9999久久精| 激情WWW| 五月天成人小说| 婷婷黄色| 亚洲愉拍99热成人精品| 久久九九精彩| 色五月婷婷丁香国产在线| 狠狠色丁香| 97人人干| 丁香五月欧美色综合| 婷婷五月天基地| 色播五月婷婷| 五月天停婷基地| 丁香六月天AV| 久久这里只有精品8| 色婷婷九月| 婷婷五月天性爱视频| 婷婷色导航| 色五月婷婷色五月婷婷色五月婷婷| 日韩另类| 男人的天堂在线婷婷| 六月婷婷色综合| 亚洲色亚洲精品| 色综合久久88色综合天天99| 婷婷.com| 色波激情五月天| 婷婷五月天影院| 色婷婷狠狠18禁| 在线看黄色| 热99视频| 九九热精品| 五月婷婷色啪| 国语精品探花| 农村熟妇高潮精品A片| 99热在线精品观看| 最新丁香六月婷婷| 色爆五月| 激情丁香久久| www.99婷婷| 天天日天天爱天天噪| 久久久久人妻网址| 久久精品五月天| 99色性爰网络| www...com黄在线观看| 亚洲色色在线| 丁香六月伊人| 碰超亚洲| 99re这里只有精品首页| 久热免费视频| 五月丁香美女| 成人丁香五月| 啪啪夜久久| 婷婷成年人免费视频| 日本V在线观看不卡视频网站| 人妻中文在线| 99自拍视频在线| 性欧美日本| 亚洲色五月| 亚洲无码色| www.91AV.COM| 夜夜躁爽日| 91怕怕网| se影音资源在线观看| 最近中文字幕2019视频1| AV伊人青草丁香六月| 成人精品在线| 激情综合五月| 五月丁香综合激情网| 99无码视频| 玖玖热视频| 久久婷婷五月| 激情综合五月| 激情综合综合综合| av国产精品| 亚洲狠狠狠色婷婷综合激情久久久| 亚洲综合五月天| 婷婷6月综合网| 婷婷久久五月| 婷婷六月爽| 人妻丰满精品一区二区A片| 久久久人人人妻丝丝丝| 亚洲 欧洲 国产 伦综合| 99欧州偷拍视频| 日日噜狠狠色综| 西西4r午夜剧场| 精品人妻一区二区| 五月婷婷另类| 欧美槡BBBB槡BBB少妇| 激情综合六月| 亚洲黄3级片网站欧美| 操操国产| 婷婷激情五月吧| 国产69久久久欧美黑人A片| 思思热热久久| 色婷婷亚洲| 丁香六月婷婷色XXXXX| 99热97| 91久久| 色五月婷婷中文字幕| 丁香伍月婷电影全集| 亚洲天堂aaa| 97人凄人人操人人爽| www.五月天婷婷| aaa丁香五月天| 能看的AV| 五月婷在线视频免费播放| 成人在线免费网址| 中文无码婷婷| 夜夜夜叫天天天做| 综合伊人久久| 中文字幕网伦射乱中文| 99热.com| 开心五月婷婷激情| 九九婷婷五月天| www.射伊蕉婷婷| av大香蕉| 97色综合| 直接看的av| 色婷婷丁香五月天| 欧美成人无码一区二区三区| 久xxxx| 日韩成人无码| 婷婷综合激情| 99热免费观看| 色欲资源网| 这里只有视频精品| 综合99综合久久久久久久| 熟妇高潮一区av| 久久婷综合| 日韩久热| 五月婷婷综合在线视频小说| 五月丁香综合伦理片| 91热99| 综合色吧| 亚洲成人综合网在线免费观看| 99热18| 久久丁香五月婷婷| 播五月开心婷婷欧美综合| 五月婷婷手机在线| 丁香婷五月天| 久久丁香婷婷五月天| 97碰碰在线看视频免费| 色情五月| 岛国午夜视频| 丁香五月婷婷国产在线| 亚洲av| 国产精产国品一二三在观看| 狠狠色狠狠操| 色五月六月| 九九综合九九| 日韩人妻在线观看| 夜夜久久综合网| 色婷婷婷婷| 色播激情五月天| 久久性爱视频久久性爱视频| 色色亚卅| 亚洲国产成人裸舞| 91大屁股| 婷婷丁香人妻久久在线观看| 五月丁香六月合| 婷婷伊人综合| 影音先锋91在线资源站| 97caop| 天海翼中文字幕高| 91久久精品国产91性色TV| 欧美性猛交99久久久久99按摩| 六月丁香婷| 高清一区二区三区日本久| 丁香五月婷婷基地| 天天射影院| 国产AV熟妇人震精品一品二区| 丁香五月影院| 精品亚洲国产成AV人片传媒| 在线中文AV| 99热草草| 久久九九一區| 99视频在线观看网址| 九色七七| 无码se| 久久视频这里都是精品| 五月婷婷久久内射| 日日激情网| 777色色色| 色色亚洲| 玖玖精品视频| 五月花婷婷| 五月婷婷丁香日韩在线| 丁香婷婷久久综合在线| 激情婷婷久久| 五月激情日本在线| 色婷婷五月天小说网| 亚洲第一第二网站| 伊人久久婷| 91婷婷| 熟妇高潮一区av| 97五月天婷婷综合激情网| 97人人操在线| 婷婷丁香五另类网站| 五月婷婷网站| 99自拍视频网站| 大香蕉综合网| 日噜噜色| 人妻熟妇国产精品| 五月丁香A片| www.五月天色色色| 婷婷五月综合婷婷| 久8色色| 久久人人九九| 色五月激情五月| 五月亭亭色| 天天做天天爱天天爽夜夜揉| 狠狠色婷婷六月激情网| 综合久久高清| 人与禽A片啪啪| 亚洲AV无码影院| 婷婷色播色五月五色五月天色妇| 五月丁香青草综合啪啪| 色色色国产| 成人αV视频免费观看| 婷婷终合色图| 丁香五月瑟瑟| 99人妻碰碰碰久久久久视| 丁香五月天堂网| 综合激情在线观看| 翔田千里aV中文字幕| 操骚货在线| 中文字幕按摩做爰| 亚洲综合99| 日本人妻久久| 色婷婷欧美在线| 婷婷刺激综合| se色婷婷视频| 色婷婷丁香五月天| 26uuu最新地址| 丁香五月激情综合| 一区视频网站| 久热精品视频| AV大香蕉| 久久东京热婷婷五月| 激情婷婷综合五月少妇| 狠狠狠狠狠干| 色婷婷a| 色五月天本日| 最近中文字幕2019视频1| av在线中文| 玖玖资源站中文| 中文字幕无码人妻少妇免费视频| 亚洲第一成人无码A片| 丁香激情综合| 国产偷人爽久久久久久老妇APP| 在线中文字幕av| 色综合色综合色综合色综合| www久视频com| Xx色综合| 久久久com| 久婷婷色| 六月婷婷在线| 激情色五月天| 丁香五月狠狠综合欧美| 另类激情综合| 97色婷婷成人综合在线观看| 婷婷五月天AV| 丁香97综合| 五月婷婷丁香色吧网| www.色五月| 五月丁香六月色婷| 天天看A片| 激情人妻综合| 日亚二欧美| 亚洲精品成人片在线播| 色五月婷婷色五月| 影音先锋男人站,影音先锋男人色资源网,影音先锋AV最新资源站,影音先锋AV资源 | 激情五月丁香色婷婷| 日日天天干| 可以免费观看的AV| 久草大| 成人 在线 日韩| 久久婷婷丁香| 啪啪婷婷五月天激情| 六月婷色| 97色热| 婷婷五月天六点丁香五月| 亚洲成人无码网站| 另类激情码| 99精品热视频| 精品婷婷| 色色性爱视频| 久久婷婷丁香五月一二三| 激情五月婷婷综合| 亚洲色五月天是什么| 五月丁香啪啪啪| 婷婷五月天xxx| 99原创自拍视频在线观看| www.思思99热| www.夜夜爱.com| 五月激情婷婷在线| 成人网站av免费网站推荐| av在线免费网站| 九九re精品视频在线观看| 热久久91| 五月丁香婷婷无码中文| 202丰满熟女妇大| 激情丰满熟妇五月| 激情精品久久| 婷婷五月天视频| 嫩草视频在线观看| 天天干,天天日| 欧美一区二区三区不卡影视| 婷婷五月激情黄色| 日日噜狠狠色综合久| 91.com男女操| 亚洲精品99| 丁香婷五月| 色很久综合| 超碰在线视屏| 99精品视频在线免费观看| 亚洲久久天堂| 亚洲激情综合| 色综天天综合| 亚洲婷婷性爱| 久久视频婷婷| 五月丁香综合啪啪啪啪啪| 亚洲av| 第四色大香蕉| 99rewww| 亚洲av电影在线| 成人精品人妻| 丁香五月激情站| 停停综合色色| 亚洲色啪| 五月天色婷婷激情| 99久久9| 五月成人丁香av91| 色五月五月婷婷| 亚洲五月天天| 伊人综合色干| 精品一二三区久久AAA片| 久久五月天激情| 97人妻碰碰中文无码久热丝袜| 日韩艹比| 五月婷婷啪啪啪| 99热精这里只有精品| 99男人天堂| 日韩精品视频中文字幕| 亚洲操精品| 亚洲色色色色| 狠狠操狠狠爱| 五月婷婷亚洲综合在线| 天天综合网站| 成人丁香| 亚洲精| 日本片日本片祼观看网站在线看中文版网页在线看| 久久97久久99久久综合欧美| aa久久| 国产精品五月天婷婷| 五月婷婷色播视频| 亚洲无码成人网| 成人超碰网| 99这里| www.色五月| 久久96热| 开心婷婷五月激情网小说| 97干婷婷| 99久久国产综合精品五月天喷水\| 大香蕉综合网| 丁香五月天资源网| 综合五月天天天天天五月| 91日本在线观看| 狠狠色丁香婷婷| 国产肥白大熟妇BBBB视频| 色欲av伊人久久大香线蕉影院 | 日本欧美成人片AAAA| 亚洲六月婷婷| 婷婷激情小说| 久久久人妻门| 五月婷婷开心激情六月蜜桃| 婷婷综合五月| 偷拍91九色| 2021日韩无码| 国产jd1024基地手机看国产| 天天色情站| 五月婷婷综合在线| 日韩啪啪视频| 美女精品一级不卡视频| 色色性爱视频| 天天操夜夜橾| 五月综合婷婷久久在线| 五月激情综合婷婷| 五月丁香婷婷福利| 精品久热| 欧美日综合| 激情六月丁香| 久久久五月五丁香| 久久WW| 日本在线99| 色五月中文字幕| 天天肏天天肏| 999九九九久久久99HD| 97操碰在线97| 天堂网操| 亚洲国产色婷婷| 97操男人的天堂| 97久久超视频| 丁香六月婷婷社区| 99精品视频推荐| 五月丁香九九| 操人久久| 操碰99| 婷婷久久综合久| 婷婷五月天在线看| 五月天婷婷三级黄| tingting五月天亚洲| 六月婷婷狠狠色在线观看| 伊人综合网4| 五月丁香欧美| 岛国AV网| 色噜噜狠狠色综无码久久合欧美| 天天爱天天操| 久久婷婷五月丁香网| 99日本精品视频热| 久久精彩视频| 欧美丰满熟妇BBB久久久| 五月天激情美女久久| 99精品久| 五月丁香色婷基地综合久久| 国产三级片91| 亚洲激情网| 狠狠狠狠狠狠草| www.色擼擼.com| 亚洲另类视频| 变态另类9| 成片免费播放| 激情涩播| 色五月婷婷AV| 久久婷婷青草五月天| 五月激情丁香五月宗合| 亚洲人成人五月天| 亚洲精品在线视频| 激情五月天视频| 中文字幕日本最新乱码视频| 色婷婷亚洲综合网站| 国产性爱一级| 丁香婷婷精品视频| 狠狠插狠狠| 国产97色在线 | 日韩| 五月激情影院| 一级黄色片看看| 国产脫衣舞一区二区三区| 色狠狠999综合网| 丁香五月精品| 久久久激情视频| 成人精品一区日本无码网| 超碰免费电影| 婷婷丁香激情综合色情| 五月色 亚洲| www激情com| 精品人人操| 中文字幕日本最新乱码视频| 97人妻碰碰碰久久| 色丁香五月婷婷婷| 第四色首页| 色婷婷视频在线| 婷婷久久五月丁香| 97操碰碰无码视频| A片试看120分钟做受视频红杏| 99热在线网站| 五月天婷a在线| 国产偷人妻精品一区| 激情五月天视频| 亚洲无码猫咪| 99热这里在线精品| 五月激情婷婷在线| 91丨九色丨大屁股| 色婷婷激情五月天| 情情五月天色| 99熟女视频| 啪啪啪丁香五月| 激情五月,色五月| 婷婷五月成人| 国产成人AV| 五月丁香啪啪婷婷| 丁香婷婷综合激情五月色| 999热这里只有精品| 国产亚洲色婷婷久久99精品91 www.riverspirits.org www.hnnun.com www.changh | 性一交一乱一交A片久| 色墦五月丁香| 九月婷婷综合网| 天天日夜夜夜操操操操| 91viP在线看| 无码人妻一区二区一牛影视| 丁香婷婷五月天色综合| 成人av在线网址| 天天色凹凸| 五月天影院婷婷在线观看| 色婷婷成人| 亚洲综合另类| 色五月综合激情| 风流少妇A片一区二区蜜桃 | 深爱激情五月网| 久久99大全| 婷婷五月综合视频免费播放| 国产做爰视频免费播放| 丁香五月天婷婷在线视频| 大香蕉伊人爱在线| 丁香五月天社区婷婷| 色宗合久久五月婷婷| 99热这里| 九月激情网| 午夜爱爱网站| 九热视频精品| 777色色色| 97婷婷五月丁香| 五月丁香久久久| WWW.桔色成人.COM| 丁香五月婷婷啪| 亚洲综合激情五月久久| 色在线99| 97碰人人操| 婷婷久久综合| 成人 九九九九| 五月婷婷AV| 天天操天天插天天射| www激情网| 国产一区二区av免费| 狠狠干2007| 性色做爰片在线观看WW| 91免费在线视频6| 97色在线| 天天色天天爱天天舔| 色色99| 激情五月图| 激情婷婷丁香| 青青热久精品视频在线观看| 亚洲爆乳无码精品AAA片蜜桃| 婷婷五月天美女| 色色五月丁香| 婷婷丁香午夜综合影视| 99ER热精品视频| 丁香婷婷色五月天| Caoub青青超碰|