欧美成人午夜精品久久久,国产?V天堂一区二区三区,欧美精品va在线观看,亚洲一区二区三区免费在线观看,av无码精品一区二区久久,欧美性爱视频不卡一区三区,欧美乱人伦视频在线观看,国产一级牲交高潮

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
返回資訊列表
99人妻碰碰久久久禁片| 久99热| 成人丁香| 色天天综合色| 超碰成人免费| 97碰成超视频免费视频| 在线中文AV| 天天澡天天狠天天天做| 五月天婷婷激情春色小说| 五月久久婷婷天堂视频| 色色色宗合网| 人与禽A片啪啪| 青草五月天| 丁香婷婷人妻| 色综合天堂| 丁香五月视频在线观看| 婷婷丁香五月综合| www久久艹| CHINESE熟女老女人HD视频| 狠狠人人婷婷| 久久伊人五月天| 亚洲婷婷月丁香五月| 天天干,天天操,天天射| 丁香五月婷婷婷桃花影院| 久热这里只有精品6| 大陆肏屄视频| 爱婷婷久久视频| 丁香六月激| 久久涩视频| 五月婷婷婷婷| 亚洲另类电影| 色播五月婷婷| 婷婷91| 丁香五月六月综合欧美| 色导航色婷婷五月天在线观看| 这里只有精品日韩精品| 激情婷婷色小说| 五月婷婷偷拍| 夜夜资源站| 婷色综合| 啪啪五月婷婷| 超级碰 久久9| 亚洲久艹| 日韩欧美一道四区中文字幕| 五月丁香黄色| 人人摸人人操人人爽| 久久182| 色吧婷婷五月亚洲| 国产av网| 日韩AV中文字幕在线| 欧类av怡春院| 色99xx| 色婷婷综合久久| 亚洲中文字幕在线观看| 中文字幕 中文字幕明步| 九九在线精点品| 色~性~乱~伦~噜| 综合性爱网| 欧美色色网| 97色伦另类图片小说视频| 99re在线视频| 色性综合| 婷婷涩五月天综合| 六月婷婷在线| 九九热10| 大香蕉久操| 99热在线只有精品| 久草热8精品视频在线观看| 可以看的av网站| 99日本黄站| 九九99九九99偷拍视频免费看| 五月天婷婷乱论小说| 最新丁香六月婷婷| 高清不卡一区| 97精品人人A片免费看| 激情五月天视频| 久久久中文| 大香蕉婷婷丁香天堂AV| 777米奇影视第四色| 天天天天操| 丁香五月偷拍| 天天操天天插天天射| 九九色插| 亚洲精品99| 丁香五月电影| 99.色| 欧美性色五月天| 成人精品99| 青草五月天| 婷婷五月天AV在线| 少妇性按摩无码中文A片 | 色域五月婷婷丁香| 婷婷久久综合| 97超级操操| 丁香五月首页| 久久五月天激情视频| 日日操,夜夜爽| 五月丁香在线婷婷美女| 激情综合久久| 免费一区二区三区| 婷婷亚洲天堂| 五月天 另类图片| 女人被男人吃奶到高潮| 亚洲中文字幕在线观看| 五月丁香综合在线| 丁香婷婷五月综合影院| 色婷婷久久综合| 99热精品在线播放| 狠狠爱婷婷丁香| 五月丁香婷婷色| www.伊人天堂偷偷婷婷| 亚洲网站999| 五月天激情小说网| 五月婷婷,狠狠操| 九九热在线观看6| 天天干天天 亚洲| 无码九九九九| 视频免费精品免费精品免费精品免费精品免费精品免费精品免费99 | 天天摸色吧天天摸色吧| 99热| 无码yw| 色色色99韩| 六月婷婷九月丁香亚洲综合| 五月丁香综合网| 五月天大香蕉av| 日本女人久久| 天天插天天操| 精品久久久91久久影视网| 97超级操操| 五月婷婷色播视频| 亚洲成人一区| 99九九中文字幕视频| 久久五月天激情婷婷| 五月婷婷丁香网| 开心激情婷婷| 在线婷婷| 91丨九色丨高潮丰满日本| 成人综合网站| 996er在线观看| 久热只有精品| 精品婷婷丁香五| 丁香五月激情婷婷视频| 97精品在线| 午夜天天精品视频| 五五月丁香花激情综合网| 婷婷狠狠干| 99国产精品白浆在线观看免费| 午夜日韩久久久网站| 五月天六月天| 久久香蕉网| 182TV亚洲| 久久婷婷五月天激情唯美| 五月丁香六月色| 色婷久| 日本不卡五月婷婷丁香| 色青青电影色五月| 国产精品久久久丁香五月八戒视频| 97干在线| 啊v视频在线观看| 99热6这里只有精品| 成人中文网| 97碰在线视频| 亚洲五月婷婷| 久月丁香爱婷婷综合| 夜夜久久综合网| 人人综合色| 婷婷激情六月综合| 国产露脸150部国语对白| 97人人操人人爽| 五月丁香六月激情| 毛片新网地| 色色色色色网| 在线视频99| 这里只有精品视频99| 9色91视频| 91视屏在线观看com.wwwvv| 日本色五月| 操碰91| 色色免费网站| 精品五月视频婷婷在线观看| 狠狠搞狠狠操| 99re久热只有精品6在线直播| 国产超碰在线| www,欧美干干干干干干| 五月综合激情啪啪啪啪啪| 熟女五月天久久综合| 99噜噜噜在线播放| 五月丁香亭亭天天舔| 超碰99在线| 天天爽夜夜爽夜夜爽精品| 五月激情六月综合| 亚洲激情五月婷婷日日| 以及AA大片看看| 色色色色色色色色色999| 99免费在线视频| 电影蜘蛛女| 桔色成人官方网站| 五月婷婷伊| 艾小青av| 99伊人婷婷在线| 人人爱人人草| 狠狠舔| 婷婷丁香六月| 亚洲色婷婷视频| 超级碰碰碰久久网站| 色五婷婷开心缴| 国产色99| 99热亚洲| 99这里有精品视频视频| 99日本黄站| 五月婷婷啪啪| 狠狠色噜噜色狠狠狠综合久久成人波 | 99久久6| 激情五月激情综合网一级丸片| 99re在线播放| 五月综合在线| 五月婷中文字幕| 这里只有精品视频99| 婷婷5月色| 成熟妇人A片免费看网站| 五月播播| 久久er视频6| 久久在线视频免费观看| 特级片神马电影| 激情婷婷丁香色五月| 五月婷婷色影院| 青青草a在线| 五月激情综合网婷婷| 亚洲色网络| 成人AV免费观看| 北京熟妇搡BBBB搡BBBB| 看片视频在线免费日产在线看| 狼人狠狠操| 99热免费| 日韩操逼大片| 99热99re6国产在线播放| 色吊丝永久访问网址| 色色99| 五月婷婷在线观看| 婷婷丁香五月天综合AV| 99欧美三级视频| 亚洲五月天婷婷在线| 麻豆AV一区二区三区| 天天日夜夜拍| 开心亚洲久久开心| 大香蕉伊人99| 九97免费视频| 一本道在线电影| 色播五月天激情| 激情五月天综合网站网站网站| 亚洲黄网在线| 久草热8精品视频在线观看| 久久婷婷综合五月天| 99在线精品视频观看免费下载| 精品一二三区久久AAA片| 99在线免费视频| 婷婷的激情五月| 九月av在线| 99色在线| 婷婷综合网| 可以直接看的av网站| 久久九九玖玖| 哇嘎成人久久| 天堂在线婷婷| 草榴视频黄色网| 欧美精品18| 日日夜夜天天| 色色A| 激情五月丁香在线观看直播| 思恩热国产视频右线观看| 久久人视频| 中国女人内射6XXXXX| 大香蕉天堂| 夜夜夜夜撸夜夜操| 岛国AV网| 亚洲成人人人操| 丁香五月另类小说在线阅读| 综合五月草| 久久香视频| 少妇高潮呻吟A片免费看软件| 激情久久久久久| 丁香五月婷婷激情蜜桃| 99亚洲色| 婷婷激情五月天小说校园| 91丨九色丨白浆秘| 99热99精品| 久久久97| 婷婷五月天堂| 91操网| 五月天激情啪啪| 久久五月网| 国在线激情网| 狠狠五月激情在线| 久久这有这里精品| 婷婷激情六月综合| 亚洲五月天综合| 激情黄色小说色五月| www.精品久9| 久久亚洲天堂| 五月丁香六月激情综合| 超碰97人人操| 色丁香五月天射婷婷爱婷婷| 亚洲 视频 导航 一区| 五月丁香中文婷婷中文| 超碰爱爱爱| 亚洲天堂无码| 天堂在线9| 综合色影院| 2015超碰| 亚洲天堂久久| 激情综合网婷婷久久| 久久久精品99亚洲综合| 多精窝99在线视频| 婷婷激情五月综合丁| 成人AV在线网站| 99热综合在线观看| 日韩爱操视频| 九九色综合网| 丁香五月播播| 中文字幕色色| 丁香五月婷婷视频| 色综合久久久久| 99精品在这里| se色婷婷视频| 六月综合婷婷开心伊人| 丁香六月激情综合网| www.精品久9| 9999热在线免费观看| 99碰网站| 丁香五月日啪| 五月天婷婷爱| www色婷婷| 亚洲综合九九| 亚洲无码影音| 丁香色综合| 97人人干人人操| 伊人婷婷青青cao| 婷婷五月天综合蜜桃| 男女久久婷婷五月天| 九九精品视频在线观看| 97精品综合久久| 女人天堂AV| 影音先锋男人女人| 亚洲天堂啪啪| 色婷婷五月天激情综合| 九九无码| 极品人妻VIDEOSSS人妻| 色欧美日| 婷婷另类开心| 操骚货在线| 亚洲精品影视| 超碰2021| 日本啪啪网| 天天激情视频| 成人综合视频在线| 操B视频在线播放| 99热欧美精品| 啪啪五月天啪啪| 色色色99| 五月天激情色色| 大香蕉久久草| 久久 视频这里只有精总| 婷婷色操| 97日韩无套内| 99日韩| www,99热在线观看| 丁香五月情色| 欧美日本黄色| 久在线综合69| 五月丁香六月欧美综合| 熟女网站久久| 69人人操人人爽| 午夜婷婷丁香| 可以免费观看的AV| 欧美A级成人婬片免费看理论| 婷婷五月天网址| 襙逼网| 日本一级一片免费视频| 五月丁香六月婷婷在线播放| 九九色网专区| 狠狠xx| www激情网站| 婷婷丁香五月婷婷| 欧美日朝成人| a久久| 久久奄也去色色网站| 久久精品99国产精品日本| 激情深爱婷婷网| 成人日韩欧美| 开心五月天激情网站| 91碰免费视频| 婷婷久久99| 久久99操| 亚洲天堂婷婷丁香| 天天综合五月天| 在线中文字幕av| 国产在这里只有精品| 激情综合在线播放| 999热这里只有精品| 丁香婷婷五月天色综合| 婷婷黄色网| 亚洲熟妇无码乱子AV电影| 91porn一起草| 少妇性BBB搡BBB爽爽爽视頻| 蜜乳中文字| 久久五月情| 亚洲AV日韩无码| 热99视频精品| 夜夜久久综合网| 开心激情婷婷| 五月婷综合| www.色五月.com| 天天干,天天日| 五月WWW| 91jiuseshunv| 99自拍视频在线| 玖玖福利视频资源| 九月激情网| 亚洲熟妇AV乱码在线观看| 五月婷婷五月天亚洲无码| 97极品在线| 五月丁香综合啪啪| 亚洲第一综合| 丁香五月婷婷精品视频| 久婷| 亚州色综合| 婷婷五月丁香五月| 精品无码视频| 青青操avbb| 9 1 A v久久久| 亚洲色99| 26uuu丁香婷婷五月| 视频免费精品免费精品免费精品免费精品免费精品免费精品免费99 | 超碰在线99| 亚洲久久婷婷丁香五月天| 久色五月天| 国产伦亲子伦亲子视频观看| 久久五月丁香婷婷| 婷婷色五月天在线观看| 五月丁香亚洲五月| 天天人人综合| 色综合久久99色| 色逼综合网| 久久久激情| 亚洲操b| 亚洲天天免费| 婷婷香香五月| 色婷婷婷婷| wuyuedingxiang| 色噜噜狠狠色综无码久久合欧美| 日韩在线视频网站| 欧美乱码国产一级A片| 色五月婷婷开心| 人人爱操| 三级黄网站| 精品九九网| 5月丁香综合图区| 99热这里只有精品在线观看| 乱码操操| 国产精品社区| 99精品在线观看视频| 五月婷婷综合久久| 色五开心五月五月深深爱| 五月激情偷拍婷婷| 天天干天天干天天干天天干天天干天天| 97人人搞| 久久亚洲婷婷| 九九国产精视频| 91人人网| 97人凄人人操人人爽| 日本专区久久| 丁香五月手机在线| 超碰亚洲天堂| 色婷婷五月天偷拍| 亚洲中文字幕AV| 99欧州偷拍视频| 亚洲 视频 导航 一区| 婷婷五月综合基地| 欧美碰碰碰| 日韩婷久| 色噜噜狠狠色综合网| 九九99在线视频| 色九九九综合| 久人操| 五月婷婷色播| 婷婷五月色| 五月婷婷xxx| 色八月婷婷| 亚洲精品色色| 国产精品久久久久久久久久| 日本成人噜噜噜| 26uuu国产色| 99超超碰| 人人操99| 久久综合首页| 婷婷综合网站| 开心深爱五月天| 欧美日韩五月婷婷| 色综合综合综合| 五月丁香综合啪啪| 激情五月婷婷开心网| 天天日天天干天天爱| 久久精品天| 国产人妻人伦精品一区二区| 五月伊人网| 日韩在线五月天婷婷| 天天开心婷婷丁香五月| 九洲一级A片| 色亭亭九月| 九九久久精品| 91精品综合久久久久久五月丁香| 五月丁香成人小说| 五月六月婷婷| 久久精品66| 丁香五月综合久久八| 丁香六月婷婷综合啪啪| 欧美大道不卡| 蜜乳中文字| 开心四月婷婷在线色播播| 九九热啪啪| www。五月,com| 国产精品国产成人国产三级| 99热只有这里有精品| 天天肏高清在线| 丁香六月婷婷综合啪啪| 开心五月丁香婷婷| 五月色导航| 2014天天爽| 人人97碰| 99在线视频播放| 玖玖婷婷免费| 在线18av | 色婷婷五月天| 一本道在线电影| 99久在线精品99re8| 婷婷五月激情的图片| 成人丁香五月天| 丁香五月五月婷婷五月天激情四射| 色婷婷丁香五月天在线视频| 欧美va视频不用播放器的va视频网| 亚洲操逼片| 婷婷综合亚洲| 亚洲六月色婷婷| 婷婷婷久久久| 99久久久久久| 91丨九色丨熟女高潮| 51XX午夜影福利| 色琪琪一综合久久激情五月视频| 丁香五月网址| 男人天堂AV在线一区二区| 欧美久久久中文字幕| 日韩精品视频中文字幕| 超碰免费在线| 91男人操女人视频| 99久热视频在线| 五月久久综合| 在线sebiav精品视频| 中文字幕91,综合| 婷婷va| 丁香五月影视| 只有精品在线观看| AⅤ色区| 色射婷婷五月天| 九九色天堂| 久久五月情| enecarbon-materials.comWu染请涟系Bao护@wip1688 | 狼人狠狠操| 九九色影视| 丁香六月婷| 99久久久99久久91熟女| 综合久久狠狠| 欧美天天搞| 色噜噜夜夜夜综合网| 亚洲综合色色| 五月婷婷丁香五月亚洲色| 久8色色| 人人摸人人| 99re免费精品视频| 久久婷婷视频| AⅤ网站在线看| 玖玖@三月天天丁香婷婷| 五月天伊人久久| 久婷婷婷| 亚洲综合丁香婷婷六月天| 色五月婷婷啪啪五月| 五月亭亭性| 狠狠色丁香| 国产AV一区二区三区最新精品 | 久久激情综合| 日本色狠狠| 综合色色网| 五月丁香激情综合网| 国产免费性爱| 午夜九九九九九九九九九九九九九| 97av在线视频| 久久99美女精彩视频| 五月激情在线| 婷婷激情五月综合| 色色丁香五月天社区| 超碰在线人妻| 亚洲色无码| 婷婷久月| 99国产精品白浆在线观看免费| 狠狠色噜噜狠狠狠狠狠色综合久久| 91AV视频| 激情五月天。| AV在线免费网站| 激情五月综合免费| 在线看片av| 五月婷婷av在线| 人妻久热| 996日日爱| 五月天啪啪啪| 婷婷性爱视频在线| 国产性色蜜乳| 丁香六月欧美| 91大屁股精品| 五月天狠狠干| 成人AV在线电影| 99久久超级| 丁香五月激情综合| 99啪视频在线观看| 99这里有精品| 婷婷久久夜| 激情久久婷婷| 综合激情五月天| 黄色AAAAA| 亚洲成人免费电影| 超碰国产一区| 丁香五月天堂| 五月激情婷婷丁香天堂| 丁香五月 综合| 精品无码片| 天天干夜晚夜操| WWW.桔色成人.COM入口| www热久久yy9| 影音先锋91在线资源站| 成人视屏在线观看| 99在热线免费视频| 五月丁香六月婷婷综合免| 色天堂操| 性爱激情综合网| 91操片| site:feetmall.com| 亚洲激情AV| 波多野结衣成人作品在线| 99热超碰| 看全色黄大色大片| 婷婷综合六月| 婷婷激情综合网| 日本A片一区| 精品人妻伦九区久久AAA片| 激情五月丁香六月综合AVXXXX| 婷婷五月天影视网址| 97久人人| 五月婷婷亚洲综合在线| 五月激情丁香啪啪| 成人精品视频99在线观看免费| 这里有精品| 婷婷激情五月综合在线视频| 日本a片网址| 丁香五月AV| 色五月噜噜| 丁香婷婷社区| 色爱99| 婷婷五月天综合久久| 这里只有精品视频看看| 九热在线这里有精品6| 婷婷综合精品| 亚洲中文AV网站| 7EzOBIhNq85TO| 99热综合| 国产毛片精品一区二区色欲黄A片| 国産精品| 97资源碰碰| 久久综合婷婷五月| 婷婷八月丁香激情综合| 亚洲操B| 日日干天天爽| 综合色五月| 99这里只有精品99| 九九免费视频| 激情综合丁香五月| sewuyuejiqingwang| 日本狠狠爽| 五月婷婷色影院| 久久五月激情| 欧美黑人大吊| 婷婷五月天国产精品| 婷婷五月色| 热99国产精品| 亚洲精品操一操、噜一噜、摸一摸、爽 | 99色色爰| 婷婷五月 丁香六月| 99久在线视频| 最新日本A片| 色色五月天网站| 亚洲国产成人综合| 人人干人人干骚美女| 天天综合色丁香| 热的五码久久精品| 就爱啪啪婷婷| 五月天婷婷中文字幕在线播放| 79色色色色| 婷婷综合一二三| 97精品自拍| www.五月天婷婷| 丰满老熟妇BBBBB搡BBB| 激情五月综合| 美女久久天堂| 欧美三级大片AA在线看| 亚洲成人网站在线播放| 99热只有精品综合| 色情久久久| 激情五月久久| 99视频精品| 51精品国自产在线| 久久精品天| 日本精品99网站| a69在线视频| 青青草免费公开视频| 精品综合久久久久久五月天| 性爱七区| 特级操b片| 开心五月婷婷五月| 久久只有这里精品免费| 开心五月婷| 伊人网啪啪| 狠狠穞A片一區二區三區| 91人妻人人操| 中文字幕在线免费观看视频| www,色中色| 五月涩涩网| 内射综合网| 疯狂做受XXXX高潮A片| 激情国产综合| www.夜夜夜| 天堂综合久久 | 久久人妻情侣| 狼人狠狠操| 一区二区三区四日本| 亚洲区在线| 日本99热| 深爱五月激情五月| 国产AV国片偷人妻麻豆| 台湾无码A片一区二区| 99 热国产在| 婷婷丁香五月亚洲| 专区无日本视频高清8| 97热久久| 丁香婷婷十月| 久久婷婷综合基地| 2022久久婷婷| 五月6香色婷婷视频| 婷婷色五月天在线观看| 国产美女无遮挡裸体毛片A片| 大香婷婷| 五月香六月婷| 高清不卡一区| g00d人体西西| 99er久久| 婷婷五月在线视频| 8区视频在线| 五月丁香AV、伊人业余、性色熟妇| 午夜成人网站在线观看| 综合网精品99| 亚洲五月丁| 香蕉综合网| 欧美日本99| 人人做天天爱| 91妻人人爽人人看片| 在线你懂的亚洲欧| 五月婷在线观看| 日韩国产AV播放| 精品国产va久久久久久久| 粉嫩av蜜桃av蜜臀av| 日韩成人电影av| 午夜婷婷六月天| 亚洲日韩乱码一区二区三区四区 | 日韩一级片| 超碰在线中文字幕| 深爱综合网| 超爽内射| 草AV9999| 激情婷婷丁香五月| 白天AV月月| 丁香婷婷久久| 久久婷婷色色| 色优久久| 五月丁香婷中文| 婷婷五月天免费视频| 波多婷婷久久| 国产精品香蕉| 大香蕉网 久久| 五月丁香AV在线| 日韩av在线播放综合网| 精品久久久人妻| 婷婷激情四射五月天| 开心五月天激情网站| h在线看免费版在线看| 五月丁香六月日逼| 日本强伦片中文字幕免费看| 99久久成人| 4399成人黄A片| 狠狠婷婷爱| 成人综合视频网址| 天天五月情| 成片免费观看大全| www.99热精品| 五月丁香综合啪啪| 五月丁香综合啪啪| 激情综合激情五月| 激情婷婷五月在线合集| 色情婷婷五月天| 久9久成人精品视频| 在线视频另类| www.9色色色| 色婷婷五月天| 人妻狠狠操| 久热婷婷综合| 婷婷五月天堂| 五月丁香婷婷基地| 国产精品99久久久久久久女警| 五月天色综合服务平台| www.1024久久| 久久久99久久| 欧美97p| 玖玖爱综合网| 丁香花社区av| 九九99精品视频在线观看| 久久这里只有精品视频26| 久久五月婷婷视频| 免费观看18视频网站| 操操操Av| 五月综合亚洲婷婷| 久久精典| 特黄三级又爽又粗又大| 久久丁香五月天| 婷婷午夜天| 丝袜大香蕉| 亚洲网站观看视频| 久久成人人妻| 婷婷五月天伊人| 久久婷婷五月综合色和| 91seav| 国产精品成人网址| 亚洲永久免费| 久久亚洲网| 色九九七七| 少妇性BBB搡BBB爽爽爽电影| 99爱在线免费视频| 77799热| 色婷九九九| 伊人色综合网| 久狠日av| 天天摸天天舔在线视频| 免费99色| 99精品无码| 五月丁香色综合| 99热99精品在线观看| 91porn一起草| 久久ri精品| 这里只有精品视频在线| 五月丁香六月婷婷综合网站| 天天爽日日搞| 免费婷婷| 青青草原爱爱网| 五月激情综合网| www.婷婷,com| 99热99热不卡| AV天堂淫乩| www久久99| 色婷婷玖玖影院| 五月日韩中文字幕| 五月天成人免费视频| 99热| av色色国产| 艾小青av| 色必久悠悠影院| 综合AV在线| 色婷婷五月影院| www.一区二区三区| 熟妇内谢69XXXXXA片| 丁香五月色| 色色激情五月| 99色色视频| 日韩在线五月天婷婷| 五月天婷婷丁香蜜桃91| 五月丁香少妇网| 色五月天中文字幕| 亚洲丁香五月美女| 99成人精品| 99久久综合精品五月天| 日日夜夜天天爽| 丁香五月乱中文字幕| 亚洲人成人五月天| 色五婷婷开心缴| 五月丁香六月激情| 亚洲AV日韩无码| 97人人操人人干| 婷婷五月六月丁香| 99综合| 熟女少妇内射日韩亚洲| 91丁香色| 99啪在线视频| 五月天伊人综合| 日本超碰在线| 激情五月第四色| 久久五月婷综合网| 婷婷激情五月天小说校园| 伊人久久五月天综合| 久久精热| 五月婷婷激情| 久/久精品99看9| 成人AV在线中文版| 成人短视频免费| www.99婷婷| 久热这里这里有精品| 婷婷涩五月天综合| 天天插天天爱| 深爱五月激情| 色色色香蕉五月婷| 成人色图情色成人网 www.5b5b5bcom 五月天 | 色婷婷色综合| 亚洲av免费在线| 伊人六月无码视频| 五月天六月色| 久久久中文| 国产色婷婷亚洲| 日韩在线aaa| 99热碰碰热| 欧美性色A片免费免费观看的| 性爱技巧五月| 超碰色色综合| 人人色AV| 亚洲性视频| 公的粗大挺进了我的密道| 婷婷色色宗合网| 99热伊人| 国产裸舞表演WWWW| 99久久综合| 97干在线视频精品店| 亚洲六月婷婷| 开心激情站婷婷五月天| 九九综合色综合| 免费在线观看AV网站| 亚卅毛片| 人人操超踫| 五月丁香啪啪啪啪| 五月精品99综合| 亚洲高清在线| 九九99一区| 99热这里只有精品55| 日噜噜色| 激情六月下句是什么| 婷婷六月综合激情| 99网| 五月丁香福利| 天天天操天天天日| 67194国产| 久久九九国产| 天天视频亚洲| 97色干| 婷婷色啪| 丁香五月婷婷激情蜜桃| www.99在线| 丁香婷婷色情| 婷婷丁香五月亚洲综合网在线视频观看| 亚洲av网站| 日本大逼91| AⅤ色区| 丁香六月婷婷| 99热爱爱干干日| 五月六月婷| 黄色国久久| 秋霞午夜理论| 久久五月婷| 欧美在线视频免费播放| 韩国三级五月天婷婷。| 日本少妇裸体做爰高潮片 | 激情99| 色 免费网站视频| 婷婷五月色| 久久99草五月婷婷| 艹| 五月婷丁香| 超碰碰碰碰| 97色97干| 99久久.www| 久久99激情丁香婷婷小说网| 日韩一级一片内射视频4K| 天天做天天爱天天摸| 婷婷五月天综合网| 91久久综合亚洲噜噜成人在线 | 中文字幕免费高清电视剧| 久热久色| 激情五月天综合网| 五月丁香婷婷色色| 亚洲综合婷婷| 丁香激情网| 综合久久综合久久| 97在线刺激| 丁香五月欧美色综合| 婷婷狠狠97| 99在线免费视频| 青青草99热久久精品国| 五月激情六月丁香| www,色综合| 五月婷在线观看| 91嫩草久久| 欧美狠狠色| 99热销国产这里有精品| 丁香五月婷婷五月天| 人人操操| 国产激情AV| www.久久久久| 97五月天| 天天综合天天做天天综合| 国产欧美日韩综合精品一区二区| 亚洲色五月天在线| 午夜天堂一区人妻| 伊人丁香花综合影院| 五月婷婷 婷婷五月 一区二区 久久久| 大香蕉院线| 丁香五月婷婷久久久| 色综合久久88色综合天天99| www,超碰| 久久99网站| 国产精品在线视频| 日韩AV在线影片| 五月丁香婷婷三级| 射琪琪| 欧美久热| 婷婷深爱五月天在线| AV片在线观看| 91视频综合网| 九九九九这里只有精品| 五月丁香六月在线欧美| 北京熟妇搡BBBB搡BBBB| 国产,欧美,日韩,性爱| 97婷婷在线视频| 五月婷婷婷婷| 丁香婷五月| 久久婷婷亚洲无码一起| 欧美日韩91| 色色日韩无码| 很很色丁香久久停停| 久久九九99| 色视五月天婷婷| 中文字幕不卡视频| 可以看的av网站| 婷婷丁香视频| 天堂综合久| 香蕉综合网| 色五狠狠| 人人爽天天莫| 91九色PORNY大屁股| 婷婷五月天激情电影| 国产精品五月丁香| 婷婷性爱视频在线| 99久久久| 天天射影院| 亚洲婷婷五月草久| 国产性爱一级| 亚洲V国产V欧美V久久久久久| 五月丁香六月婷婷无码| www久久久| 免费碰碰视频久| 可以看的AV| 婷婷五月天免费视频| 99热这里只有精品268| 成片免费观看大全| 91精品丝袜久久久久久| 色色亚洲五月天| 99视频精品视频| 大伊香蕉玖玖爱| 亚洲熟妇AV乱码在线观看| 五月婷婷丁香大陆免费| 丁香欧美| 丁香五月综合高清在线| 中文字幕无码成人电影| 五月天社区| AV在线免费网站| 性生活久久人妻| 五月天五月色婷婷综合| 九月久久婷婷| 99热传媒| 超碰av在线| 丁香五月区| 五月天涩涩| 久久五月天激情视频| 五月婷婷影院| 人人干人人操外国| 夜夜嗨一区二区三区直播内容| 色噜噜婷婷| 婷婷 丁香 精品| 国产资源91在线| 精品九九在线观看| www.激情| xxxx久| 在线99精品| 色婷婷狠狠18yy| 五月天色小说| 另类小说五月天| AAA久久| 超碰97免费在线| 99这里只有精品|v| 色综合网综合| 婷婷一本和五月丁香| 激情综合网五月在线播放| 探花搜索结果 - 黄上黄| 偷拍99在线视频观看| 亚洲午夜成人av电影网| 激情综合五月婷婷| 青青草成人网| 亚洲激情AV| 乱码操操| 99色综合网| 最新久久网址| 婷婷的色色五月天| 五月婷婷六月丁香在线| 97色色在线视频| 色婷婷六月天在线| 婷婷五月天成人基地| 99re思思热这里| 怡红院院久久| 天天干肏夜夜| 成年人99热| 色综合综合色| 激情五月婷婷色| 激情五月丁香六月| 天天激情| 激情五月天视频| 欧美色五月| 91ncm视频| 丁香五月欧美成人| 色色色色网| 久操热| 免费看欧美成人A片无码| 国产精品久久久久久妇女6080| 国产毛多水多女人A片| 老美AA片| 色婷婷狠狠禁久久| 中文字幕无码成人电影| Caop在线| 久久婷婷色情7777网站| 久久久www| 激情综合网络插| sewuyuejiqingwang| www.夜夜.com| 五月天亚洲综合网| 丁香五月影视| 九九热这里只有精品6| 亚洲熟妇AV乱码在线观看| 丁香婷婷五月色综合| 五月婷婷丁香大香蕉| 伊人玖玖精品| 天天干,天天舔| 婷婷五月天深爱| 婷婷色情五月| xx久久| 欧美激情综合| 草榴视频黄色网| 色情五月婷| 婷婷5月色| 人人草人人视| 激情婷婷久久| 91操碰| 99操网站| 九九综合| 五月天四色房丁香| 色综合伊人网| 激情综合网五月婷婷| 五月成人丁香av91| 成人中文字幕在线| 玖玖伦理电影| 开心激情播播五月天| 色播综合| 人妻激情久久| 99热1| 久久只这里有精品| 青青草原伊人网| 日本猛少妇色XXXXX猛叫| 69人人操人人爽| 亚洲综合色色| 青草激情在线| 五月丁香六月婷综合成人综合| 亚洲精品久久久无码 | 色9999日韩国产| 五月婷在线色视频| 久久女人天堂| 丁香六月成人| 欧美日韩成人在线| 丁香五月a| 色色热| 亚洲成片在线观看| 亚洲五月天天| 五月婷婷偷拍| 激情综合网激情五月俺也去| 综合色五月| 五月丁香花婷婷玉莉AV| 激情五月天婷婷五月天| 小视频久久久aaa| 亚洲色激情| 丁香色播五月天| 九九99九九99九九99视频网| 99精品国产乱码久久久人妻| www热久久yy9| 六月婷婷国产| 色日本五月天| 99九九热视频| 婷婷激情五月天小说| 丁香五月人妻| 久久九九@| 五月婷婷性| 全部老头和老太XXXXX| 97色婷婷成人综合在线观看| 亚洲色情在线| 久久99热网| 丁香五月六月久久综合 | 色婷婷小说| 伊人激情| 色婷婷狠| 日韩成人电影Av| 亚洲中文乱字字幕线在永久| 天天插天天插天天插天天插| 亚洲天堂无码| 99热6色| 婷婷五月天 丁香五月天 裸体| 久久五月天色婷婷| 色丁香五月天| 九九人人自拍| 99爱这里只有精品免费视频| 婷婷色色网站| 综合狠狠干| 狠狠色婷婷777| 亚洲色情久久| 91日本在线观看| 五月婷婷丁香大陆免费| 99色精品| 亚洲国产另类av| 99色视频免费在线规看| 尤物一区二区| 色五月丁香激情视频| 五月天婷婷基地| 99re99热| 色人久久| 99热日韩这里只有精品| 99人人干| 激情五月综合视频| 五月天色色色| 亚洲性爱干干| 伊人激情AV一区二区三区| 色五月婷婷久久爱| 色色综合网站| 99热在线里有精品| EEUSS鲁片一区二区三区| 婷婷六月色丁香视频在线观看| www.超碰| 97深爱伊人综合| 五月停停大香蕉| 久久久五月四色| 操婷婷基地| 91啪啪网| 日韩成人综合网| 久久五月丁香|