1515
1616var source = Path . Combine ( sourcePath , "vbaProject.bin" ) ;
1717
18- var vba = new CompoundFile ( source ) ;
19- var root = vba . RootStorage ;
18+ using var root = RootStorage . OpenRead ( source ) ;
2019
21- root . VisitEntries ( item => ProcessFile ( root , "" , item ) , false ) ;
22- ProcessDirAndModules ( root . GetStorage ( "VBA" ) ) ;
20+ ProcessEntriesRecursive ( root , "" ) ;
21+ var vbaStorage = root . OpenStorage ( "VBA" ) ;
22+ ProcessDirAndModules ( vbaStorage ) ;
2323
2424Console . WriteLine ( ) ;
2525Console . WriteLine ( $ " vbaProject.bin -> { targetPath } ") ;
2626Console . WriteLine ( "Project was decompiled." ) ;
2727
28- void ProcessFile ( CFStorage storage , string directory , CFItem item )
28+ void ProcessEntriesRecursive ( Storage storage , string directory )
2929{
30- if ( item . IsStream )
30+ foreach ( var entry in storage . EnumerateEntries ( ) )
3131 {
32- var name = item . Name ;
33- var target = Path . Combine ( targetPath , directory , name + ".bin" ) ;
32+ if ( entry . Type == EntryType . Stream )
33+ {
34+ var name = entry . Name ;
35+ var target = Path . Combine ( targetPath , directory , name + ".bin" ) ;
3436
35- var stream = storage . GetStream ( name ) ;
36- var data = stream . GetData ( ) ;
37+ using var stream = storage . OpenStream ( name ) ;
38+ var data = new byte [ stream . Length ] ;
39+ stream . ReadExactly ( data ) ;
3740
38- if ( name == "dir" )
39- {
40- try
41- {
42- data = VbaCompression . Decompress ( data ) ;
43- }
44- catch ( Exception ex )
41+ if ( name == "dir" )
4542 {
46- Console . WriteLine ( ex . Message ) ;
43+ try
44+ {
45+ data = VbaCompression . Decompress ( data ) ;
46+ }
47+ catch ( Exception ex )
48+ {
49+ Console . WriteLine ( ex . Message ) ;
50+ }
4751 }
52+
53+ File . WriteAllBytes ( target , data ) ;
4854 }
49-
50- File . WriteAllBytes ( target , data ) ;
51- }
52- else if ( item . IsStorage )
53- {
54- var s2 = ( CFStorage ) item ;
55- var dir = Path . Combine ( targetPath , s2 . Name ) ;
56- if ( ! Directory . Exists ( dir ) )
55+ else if ( entry . Type == EntryType . Storage )
5756 {
58- Directory . CreateDirectory ( dir ) ;
59- }
57+ var dir = Path . Combine ( targetPath , entry . Name ) ;
58+ if ( ! Directory . Exists ( dir ) )
59+ {
60+ Directory . CreateDirectory ( dir ) ;
61+ }
6062
61- s2 . VisitEntries ( item => ProcessFile ( s2 , s2 . Name , item ) , false ) ;
63+ var subStorage = storage . OpenStorage ( entry . Name ) ;
64+ ProcessEntriesRecursive ( subStorage , entry . Name ) ;
65+ }
6266 }
6367}
6468
6569
66- void ProcessDirAndModules ( CFStorage vbaStorage )
70+ void ProcessDirAndModules ( Storage vbaStorage )
6771{
68- var dir = vbaStorage . GetStream ( "dir" ) ;
69- var data = dir . GetData ( ) ;
72+ using var dirStream = vbaStorage . OpenStream ( "dir" ) ;
73+ var data = new byte [ dirStream . Length ] ;
74+ dirStream . ReadExactly ( data ) ;
7075 data = VbaCompression . Decompress ( data ) ;
7176 var target = Path . Combine ( targetPath , "vba" , "dir.bin" ) ;
7277
@@ -76,17 +81,20 @@ void ProcessDirAndModules(CFStorage vbaStorage)
7681 foreach ( var module in modules )
7782 {
7883 var name = module . Name ;
84+ if ( name == null ) continue ;
85+
7986 var targetVbBin = Path . Combine ( targetPath , "vba" , name + ".bin" ) ;
8087 var targetVbText = Path . Combine ( targetPath , "vba" , name + ".vb" ) ;
8188
82- var stream = vbaStorage . GetStream ( name ) ;
83- Span < byte > dataVb = stream . GetData ( ) ;
84- var dataVbBin = dataVb . Slice ( ( int ) module . Offset ) . ToArray ( ) ;
89+ using var stream = vbaStorage . OpenStream ( name ) ;
90+ var dataVb = new byte [ stream . Length ] ;
91+ stream . ReadExactly ( dataVb ) ;
92+ var dataVbBin = dataVb . AsSpan ( ) . Slice ( ( int ) module . Offset ) . ToArray ( ) ;
8593 File . WriteAllBytes ( targetVbBin , dataVbBin ) ;
8694
87- dataVb = VbaCompression . Decompress ( dataVbBin ) ;
95+ var decompressed = VbaCompression . Decompress ( dataVbBin ) ;
8896
89- var sourceCode = Encoding . GetEncoding ( 1252 ) . GetString ( dataVb ) ;
97+ var sourceCode = Encoding . GetEncoding ( 1252 ) . GetString ( decompressed ) ;
9098
9199 File . WriteAllText ( targetVbText , sourceCode ) ;
92100 }
0 commit comments