diff --git a/BBDecoder.cpp b/BBDecoder.cpp index 9118787..e73a186 100644 --- a/BBDecoder.cpp +++ b/BBDecoder.cpp @@ -51,6 +51,8 @@ CKERROR CreateBBDecoderProto(CKBehaviorPrototype **pproto) int BBDecoder(const CKBehaviorContext& behcontext) { + InitVSDTempFolder(behcontext.Context); // yyc mark: init dynamic temp folder first. + interface_t parse_bb_test(CKBehavior *bb, CKFile *file); void decorate(interface_t &data, CKBehavior *bb); void generate_bb_test(interface_t &interface_data, CKBehavior *bb, CKFile *file); diff --git a/Decorator.cpp b/Decorator.cpp index cd9f8bd..f61aac6 100644 --- a/Decorator.cpp +++ b/Decorator.cpp @@ -7,9 +7,6 @@ #include #include -//extern "C" { -// extern void __stdcall OutputDebugStringA(_In_opt_ const char* lpOutputString); -//}; void printfdbg(const char* fmt, ...)//print a format string to VS debug output { char s[1024]; diff --git a/Generator.cpp b/Generator.cpp index 6bfa8d4..8a34be3 100644 --- a/Generator.cpp +++ b/Generator.cpp @@ -234,16 +234,18 @@ void generate_bb_test(interface_t &interface_data, CKBehavior *bb, CKFile *file) if (name[i] == '.' || name[i] == '_') continue; name[i] = '_'; } - sprintf(filename, base_path "/generator/generator_out_%s.log", name); Generator generator = Generator(interface_data); char *buffer = new char[1048576]; int length = generator.Generate(buffer); +#if defined(VSD_ENABLE_LOG) // yyc mark: only enable logger on Debug config + sprintf(filename, "%s/generator_out_%s.log", VSDTempFolderGenerator, name); FILE *fout = fopen(filename, "wb"); for (int i = 0; i < length * 4; ++i) { fputc(buffer[i], fout); } fclose(fout); +#endif extern void parse_string_test(CKBehavior *bb, char *buffer); parse_string_test(bb, buffer); diff --git a/Parser.cpp b/Parser.cpp index 1939cda..5d7b171 100644 --- a/Parser.cpp +++ b/Parser.cpp @@ -2,6 +2,7 @@ #include "precomp.h" #include #include "interfaceData.h" +#include using namespace std; class Parser @@ -301,7 +302,12 @@ class Parser } void parse() { + // yyc mark: only enable logger on Debug config +#if defined(VSD_ENABLE_LOG) m_logger = fopen(m_filename, "w"); +#else + m_logger = fopen("NUL", "w"); +#endif m_depth = 0; char *p = m_data; parse_chunk(p); @@ -379,7 +385,7 @@ void parse_string_test(CKBehavior *bb,char *buffer) } map bbTypeMap; pre_scan(bb, bbTypeMap); - sprintf(filename, base_path "/generator/parser_out_%s.log", name); + sprintf(filename, "%s/parser_out_%s.log", VSDTempFolderGenerator, name); Parser parser = Parser(buffer, filename, bbTypeMap); parser.parse(); } @@ -399,7 +405,7 @@ interface_t parse_bb_test(CKBehavior *bb, CKFile *file) } map bbTypeMap; pre_scan(bb, bbTypeMap); - sprintf(filename, base_path "/parser/parser_out_%s.log", name); + sprintf(filename, "%s/parser_out_%s.log", VSDTempFolderParser, name); //bb->PreSave(file, 0); CKStateChunk *chunk = bb->Save(file, 0); int length = chunk->ConvertToBuffer(NULL); diff --git a/StdAfx.cpp b/StdAfx.cpp index e679268..48d59e2 100644 --- a/StdAfx.cpp +++ b/StdAfx.cpp @@ -3,4 +3,45 @@ // stdafx.obj will contain the pre-compiled type information #include "precomp.h" +#include +#include +#include +char* VSDTempFolderGenerator = nullptr; +char* VSDTempFolderParser = nullptr; +void InitVSDTempFolder(CKContext* ctx) { + FreeVSDTempFolder(); // free first + + auto pathmgr = ctx->GetPathManager(); + assert(pathmgr != nullptr); + + // WARNING: it seems that Virtools will not cleanup temp folder + // when crash or terminated by Visual Studio. + // Programmer may need manually clean it. + std::filesystem::path temp(pathmgr->GetVirtoolsTemporaryFolder().CStr()); + std::string cache; + temp /= "VSD"; + + auto generator = temp / "generator"; + cache = generator.string(); + VSDTempFolderGenerator = new char[cache.size() + 1]; + std::memcpy(VSDTempFolderGenerator, cache.c_str(), cache.size() + 1); + std::filesystem::create_directories(generator); + + auto parser = temp / "parser"; + cache = parser.string(); + VSDTempFolderParser = new char[cache.size() + 1]; + std::memcpy(VSDTempFolderParser, cache.c_str(), cache.size() + 1); + std::filesystem::create_directories(parser); + + ctx->OutputToConsoleEx("VirtoolsScriptDeobfuscation: Log path is \"%s\"", temp.string().c_str()); + OutputDebugStringA("Log path: "); + OutputDebugStringA(temp.string().c_str()); + OutputDebugStringA("\n"); +} +void FreeVSDTempFolder(void) { + if (VSDTempFolderGenerator != nullptr) delete[] VSDTempFolderGenerator; + if (VSDTempFolderParser != nullptr) delete[] VSDTempFolderParser; + + VSDTempFolderGenerator = VSDTempFolderParser = nullptr; +} diff --git a/VirtoolsScriptDeobfuscation.vcxproj b/VirtoolsScriptDeobfuscation.vcxproj index 200ae67..d8564cb 100644 --- a/VirtoolsScriptDeobfuscation.vcxproj +++ b/VirtoolsScriptDeobfuscation.vcxproj @@ -70,6 +70,7 @@ Use precomp.h $(IntDir)$(ProjectName).pch + stdcpp17 ck2.lib;vxmath.lib;%(AdditionalDependencies) @@ -103,6 +104,7 @@ Use precomp.h $(IntDir)$(ProjectName).pch + stdcpp17 ck2.lib;vxmath.lib;%(AdditionalDependencies) diff --git a/precomp.h b/precomp.h index 28c3d2e..628b716 100644 --- a/precomp.h +++ b/precomp.h @@ -4,7 +4,10 @@ #include "VxDefines.h" #include "CKAll.h" -#define base_path "C:\\Users\\jjy\\Desktop\\test" + +extern char* VSDTempFolderGenerator; +extern char* VSDTempFolderParser; +extern void InitVSDTempFolder(CKContext* ctx); +extern void FreeVSDTempFolder(void); + extern void printfdbg(const char* fmt,...); -//#undef min -//#undef max