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
65-
66- void ProcessDirAndModules ( CFStorage vbaStorage )
69+ void ProcessDirAndModules ( Storage vbaStorage )
6770{
68- var dir = vbaStorage . GetStream ( "dir" ) ;
69- var data = dir . GetData ( ) ;
71+ using var dirStream = vbaStorage . OpenStream ( "dir" ) ;
72+ var data = new byte [ dirStream . Length ] ;
73+ dirStream . ReadExactly ( data ) ;
7074 data = VbaCompression . Decompress ( data ) ;
7175 var target = Path . Combine ( targetPath , "vba" , "dir.bin" ) ;
7276
@@ -76,18 +80,21 @@ void ProcessDirAndModules(CFStorage vbaStorage)
7680 foreach ( var module in modules )
7781 {
7882 var name = module . Name ;
83+ if ( name == null ) continue ;
84+
7985 var targetVbBin = Path . Combine ( targetPath , "vba" , name + ".bin" ) ;
8086 var targetVbText = Path . Combine ( targetPath , "vba" , name + ".vb" ) ;
8187
82- var stream = vbaStorage . GetStream ( name ) ;
83- Span < byte > dataVb = stream . GetData ( ) ;
84- var dataVbBin = dataVb . Slice ( ( int ) module . Offset ) . ToArray ( ) ;
88+ using var stream = vbaStorage . OpenStream ( name ) ;
89+ var dataVb = new byte [ stream . Length ] ;
90+ stream . ReadExactly ( dataVb ) ;
91+ var dataVbBin = dataVb . AsSpan ( ) . Slice ( ( int ) module . Offset ) . ToArray ( ) ;
8592 File . WriteAllBytes ( targetVbBin , dataVbBin ) ;
86-
87- dataVb = VbaCompression . Decompress ( dataVbBin ) ;
8893
89- var sourceCode = Encoding . GetEncoding ( 1252 ) . GetString ( dataVb ) ;
94+ var decompressed = VbaCompression . Decompress ( dataVbBin ) ;
95+
96+ var sourceCode = Encoding . GetEncoding ( 1252 ) . GetString ( decompressed ) ;
9097
9198 File . WriteAllText ( targetVbText , sourceCode ) ;
9299 }
93- }
100+ }
0 commit comments