@@ -1249,6 +1249,30 @@ private void ParseDelayedImport(Dictionary<IntPtr, IntPtr> imports, ImageDelayIm
12491249 }
12501250 }
12511251
1252+ private Dictionary < int , string > GetNameToOrdinals ( ImageExportDirectory export_directory )
1253+ {
1254+ Dictionary < int , string > ordinal_to_names = new Dictionary < int , string > ( ) ;
1255+ IntPtr names = RvaToVA ( export_directory . AddressOfNames ) ;
1256+ IntPtr name_ordinals = RvaToVA ( export_directory . AddressOfNameOrdinals ) ;
1257+
1258+ if ( names == IntPtr . Zero || name_ordinals == IntPtr . Zero )
1259+ return ordinal_to_names ;
1260+
1261+ int [ ] name_rvas = new int [ export_directory . NumberOfNames ] ;
1262+ Marshal . Copy ( names , name_rvas , 0 , name_rvas . Length ) ;
1263+ IntPtr [ ] name_vas = name_rvas . Select ( r => r != 0 ? RvaToVA ( r ) : IntPtr . Zero ) . ToArray ( ) ;
1264+ short [ ] ordinals = new short [ export_directory . NumberOfNames ] ;
1265+ Marshal . Copy ( name_ordinals , ordinals , 0 , ordinals . Length ) ;
1266+
1267+ for ( int i = 0 ; i < name_vas . Length ; ++ i )
1268+ {
1269+ string name = Marshal . PtrToStringAnsi ( name_vas [ i ] ) ;
1270+ int ordinal = ordinals [ i ] ;
1271+ ordinal_to_names [ ordinal ] = name ;
1272+ }
1273+ return ordinal_to_names ;
1274+ }
1275+
12521276 private void ParseExports ( )
12531277 {
12541278 _exports = new List < DllExport > ( ) ;
@@ -1267,31 +1291,18 @@ private void ParseExports()
12671291 {
12681292 return ;
12691293 }
1270- IntPtr funcs = RvaToVA ( export_directory . AddressOfFunctions ) ;
1271- IntPtr names = RvaToVA ( export_directory . AddressOfNames ) ;
1272- IntPtr name_ordinals = RvaToVA ( export_directory . AddressOfNameOrdinals ) ;
12731294
12741295 long export_base = buffer . DangerousGetHandle ( ) . ToInt64 ( ) ;
1275- long export_top = export_base + buffer . Length ;
1276-
1296+ long export_top = export_base + buffer . Length ;
1297+
1298+ IntPtr funcs = RvaToVA ( export_directory . AddressOfFunctions ) ;
1299+ if ( funcs == IntPtr . Zero )
1300+ return ;
12771301 int [ ] func_rvas = new int [ export_directory . NumberOfFunctions ] ;
12781302 Marshal . Copy ( funcs , func_rvas , 0 , func_rvas . Length ) ;
12791303 IntPtr [ ] func_vas = func_rvas . Select ( r => r != 0 ? RvaToVA ( r ) : IntPtr . Zero ) . ToArray ( ) ;
12801304
1281- int [ ] name_rvas = new int [ export_directory . NumberOfNames ] ;
1282- Marshal . Copy ( names , name_rvas , 0 , name_rvas . Length ) ;
1283- IntPtr [ ] name_vas = name_rvas . Select ( r => r != 0 ? RvaToVA ( r ) : IntPtr . Zero ) . ToArray ( ) ;
1284-
1285- short [ ] ordinals = new short [ export_directory . NumberOfNames ] ;
1286- Marshal . Copy ( name_ordinals , ordinals , 0 , ordinals . Length ) ;
1287-
1288- Dictionary < int , string > ordinal_to_names = new Dictionary < int , string > ( ) ;
1289- for ( int i = 0 ; i < name_vas . Length ; ++ i )
1290- {
1291- string name = Marshal . PtrToStringAnsi ( name_vas [ i ] ) ;
1292- int ordinal = ordinals [ i ] ;
1293- ordinal_to_names [ ordinal ] = name ;
1294- }
1305+ Dictionary < int , string > ordinal_to_names = GetNameToOrdinals ( export_directory ) ;
12951306
12961307 for ( int i = 0 ; i < func_vas . Length ; ++ i )
12971308 {
0 commit comments