@@ -315,66 +315,103 @@ func (pe *File) ParseVersionResources() (map[string]string, error) {
315
315
directory := e .Directory .Entries [0 ].Directory
316
316
317
317
for _ , e := range directory .Entries {
318
- ver , err := pe .parseVersionInfo ( e )
318
+ m , err := pe .parseVersionEntry ( e , vers )
319
319
if err != nil {
320
- return vers , err
321
- }
322
- ff , err := pe .parseFixedFileInfo (e )
323
- if err != nil {
324
- return vers , err
320
+ return m , err
325
321
}
322
+ }
323
+ }
324
+ return vers , nil
325
+ }
326
+
327
+ func (pe * File ) parseVersionEntry (e ResourceDirectoryEntry , vers map [string ]string ) (map [string ]string , error ) {
328
+ ver , err := pe .parseVersionInfo (e )
329
+ if err != nil {
330
+ return vers , err
331
+ }
332
+ ff , err := pe .parseFixedFileInfo (e )
333
+ if err != nil {
334
+ return vers , err
335
+ }
326
336
327
- offset := ff .GetStringFileInfoOffset (e )
337
+ offset := ff .GetStringFileInfoOffset (e )
328
338
339
+ for {
340
+ f , n , err := pe .parseStringFileInfo (offset , e )
341
+ if err != nil || f .Length == 0 {
342
+ break
343
+ }
344
+
345
+ switch n {
346
+ case StringFileInfoString :
347
+ tableOffset := f .GetStringTableOffset (offset )
329
348
for {
330
- f , n , err := pe .parseStringFileInfo ( offset , e )
331
- if err != nil || f . Length == 0 {
349
+ table , err := pe .parseStringTable ( tableOffset , e )
350
+ if err != nil {
332
351
break
333
352
}
334
-
335
- switch n {
336
- case StringFileInfoString :
337
- tableOffset := f .GetStringTableOffset (offset )
338
- for {
339
- table , err := pe .parseStringTable (tableOffset , e )
340
- if err != nil {
341
- break
342
- }
343
- stringOffset := table .GetStringOffset (tableOffset , e )
344
- for stringOffset < tableOffset + uint32 (table .Length ) {
345
- k , v , l , err := pe .parseString (stringOffset , e )
346
- if err != nil {
347
- break
348
- }
349
- vers [k ] = v
350
- if l == 0 {
351
- stringOffset = tableOffset + uint32 (table .Length )
352
- } else {
353
- stringOffset = stringOffset + uint32 (l )
354
- }
355
- }
356
- // handle potential infinite loops
357
- if uint32 (table .Length )+ tableOffset > tableOffset {
358
- break
359
- }
360
- if tableOffset > uint32 (f .Length ) {
361
- break
362
- }
353
+ stringOffset := table .GetStringOffset (tableOffset , e )
354
+ for stringOffset < tableOffset + uint32 (table .Length ) {
355
+ k , v , l , err := pe .parseString (stringOffset , e )
356
+ if err != nil {
357
+ break
363
358
}
364
- case VarFileInfoString :
359
+ vers [k ] = v
360
+ if l == 0 {
361
+ stringOffset = tableOffset + uint32 (table .Length )
362
+ } else {
363
+ stringOffset = stringOffset + uint32 (l )
364
+ }
365
+ }
366
+ // handle potential infinite loops
367
+ if uint32 (table .Length )+ tableOffset > tableOffset {
365
368
break
366
- default :
369
+ }
370
+ if tableOffset > uint32 (f .Length ) {
367
371
break
368
372
}
373
+ }
374
+ case VarFileInfoString :
375
+ break
376
+ default :
377
+ break
378
+ }
369
379
370
- offset += uint32 (f .Length )
380
+ offset += uint32 (f .Length )
371
381
372
- // StringFileInfo/VarFileinfo structs consumed?
373
- if offset >= uint32 (ver .Length ) {
374
- break
375
- }
382
+ // StringFileInfo/VarFileinfo structs consumed?
383
+ if offset >= uint32 (ver .Length ) {
384
+ break
385
+ }
386
+ }
387
+ return nil , nil
388
+ }
389
+
390
+ // ParseVersionResourcesForEntries parses file version strings from the version resource
391
+ // directory. This directory contains several structures starting with VS_VERSION_INFO
392
+ // with references to children StringFileInfo structures. In addition, StringFileInfo
393
+ // contains the StringTable structure with String entries describing the name and value
394
+ // of each file version strings.
395
+ func (pe * File ) ParseVersionResourcesForEntries () ([]map [string ]string , error ) {
396
+ var allVersions []map [string ]string
397
+ if pe .opts .OmitResourceDirectory {
398
+ return allVersions , nil
399
+ }
400
+ for _ , e := range pe .Resources .Entries {
401
+ if e .ID != VersionResourceType {
402
+ continue
403
+ }
404
+
405
+ directory := e .Directory .Entries [0 ].Directory
406
+
407
+ for _ , e := range directory .Entries {
408
+ vers := make (map [string ]string )
409
+ allVersions = append (allVersions , vers )
410
+ _ , err := pe .parseVersionEntry (e , vers )
411
+ if err != nil {
412
+ return allVersions , err
376
413
}
377
414
}
378
415
}
379
- return vers , nil
416
+ return allVersions , nil
380
417
}
0 commit comments