// 90CN_digest_trace.h —— 章节过场(op1378 / op24)客户端侧只读日志。 // // 只在补丁已有的 class0 派发代理里调用,不新增 hook。 #pragma once namespace cn90 { // 传入 class0 包首地址(bytes[0]=class,bytes[1..2]=opcode)。 // 命中 op1378 / op24 时写一行到 90CN_digest.log;其它包直接返回。 void LogClass0CutscenePacket(const unsigned char* bytes); // 记录一次 *.avi 打开:路径 + 调用点 RVA(用于定位客户端影片播放函数)。 void LogAviOpen(const char* path, const char* callerRvas); // 记录影片函数入口的寄存器/栈参数,用于判定调用约定。 void LogMovieEntry(unsigned retRva, unsigned ecx, unsigned edx, unsigned arg1, const char* s1, unsigned arg2, const char* s2, unsigned arg3, const char* s3); // 记录一次「主动调用客户端影片播放器」的尝试(willCall=1 表示真的调用了)。 void LogMovieInvoke(unsigned fnRva, unsigned thisPtr, const char* path, int willCall); void LogMovieChain(const char* chain); // 记录一次「原始栈扫描」结果:把栈上出现的 bdvid32.dll / DNF.exe 返回地址 // 连同「前一条指令像不像 call」一起写出来(带 * 的更像真正的返回地址)。 void LogMovieStack(const char* frames); // 记录影片对象 Open(path) 的一次调用:返回地址、this、宽字符路径、栈上候选返回地址。 void LogMovieOpen(unsigned retRva, unsigned thisPtr, unsigned argPtr, const char* pathText, const char* stackText); // 记录影片对象 Play() 的一次调用。 void LogMoviePlay(unsigned retRva, unsigned thisPtr, const char* stackText); // 记录影片 Render 的调用(计数 + this + 返回地址 + 栈上候选)。 void LogMovieRender(long count, unsigned thisPtr, unsigned retRva, const char* stackText); // 一次性记录播放对象 vtable 的 12 个槽位(模块!RVA)。 void LogMovieVtable(unsigned object, unsigned vtable, const char* slots); // DLL 初始化完成时写一行 "ready",便于确认补丁版本已加载。 void LogStoryDigestTraceReady(); }