_tmain.cpp 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. #include "def.hpp"
  2. namespace std {
  3. #ifdef UNICODE
  4. typedef wstring Tstring;
  5. #else
  6. typedef string Tstring;
  7. #endif
  8. }
  9. int _tmain(int argc, TCHAR* argv[]) {
  10. if (argc != 2 && argc != 3) {
  11. _tprintf_s(TEXT("Usage:\r\n"));
  12. _tprintf_s(TEXT(" navicat-patcher.exe <Navicat installation path> [RSA-2048 PEM file]\r\n"));
  13. return 0;
  14. }
  15. { // check path validity
  16. DWORD attr = GetFileAttributes(argv[1]);
  17. if (attr == INVALID_FILE_ATTRIBUTES) {
  18. _tprintf_s(TEXT("Failed to get installation path attribute. CODE: 0x%08x @[GetFileAttributes]\r\n"), GetLastError());
  19. return 0;
  20. }
  21. if ((attr & FILE_ATTRIBUTE_DIRECTORY) == 0) {
  22. _tprintf_s(TEXT("Error: Path is not a directory.\r\n"));
  23. return 0;
  24. }
  25. }
  26. std::Tstring navicat_exe_path(argv[1]);
  27. if (navicat_exe_path.back() != TEXT('/') && navicat_exe_path.back() != TEXT('\\'))
  28. navicat_exe_path.push_back(TEXT('\\'));
  29. navicat_exe_path += TEXT("navicat.exe");
  30. std::Tstring libcc_dll_path(argv[1]);
  31. if (libcc_dll_path.back() != TEXT('/') && libcc_dll_path.back() != TEXT('\\'))
  32. libcc_dll_path.push_back(TEXT('\\'));
  33. libcc_dll_path += TEXT("libcc.dll");
  34. DWORD NavicatMajorVersion;
  35. DWORD NavicatMinorVersion;
  36. if (!patcher::GetNavicatVerion(navicat_exe_path.c_str(), &NavicatMajorVersion, &NavicatMinorVersion))
  37. return 0;
  38. BOOL status;
  39. if (NavicatMajorVersion <= 0x000C0000 && NavicatMinorVersion < 0x00190000) { // for navicat ver < 12.0.25
  40. status = patcher::Solution0::Do(navicat_exe_path.c_str());
  41. } else if (NavicatMajorVersion == 0x000C0000 && NavicatMinorVersion <= 0x001C0000) { // for navicat ver <= 12.0.28
  42. status = patcher::Solution1::Do(libcc_dll_path.c_str(), argc == 3 ? argv[2] : nullptr);
  43. } else {
  44. _tprintf_s(TEXT("Warning: Unknown version detected, still continue? [y/n] "));
  45. TCHAR selection = _gettchar();
  46. if (selection == 'Y' || selection == 'y')
  47. status = patcher::Solution1::Do(libcc_dll_path.c_str(), argc == 3 ? argv[2] : nullptr);
  48. }
  49. _tprintf_s(TEXT("%s\r\n"), status == TRUE ? TEXT("Success!") : TEXT("Failed!"));
  50. return 0;
  51. }