Skip to content

Commit b2fba5a

Browse files
committed
Update the OpenMcdf library in vbad project
1 parent dd93e44 commit b2fba5a

File tree

2 files changed

+46
-38
lines changed

2 files changed

+46
-38
lines changed

utils/vbad/Program.cs

Lines changed: 45 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -15,58 +15,63 @@
1515

1616
var 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

2424
Console.WriteLine();
2525
Console.WriteLine($" vbaProject.bin -> {targetPath}");
2626
Console.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
}

utils/vbad/vbad.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
</PropertyGroup>
99

1010
<ItemGroup>
11-
<PackageReference Include="OpenMcdf" Version="2.4.1" />
11+
<PackageReference Include="OpenMcdf" Version="3.1.0" />
1212
<PackageReference Include="NetOfficeFw.VbaCompression" Version="3.0.1" />
1313
</ItemGroup>
1414

0 commit comments

Comments
 (0)