-
Notifications
You must be signed in to change notification settings - Fork 86
Expand file tree
/
Copy pathImage.cpp
More file actions
68 lines (49 loc) · 2.15 KB
/
Image.cpp
File metadata and controls
68 lines (49 loc) · 2.15 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include <BNM/Image.hpp>
#include <BNM/Class.hpp>
#include <Internals.hpp>
BNM::Image::Image(const std::string_view &name) {
_data = Internal::TryGetImage(name);
BNM_LOG_WARN_IF(!_data, DBG_BNM_MSG_Image_Constructor_NotFound, name.data());
}
BNM::Image::Image(const BNM::IL2CPP::Il2CppAssembly *assembly) {
_data = Internal::il2cppMethods.il2cpp_assembly_get_image(assembly);
}
std::vector<BNM::Class> BNM::Image::GetClasses(bool includeInner) const {
std::vector<IL2CPP::Il2CppClass *> classes{};
if (_data->nameToClassHashTable == (decltype(_data->nameToClassHashTable)) -0x424e4d) goto NEW_CLASSES;
if (Internal::il2cppMethods.il2cpp_image_get_class) {
size_t typeCount = _data->typeCount;
for (size_t i = 0; i < typeCount; ++i) {
auto cls = Internal::il2cppMethods.il2cpp_image_get_class(_data, i);
if (!includeInner && cls->declaringType || !cls->flags && strcmp(cls->name, BNM_OBFUSCATE("<Module>")) == 0) continue;
classes.push_back(cls);
}
} else {
Internal::Image$$GetTypes(_data, false, &classes);
if (includeInner) goto NEW_CLASSES;
for (auto it = classes.begin(); it != classes.end();) {
if ((*it)->declaringType) {
classes.erase(it);
continue;
}
++it;
}
}
NEW_CLASSES:
#ifdef BNM_CLASSES_MANAGEMENT
Internal::ClassesManagement::bnmClassesMap.ForEachByImage(_data, [&classes, includeInner](IL2CPP::Il2CppClass *BNMClass) -> bool {
if (!includeInner && BNMClass->declaringType) return false;
classes.push_back(BNMClass);
return false;
});
#endif
// A clever way to make a copy with the desired type without for, because BNM::Class is BNM::IL2CPP::Il2CppClass *.
return *(std::vector<BNM::Class> *) &classes;
}
std::vector<BNM::Image> BNM::Image::GetImages() {
auto &assemblies = *Internal::il2cppMethods.Assembly$$GetAllAssemblies();
std::vector<Image> ret;
ret.reserve(assemblies.size());
for (auto assembly : assemblies) ret.emplace_back(Internal::il2cppMethods.il2cpp_assembly_get_image(assembly));
return ret;
}