No Description
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

Assembly.cpp 3.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. #include "il2cpp-config.h"
  2. #include "vm/Assembly.h"
  3. #include "vm/AssemblyName.h"
  4. #include "vm/MetadataCache.h"
  5. #include "vm/Runtime.h"
  6. #include "vm-utils/VmStringUtils.h"
  7. #include "il2cpp-tabledefs.h"
  8. #include "il2cpp-class-internals.h"
  9. #include <vector>
  10. #include <string>
  11. namespace il2cpp
  12. {
  13. namespace vm
  14. {
  15. static AssemblyVector s_Assemblies;
  16. AssemblyVector* Assembly::GetAllAssemblies()
  17. {
  18. return &s_Assemblies;
  19. }
  20. const Il2CppAssembly* Assembly::GetLoadedAssembly(const char* name)
  21. {
  22. for (AssemblyVector::const_iterator assembly = s_Assemblies.begin(); assembly != s_Assemblies.end(); ++assembly)
  23. {
  24. if (strcmp((*assembly)->aname.name, name) == 0)
  25. return *assembly;
  26. }
  27. return NULL;
  28. }
  29. Il2CppImage* Assembly::GetImage(const Il2CppAssembly* assembly)
  30. {
  31. return assembly->image;
  32. }
  33. void Assembly::GetReferencedAssemblies(const Il2CppAssembly* assembly, AssemblyNameVector* target)
  34. {
  35. for (int32_t sourceIndex = 0; sourceIndex < assembly->referencedAssemblyCount; sourceIndex++)
  36. {
  37. const Il2CppAssembly* refAssembly = MetadataCache::GetReferencedAssembly(assembly, sourceIndex);
  38. target->push_back(&refAssembly->aname);
  39. }
  40. }
  41. static bool ends_with(const char *str, const char *suffix)
  42. {
  43. if (!str || !suffix)
  44. return false;
  45. const size_t lenstr = strlen(str);
  46. const size_t lensuffix = strlen(suffix);
  47. if (lensuffix > lenstr)
  48. return false;
  49. return strncmp(str + lenstr - lensuffix, suffix, lensuffix) == 0;
  50. }
  51. const Il2CppAssembly* Assembly::Load(const char* name)
  52. {
  53. const size_t len = strlen(name);
  54. utils::VmStringUtils::CaseInsensitiveComparer comparer;
  55. for (AssemblyVector::const_iterator assembly = s_Assemblies.begin(); assembly != s_Assemblies.end(); ++assembly)
  56. {
  57. if (comparer(name, (*assembly)->aname.name))
  58. return *assembly;
  59. }
  60. if (!ends_with(name, ".dll") && !ends_with(name, ".exe"))
  61. {
  62. char *tmp = new char[len + 5];
  63. memset(tmp, 0, len + 5);
  64. memcpy(tmp, name, len);
  65. memcpy(tmp + len, ".dll", 4);
  66. const Il2CppAssembly* result = Load(tmp);
  67. if (!result)
  68. {
  69. memcpy(tmp + len, ".exe", 4);
  70. result = Load(tmp);
  71. }
  72. delete[] tmp;
  73. return result;
  74. }
  75. else
  76. {
  77. for (AssemblyVector::const_iterator assembly = s_Assemblies.begin(); assembly != s_Assemblies.end(); ++assembly)
  78. {
  79. if (comparer(name, (*assembly)->image->name))
  80. return *assembly;
  81. }
  82. return NULL;
  83. }
  84. }
  85. void Assembly::Register(const Il2CppAssembly* assembly)
  86. {
  87. s_Assemblies.push_back(assembly);
  88. }
  89. void Assembly::ClearAllAssemblies()
  90. {
  91. s_Assemblies.clear();
  92. }
  93. void Assembly::Initialize()
  94. {
  95. }
  96. } /* namespace vm */
  97. } /* namespace il2cpp */