欧美成人午夜精品久久久,国产?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
返回資訊列表
国产黄色av| 色婷五月| 秋霞丝袜啪啪啪| 天天干天天做| 久久一二三视频| 91九色欧美| 国内外色色色色色成人视频| 五月丁香五月综合欧美| 久久6这里只有精品| 久草免费福利视频| 亚洲无AV在线中文字幕| 婷婷久久五月丁香| 99免费在线视频| 五月天激情国产综合婷婷婷就去爱| 99热在线观看| 久艹大香蕉| 六月丁香婷啪射| 亚州操操| 91凹凸在线| 成人中文网| 色噜噜狠狠色综无码久久合欧美| 天天爽天天摸| 色色色色色色综合| 亚洲一区先锋影音| 五月丁香婷婷综合在线| 蜜乳人妻一区二区三区| 成人在线免费网址| 成人小说色图婷婷五月| 久久九九激情五月天| 久久久久久9| 亚洲婷婷在线播放十月| 亚洲av网站在线观看| 亚洲无码 图片区| 97碰久久| 超碰99久久| 思思99精品视频在线观看| 五月婷久久久| 9999热在线| 婷婷综合视频| 久久ab| 我爱婷婷五月天综合88| 一区二区三区XXXXXX| 超碰免费人人| 五月色网| 最近韩国日本免费高清观看| 大香蕉啪啪网| 亚洲亚洲人成综合网络| 操操综合网婷婷| 26uuu欧美日本| 伊人玖玖婷婷| 婷婷五月天,影院| 五月婷精品| 91碰碰碰久久久久| 亚洲操操操| 欧美精品999| 亚洲成人无码专区| 九九色婷婷五月天| 9色天堂| 在线观看免费人成视频无码| 成人美女网| 五月丁香综合啪啪| 熟妇无码乱子成人精品| 亚洲电影在线观看| 激情五月天婷婷丁香| 91久久久久久| 97超级碰人人| 日亚二欧美| 欧美在线视频9| 三日本无码| jiZZdr| 五月婷婷偷拍| 五月婷婷深深爱| 色色五月婷| 成人狠狠成人狠狠成人狠狠成人狠狠 | 丁香五月天大香蕉啪啪| 中文字幕无码成人电影| 亚洲在线综合| 五月丁香AV、伊人业余、性色熟妇| 人人草公开操| 婷婷丁香五月高清| 97碰在线视频| 五月丁香婷婷色| 五月婷婷综合在线| 北京熟妇搡BBBB搡BBBB| 啪啪五月综合| 97色色色视屏| 综合婷婷五月天| 六月婷婷九月丁香亚洲综合| 国产成人av在线播放| 五月天色婷婷基地| 综合激情五月天| 天天搽天天射| 久久九精品| 粉嫩av懂色av蜜臀av熟妇| 91操人| 美女天天艹人人爽| 婷婷六月视频| 九九热精品| 五月天婷婷社区| 五月丁香狠狠爱| 一起草Av| 99丝袜精品视频网站| 婷婷精品综合| 思思精品久久艹| 五月天社区婷婷丁香社区| 91超碰在线观看| 婷婷五月天久久久| 99九九精品视频推荐| 色播五月综合网| 色婷婷综合综合网| 亚洲综合色棒| 五月婷婷综合网| 涩玖玖免费视频| site:hcxsz888.com| 99er在线观看| 色色亚洲视频| 久久久.COM| 婷婷激情区| 激情综合丁香五月| 亚洲AV影片在线观看| 五月婷婷色播| 99热97| 色播婷婷五月天| 亚洲日韩久久婷婷伊人| 伊人色综合影院视频| 伊人六月丁香婷婷| 五月天综合| 色综合香蕉| 俺去也在线官网| 91天天操天天干天天射| 婷婷色情网| 五月婷导航| 五月天激情综合| 黄色毛片精品| 99小视频在线| 五月婷婷性爱| 97人人操人人干| 丁香五月天色婷婷| 亚洲综合成人网站| 五月六月丁香婷婷在线观看| 九九热最新| 伊人狼人干| 天堂AV三级| 97亚洲婷婷| 国产亚洲99久久精品熟| 五月天俺去也| 3DAV亚洲香蕉久久 一区二区| 色五月开心五月激情五月| 97人人搞| 丁香五月手机视频| 婷婷久月| 亚洲激情五月| 2017人人操| 三级黄色大片视频| 99色最新在线视频| 久热99狠| 99色色爰| a网站免费观看| 亚洲成人影视在线观看| 婷婷在线视频| 亚洲AV成人片无码网站| 天天色宗合| 五月婷婷婷色| 五月精品| www.激情| 伊人激情影院| 婷婷六月天激情影院| 国产精品99久久久久久久女警| www.色五月| 亚洲精品视频在线播放| 9色在线视频| 五月综合久久| 丁香六月婷婷缴情欧美| 91九色首页| 日韩AV片| 性无码专区无码| 丁香九月综合| 天天爽天天| bbwcuckold精品熟妇| 婷婷久久网| 91丨熟女丨首页| 色色丁香五月天| 色99自拍| 亚洲精品白浆高清久久久久久| 亚洲开心激情网| 五月天婷婷在线视频| 人人摸人人摸| 色玖玖爱| 人人插操| 亚卅毛片| 欧美激情xxxXX| 亭亭玉月丁香| 五月天影院婷婷在线观看| www.婷婷五月天.com| 97色色色视屏| 天色综合网| 激情久久五月天| 五月激情综合网| 91网站黄| 99久久婷婷综合| 久婷久婷| 亚洲免费99| 五月亭亭欧美女人| 国产真人做爰视频免费| 大香蕉婷婷丁香视频在线| 亚洲五月天综合色| 中文AV在线观看| 黄色三级日本| 精品乱码久久久久| 久久99久久99精品免视看婷婷| 深爱开心激情| www超碰| 九九在线视频| 亚洲久久婷婷丁香五月天| 毛片新网地| 五月激情小说| 人妻激情在线| 99性感视频| 超碰9在| 深爱激情婷| 色婷婷色情| 九九成人| 五月激情天| 婷丁香久综合| 欧美三日本三级少妇三99| 久久怕怕视频| 九九无码| 天天爽日日爽夜夜爽| 大香蕉天堂| 99啪啪视频| 99热只有精品在线观看| 五月丁香美女| 中文字幕激情综合| 亚洲第一成人AV| 色六月婷婷| 五月欧美色色五月| 一根材五月婷成人| 91人人澡人人爽人人看| 中文字幕久久婷九女同| 亚洲亚洲人成综合网络| 99婷婷国产最新视频| 五月丁香六月婷婷中合网| 九九性爱网| 伊人在线视频| www色色色com| 久久久久久人妻| 五月丁香婷婷综合网| 日本颜色视频人人爱| 激情亚洲色图片丁香综合| 婷婷久久综合久| 91人人超碰在线| 九九九九九九九九九九九九九国产精品| 任你草| 激情亚洲网| 第四色五月婷婷| 婷婷五月天激情文学| 午夜电影网VA内射| 操操操AV| 天天综合网在线| 99热在线观看免费| 日日夜夜婷婷| 天天射影院| 五月丁香婷婷成人网| 2025天天爽天天摸| 这里只有精品网站| 激情九九六月激情免费视频| 成人五月天丁香婷| 久久a热| 99热这里只有精品在线观看| 激情综合五月天| 亚洲超碰在线| 色色综合网www| 99国产在线精品视频| 日产精品一线二线三线芒果| 亚洲欧美成人在线观看| 99久久.www| 激情熟女网| 亚洲精品网址| 激情AV| 久久综合丁香五月| 激情亚洲色图片丁香综合| 就爱干 在线| 偷拍视频五月天| 亚洲丁香五月| 综合AV在线| 99re久久| 91婷婷视频| 99热在线网站| 九九国产视频| 五月婷婷六月奇米网丁香| 伊人深爱综合| 99久在线视频| 九九婷婷五月天| 伊人超碰在线| 亚洲小视频免费播放| 7月婷婷六月丁香| 深爱开心激情网| 五月之婷婷| 激情图片久久| 欧美色片中文字幕久久久久| 97精品在线| 婷婷丁香六月综合激情站| 色色色精品无码区| www.色五月| 五月婷在线观看| 激情综合网激情五月丁香五月俺也去| 色欧美影院| 综合综合色色| 久久久久人妻网址| 欧美大肥婆大肥BBBBB| 激情 久久 婷婷| 人人操 色| 久久视屏这里只有久久| 99视频精品全部观看10| 精品夜夜澡人妻无码AV| 五月色丁香| 天天日天天摸天天| 婷婷丁香六月| 99色免费| 日韩精品无码99| 香蕉操亚洲| 北条麻妃九九九国产精品视频| 久久在线大香蕉| 五月婷高清视频| 开心网五月色婷婷| 色五月丁香五| 丁香六月AV| 日日噜噜夜夜狠狠久久丁香六月| 精品久久久91久久影视网| 亚洲AV无码成人精品区电影网| 97丁香花五月天激情小说| 九九在线这里只有精品视频| 色欲一区二区三区精品A片 | 99国产97在线,| 亚洲综合九九| 五月婷婷亚洲| 大胆伊人久久| 开心婷婷五月综合| 色播五月婷婷| 五月天综合网| 久久丁香婷婷色情综合| 五月婷婷亚洲综合网| 婷婷五月天福利| 欧美日韩中文国产一区发布| 丁香五月婷婷狠狠色| 另类小说激情五月天| 婷婷五月激情中文字幕| 九九热九九| 亚洲操B| 天天揷综合网| 激情婷婷丁香色情五月天| 另类图片天天影视在线观看| 国产av基地| 操人妻视频91| 日本天堂久久| 狠狠干五月天| 久久婷婷人人| 伊人婷婷综合| 欧美va亚洲va| 中文字幕av在线播放| 婷婷色一二三区波多野结衣| 久久总和99| wWW九九在线播放| 中文av网| 99色在线| 国产婷婷色综合AV蜜臀AV| 六月五月丁香五月欧美| 成人午夜天| 九九热区一区二区三区| 中文字幕高清av| 色视频五月天| 激情五月天色色网| 人妻熟人中文字幕一区二区| 欧美精品熟女一区二区| 91成人电影| 婷婷五月天手机版视频| 九九色大香蕉| 激情五月天婷婷图| 久久久天堂国产精品女人| 思思热精品免费视频| 丁香五月婷婷综合激情哟哟哟| 久久婷婷在线| 无码区婷婷五月花开| 九九aV| 丁香亭亭久久| 情色五月天 网站| 天天色天天日天天舔| 女婷久久| 狠狠插.com| 99热这里只有精品22| 丁香五月停停基地| 被强行糟蹋的女人A片| 激情丁香五月婷婷啪啪| 91avse| 五月婷婷色| 丁香月六月| 婷婷六月啪啪| 日日爱699| av五月丁香婷婷网| 婷婷久热| 色色色99| 久久伊人日日夜夜| 五月婷婷影院| 丁香色情五月综合激情| 婷婷成人五月天成人文学| 五月天婷婷丁香视频| 9婷婷内射| 日日日日日| 夜夜谢天天干| 亚洲综合色丁香婷婷六月| 色婷婷文字幕| 狠狠干最新地址| 婷婷五月激情图片| 91精品久久久久、久五月天| 丁香六月av| 狠狠色网| 99热最新国内| 五月丁香亭亭| 九九热在线99| 99热综合色图| 激情开心五月天婷婷基地丁香社区| 五月婷婷深深爱| 婷婷香蕉精品| 精品夜夜澡人妻无码AV| 色啪网| 操人妻视频91| 99免费视频在线观看爱| 五月综合在线婷婷图片| 亚洲激情综合色站| 日韩一级片| 1024欧美日韩精品久久久| 激情五月激情综合网| 激情丁香五月| 五月婷婷婷| 五月天激情Av| 色五月丁香一区在线| 九九碰九九爱97超| 婷婷中文无码| 99在线视频播放| 微拍92| 免费观看全黄做爰的视频| 久久草大香蕉| 欧美va在线| 99热亚洲精品| 五月色网| 色色丁香婷婷综合| 五月丁香福利| 婷婷丁香六月| 色色五月天婷婷| 2016日日夜夜操| 一区二区传媒视频| 久久国产高潮白浆免费观看99| 精品无码久久久久久久久| 天天插综合| 亚洲色综合| 激情床戏| 99啪啪| 超碰av在线| 99热在线中文字幕| 日韩无码色色| 婷婷五月天丁香| 久久这里只有精品8| 婷婷五月天成人网| 九九久久精品| 1024操逼| 五月丁香婷婷色播无码| 91岛国片| 久久98| 夜夜爽天天| 亚洲视频色色| 天天狠狠色综合| 九九热视频思思| 99热这里只有免费| 国产这里只有精品| 超碰人人色| 人人播| 国产免费一区二区在线A片视频| 九九精品热| 无码AV久久久久久久久| 狠狠色综合久久久久| 色婷婷性爱| 亚洲婷婷91丁香| 色综合久久中文| 激情综合五月天| 91天天操天天干天天射| 婷婷亚洲色| 99色爱| 婷婷五月天涩涩| 日韩视频女神99| 亚洲激情av| 九九视频这里是精品五月| 日本噜噜色网| 久久精品9| 精品无码久久久久久久久| 99视频在线观看地址| 激情五月婷婷色综合| 99九九在线视频| 丁香婷婷色五月| 中文aV网| 色情五月婷| 26uuu国产| 丁香五月成人| 99碰碰碰| 久久这里这里有精品免费视频| 色五月在线| 思思久久精品| 99热18| 婷婷伊人綜合中文| 7月婷婷六月丁香| 亚洲日韩26uuu| 99热精品中文字幕| 婷婷六月综合激情| 99热97美女| 五月丁香免费视频| 日本成人小说婷婷六月| 色色五月丁香婷婷| 五月婷视频| 婷婷五月中文字幕| 五月激情视频网| 欧洲亚洲精品| 日日夜夜狠狠| www.久久99热地址发布| 国产寻花在线| 久久综合性| 欧美情色一区| www.色婷婷| 伊人五月天婷婷| 99精品自拍视频| 狠狠干五月| 国产成人综合在线| 99热在线成人网站| 91日韩在线| 九热视频精品| 丁香五月天五码婷婷| 成人婷99最新| 色yeye色综合| 九九视频热| 日韩亚洲视频| 日本久草福利| 日日操,日日爽| 26uuu欧美亚洲日韩| 热99玖玖99玖玖99九九| 国产这里只有精品| 好好日激情五月天| 久久精品爱爱| 五月婷综合性中心| 五月丁香六月婷婷亚洲天堂网站| 9热久久在线| 成人av在线网| 欧美成人Va| 精品99视频| 婷婷综合久久综合| 夜夜做天天爽| 婷婷丁香在线| 九九黄色网| 91ncm视频| 91美女啪啪| caopeng97日韩| 欧洲亚洲精品| 99ri视频| www.超碰在线| 久热成人| 国产精品久久..4399| 一级性爱大片| 五月丁香六月婷婷国产视频| 久草九一| 天天做天天摸| 激情碰碰碰| 五月欧美色色五月| 亚洲狠狠色丁香婷婷综合久久| 亚洲丁香婷婷五月天综合色| 久久九九色| 久久精品婷婷| 亚洲视频五区| 婷婷久久综合| 五月丁香久人妻中文| 在线色色| 五月色综合网欧美网| 亚洲综合色婷婷| 丁香五月婷婷色情综合| www色婷婷| 黄网网站在线播放| 久久婷婷综合五月天| 婷婷综合色色| 婷婷久久综合| 天天天摸夜夜夜玩| 婷婷综合另类| 五月丁香 啪啪| 色情丁香五月婷婷精品| 99热8| 玖玖爱伊人网| 久99在线视频| 五月五婷婷| 丁香五月 激情文学| 五月婷婷婷婷| 丁香五月欧美色综合| 91re色综合视频| 天天久久综合| 五月婷婷六月丁香玖玖玫瑰91| 激情网婷婷五月天| 激情六| 欧美丰满熟妇BBB久久久| 色婷婷香蕉丁丁网| 青青草99热久久精品国| 色色色色综合| 五月天另类小说久久小说网| 97操碰在线视频| 1024人妻| 婷婷丁香综合成人| 婷婷99视频精品| 色五月综合网| 激情綜合W W W,激情五月天| 天天久久狠狠色综合| 婷婷色中文字幕| 丁香色五月婷婷91桃色| 99日本黄站| 久久婷婷五月| 日本3级片一区2区| 成人无码精品1区2区3区免费看| 五月激情网五月综合网| 美女91一起草| 欧美日韩成人在线| 橾逼网| 丁香婷婷六月激情文学| 丁香五月婷婷总啪啪| 久久婷婷综合基地| 伊人婷婷五月| 久久99网站| 香蕉久日夜| 任我肏| 天天操天爱综合| 久久五月激情| 99九九99九九九视频精品| 午夜天堂啪啪| 亚洲成人五月天| xxxx五月| 日韩成人AV在线播放| 无码一区精品一区视频| 五月丁香综合激情| 五月六月伦理| 涩涩婷婷五月| 五月婷婷激情综合在线| 无码髙清| 久草视频大香蕉99| 内射人妻视频国内| 99热这里只有精品3| 女人天堂 AV| 99 频99热国里只有精品| 激情图片久久| 97超碰在线观看免费| 久久久久久久人妻| 婷婷亚洲影院| 99久久婷婷五月综合| 丁香婷婷色| 婷婷五月AV| 人妻中文字幕网| 九九色黄色| 91精品国产综合久久久不卡电影| 中文人妻AV久久人妻18| 国产成人网址| 免费观看18视频网站| 9久热| 97人人看| 久久久久9| 99ri在线观看视频| 激情婷婷色色| 好好干Av| 蜘蛛女免费观看完整版高清电影 | 超碰在线观看三级片| 综合五月婷婷| 久久久国产精品黄毛片| 欧美久久一级内射wwwwww.| 图片区 小说区 区 亚洲五月| 激情婷婷五月天| 久久久久久久人妻| 亚洲乱码日产精品BD| 天天拍天天操| 人人操日| 婷婷五月天论坛| 99色丁香婷婷综合网| 6080av| 婷婷狠狠操| 久久久婷婷婷| 日韩在线9| 婷婷五月天激情五月天| 九月色婷婷综合| 丁香五月花| 99er热精品视频| 亚洲六月色婷婷| 久热99中文字幕| 亚洲乱码在线观看| 午夜理论片最新午夜理论剧| 色色综合成人网| 天天人人天天爽| 天天狠狠色噜噜| 亚洲国产色色| 激情视频综合| 久草婷婷| 色综合色综合色综合| 一区二区乱码视频| 狠狠色噜噜狠狠色噜噜噜999| 四虎婷婷五月天| 五月天激情小说欧美激情| 9l视频自拍9l九色9l成人| 亚洲色网络| 丁香五月天殴美激情| 99热在线观看免费| 97人人干人人操| 亚洲日韩一页精品发布| 丁香久久九九99| 五月丁香日本一抹本| 国产精品色一哟哟| 丁香色综合| 久久视频在线视频| 九九99在线视频| 婷婷久久欧美| 天天艹夜夜艹| 99热精品在线观看| 五月婷婷日| 五月婷婷 六月丁香| 五月丁香六月婷婷网| 天天爽天天干| 热久久色| 人妻操在线看| 开心激情网在线| 综合五月激情| 狠狠色五月激情| 五月婷婷六月丁香在线视频免费在线观看| av大香蕉| 五月婷婷五月天| 天天橾夜夜爽| 丁香网站| www.99在线| 五月天婷婷在线播放| 另类在线| 久久99久久99精品免视看婷| 涩涩涩五月天| 4438亚洲欧美| 伍月婷婷免费视频| 99久在线精品| 色涩影院六月丁香| 五月花婷婷丁香| 婷婷色色五月天| 猫咪伊人久久| 夜夜骑夜夜撸| 91大操| 玖玖伦理电影| 五月天另类小说| 99九九视频| 日韩操| 超级碰碰97在线| 丁香六月AV| 91色婷婷综合久久中文字幕二区| 五月丁香啪。| 日本社区五月天激情| 午夜不卡久久精品无码免费| 六月丁香基地| 婷婷综合视频| www.超碰在线| www.99婷婷| 婷婷久久精品| 《久久综合九色综合97婷婷| 五月天色影院| 久久婷婷大香蕉| 成人九九视频| www.com久久久久久久久久久久久久久久久| 婷婷基地成人五月天| 深爱五月婷婷| 激情另类综合| www.久久99| 天天舔夜夜操www com| 91精品91久久久中77777| 综合久久高清| 色丁香久久| 亚洲永久免费| 五月丁香综合在线| 成人五月天色天堂| 双性美人被调教到喷水A片| 婷婷激情五月天7| 99视频内射三四| wwW天天干| 中文字幕欧美日韩VA免费视频| 久久久久婷婷五月热综合| 五月综合色| 婷婷五月俺要去| 欧美性生交xXxX久久久| 五月天激情美女久久| 五月激香蕉网| 涩涩涩五月天| 欧洲一区二区| 五月丁香成人网| 婷婷五六日| 久久精彩视频18| 天天插天天插天天插天天插| 国产综合婷婷| 人人爱操| 丁香五月激情婷婷激情| 色色色色色色色五月| 日日操夜夜骑| 爽极品色| 亚洲日韩乱码一区二区三区四区| 丁香六月激情蜜桃| 日韩无码人妻一区二区| 另类天堂| 色五月激情综合| 久久女人九九| 99在线观看| 男人综合网| 中文字幕在线不卡视频| 久久久婷| AV操一操| 99自拍视频网站| 丁香五月色综合色播五月| 超碰九热| 综合色情网| 日日噜狠狠色综合久久| 操日本三片99| 777精品久无码人妻蜜桃| 色婷五月天激情| 97精品综合| 天堂呦 呦百度搜索-百度搜索| 激情av在线| 五月亭亭六月激情| 激情九九六月激情免费视频| www.超碰| 综合网啪| 天天干天天玩天天夜天天射天天操天天日蜜臀少妇| 日韩美一级毛卡片| 色5月婷婷| 五月丁香成人视频| 99色啊| 五月丁香在线观看99| 99热综合| 婷婷五月综合社区| 俺去也在线www色官网| 情色五月天网站| 99热有精品在线观看| 婷婷综合久久| 天天久| 婷婷丁香五月激情图片| 久久狠狠干| 激情五月婷婷综合网| 久久 婷婷 五月天| 天天综合永久| 丁香婷婷婷五月综合色情| 99啪啪| 激情五月天伊人影院| 六月色婷婷色| 四射综合网| 国产精品久久久久久妇女6080 | 《丁香激情综合久久伊人久久》影视在线观看 -高清预告手机免费播放 -三妹影院 | 五月天综合| 婷婷五月永远18免费久久久| 99在线资源| 熟妇国产| 久久性爱视频| 五月婷中文字幕| 99热成人在线观看| www.国产亚洲69ty.久久久久久久久久久久| 婷婷国产五月天17c| 欧美精品XXXXBBBB| 久操热线| 97色色色| 婷婷六月激情在线视频| 伊人大香五月天| 色婷婷777狠狠| 色婷婷aV四虎| 婷婷四色成人综合色视| 伊人碰碰碰| 一级七香蕉| 色综合久久久无码中文字幕999| 亚洲综合色婷婷| 丁香婷婷深情五月亚洲| 丁香五月人妻熟女| 成人色站,在线视频,看片-SS1AV| 91ncm视频| 999九九九久久久99HD| 韩日另类| 99在线精品免费视频| 久久婷婷综合五月天| 91婷色| 极品另类| 激情五月天小说|五月天开心激情网|亚洲精品国产自在现线|黄色五月天 | 久久久色情| 九九婷| 欧美精品中文字幕亚洲专区| 69精品人人人人| 思思精品视频| 超碰99在线观看| 色婷婷88| 99re在线视频| 色老久久| 久9视频免费播放| 婷婷五月天综合网| 99爱视频在线观看| 五月天久久婷婷| 五月婷婷中文字幕| 欧美激情综合五月色丁香| 性生活久久朋友人妻| 人人干Av| 色婷婷丁香香香蕉视频| 五月激情网综合| 久久久久人妻中文| 99热这里只有精品最新网址| 婷婷激情五月天小说校园| 亚洲丁香五月在线观看| 性生活久久朋友人妻| 丁香色综合| 五月天婷婷色综合| 99热这里都是精品| www.久久爱.com| 玖玖综合网| 久久机热/这里只有精品| 99视频在线| h在线看免费版在线看| 被强行糟蹋的女人A片| 人妻丰满精品一区二区A片| 五月WWW| 骚货艹网站视频| www.99热视频| 五月丁香婷婷在线| 99综合免费视频| 91操人人操| 五月天激情日色在线| 青青草原伊人网| 超碰精品在线| 五月婷婷狠天天色综合| 爱婷婷五月| 婷婷五月天久久| 99热91| 亚洲视频一区| www.久9| 99热超碰| 艾小青av| 五月天色婷婷av| 五月天婷婷久久| 五月婷婷无码专区| 北条麻妃伊人| 91精品啪| 四色永久成人网站| 就爱操www com| 五月天网站亭亭| 五月丁香色| 天天色情站| 9999综合99综合人| 99 热国产在| 五月丁香激情欧洲啪啪| 丁香五月成人| 久色网| 超碰免费电影| 26UUU| 26uuu精品国产| 人人播| 精品操逼一区二区| 99热r| 婷婷五月天高清无码| 日本久久99| 偷拍99在线视频观看| 久久久五月天| 99re思思久久| 97精品综合久久| 99视频在线观看视频| 夜夜爽天天| www.操.com| 亚洲视频在线观看| 99精品97| 日日噜狠狠色综合久久| 99精品一二三四视频| 黄网在线免费观| 激情性爱五月天| 79色色| 国产精品第一国产精品| 1024婷婷综合久久五月天| 久久五月婷婷开心网| 九九热av| 五月色婷婷夜色| 天天人人天天爽| 99ri精品视频在线观看| 婷婷五月丁香综合瑟瑟| 色婷婷av在线观看| 蜜桃婷婷狠狠久久综合| 六月丁香婷婷天堂| 九九精品热| 伊人九九综合| 伊人久久丁香婷婷六月五月综合| 天天做夜夜爽| 国产日韩av片| 女高怪谈在线观看| 国产午夜精品一区二区三区嫩草| 97碰超级人人看| 九九热在线视频观看| 亚洲综合色婷| 九九热只有这里是精品| 色婷婷av在线观看| 99丁香五月婷婷在线| 五月天色婷婷基地| 国精产品一区一区三区免费视频| 色色丁香| 久久综合五月天| 激情综合色婷婷啪啪六月天| 天天情色综合网| 69凹凸成人综合网| 岛国资源网| 大香蕉九九| 99精品热视频只有精品10| 99亚洲视频| aaaa.黄| 六月丁香激情网| 99热伊人综合| 激情五月四色| 国产在线网| 五月婷在线色视频| 国精产品一区一区三区免费视频| 色八月婷婷| 激情网五月| aⅤ79成人片| 91欧美| jiqingtaose五月天| 亚洲综合色色| 91操人视频| 97色在线| 五月噜噜噜色综合| www.婷婷六月天| 色噜噜,噜噜色| 免费视频WWW在线观看网站| 精品一二三区视频立| 99爱在线视频| 午夜丁香六月婷| 少妇人妻丰满做爰XXX| 欧美五月丁香在线观看| 午夜精品久久久久久久爽| 四五月婷婷| 色色五月天 亚洲| 久久久精品色色色| 婷婷五月精品中文| 五月天伊人综合| 91丨九色丨高潮丰满日本| 99精品视频网站| 五月激情婷婷图片基地| 成 人片 黄 色 大 片| 六月五月婷婷| 日本理论久久| 成人在线不卡| 国产噜一噜天天噜| 99热网精品| 天天做天天摸| 91九色 婷婷| 99精品在线观看| 丁香五月婷婷激情视频播放| 九九精品丁香花| 五月色丁香| 五月天久久婷婷| www.狠狠色.com| 一级韩国产精品毛| xxxx久| 性爱动图国产麻豆一区二区三区| 亚洲亚洲人成综合网络| 色五开心五月五月深深爱| 六月丁香婷婷色狠狠久久| 久久久久久久久久8888| 婷婷五月开心中文字幕色| 97操在线资源| 大香蕉五月天婷婷| 久久久久久人妻久久久久久久久久人妻久久久 | 91丨九色丨国产打屁股网站| 丁香五月网址| sewuyue第四色| 9有码中文| 99噜噜噜在线播放| www.jiujiujiu| 全国最新疫情| 日本97在线视频| www.91av.com| 日本在线视频www色| 高清无码中文字幕aVDV| 99性视频| 亚洲精品另类| 激情五月激情综合网| 91精品综合久久婷婷九色| 99re思思热这里| 欧美激情综合| 欧美日韩国产一区二区| 免费观看全黄做爰的视频| 日本久热| 九九视频在线观看| 色婷婷综合五月| 99性视频| www.五月丁香| 激情综合五月丁香六月婷婷| 色色色欧美| 久久久8| 舔色婷婷| 激情五月视频| 久久五月天合网| 在线中文字幕av| 美腿丝袜AV天堂网| 激情AV综合| 丁香六月激情| 九月婷婷| 色综合丁香婷婷| WWW,婷婷,COM| 天天日夜夜操五月| 午夜色婷婷| 亚州操逼网| 精品一区二区三区三区| 在线中文字幕免费视频| 欧美成人一区二区三区在线视频 | 久久视频婷婷| 超碰人人妻| 欧美综合五月天婷婷tin| 五月婷婷丁香六月| 久久免费精彩视频| 色婷婷影院| 久久久999精品| 亚洲婷婷基地| 国产精品色色| 26UUU精品一区二区| 亚洲另类噜噜| 99免费视频网| 亚洲综合婷婷六月丁香五月| 五月花婷婷最新| 狠狠久久婷五月综合色| 亚洲五月丁香综合网| 丁香色六月| 欧美日本VA| 婷婷综合欧美| 亚洲精品乱码久久久久久按摩观| 伊人久久99| 91avse| 婷婷成人综合| AAA久久| 狠狠草狠狠草| 久久综合五月天| 91色久| 欧美激情五月天| 欧美性猛交XXXX乱大交极品| 风流少妇A片一区二区蜜桃| 少妇性BBB搡BBB爽爽爽电影| 熟女人妻一区二区三区免费看| 噼里啪啦在线观看免费完整版视频 | 大香蕉婷婷丁香视频在线| 97人人看| 九月色婷婷| 亚洲亚洲激情| 欧美综合激情五月| 亚洲成人va| 五月天播播中文字幕| 五月婷婷激情久久| 丁香成人五月天| 91操人| 丁香五月综合网| 大香蕉丁香| 亚洲视频二区| 夜夜涩涩涩| 丁香六月视频免费观看| 婷婷中文字幕网| 变态另类色图| 久久婷婷五月天激情四射| 强辱丰满人妻HD中文字幕| 色色五月婷婷| 五月天婷a在线| 丁香五月婷婷久久久| 热99在线精品| 久久丁香| 先锋资源 996| 日日操夜夜爽| 99熟女| 八戒青柠影视剧在线观看| 丁香99| 九九热99视频在线| 色之综合网| 亚洲色情网站| 色色丁香婷婷| 精品成人无码A片观看香草视频| 天天综合网~91| 日本三级中国三级99| 国产欧美婷婷五月| 99久在线精品99re8| 九九热99热| 日日操天堂| AV在线观看网站| 婷婷狠狠五月综合| 蜜桃人妻无码AV天堂三区| 五月天久久久| 伊人久久大香线蕉AV最新午夜| 超碰免费人人| 国产SUV精品一区二区883| 婷婷色五月天色| 成人羞羞啪啪 全 视频| 婷婷性色| 色婷婷狠狠| av线电影| 婷婷五月丁香基| 久久婷婷综合国产| 国产毛片精品一区二区色欲黄A片| 五月婷婷综合性爱噜噜| 激情文学天天| 九九综合| 碰碰人人人| 秋霞黄色一级久久| 操操操Av| 黄色热99| 永久无码色| 婷婷久久色| 国产婷伊人| 激情五月综合网| 久久538| 江苏少妇性BBB搡BBB爽爽爽| 久99久在线| 六月婷婷中文字幕| 日韩成人中文| 久久五月天色婷婷| 欧美性爱一区| 亚洲成人在线电影网站| 夜夜人妻五月天| 日韩久久色| 婷婷五月天性爱视频| 亚洲人人干| 综合五月婷婷| 99人人干人人| 五月婷婷激情久久| 香蕉人妻AV久久久久天天| 99操视频| 欧美乱码国产一级A片| 国产精女同一区二区三区久| 色五月无码| 婷婷五月天激情网| 狠狠色丁香婷婷久久综合| http://www.sd-xiangsu.com/| 蜜桃人妻无码AV天堂三区| 色综合色综合网| 熟女网站久久| 久草丁香婷婷五月天婷| 婷婷激情五月天视频在线| 日本不卡高字幕在线2019| 久久这里这里有精品免费视频| 久99久精品视频| 99精品女人天堂| 亭亭五月色男人| 久久这里只有精品视频15 | 五月婷婷综合性爱噜噜| 嫩草AV久久伊人妇女超级a| 欧美顶级少妇做爰HD| 青青草搞屄视频网站| 噜噜视频| 久久久com| 日本精品99| 黄网网站在线播放| 日本色99| 4438激情网| 超碰免费大香蕉| 操操自拍| 亚洲AV综合在线观看| 婷婷九月亚洲| 激情综合网址| 色综合色五月| 九九五月天| 婷婷色综合| 婷婷丁香在线| 五丁香激情综合| 99国产精品白浆在线观看免费| 五月视频日本免费观看| 欧亚成人A片一区二区| 99热精这里只有精品| 九九九九热99超碰| 99久久6|