@@ -64,6 +64,11 @@ public abstract class HasCustomAttributes(uint token, ApplicationAnalysisContext
64
64
65
65
public abstract string CustomAttributeOwnerName { get ; }
66
66
67
+ /// <summary>
68
+ /// Pre-v29, stores the index of the custom attribute range for this member. Post-v29, always 0.
69
+ /// </summary>
70
+ private int Pre29RangeIndex ;
71
+
67
72
public bool IsCompilerGeneratedBasedOnCustomAttributes =>
68
73
CustomAttributes ? . Any ( a => a . Constructor . DeclaringType ! . FullName . Contains ( "CompilerGeneratedAttribute" ) )
69
74
?? AttributeTypes ? . Any ( t => t . Type == Il2CppTypeEnum . IL2CPP_TYPE_CLASS && t . AsClass ( ) . FullName ! . Contains ( "CompilerGeneratedAttribute" ) )
@@ -88,7 +93,7 @@ protected void InitCustomAttributeData()
88
93
return ;
89
94
}
90
95
91
- AttributeTypeRange = AppContext . Metadata . GetCustomAttributeData ( CustomAttributeAssembly . Definition . Image , CustomAttributeIndex , Token , out var rangeIndex ) ;
96
+ AttributeTypeRange = AppContext . Metadata . GetCustomAttributeData ( CustomAttributeAssembly . Definition . Image , CustomAttributeIndex , Token , out Pre29RangeIndex ) ;
92
97
93
98
if ( AttributeTypeRange == null || AttributeTypeRange . count == 0 )
94
99
{
@@ -101,7 +106,35 @@ protected void InitCustomAttributeData()
101
106
. Select ( attrIdx => AppContext . Metadata ! . attributeTypes ! [ attrIdx ] ) //Not null because we've checked we're not on v29
102
107
. Select ( typeIdx => AppContext . Binary ! . GetType ( typeIdx ) )
103
108
. ToList ( ) ;
109
+ }
110
+
111
+ private ( long blobStart , long blobEnd ) ? GetV29BlobOffsets ( )
112
+ {
113
+ var target = new Il2CppCustomAttributeDataRange ( ) { token = Token } ;
114
+ var caIndex = AppContext . Metadata . AttributeDataRanges . BinarySearch
115
+ (
116
+ CustomAttributeAssembly . Definition . Image . customAttributeStart ,
117
+ ( int ) CustomAttributeAssembly . Definition . Image . customAttributeCount ,
118
+ target ,
119
+ new TokenComparer ( )
120
+ ) ;
121
+
122
+ if ( caIndex < 0 )
123
+ {
124
+ RawIl2CppCustomAttributeData = Array . Empty < byte > ( ) ;
125
+ return null ;
126
+ }
127
+
128
+ var attributeDataRange = AppContext . Metadata . AttributeDataRanges [ caIndex ] ;
129
+ var next = AppContext . Metadata . AttributeDataRanges [ caIndex + 1 ] ;
130
+
131
+ var blobStart = AppContext . Metadata . metadataHeader . attributeDataOffset + attributeDataRange . startOffset ;
132
+ var blobEnd = AppContext . Metadata . metadataHeader . attributeDataOffset + next . startOffset ;
133
+ return ( blobStart , blobEnd ) ;
134
+ }
104
135
136
+ private void InitPre29AttributeGeneratorAnalysis ( int rangeIndex )
137
+ {
105
138
ulong generatorPtr ;
106
139
if ( AppContext . MetadataVersion < 27 )
107
140
try
@@ -112,7 +145,7 @@ protected void InitCustomAttributeData()
112
145
{
113
146
Logger . WarnNewline ( "Custom attribute generator out of range for " + this , "CA Restore" ) ;
114
147
RawIl2CppCustomAttributeData = Array . Empty < byte > ( ) ;
115
- return ; //Bail out
148
+ return ;
116
149
}
117
150
else
118
151
{
@@ -126,38 +159,13 @@ protected void InitCustomAttributeData()
126
159
{
127
160
Logger . WarnNewline ( $ "Supposedly had custom attributes ({ string . Join ( ", " , AttributeTypes ) } ), but generator was null for " + this , "CA Restore" ) ;
128
161
RawIl2CppCustomAttributeData = Memory < byte > . Empty ;
129
- return ; //Possibly no attributes with params?
162
+ return ;
130
163
}
131
164
132
165
CaCacheGeneratorAnalysis = new ( generatorPtr , AppContext , this ) ;
133
166
RawIl2CppCustomAttributeData = CaCacheGeneratorAnalysis . RawBytes ;
134
167
}
135
168
136
- private ( long blobStart , long blobEnd ) ? GetV29BlobOffsets ( )
137
- {
138
- var target = new Il2CppCustomAttributeDataRange ( ) { token = Token } ;
139
- var caIndex = AppContext . Metadata . AttributeDataRanges . BinarySearch
140
- (
141
- CustomAttributeAssembly . Definition . Image . customAttributeStart ,
142
- ( int ) CustomAttributeAssembly . Definition . Image . customAttributeCount ,
143
- target ,
144
- new TokenComparer ( )
145
- ) ;
146
-
147
- if ( caIndex < 0 )
148
- {
149
- RawIl2CppCustomAttributeData = Array . Empty < byte > ( ) ;
150
- return null ;
151
- }
152
-
153
- var attributeDataRange = AppContext . Metadata . AttributeDataRanges [ caIndex ] ;
154
- var next = AppContext . Metadata . AttributeDataRanges [ caIndex + 1 ] ;
155
-
156
- var blobStart = AppContext . Metadata . metadataHeader . attributeDataOffset + attributeDataRange . startOffset ;
157
- var blobEnd = AppContext . Metadata . metadataHeader . attributeDataOffset + next . startOffset ;
158
- return ( blobStart , blobEnd ) ;
159
- }
160
-
161
169
/// <summary>
162
170
/// Attempt to parse the Il2CppCustomAttributeData blob into custom attributes.
163
171
/// </summary>
@@ -175,6 +183,8 @@ public void AnalyzeCustomAttributeData(bool allowAnalysis = true)
175
183
AnalyzeCustomAttributeDataV29 ( ) ;
176
184
return ;
177
185
}
186
+
187
+ InitPre29AttributeGeneratorAnalysis ( Pre29RangeIndex ) ;
178
188
179
189
if ( RawIl2CppCustomAttributeData . Length == 0 )
180
190
return ;
0 commit comments