From 5d7c99da6461419b886e4bd6222d66dd37545309 Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Sun, 1 Mar 2026 20:40:37 -0500 Subject: [PATCH 001/160] Rename tests/Unit/Models/test_vbaProject.py to tests/Unit/test_vbaProject.pyt --- tests/Unit/{Models/test_vbaProject.py => test_vbaProject.pyt} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename tests/Unit/{Models/test_vbaProject.py => test_vbaProject.pyt} (100%) diff --git a/tests/Unit/Models/test_vbaProject.py b/tests/Unit/test_vbaProject.pyt similarity index 100% rename from tests/Unit/Models/test_vbaProject.py rename to tests/Unit/test_vbaProject.pyt From f3c72574062753b954c8546e099a0295bc1a1759 Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Sun, 1 Mar 2026 20:55:36 -0500 Subject: [PATCH 002/160] Update reference_registered.py --- src/ms_ovba/Models/Entities/reference_registered.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/ms_ovba/Models/Entities/reference_registered.py b/src/ms_ovba/Models/Entities/reference_registered.py index 5b358a6dc..054309dc4 100644 --- a/src/ms_ovba/Models/Entities/reference_registered.py +++ b/src/ms_ovba/Models/Entities/reference_registered.py @@ -1,7 +1,6 @@ import struct from ms_ovba.Models.Entities.reference_record import ReferenceRecord from ms_ovba.Models.Fields.libid_reference import LibidReference -from ms_ovba.Models.Fields.packed_data import PackedData from typing import TypeVar @@ -24,10 +23,11 @@ def libid(self: T) -> LibidReference: return self._libid_ref def pack(self: T, cp_name: str, endien: str) -> bytes: + endien_symbol = '<' if endien == 'little' else '>' strlen = len(self._libid_ref) - format = "HII" + str(strlen) + "sIH" + format = endien_symbol + "HII" + str(strlen) + "sIH" lib_str = str(self._libid_ref).encode(cp_name) - ref_registered = PackedData(format, 0x000D, strlen + 10, + ref_registered = struct.pack(format, 0x000D, strlen + 10, strlen, lib_str, 0, 0) return ref_registered.pack(cp_name, endien) From 22f6153b1a7a41ff3ce8ac8512ddea03addaa7fe Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Sun, 1 Mar 2026 20:55:54 -0500 Subject: [PATCH 003/160] Update reference_registered.py --- src/ms_ovba/Models/Entities/reference_registered.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ms_ovba/Models/Entities/reference_registered.py b/src/ms_ovba/Models/Entities/reference_registered.py index 054309dc4..1f7ed0d61 100644 --- a/src/ms_ovba/Models/Entities/reference_registered.py +++ b/src/ms_ovba/Models/Entities/reference_registered.py @@ -28,7 +28,7 @@ def pack(self: T, cp_name: str, endien: str) -> bytes: format = endien_symbol + "HII" + str(strlen) + "sIH" lib_str = str(self._libid_ref).encode(cp_name) ref_registered = struct.pack(format, 0x000D, strlen + 10, - strlen, lib_str, 0, 0) + strlen, lib_str, 0, 0) return ref_registered.pack(cp_name, endien) From f009ed4eac14e4fee388eca890b9882aa230cf59 Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Sun, 1 Mar 2026 20:57:32 -0500 Subject: [PATCH 004/160] Update reference_registered.py --- src/ms_ovba/Models/Entities/reference_registered.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/ms_ovba/Models/Entities/reference_registered.py b/src/ms_ovba/Models/Entities/reference_registered.py index 1f7ed0d61..f55420eec 100644 --- a/src/ms_ovba/Models/Entities/reference_registered.py +++ b/src/ms_ovba/Models/Entities/reference_registered.py @@ -27,10 +27,8 @@ def pack(self: T, cp_name: str, endien: str) -> bytes: strlen = len(self._libid_ref) format = endien_symbol + "HII" + str(strlen) + "sIH" lib_str = str(self._libid_ref).encode(cp_name) - ref_registered = struct.pack(format, 0x000D, strlen + 10, - strlen, lib_str, 0, 0) - - return ref_registered.pack(cp_name, endien) + return struct.pack(format, 0x000D, strlen + 10, + strlen, lib_str, 0, 0) @staticmethod def unpack(data: bytes, endien: str) -> T: From 80966a66133eb3cbdc33e69b3be5c1539176da09 Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Sun, 1 Mar 2026 21:18:29 -0500 Subject: [PATCH 005/160] Update reference_project.py --- src/ms_ovba/Models/Entities/reference_project.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/ms_ovba/Models/Entities/reference_project.py b/src/ms_ovba/Models/Entities/reference_project.py index c95aea2b7..2e059b57f 100644 --- a/src/ms_ovba/Models/Entities/reference_project.py +++ b/src/ms_ovba/Models/Entities/reference_project.py @@ -1,6 +1,6 @@ +import struct from ms_ovba.Models.Entities.reference_record import ReferenceRecord from ms_ovba.Models.Fields.project_reference import ProjectReference -from ms_ovba.Models.Fields.packed_data import PackedData from typing import TypeVar @@ -16,16 +16,15 @@ def __init__(self: T, codepage_name: str, self._ref = ref def pack(self: T, cp_name: str, endien: str) -> bytes: + endien_symbol = '<' if endien == 'little' else '>' lib_rel = self._ref.relative() libid_abs_size = len(self._ref) libid_rel_size = len(lib_rel) - format = ("HII" + str(libid_abs_size) + "sI" + + format = (endien_symbol + "HII" + str(libid_abs_size) + "sI" + str(libid_rel_size) + "sIH") ref_str = str(self._ref).encode(cp_name) ref_str_rel = str(lib_rel).encode(cp_name) - ref_project = PackedData(format, 0x000E, + return struct.pack(format, 0x000E, libid_abs_size + libid_rel_size + 14, libid_abs_size, ref_str, libid_rel_size, ref_str_rel, 0x65BE0257, 0x0017) - - return (ref_project.pack(cp_name, endien)) From 29fa3bb9d33b23ac92b639d391131d7a05b66387 Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Sun, 1 Mar 2026 21:20:35 -0500 Subject: [PATCH 006/160] Update reference_project.py --- src/ms_ovba/Models/Entities/reference_project.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/ms_ovba/Models/Entities/reference_project.py b/src/ms_ovba/Models/Entities/reference_project.py index 2e059b57f..d0dcf27a0 100644 --- a/src/ms_ovba/Models/Entities/reference_project.py +++ b/src/ms_ovba/Models/Entities/reference_project.py @@ -25,6 +25,6 @@ def pack(self: T, cp_name: str, endien: str) -> bytes: ref_str = str(self._ref).encode(cp_name) ref_str_rel = str(lib_rel).encode(cp_name) return struct.pack(format, 0x000E, - libid_abs_size + libid_rel_size + 14, - libid_abs_size, ref_str, libid_rel_size, - ref_str_rel, 0x65BE0257, 0x0017) + libid_abs_size + libid_rel_size + 14, + libid_abs_size, ref_str, libid_rel_size, + ref_str_rel, 0x65BE0257, 0x0017) From a0202d3b72c14be5577d46ca3d6cb7bdfdd80742 Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Sun, 1 Mar 2026 21:35:14 -0500 Subject: [PATCH 007/160] Update packed_data.py --- src/ms_ovba/Models/Fields/packed_data.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/ms_ovba/Models/Fields/packed_data.py b/src/ms_ovba/Models/Fields/packed_data.py index 7ee87ae38..d96d41848 100644 --- a/src/ms_ovba/Models/Fields/packed_data.py +++ b/src/ms_ovba/Models/Fields/packed_data.py @@ -7,7 +7,9 @@ class PackedData(): """ - Multivalue field with a packing format + Multivalue field with a packing format. + This class allows a user to define a data format, + and render it at a later time. """ def __init__(self: T, format: str, *values: Any) -> None: self.values = values From 8299698f58f23ee09af84dcf106331e58f988b87 Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Sun, 1 Mar 2026 21:42:21 -0500 Subject: [PATCH 008/160] Update reference.py --- src/ms_ovba/Models/Entities/reference.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/ms_ovba/Models/Entities/reference.py b/src/ms_ovba/Models/Entities/reference.py index a78bc90eb..50d8879dc 100644 --- a/src/ms_ovba/Models/Entities/reference.py +++ b/src/ms_ovba/Models/Entities/reference.py @@ -13,11 +13,8 @@ class Reference(): """ 2.3.4.2.2.1 REFERENCE Record """ - def __init__(self: T, codepage_name: str, - ref: ReferenceRecord, + def __init__(self: T, ref: ReferenceRecord, name: str = None) -> None: - # is self._codepage_name even needed? - self._codepage_name = codepage_name self._ref = ref self._refname = name From 36d31b2e18c3ff76dcc24295b90a0f9492e98d2c Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Sun, 1 Mar 2026 21:45:35 -0500 Subject: [PATCH 009/160] Update test_dirObject.pyt --- tests/Functional/test_dirObject.pyt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/Functional/test_dirObject.pyt b/tests/Functional/test_dirObject.pyt index 7a86f26a2..f09d144f0 100644 --- a/tests/Functional/test_dirObject.pyt +++ b/tests/Functional/test_dirObject.pyt @@ -43,7 +43,7 @@ def test_dirstream() -> None: "C:\\Windows\\System32\\stdole2.tlb", "OLE Automation" )) - ole_reference = Reference(codepage_name, libid_ref, "stdole") + ole_reference = Reference(libid_ref, "stdole") guid = uuid.UUID('2DF8D04C5BFA101BBDE500AA0044DE52') libid_ref2 = ReferenceRegistered(codepage_name, LibidReference( guid, @@ -52,7 +52,7 @@ def test_dirstream() -> None: "C:\\Program Files\\Common Files\\Microsoft Shared\\OFFICE16\\MSO.DLL", "Microsoft Office 16.0 Object Library" )) - office_reference = Reference(codepage_name, libid_ref2, "Office") + office_reference = Reference(libid_ref2, "Office") project.add_reference(ole_reference) project.add_reference(office_reference) project.set_project_cookie(0x08F3) From d9338f0c87d9b473a9f228987677a2f49b635f7a Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Sun, 1 Mar 2026 21:47:35 -0500 Subject: [PATCH 010/160] Update test_reference.py --- tests/Unit/Models/Entities/test_reference.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/Unit/Models/Entities/test_reference.py b/tests/Unit/Models/Entities/test_reference.py index 92b614392..2e0e9e7fb 100644 --- a/tests/Unit/Models/Entities/test_reference.py +++ b/tests/Unit/Models/Entities/test_reference.py @@ -22,18 +22,18 @@ def pack(self, foo, bar) -> bytes: def test_constructor1() -> None: ref_proj = "" - ref = Reference("cp1", ref_proj) + ref = Reference(ref_proj) assert isinstance(ref, Reference) def test_constructor2() -> None: - ref = Reference("cp1", "", "VBAProject1") + ref = Reference("", "VBAProject1") assert isinstance(ref, Reference) def test_pack() -> None: ref_proj = MockRefProj() - ref = Reference("cp1", ref_proj, "VBAProject1") + ref = Reference(ref_proj, "VBAProject1") expected_hex = ("16 00 0B 00 00 00 56 42 41 50 72 6F 6A 65 63 74", "31 3E 00 16 00 00 00 56 00 42 00 41 00 50 00 72", From 71fb97d8b8be580ab1c7774288598668db342b10 Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Mon, 2 Mar 2026 09:49:05 -0500 Subject: [PATCH 011/160] Update test_idSizeField.py --- tests/Unit/Models/Fields/test_idSizeField.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/Unit/Models/Fields/test_idSizeField.py b/tests/Unit/Models/Fields/test_idSizeField.py index 033ce3be9..c864711d9 100644 --- a/tests/Unit/Models/Fields/test_idSizeField.py +++ b/tests/Unit/Models/Fields/test_idSizeField.py @@ -2,6 +2,10 @@ from ms_ovba.Models.Fields.idSizeField import IdSizeField +def test_H(): + field = IdSizeField(1, 2, 3) + assert field.pack == b'\x01\x00\x01\x00\x03\x00' + def test_bad_value() -> None: field = IdSizeField(2, 3, 6) with pytest.raises(Exception): From e31d78b4402f7af7fe3c7325f78c99df6419f847 Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Mon, 2 Mar 2026 09:50:08 -0500 Subject: [PATCH 012/160] Update test_idSizeField.py --- tests/Unit/Models/Fields/test_idSizeField.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tests/Unit/Models/Fields/test_idSizeField.py b/tests/Unit/Models/Fields/test_idSizeField.py index c864711d9..1934dd9d0 100644 --- a/tests/Unit/Models/Fields/test_idSizeField.py +++ b/tests/Unit/Models/Fields/test_idSizeField.py @@ -6,6 +6,12 @@ def test_H(): field = IdSizeField(1, 2, 3) assert field.pack == b'\x01\x00\x01\x00\x03\x00' + +def test_H(): + field = IdSizeField(1, 4, 3) + assert field.pack == b'\x01\x00\x01\x00\x03\x00\x00\x00' + + def test_bad_value() -> None: field = IdSizeField(2, 3, 6) with pytest.raises(Exception): From ecd03f8506b401e12492f6a1e54b060b0f36f297 Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Mon, 2 Mar 2026 10:08:25 -0500 Subject: [PATCH 013/160] Update test_idSizeField.py --- tests/Unit/Models/Fields/test_idSizeField.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Unit/Models/Fields/test_idSizeField.py b/tests/Unit/Models/Fields/test_idSizeField.py index 1934dd9d0..f58cc5e0e 100644 --- a/tests/Unit/Models/Fields/test_idSizeField.py +++ b/tests/Unit/Models/Fields/test_idSizeField.py @@ -7,7 +7,7 @@ def test_H(): assert field.pack == b'\x01\x00\x01\x00\x03\x00' -def test_H(): +def test_I(): field = IdSizeField(1, 4, 3) assert field.pack == b'\x01\x00\x01\x00\x03\x00\x00\x00' From e5479964562c8142b9b0c91bd020b6e8d02478b2 Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Mon, 2 Mar 2026 10:15:08 -0500 Subject: [PATCH 014/160] Update test_idSizeField.py --- tests/Unit/Models/Fields/test_idSizeField.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/Unit/Models/Fields/test_idSizeField.py b/tests/Unit/Models/Fields/test_idSizeField.py index f58cc5e0e..0b94ab356 100644 --- a/tests/Unit/Models/Fields/test_idSizeField.py +++ b/tests/Unit/Models/Fields/test_idSizeField.py @@ -4,12 +4,12 @@ def test_H(): field = IdSizeField(1, 2, 3) - assert field.pack == b'\x01\x00\x01\x00\x03\x00' + assert field.pack("cp", "little") == b'\x01\x00\x01\x00\x00\x00\x03\x00' def test_I(): field = IdSizeField(1, 4, 3) - assert field.pack == b'\x01\x00\x01\x00\x03\x00\x00\x00' + assert field.pack("cp", "little") == b'\x01\x00\x01\x00\x00\x00\x03\x00\x00\x00' def test_bad_value() -> None: From edd2f93696b73ffd85c60ad7602411a18b1517ad Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Mon, 2 Mar 2026 10:19:45 -0500 Subject: [PATCH 015/160] Update test_idSizeField.py --- tests/Unit/Models/Fields/test_idSizeField.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/Unit/Models/Fields/test_idSizeField.py b/tests/Unit/Models/Fields/test_idSizeField.py index 0b94ab356..fbf7c9212 100644 --- a/tests/Unit/Models/Fields/test_idSizeField.py +++ b/tests/Unit/Models/Fields/test_idSizeField.py @@ -9,7 +9,8 @@ def test_H(): def test_I(): field = IdSizeField(1, 4, 3) - assert field.pack("cp", "little") == b'\x01\x00\x01\x00\x00\x00\x03\x00\x00\x00' + expected = b'\x01\x00\x01\x00\x00\x00\x03\x00\x00\x00' + assert field.pack("cp", "little") == expected def test_bad_value() -> None: From f21a4936a7c1eb50fc888a0720ab737231a9549f Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Mon, 2 Mar 2026 10:26:52 -0500 Subject: [PATCH 016/160] Update test_idSizeField.py --- tests/Unit/Models/Fields/test_idSizeField.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/Unit/Models/Fields/test_idSizeField.py b/tests/Unit/Models/Fields/test_idSizeField.py index fbf7c9212..34e9529ce 100644 --- a/tests/Unit/Models/Fields/test_idSizeField.py +++ b/tests/Unit/Models/Fields/test_idSizeField.py @@ -4,12 +4,12 @@ def test_H(): field = IdSizeField(1, 2, 3) - assert field.pack("cp", "little") == b'\x01\x00\x01\x00\x00\x00\x03\x00' + assert field.pack("cp", "little") == b'\x01\x00\x02\x00\x00\x00\x03\x00' def test_I(): field = IdSizeField(1, 4, 3) - expected = b'\x01\x00\x01\x00\x00\x00\x03\x00\x00\x00' + expected = b'\x01\x00\x04\x00\x00\x00\x03\x00\x00\x00' assert field.pack("cp", "little") == expected From c0d7246e75fbfe3d17b7c3a2be979ec0ab48c3f5 Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Mon, 2 Mar 2026 10:42:47 -0500 Subject: [PATCH 017/160] Update test_idSizeField.py --- tests/Unit/Models/Fields/test_idSizeField.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/tests/Unit/Models/Fields/test_idSizeField.py b/tests/Unit/Models/Fields/test_idSizeField.py index 34e9529ce..af0996176 100644 --- a/tests/Unit/Models/Fields/test_idSizeField.py +++ b/tests/Unit/Models/Fields/test_idSizeField.py @@ -2,10 +2,18 @@ from ms_ovba.Models.Fields.idSizeField import IdSizeField +def test_string() -> None: + field = IdSizeField(1, 2, "Hi") + expected = b'\x01\x00\x02\x00\x00\x00Hi' + assert field.pack("cp", "little") == expected + + def test_H(): field = IdSizeField(1, 2, 3) - assert field.pack("cp", "little") == b'\x01\x00\x02\x00\x00\x00\x03\x00' - + expected = b'\x01\x00\x02\x00\x00\x00\x03\x00' + assert field.pack("cp", "little") == expected + + def test_I(): field = IdSizeField(1, 4, 3) From b13cced918d458493608f3b79283cadc57681ff5 Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Mon, 2 Mar 2026 10:45:06 -0500 Subject: [PATCH 018/160] Update test_idSizeField.py --- tests/Unit/Models/Fields/test_idSizeField.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Unit/Models/Fields/test_idSizeField.py b/tests/Unit/Models/Fields/test_idSizeField.py index af0996176..ed25cdbf4 100644 --- a/tests/Unit/Models/Fields/test_idSizeField.py +++ b/tests/Unit/Models/Fields/test_idSizeField.py @@ -6,7 +6,7 @@ def test_string() -> None: field = IdSizeField(1, 2, "Hi") expected = b'\x01\x00\x02\x00\x00\x00Hi' assert field.pack("cp", "little") == expected - + def test_H(): field = IdSizeField(1, 2, 3) From a06dbaa601e134c376852c3833bbd519c75d96c3 Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Mon, 2 Mar 2026 10:46:06 -0500 Subject: [PATCH 019/160] Update idSizeField.py --- src/ms_ovba/Models/Fields/idSizeField.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/ms_ovba/Models/Fields/idSizeField.py b/src/ms_ovba/Models/Fields/idSizeField.py index cc6b5f061..bcc2c9c02 100644 --- a/src/ms_ovba/Models/Fields/idSizeField.py +++ b/src/ms_ovba/Models/Fields/idSizeField.py @@ -22,8 +22,7 @@ def pack(self: T, codepage_name: str, endien: str) -> bytes: if isinstance(self._value, str): self.stringValue = self._value self._value = bytes(self._value, encoding="ascii") - format += str(self._size) + "s" - elif isinstance(self._value, bytes): + if isinstance(self._value, bytes): format += str(self._size) + "s" elif self._size == 2: format += "H" From 457b526ffdb5003be7f551c36b25919ff1de5c12 Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Mon, 2 Mar 2026 10:48:34 -0500 Subject: [PATCH 020/160] Update test_idSizeField.py --- tests/Unit/Models/Fields/test_idSizeField.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/tests/Unit/Models/Fields/test_idSizeField.py b/tests/Unit/Models/Fields/test_idSizeField.py index ed25cdbf4..a83d55118 100644 --- a/tests/Unit/Models/Fields/test_idSizeField.py +++ b/tests/Unit/Models/Fields/test_idSizeField.py @@ -6,14 +6,13 @@ def test_string() -> None: field = IdSizeField(1, 2, "Hi") expected = b'\x01\x00\x02\x00\x00\x00Hi' assert field.pack("cp", "little") == expected - + def test_H(): field = IdSizeField(1, 2, 3) expected = b'\x01\x00\x02\x00\x00\x00\x03\x00' assert field.pack("cp", "little") == expected - - + def test_I(): field = IdSizeField(1, 4, 3) From a5d43bbe8ad4fc4744d812b2137786cb224641d9 Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Mon, 2 Mar 2026 10:53:01 -0500 Subject: [PATCH 021/160] Update doubleEncodedString.py --- src/ms_ovba/Models/Fields/doubleEncodedString.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/ms_ovba/Models/Fields/doubleEncodedString.py b/src/ms_ovba/Models/Fields/doubleEncodedString.py index 09c43166c..6f523faca 100644 --- a/src/ms_ovba/Models/Fields/doubleEncodedString.py +++ b/src/ms_ovba/Models/Fields/doubleEncodedString.py @@ -14,11 +14,11 @@ def __init__(self: T, ids: list, text: str) -> None: self.ids = ids self.value = text - def pack(self: T, codepage_name: str, endien: str) -> bytes: - encoded = self.value.encode(codepage_name) + def pack(self: T, endien: str, cp_name: str) -> bytes: + encoded = self.value.encode(cp_name) self.mod_name1 = IdSizeField(self.ids[0], len(encoded), encoded) format = "utf_16_le" if endien == 'little' else "utf_16_be" encoded = self.value.encode(format) self.mod_name2 = IdSizeField(self.ids[1], len(encoded), encoded) - return (self.mod_name1.pack(codepage_name, endien) - + self.mod_name2.pack(codepage_name, endien)) + return (self.mod_name1.pack(endien) + + self.mod_name2.pack(endien)) From d7a15d7d41f366a1139f49562f1b9eb7d5851dcf Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Mon, 2 Mar 2026 10:53:19 -0500 Subject: [PATCH 022/160] Update idSizeField.py --- src/ms_ovba/Models/Fields/idSizeField.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ms_ovba/Models/Fields/idSizeField.py b/src/ms_ovba/Models/Fields/idSizeField.py index bcc2c9c02..1506bc991 100644 --- a/src/ms_ovba/Models/Fields/idSizeField.py +++ b/src/ms_ovba/Models/Fields/idSizeField.py @@ -16,7 +16,7 @@ def __init__(self: T, id: int, size: int, value: Any) -> None: self._size = size self._value = value - def pack(self: T, codepage_name: str, endien: str) -> bytes: + def pack(self: T, endien: str) -> bytes: endien_symbol = '<' if endien == 'little' else '>' format = endien_symbol + "HI" if isinstance(self._value, str): From 93773ee8f3e6c0f0a7023c68b01b33af93708a40 Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Mon, 2 Mar 2026 10:54:07 -0500 Subject: [PATCH 023/160] Update packed_data.py --- src/ms_ovba/Models/Fields/packed_data.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ms_ovba/Models/Fields/packed_data.py b/src/ms_ovba/Models/Fields/packed_data.py index d96d41848..2c27aaafa 100644 --- a/src/ms_ovba/Models/Fields/packed_data.py +++ b/src/ms_ovba/Models/Fields/packed_data.py @@ -15,6 +15,6 @@ def __init__(self: T, format: str, *values: Any) -> None: self.values = values self.format = format - def pack(self: T, codepage_name: str, endien: str) -> bytes: + def pack(self: T, endien: str) -> bytes: endien_symbol = '<' if endien == 'little' else '>' return struct.pack(endien_symbol + self.format, *self.values) From f1244c25f2215edc935ee6344fadd288b713aa81 Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Mon, 2 Mar 2026 10:54:44 -0500 Subject: [PATCH 024/160] Update test_idSizeField.py --- tests/Unit/Models/Fields/test_idSizeField.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/Unit/Models/Fields/test_idSizeField.py b/tests/Unit/Models/Fields/test_idSizeField.py index a83d55118..d345bb00a 100644 --- a/tests/Unit/Models/Fields/test_idSizeField.py +++ b/tests/Unit/Models/Fields/test_idSizeField.py @@ -5,22 +5,22 @@ def test_string() -> None: field = IdSizeField(1, 2, "Hi") expected = b'\x01\x00\x02\x00\x00\x00Hi' - assert field.pack("cp", "little") == expected + assert field.pack("little") == expected def test_H(): field = IdSizeField(1, 2, 3) expected = b'\x01\x00\x02\x00\x00\x00\x03\x00' - assert field.pack("cp", "little") == expected + assert field.pack("little") == expected def test_I(): field = IdSizeField(1, 4, 3) expected = b'\x01\x00\x04\x00\x00\x00\x03\x00\x00\x00' - assert field.pack("cp", "little") == expected + assert field.pack("little") == expected def test_bad_value() -> None: field = IdSizeField(2, 3, 6) with pytest.raises(Exception): - field.pack(1234, "little") + field.pack("little") From 558d0400c2daac88789d174274defe188177279b Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Mon, 2 Mar 2026 10:56:00 -0500 Subject: [PATCH 025/160] Update test_reference.py --- tests/Unit/Models/Entities/test_reference.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Unit/Models/Entities/test_reference.py b/tests/Unit/Models/Entities/test_reference.py index 2e0e9e7fb..e9724fe6e 100644 --- a/tests/Unit/Models/Entities/test_reference.py +++ b/tests/Unit/Models/Entities/test_reference.py @@ -13,7 +13,7 @@ def pack(self, one, two) -> bytes: class MockRefProj: - def pack(self, foo, bar) -> bytes: + def pack(self, foo) -> bytes: return (b'\x0e\x00^\x00\x00\x000\x00\x00\x00' + b'*\\CC:\\Example Path\\Example-ReferencedProject.xls ' + b'\x00\x00\x00*\\CExample-ReferencedProject.xls' + From b19811756ccb52e9b47e9a9a2e3ebc49c5bcc938 Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Mon, 2 Mar 2026 10:57:11 -0500 Subject: [PATCH 026/160] Update reference.py --- src/ms_ovba/Models/Entities/reference.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ms_ovba/Models/Entities/reference.py b/src/ms_ovba/Models/Entities/reference.py index 50d8879dc..843f3f7f8 100644 --- a/src/ms_ovba/Models/Entities/reference.py +++ b/src/ms_ovba/Models/Entities/reference.py @@ -18,7 +18,7 @@ def __init__(self: T, ref: ReferenceRecord, self._ref = ref self._refname = name - def pack(self: T, cp_name: str, endien: str) -> bytes: + def pack(self: T, endien: str, cp_name: str) -> bytes: name_pack = b'' if self._refname is not None: name_de = DoubleEncodedString([0x0016, 0x003E], self._refname) From f5f4d0d8ef53eb6ca9dfa4bbc60d80ac89dad82c Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Mon, 2 Mar 2026 10:58:13 -0500 Subject: [PATCH 027/160] Update test_reference.py --- tests/Unit/Models/Entities/test_reference.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/Unit/Models/Entities/test_reference.py b/tests/Unit/Models/Entities/test_reference.py index e9724fe6e..3f299d73d 100644 --- a/tests/Unit/Models/Entities/test_reference.py +++ b/tests/Unit/Models/Entities/test_reference.py @@ -47,8 +47,8 @@ def test_pack() -> None: "00") expected = bytes.fromhex(" ".join(expected_hex)) codepage = 0x04E4 - codepage_name = "cp" + str(codepage) + cp_name = "cp" + str(codepage) path = 'ms_ovba.Models.Entities.reference.DoubleEncodedString' with mock.patch(path, MockDEString): - results = ref.pack(codepage_name, 'little') + results = ref.pack('little', cp_name) assert results == expected From 918811165f206ee31e4b767247ea33bd6ce91c67 Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Mon, 2 Mar 2026 11:00:09 -0500 Subject: [PATCH 028/160] Update reference_project.py --- src/ms_ovba/Models/Entities/reference_project.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/ms_ovba/Models/Entities/reference_project.py b/src/ms_ovba/Models/Entities/reference_project.py index d0dcf27a0..202656fc8 100644 --- a/src/ms_ovba/Models/Entities/reference_project.py +++ b/src/ms_ovba/Models/Entities/reference_project.py @@ -9,13 +9,10 @@ class ReferenceProject(ReferenceRecord): - def __init__(self: T, codepage_name: str, - ref: ProjectReference) -> None: - # is self._codepage_name even needed? - self._codepage_name = codepage_name + def __init__(self: T, ref: ProjectReference) -> None: self._ref = ref - def pack(self: T, cp_name: str, endien: str) -> bytes: + def pack(self: T, endien: str, cp_name: str) -> bytes: endien_symbol = '<' if endien == 'little' else '>' lib_rel = self._ref.relative() libid_abs_size = len(self._ref) From adbf425ee71e7c144a4974555a3afa126fc9991e Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Mon, 2 Mar 2026 11:01:25 -0500 Subject: [PATCH 029/160] Update test_reference_project.py --- tests/Unit/Models/Entities/test_reference_project.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/Unit/Models/Entities/test_reference_project.py b/tests/Unit/Models/Entities/test_reference_project.py index c3008e028..58e683f0e 100644 --- a/tests/Unit/Models/Entities/test_reference_project.py +++ b/tests/Unit/Models/Entities/test_reference_project.py @@ -38,7 +38,7 @@ def test_pack() -> None: "BE 65 17 00") expected = bytes.fromhex(" ".join(expected_hex)) codepage = 0x04E4 - codepage_name = "cp" + str(codepage) - ref_proj = ReferenceProject(codepage_name, ref) - results = ref_proj.pack(codepage_name, 'little') + cp_name = "cp" + str(codepage) + ref_proj = ReferenceProject(ref) + results = ref_proj.pack('little', cp_name) assert results == expected From bb3dc572e200e9c0eb60ee6879597aa0e73408d5 Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Mon, 2 Mar 2026 11:02:44 -0500 Subject: [PATCH 030/160] Update reference_registered.py --- src/ms_ovba/Models/Entities/reference_registered.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/ms_ovba/Models/Entities/reference_registered.py b/src/ms_ovba/Models/Entities/reference_registered.py index f55420eec..b9fd8b46d 100644 --- a/src/ms_ovba/Models/Entities/reference_registered.py +++ b/src/ms_ovba/Models/Entities/reference_registered.py @@ -12,17 +12,14 @@ class ReferenceRegistered(ReferenceRecord): 2.3.4.2.2.5 Specifies a reference to an Automation type library. """ - def __init__(self: T, codepage_name: str, - libid_ref: LibidReference) -> None: - # is self._codepage_name even needed? - self._codepage_name = codepage_name + def __init__(self: T, libid_ref: LibidReference) -> None: self._libid_ref = libid_ref @property def libid(self: T) -> LibidReference: return self._libid_ref - def pack(self: T, cp_name: str, endien: str) -> bytes: + def pack(self: T, endien: str, cp_name: str) -> bytes: endien_symbol = '<' if endien == 'little' else '>' strlen = len(self._libid_ref) format = endien_symbol + "HII" + str(strlen) + "sIH" From cd30c527540be66afa2106de134d8b51caaf66ee Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Mon, 2 Mar 2026 11:04:11 -0500 Subject: [PATCH 031/160] Update test_reference_registered.py --- tests/Unit/Models/Entities/test_reference_registered.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/Unit/Models/Entities/test_reference_registered.py b/tests/Unit/Models/Entities/test_reference_registered.py index 1287e05e6..18d356590 100644 --- a/tests/Unit/Models/Entities/test_reference_registered.py +++ b/tests/Unit/Models/Entities/test_reference_registered.py @@ -21,7 +21,7 @@ def unpack(data): def test_constructor() -> None: ref = MockLibid1() - module = ReferenceRegistered("cp1", ref) + module = ReferenceRegistered(ref) assert isinstance(module, ReferenceRegistered) @@ -35,9 +35,9 @@ def test_pack() -> None: "74 6F 6D 61 74 69 6F 6E 00 00 00 00 00 00") expected = bytes.fromhex(" ".join(expected_hex)) codepage = 0x04E4 - codepage_name = "cp" + str(codepage) - ref_reg = ReferenceRegistered(codepage_name, MockLibid1()) - results = ref_reg.pack(codepage_name, 'little') + cp_name = "cp" + str(codepage) + ref_reg = ReferenceRegistered(MockLibid1()) + results = ref_reg.pack('little', cp_name) assert results == expected From dbc4fcb4518d83e82b844daa1c9d6ef6e7cc83b0 Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Mon, 2 Mar 2026 11:06:40 -0500 Subject: [PATCH 032/160] Update test_reference.py --- tests/Unit/Models/Entities/test_reference.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Unit/Models/Entities/test_reference.py b/tests/Unit/Models/Entities/test_reference.py index 3f299d73d..37b4bbc09 100644 --- a/tests/Unit/Models/Entities/test_reference.py +++ b/tests/Unit/Models/Entities/test_reference.py @@ -13,7 +13,7 @@ def pack(self, one, two) -> bytes: class MockRefProj: - def pack(self, foo) -> bytes: + def pack(self, foo, bar) -> bytes: return (b'\x0e\x00^\x00\x00\x000\x00\x00\x00' + b'*\\CC:\\Example Path\\Example-ReferencedProject.xls ' + b'\x00\x00\x00*\\CExample-ReferencedProject.xls' + From a7ccd09e787b0633d5d91266411c8e933990e8b4 Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Mon, 2 Mar 2026 11:09:44 -0500 Subject: [PATCH 033/160] Update reference_registered.py --- src/ms_ovba/Models/Entities/reference_registered.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ms_ovba/Models/Entities/reference_registered.py b/src/ms_ovba/Models/Entities/reference_registered.py index b9fd8b46d..b72508303 100644 --- a/src/ms_ovba/Models/Entities/reference_registered.py +++ b/src/ms_ovba/Models/Entities/reference_registered.py @@ -61,4 +61,4 @@ def unpack(data: bytes, endien: str) -> T: pass libid_ref = LibidReference.unpack(libid_ref_bytes) - return ReferenceRegistered("", libid_ref) + return ReferenceRegistered(libid_ref) From 3c45d7f166bf918c5c1c8ce8d7522c7e1f9be170 Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Mon, 2 Mar 2026 11:11:05 -0500 Subject: [PATCH 034/160] Update test_reference_project.py --- tests/Unit/Models/Entities/test_reference_project.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Unit/Models/Entities/test_reference_project.py b/tests/Unit/Models/Entities/test_reference_project.py index 58e683f0e..1026fa175 100644 --- a/tests/Unit/Models/Entities/test_reference_project.py +++ b/tests/Unit/Models/Entities/test_reference_project.py @@ -3,7 +3,7 @@ def test_constructor() -> None: ref = MockProjectReference() - module = ReferenceProject("cp1", ref) + module = ReferenceProject(ref) assert isinstance(module, ReferenceProject) From 45de9c8a656536a79bb5db4a2160d36d78abc7b1 Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Mon, 2 Mar 2026 11:14:41 -0500 Subject: [PATCH 035/160] Update test_project_reference.py --- tests/Unit/Models/Fields/test_project_reference.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tests/Unit/Models/Fields/test_project_reference.py b/tests/Unit/Models/Fields/test_project_reference.py index 578ba5ade..040c81094 100644 --- a/tests/Unit/Models/Fields/test_project_reference.py +++ b/tests/Unit/Models/Fields/test_project_reference.py @@ -20,3 +20,9 @@ def test_len() -> None: def test_str() -> None: ref = ProjectReference("C:\\Example Path\\Example-ReferencedProject.xls") assert str(ref) == "*\\CC:\\Example Path\\Example-ReferencedProject.xls" + + +def test_relative() -> None: + ref = ProjectReference("C:\\Example Path\\Example-ReferencedProject.xls") + rel = ref.relative() + assert str(rel) == "Example-ReferencedProject.xls" From 693d2ec8a2e26180d19aeb4f0020f9b6ea04ade6 Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Mon, 2 Mar 2026 11:16:10 -0500 Subject: [PATCH 036/160] Update test_project_reference.py --- tests/Unit/Models/Fields/test_project_reference.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Unit/Models/Fields/test_project_reference.py b/tests/Unit/Models/Fields/test_project_reference.py index 040c81094..3b2f2f59f 100644 --- a/tests/Unit/Models/Fields/test_project_reference.py +++ b/tests/Unit/Models/Fields/test_project_reference.py @@ -25,4 +25,4 @@ def test_str() -> None: def test_relative() -> None: ref = ProjectReference("C:\\Example Path\\Example-ReferencedProject.xls") rel = ref.relative() - assert str(rel) == "Example-ReferencedProject.xls" + assert str(rel) == "*\\CExample-ReferencedProject.xls" From 8a74790f7d93e4e292ff511d144f500169501040 Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Mon, 2 Mar 2026 11:21:41 -0500 Subject: [PATCH 037/160] Update doubleEncodedString.py --- src/ms_ovba/Models/Fields/doubleEncodedString.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/ms_ovba/Models/Fields/doubleEncodedString.py b/src/ms_ovba/Models/Fields/doubleEncodedString.py index 6f523faca..52332a4b1 100644 --- a/src/ms_ovba/Models/Fields/doubleEncodedString.py +++ b/src/ms_ovba/Models/Fields/doubleEncodedString.py @@ -12,13 +12,17 @@ class DoubleEncodedString(): """ def __init__(self: T, ids: list, text: str) -> None: self.ids = ids - self.value = text + self._value = text + + @property + def value(self) -> str: + return self._value def pack(self: T, endien: str, cp_name: str) -> bytes: - encoded = self.value.encode(cp_name) + encoded = self._value.encode(cp_name) self.mod_name1 = IdSizeField(self.ids[0], len(encoded), encoded) format = "utf_16_le" if endien == 'little' else "utf_16_be" - encoded = self.value.encode(format) + encoded = self._value.encode(format) self.mod_name2 = IdSizeField(self.ids[1], len(encoded), encoded) return (self.mod_name1.pack(endien) + self.mod_name2.pack(endien)) From 9c493c4c96ba3654ef758d424e81745fe5999b8a Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Mon, 2 Mar 2026 11:27:28 -0500 Subject: [PATCH 038/160] Create test_double_encoded_string.py --- .../Fields/test_double_encoded_string.py | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 tests/Unit/Models/Fields/test_double_encoded_string.py diff --git a/tests/Unit/Models/Fields/test_double_encoded_string.py b/tests/Unit/Models/Fields/test_double_encoded_string.py new file mode 100644 index 000000000..10d7cecf2 --- /dev/null +++ b/tests/Unit/Models/Fields/test_double_encoded_string.py @@ -0,0 +1,20 @@ +from ms_ovba.Models.Fields.doubleEncodedString import ( + DoubleEncodedString +) + + +def test_constructor() -> None: + de_string = DoubleEncodedString([0x01, 0x02], "Foo") + assert isinstance(de_string, DoubleEncodedString) + + +def test_value_property() -> None: + expected = "Foo" + de_string = DoubleEncodedString([0x01, 0x02], expected) + assert de_string.value == expected + + +def test_pack() -> None: + de_string = DoubleEncodedString([0x01, 0x02], "Foo") + expected = (b'\x01\x00\x03\x00\x00\x00Foo' + + b'\x02\x00\x06\x00\x00\x00F\x00o\x00o\x00') From de49ef166bb61ab7093a34445ef79460062514ec Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Mon, 2 Mar 2026 11:30:18 -0500 Subject: [PATCH 039/160] Update test_double_encoded_string.py --- tests/Unit/Models/Fields/test_double_encoded_string.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/Unit/Models/Fields/test_double_encoded_string.py b/tests/Unit/Models/Fields/test_double_encoded_string.py index 10d7cecf2..c87fb87fa 100644 --- a/tests/Unit/Models/Fields/test_double_encoded_string.py +++ b/tests/Unit/Models/Fields/test_double_encoded_string.py @@ -15,6 +15,9 @@ def test_value_property() -> None: def test_pack() -> None: + codepage = 0x04E4 + cp_name = "cp" + str(codepage) de_string = DoubleEncodedString([0x01, 0x02], "Foo") expected = (b'\x01\x00\x03\x00\x00\x00Foo' + b'\x02\x00\x06\x00\x00\x00F\x00o\x00o\x00') + assert de_string.pack("little",cp_name) == expected From 20b7ee54c5ec6711c9ffb996f4738c7d5dc0eca3 Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Mon, 2 Mar 2026 11:34:56 -0500 Subject: [PATCH 040/160] Update test_double_encoded_string.py --- tests/Unit/Models/Fields/test_double_encoded_string.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Unit/Models/Fields/test_double_encoded_string.py b/tests/Unit/Models/Fields/test_double_encoded_string.py index c87fb87fa..94377392d 100644 --- a/tests/Unit/Models/Fields/test_double_encoded_string.py +++ b/tests/Unit/Models/Fields/test_double_encoded_string.py @@ -20,4 +20,4 @@ def test_pack() -> None: de_string = DoubleEncodedString([0x01, 0x02], "Foo") expected = (b'\x01\x00\x03\x00\x00\x00Foo' + b'\x02\x00\x06\x00\x00\x00F\x00o\x00o\x00') - assert de_string.pack("little",cp_name) == expected + assert de_string.pack("little", cp_name) == expected From 6bf7eaa1b56155bdb58a759057b02b33faf95dde Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Mon, 2 Mar 2026 11:44:35 -0500 Subject: [PATCH 041/160] Update test_project_reference.py --- .../Models/Fields/test_project_reference.py | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/tests/Unit/Models/Fields/test_project_reference.py b/tests/Unit/Models/Fields/test_project_reference.py index 3b2f2f59f..e5a9792c8 100644 --- a/tests/Unit/Models/Fields/test_project_reference.py +++ b/tests/Unit/Models/Fields/test_project_reference.py @@ -1,3 +1,4 @@ +import pytest from ms_ovba.Models.Fields.project_reference import ProjectReference @@ -17,9 +18,19 @@ def test_len() -> None: assert len(ref) == 48 -def test_str() -> None: - ref = ProjectReference("C:\\Example Path\\Example-ReferencedProject.xls") - assert str(ref) == "*\\CC:\\Example Path\\Example-ReferencedProject.xls" +@pytest.mark.parametrize("data, expected", [ + [ + "C:\\Example Path\\Example-ReferencedProject.xls", + "*\\CC:\\Example Path\\Example-ReferencedProject.xls" + ], + [ + "/Example Path/Example-ReferencedProject.xls", + "*\\B/Example Path/Example-ReferencedProject.xls" + ] +]) +def test_str(data, expected) -> None: + ref = ProjectReference(data) + assert str(ref) == expected def test_relative() -> None: From 6628cf61f564db5a3ac1907f16bd5c0460aa340a Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Mon, 2 Mar 2026 11:45:52 -0500 Subject: [PATCH 042/160] Update test_project_reference.py --- tests/Unit/Models/Fields/test_project_reference.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/Unit/Models/Fields/test_project_reference.py b/tests/Unit/Models/Fields/test_project_reference.py index e5a9792c8..b9377bbee 100644 --- a/tests/Unit/Models/Fields/test_project_reference.py +++ b/tests/Unit/Models/Fields/test_project_reference.py @@ -19,14 +19,14 @@ def test_len() -> None: @pytest.mark.parametrize("data, expected", [ - [ + ( "C:\\Example Path\\Example-ReferencedProject.xls", "*\\CC:\\Example Path\\Example-ReferencedProject.xls" - ], - [ + ), + ( "/Example Path/Example-ReferencedProject.xls", "*\\B/Example Path/Example-ReferencedProject.xls" - ] + ) ]) def test_str(data, expected) -> None: ref = ProjectReference(data) From cdea10dceb765689e3b0cbbc0040327f1adfca52 Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Mon, 2 Mar 2026 11:51:11 -0500 Subject: [PATCH 043/160] Update test_project_reference.py --- tests/Unit/Models/Fields/test_project_reference.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/tests/Unit/Models/Fields/test_project_reference.py b/tests/Unit/Models/Fields/test_project_reference.py index b9377bbee..1a485638d 100644 --- a/tests/Unit/Models/Fields/test_project_reference.py +++ b/tests/Unit/Models/Fields/test_project_reference.py @@ -18,18 +18,20 @@ def test_len() -> None: assert len(ref) == 48 -@pytest.mark.parametrize("data, expected", [ +@pytest.mark.parametrize("data, "embedded", expected", [ ( "C:\\Example Path\\Example-ReferencedProject.xls", + True, "*\\CC:\\Example Path\\Example-ReferencedProject.xls" ), ( "/Example Path/Example-ReferencedProject.xls", + False, "*\\B/Example Path/Example-ReferencedProject.xls" ) ]) -def test_str(data, expected) -> None: - ref = ProjectReference(data) +def test_str(data, embedded, expected) -> None: + ref = ProjectReference(data, embedded) assert str(ref) == expected From 0294b14b3d115cc0f34feeec4630a2baf830ff1d Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Mon, 2 Mar 2026 11:52:01 -0500 Subject: [PATCH 044/160] Update test_project_reference.py --- tests/Unit/Models/Fields/test_project_reference.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Unit/Models/Fields/test_project_reference.py b/tests/Unit/Models/Fields/test_project_reference.py index 1a485638d..9c8b12dc7 100644 --- a/tests/Unit/Models/Fields/test_project_reference.py +++ b/tests/Unit/Models/Fields/test_project_reference.py @@ -18,7 +18,7 @@ def test_len() -> None: assert len(ref) == 48 -@pytest.mark.parametrize("data, "embedded", expected", [ +@pytest.mark.parametrize("data, embedded, expected", [ ( "C:\\Example Path\\Example-ReferencedProject.xls", True, From 191ee0081ff15ccdd2ec72dcf3215487c19a0eec Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Mon, 2 Mar 2026 12:14:53 -0500 Subject: [PATCH 045/160] Update dirStream.py --- src/ms_ovba/Views/dirStream.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/ms_ovba/Views/dirStream.py b/src/ms_ovba/Views/dirStream.py index db22fb96f..fe816ee57 100644 --- a/src/ms_ovba/Views/dirStream.py +++ b/src/ms_ovba/Views/dirStream.py @@ -24,7 +24,7 @@ def __init__(self: T, project: VbaProject) -> None: def to_bytes(self: T) -> bytes: information = self._load_information() endien = self.project.endien - codepage_name = self.project.get_codepage_name() + cp_name = self.project.get_codepage_name() pack_symbol = '<' if endien == 'little' else '>' # should be 0xFFFF cookie_value = self.project.get_project_cookie() @@ -33,16 +33,16 @@ def to_bytes(self: T) -> bytes: modules = self.project.modules output = b'' for record in information: - output += record.pack(codepage_name, endien) + output += record.pack(endien, cp_name) for record in references: - output += record.pack(codepage_name, endien) + output += record.pack(endien, cp_name) modules_header = IdSizeField(0x000F, 2, len(modules)) - output += (modules_header.pack(codepage_name, endien) - + self.project_cookie.pack(codepage_name, endien)) + output += (modules_header.pack(cp_name, endien) + + self.project_cookie.pack(cp_name, endien)) for record in modules: - output += record.pack(codepage_name, endien) + output += record.pack(cp_name, endien) output += struct.pack(pack_symbol + "HI", 16, 0) return output From 0ba33a234d7245824830226fc55fde923d8a0519 Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Mon, 2 Mar 2026 12:17:15 -0500 Subject: [PATCH 046/160] Update and rename test_dirObject.pyt to test_dirObject.py --- tests/Functional/{test_dirObject.pyt => test_dirObject.py} | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename tests/Functional/{test_dirObject.pyt => test_dirObject.py} (96%) diff --git a/tests/Functional/test_dirObject.pyt b/tests/Functional/test_dirObject.py similarity index 96% rename from tests/Functional/test_dirObject.pyt rename to tests/Functional/test_dirObject.py index f09d144f0..7f3f50e56 100644 --- a/tests/Functional/test_dirObject.pyt +++ b/tests/Functional/test_dirObject.py @@ -36,7 +36,7 @@ def test_dirstream() -> None: codepage = 0x04E4 codepage_name = "cp" + str(codepage) guid = uuid.UUID('0002043000000000C000000000000046') - libid_ref = ReferenceRegistered(codepage_name, LibidReference( + libid_ref = ReferenceRegistered(LibidReference( guid, "2.0", "0", @@ -45,7 +45,7 @@ def test_dirstream() -> None: )) ole_reference = Reference(libid_ref, "stdole") guid = uuid.UUID('2DF8D04C5BFA101BBDE500AA0044DE52') - libid_ref2 = ReferenceRegistered(codepage_name, LibidReference( + libid_ref2 = ReferenceRegistered(LibidReference( guid, "2.0", "0", From 61fe4eab03fb82469b2bc89ddc920c70fff459bd Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Mon, 2 Mar 2026 12:19:04 -0500 Subject: [PATCH 047/160] Update test_dirObject.py --- tests/Functional/test_dirObject.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/Functional/test_dirObject.py b/tests/Functional/test_dirObject.py index 7f3f50e56..6195bbdd2 100644 --- a/tests/Functional/test_dirObject.py +++ b/tests/Functional/test_dirObject.py @@ -33,8 +33,6 @@ def test_dirstream() -> None: project = VbaProject() stream = DirStream(project) stream.include_compat() - codepage = 0x04E4 - codepage_name = "cp" + str(codepage) guid = uuid.UUID('0002043000000000C000000000000046') libid_ref = ReferenceRegistered(LibidReference( guid, From 863ff82b648624f5f52e532e4608904a058c8f8e Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Mon, 2 Mar 2026 12:20:39 -0500 Subject: [PATCH 048/160] Update idSizeField.py --- src/ms_ovba/Models/Fields/idSizeField.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ms_ovba/Models/Fields/idSizeField.py b/src/ms_ovba/Models/Fields/idSizeField.py index 1506bc991..1fb96134b 100644 --- a/src/ms_ovba/Models/Fields/idSizeField.py +++ b/src/ms_ovba/Models/Fields/idSizeField.py @@ -16,7 +16,7 @@ def __init__(self: T, id: int, size: int, value: Any) -> None: self._size = size self._value = value - def pack(self: T, endien: str) -> bytes: + def pack(self: T, endien: str, cp_name: str = None) -> bytes: endien_symbol = '<' if endien == 'little' else '>' format = endien_symbol + "HI" if isinstance(self._value, str): From c5f425a39aecea54e3e3b90738574bac3d04a5cf Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Mon, 2 Mar 2026 12:51:08 -0500 Subject: [PATCH 049/160] Update packed_data.py --- src/ms_ovba/Models/Fields/packed_data.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ms_ovba/Models/Fields/packed_data.py b/src/ms_ovba/Models/Fields/packed_data.py index 2c27aaafa..70e8430f8 100644 --- a/src/ms_ovba/Models/Fields/packed_data.py +++ b/src/ms_ovba/Models/Fields/packed_data.py @@ -15,6 +15,6 @@ def __init__(self: T, format: str, *values: Any) -> None: self.values = values self.format = format - def pack(self: T, endien: str) -> bytes: + def pack(self: T, endien: str, cp_name: str = None) -> bytes: endien_symbol = '<' if endien == 'little' else '>' return struct.pack(endien_symbol + self.format, *self.values) From eb1918a858d42c0c72998e5133c38858ac25391d Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Mon, 2 Mar 2026 12:59:11 -0500 Subject: [PATCH 050/160] Update reference.py --- src/ms_ovba/Models/Entities/reference.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ms_ovba/Models/Entities/reference.py b/src/ms_ovba/Models/Entities/reference.py index 843f3f7f8..a2a121d8d 100644 --- a/src/ms_ovba/Models/Entities/reference.py +++ b/src/ms_ovba/Models/Entities/reference.py @@ -22,7 +22,7 @@ def pack(self: T, endien: str, cp_name: str) -> bytes: name_pack = b'' if self._refname is not None: name_de = DoubleEncodedString([0x0016, 0x003E], self._refname) - name_pack = name_de.pack(cp_name, endien) + name_pack = name_de.pack(endien, cp_name) return name_pack + self._ref.pack(cp_name, endien) From 09b0da6856cfe8a312640d4cdf8e1f8ad03dff97 Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Mon, 2 Mar 2026 13:03:09 -0500 Subject: [PATCH 051/160] Update reference.py --- src/ms_ovba/Models/Entities/reference.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ms_ovba/Models/Entities/reference.py b/src/ms_ovba/Models/Entities/reference.py index a2a121d8d..a9b9d8368 100644 --- a/src/ms_ovba/Models/Entities/reference.py +++ b/src/ms_ovba/Models/Entities/reference.py @@ -24,7 +24,7 @@ def pack(self: T, endien: str, cp_name: str) -> bytes: name_de = DoubleEncodedString([0x0016, 0x003E], self._refname) name_pack = name_de.pack(endien, cp_name) - return name_pack + self._ref.pack(cp_name, endien) + return name_pack + self._ref.pack(endien, cp_name) @staticmethod def unpack(data: bytes, endien: str) -> T: From 14cec35adb0c0dbbaf1ff89f629e87913a797245 Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Mon, 2 Mar 2026 13:09:54 -0500 Subject: [PATCH 052/160] Update module_base.py --- src/ms_ovba/Models/Entities/module_base.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/ms_ovba/Models/Entities/module_base.py b/src/ms_ovba/Models/Entities/module_base.py index 4d2f0b399..90c08c8e2 100644 --- a/src/ms_ovba/Models/Entities/module_base.py +++ b/src/ms_ovba/Models/Entities/module_base.py @@ -65,22 +65,22 @@ def add_workspace(self: T, val1: int, val2: int, val3: int, val4: int, val5: int) -> None: self.workspace = [val1, val2, val3, val4, val5] - def pack(self: T, codepage_name: str, endien: str) -> bytes: + def pack(self: T, endien: str, cp_name: str) -> bytes: """ Pack the metadata for use in the dir stream. """ typeid_value = 0x0022 if self.type == 'Document' else 0x0021 type_id = PackedData("HI", typeid_value, 0) self.offsetRec = IdSizeField(0x0031, 4, len(self._cache)) - output = (self.modName.pack(codepage_name, endien) - + self.streamName.pack(codepage_name, endien) - + self.docString.pack(codepage_name, endien) - + self.offsetRec.pack(codepage_name, endien) - + self.helpContext.pack(codepage_name, endien) - + self.cookie.pack(codepage_name, endien) - + type_id.pack(codepage_name, endien)) + output = (self.modName.pack(endien, cp_name) + + self.streamName.pack(endien, cp_name) + + self.docString.pack(endien, cp_name) + + self.offsetRec.pack(endien) + + self.helpContext.pack(endien, cp_name) + + self.cookie.pack(endien) + + type_id.pack(endien)) footer = PackedData("HI", 0x002B, 0) - output += footer.pack(codepage_name, endien) + output += footer.pack(endien) return output def to_project_module_string(self: T) -> str: From f46dd3bb518b3ef8226cc089b95323f5b6c7eafb Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Mon, 2 Mar 2026 13:12:34 -0500 Subject: [PATCH 053/160] Update dirStream.py --- src/ms_ovba/Views/dirStream.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/ms_ovba/Views/dirStream.py b/src/ms_ovba/Views/dirStream.py index fe816ee57..09cdcc5b0 100644 --- a/src/ms_ovba/Views/dirStream.py +++ b/src/ms_ovba/Views/dirStream.py @@ -39,10 +39,10 @@ def to_bytes(self: T) -> bytes: modules_header = IdSizeField(0x000F, 2, len(modules)) - output += (modules_header.pack(cp_name, endien) - + self.project_cookie.pack(cp_name, endien)) + output += (modules_header.pack(endien) + + self.project_cookie.pack(endien)) for record in modules: - output += record.pack(cp_name, endien) + output += record.pack(endien, cp_name) output += struct.pack(pack_symbol + "HI", 16, 0) return output From 46f1a7acf71e4ef301dffb2861eaa7e58a87c45f Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Mon, 2 Mar 2026 13:19:15 -0500 Subject: [PATCH 054/160] Update and rename test_fullFile.pyt to test_fullFile.py --- tests/Functional/{test_fullFile.pyt => test_fullFile.py} | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) rename tests/Functional/{test_fullFile.pyt => test_fullFile.py} (97%) diff --git a/tests/Functional/test_fullFile.pyt b/tests/Functional/test_fullFile.py similarity index 97% rename from tests/Functional/test_fullFile.pyt rename to tests/Functional/test_fullFile.py index 82f6f749b..cfd2eb6d3 100644 --- a/tests/Functional/test_fullFile.pyt +++ b/tests/Functional/test_fullFile.py @@ -83,22 +83,22 @@ def test_full_file() -> None: project.set_include_projectwm(True) codepage = 0x04E4 codepage_name = "cp" + str(codepage) - libid_ref = ReferenceRegistered(codepage_name, LibidReference( + libid_ref = ReferenceRegistered(LibidReference( uuid.UUID("0002043000000000C000000000000046"), "2.0", "0", "C:\\Windows\\System32\\stdole2.tlb", "OLE Automation" )) - ole_reference = Reference(codepage_name, libid_ref, "stdole") - libid_ref2 = ReferenceRegistered(codepage_name, LibidReference( + ole_reference = Reference(libid_ref, "stdole") + libid_ref2 = ReferenceRegistered(LibidReference( uuid.UUID("2DF8D04C5BFA101BBDE500AA0044DE52"), "2.0", "0", "C:\\Program Files\\Common Files\\Microsoft Shared\\OFFICE16\\MSO.DLL", "Microsoft Office 16.0 Object Library" )) - office_reference = Reference(codepage_name, libid_ref2, "Office") + office_reference = Reference(libid_ref2, "Office") project.add_reference(ole_reference) project.add_reference(office_reference) proj_cookie = 0x08F3 From c904e346e8ad4dc03708048f21ae39c61e77c495 Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Mon, 2 Mar 2026 14:01:00 -0500 Subject: [PATCH 055/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index cfd2eb6d3..20aa141da 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -81,8 +81,6 @@ def test_full_file() -> None: project = VbaProject() project.default_date = Filetime.from_msfiletime(0x01D92433C2B823C0) project.set_include_projectwm(True) - codepage = 0x04E4 - codepage_name = "cp" + str(codepage) libid_ref = ReferenceRegistered(LibidReference( uuid.UUID("0002043000000000C000000000000046"), "2.0", From 720e53e5be975eccb0cd69cc6c9a3ff9d035ad47 Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Mon, 2 Mar 2026 14:05:56 -0500 Subject: [PATCH 056/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index 20aa141da..da11b5644 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -134,8 +134,7 @@ def test_full_file() -> None: project.add_module(sheet1) project.add_module(this_workbook) - ole_file = ProjectOleFile(project) - ole_file.write_file() + ProjectOleFile.write_file(project) # storage.set_modified(time) # storage.set_created(time) From 251fe268cd6315c4849beb6eb03a8b248ae2514c Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Mon, 2 Mar 2026 15:51:16 -0500 Subject: [PATCH 057/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 41 ++----------------------------- 1 file changed, 2 insertions(+), 39 deletions(-) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index da11b5644..bd9006d87 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -136,45 +136,8 @@ def test_full_file() -> None: ProjectOleFile.write_file(project) - # storage.set_modified(time) - # storage.set_created(time) - - # fails - # file_size = os.stat("vbaProject.bin").st_size - # expected_size = os.stat("tests/blank/vbaProject.bin").st_size - # assert file_size == expected_size - # compare new file to blank file in 512 block chunks - new = open("./vbaProject.bin", "rb") - expected = open("tests/blank/vbaProject.bin", "rb") - - # Header - assert new.read(512) == expected.read(512) - - # FAT - # assert new.read(512) == expected.read(512) - new.read(512) - expected.read(512) - - # Dir1 - ole_standard = OleFile.create_from_file("tests/blank/vbaProject.bin") - ole_new = OleFile.create_from_file("./vbaProject.bin") - std_flat = ole_standard.root_directory.flatten() - new_flat = ole_new.root_directory.flatten() - assert (len(std_flat) == len(new_flat)) - std_str = "" - new_str = "" - for dir in std_flat: - std_str += "\n" + str(dir) - for dir in new_flat: - new_str += "\n" + str(dir) - assert new_str == std_str - - # assert new.read(512) == expected.read(512) - new.read(512) - expected.read(512) - - # minifat - # assert new.read(512) == expected.read(512) + # combine sectors from bin into the streams + # compare raw or uncompressed streams. def create_cache() -> bytes: From b14c489768c13c7e32475224408705dab42ca7f3 Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Tue, 3 Mar 2026 09:47:53 -0500 Subject: [PATCH 058/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index bd9006d87..3eeb5eb19 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -18,6 +18,7 @@ ) from ms_ovba.Models.Fields.libid_reference import LibidReference from ms_ovba.Views.project_ole_file import ProjectOleFile +from ms_ovba.Views.projectWm import ProjectWm from typing import Type, TypeVar @@ -134,6 +135,23 @@ def test_full_file() -> None: project.add_module(sheet1) project.add_module(this_workbook) + # Check ProjectWm + projectwm = ProjectWm(project) + # Read from file instead of pasting + expected = (b'ThisWorkbook\x00T\x00h' + + b'\x00i\x00s\x00W\x00o\x00r\x00k\x00b\x00o' + + b'\x00o\x00k\x00\x00\x00Sheet1\x00S\x00' + + b'h\x00e\x00e\x00t\x001\x00\x00\x00Modu' + + b'le1\x00M\x00o\x00d\x00u\x00l\x00e\x00' + + b'1\x00') + assert projectwm.to_bytes() == b'' + + # Check Project + + # Check Dir + + # Check _VBA_Project + ProjectOleFile.write_file(project) # combine sectors from bin into the streams From 416bfa449703f92d29609343df44105434f774ee Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Tue, 3 Mar 2026 09:50:44 -0500 Subject: [PATCH 059/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index 3eeb5eb19..206b23883 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -144,7 +144,7 @@ def test_full_file() -> None: b'h\x00e\x00e\x00t\x001\x00\x00\x00Modu' + b'le1\x00M\x00o\x00d\x00u\x00l\x00e\x00' + b'1\x00') - assert projectwm.to_bytes() == b'' + assert projectwm.to_bytes() == expected # Check Project From 424fa24d9798090f3fc6a5f508ed4ef43cef844a Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Tue, 3 Mar 2026 10:21:40 -0500 Subject: [PATCH 060/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index 206b23883..bb6786edd 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -3,7 +3,6 @@ import struct import unittest.mock import uuid -from ms_cfb.ole_file import OleFile from ms_dtyp.filetime import Filetime from ms_ovba_compression.ms_ovba import MsOvba from ms_pcode_assembler.module_cache import ModuleCache @@ -151,7 +150,7 @@ def test_full_file() -> None: # Check Dir # Check _VBA_Project - + ProjectOleFile.write_file(project) # combine sectors from bin into the streams From 676a2ba2ed371728ab47c80e8613b2c3f419ddac Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Tue, 3 Mar 2026 10:25:43 -0500 Subject: [PATCH 061/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index bb6786edd..adae79456 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -130,9 +130,10 @@ def test_full_file() -> None: module1.normalize_file() module1.set_cache(module_cache.to_bytes()) - project.add_module(module1) - project.add_module(sheet1) project.add_module(this_workbook) + project.add_module(sheet1) + project.add_module(module1) + # Check ProjectWm projectwm = ProjectWm(project) From 57282b8c4f919c5f6f098bedea36224447de11f8 Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Tue, 3 Mar 2026 10:26:59 -0500 Subject: [PATCH 062/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index adae79456..d6425b21f 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -133,7 +133,6 @@ def test_full_file() -> None: project.add_module(this_workbook) project.add_module(sheet1) project.add_module(module1) - # Check ProjectWm projectwm = ProjectWm(project) From 92a613f0ac2ad60d82d90f0bf0692c91960bc17e Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Tue, 3 Mar 2026 10:29:07 -0500 Subject: [PATCH 063/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index d6425b21f..5bcd9679f 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -142,7 +142,7 @@ def test_full_file() -> None: b'\x00o\x00k\x00\x00\x00Sheet1\x00S\x00' + b'h\x00e\x00e\x00t\x001\x00\x00\x00Modu' + b'le1\x00M\x00o\x00d\x00u\x00l\x00e\x00' + - b'1\x00') + b'1\x00\x00\x00\x00\x00') assert projectwm.to_bytes() == expected # Check Project From 8039a32517ed0f2a4125073f0fe9918e691a7f56 Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Tue, 3 Mar 2026 11:07:51 -0500 Subject: [PATCH 064/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index 5bcd9679f..39c91401b 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -143,7 +143,9 @@ def test_full_file() -> None: b'h\x00e\x00e\x00t\x001\x00\x00\x00Modu' + b'le1\x00M\x00o\x00d\x00u\x00l\x00e\x00' + b'1\x00\x00\x00\x00\x00') - assert projectwm.to_bytes() == expected + wm_bytes = projectwm.to_bytes() + assert size(wm_bytes) == 0x56 + assert wm_bytes == expected # Check Project From 583da8da368a530bcd7a6e15097b88f6bda43ae6 Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Tue, 3 Mar 2026 11:12:23 -0500 Subject: [PATCH 065/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index 39c91401b..570bb44af 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -135,7 +135,7 @@ def test_full_file() -> None: project.add_module(module1) # Check ProjectWm - projectwm = ProjectWm(project) + wm_bytes = ProjectWm(project).to_bytes() # Read from file instead of pasting expected = (b'ThisWorkbook\x00T\x00h' + b'\x00i\x00s\x00W\x00o\x00r\x00k\x00b\x00o' + @@ -143,7 +143,6 @@ def test_full_file() -> None: b'h\x00e\x00e\x00t\x001\x00\x00\x00Modu' + b'le1\x00M\x00o\x00d\x00u\x00l\x00e\x00' + b'1\x00\x00\x00\x00\x00') - wm_bytes = projectwm.to_bytes() assert size(wm_bytes) == 0x56 assert wm_bytes == expected @@ -152,6 +151,8 @@ def test_full_file() -> None: # Check Dir # Check _VBA_Project + pv_bytes = ProjectView(project).to_bytes() + assert size(pv_bytes) == 0x09F0 ProjectOleFile.write_file(project) From e86225a75989d75dfb2827f7514376d99cd1c3b7 Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Tue, 3 Mar 2026 11:13:27 -0500 Subject: [PATCH 066/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index 570bb44af..a5524e1ba 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -143,7 +143,7 @@ def test_full_file() -> None: b'h\x00e\x00e\x00t\x001\x00\x00\x00Modu' + b'le1\x00M\x00o\x00d\x00u\x00l\x00e\x00' + b'1\x00\x00\x00\x00\x00') - assert size(wm_bytes) == 0x56 + assert len(wm_bytes) == 0x56 assert wm_bytes == expected # Check Project @@ -152,7 +152,7 @@ def test_full_file() -> None: # Check _VBA_Project pv_bytes = ProjectView(project).to_bytes() - assert size(pv_bytes) == 0x09F0 + assert len(pv_bytes) == 0x09F0 ProjectOleFile.write_file(project) From 3549935e4ceeb9b60b9d23e86116f6b9fdacb10a Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Tue, 3 Mar 2026 11:15:27 -0500 Subject: [PATCH 067/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index a5524e1ba..63a1d099d 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -17,6 +17,7 @@ ) from ms_ovba.Models.Fields.libid_reference import LibidReference from ms_ovba.Views.project_ole_file import ProjectOleFile +from ms_ovba.Views.project_view import ProjectView from ms_ovba.Views.projectWm import ProjectWm from typing import Type, TypeVar From 5e677450255a66185bcfae8d80d8a9517fdb953c Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Tue, 3 Mar 2026 11:32:11 -0500 Subject: [PATCH 068/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index 63a1d099d..ea2bd8856 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -153,7 +153,14 @@ def test_full_file() -> None: # Check _VBA_Project pv_bytes = ProjectView(project).to_bytes() - assert len(pv_bytes) == 0x09F0 + bin_path = "tests/blank/vbaProject.bin" + bin_offset = 0x14C0 + cache_size = 0x09F0 + b = open(bin_path, "rb") + b.seek(bin_offset) + file_bytes = b.read(cache_size) + assert pv_bytes == file_bytes + # assert len(pv_bytes) == 0x09F0 ProjectOleFile.write_file(project) From 121056972620498955f9250d28155031415f5a99 Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Tue, 3 Mar 2026 12:11:55 -0500 Subject: [PATCH 069/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index ea2bd8856..e28915d79 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -213,6 +213,7 @@ def create_cache() -> bytes: ca = (b'' + b'\xFF\x09\x04\x00\x00\x09\x04\x00\x00\xE4\x04\x03\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x01\x00\x04\x00\x02\x00') + # Why is this counter here? i = 0 for lib in libraries: lib_str = bytearray(str(lib), "utf_16_le") @@ -220,7 +221,7 @@ def create_cache() -> bytes: ca += lib_str ca += struct.pack(" Date: Tue, 3 Mar 2026 12:46:31 -0500 Subject: [PATCH 070/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index e28915d79..9f9034058 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -103,7 +103,7 @@ def test_full_file() -> None: proj_cookie = 0x08F3 project.set_project_cookie(proj_cookie) project.set_project_id('{9E394C0B-697E-4AEE-9FA6-446F51FB30DC}') - project.set_performance_cache(create_cache()) + project.set_performance_cache(create_cache(proj_cookie)) project.set_performance_cache_version(0x00B5) base_path = "src/ms_ovba/blank_files/" @@ -168,7 +168,7 @@ def test_full_file() -> None: # compare raw or uncompressed streams. -def create_cache() -> bytes: +def create_cache(proj_cookie: int) -> bytes: modules = [] this_workbook = DocModule("ThisWorkbook") this_workbook.cookie.value = 0xB81C @@ -210,20 +210,28 @@ def create_cache() -> bytes: "C:\\Program Files\\Common Files\\Microsoft Shared\\OFFICE16\\MSO.DLL", "Microsoft Office 16.0 Object Library" )) - ca = (b'' - + b'\xFF\x09\x04\x00\x00\x09\x04\x00\x00\xE4\x04\x03\x00\x00\x00\x00' - + b'\x00\x00\x00\x00\x00\x01\x00\x04\x00\x02\x00') - # Why is this counter here? - i = 0 + ca = struct.pack(" Date: Tue, 3 Mar 2026 13:07:05 -0500 Subject: [PATCH 071/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index 9f9034058..f531f0d05 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -223,7 +223,8 @@ def create_cache(proj_cookie: int) -> bytes: ca += struct.pack("<5H", 3, 2, 2, 1, 6) # Compile Time Data - ca += struct.pack("<6IH", 0x0212, 0x010214, 0x010216, 0x0218, 0x01021a, 0x01021c, 0x0222) + ca += struct.pack("<6IH", 0x0212, 0x010214, 0x010216, 0x0218, + 0x01021a, 0x01021c, 0x0222) # Data ca += b'\xFF' * 6 + b'\x00' * 4 + b'\xFF' * 2 + b'\x00' * 2 From dc60e777a5d6a4cc34571d57f913cf21798fe6e0 Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Tue, 3 Mar 2026 13:21:19 -0500 Subject: [PATCH 072/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index f531f0d05..b8c3d5a62 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -210,7 +210,7 @@ def create_cache(proj_cookie: int) -> bytes: "C:\\Program Files\\Common Files\\Microsoft Shared\\OFFICE16\\MSO.DLL", "Microsoft Office 16.0 Object Library" )) - ca = struct.pack(" Date: Tue, 3 Mar 2026 13:24:04 -0500 Subject: [PATCH 073/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index b8c3d5a62..2eac75cad 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -210,7 +210,7 @@ def create_cache(proj_cookie: int) -> bytes: "C:\\Program Files\\Common Files\\Microsoft Shared\\OFFICE16\\MSO.DLL", "Microsoft Office 16.0 Object Library" )) - ca = struct.pack(" Date: Tue, 3 Mar 2026 13:34:16 -0500 Subject: [PATCH 074/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index 2eac75cad..f64c5e7a5 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -229,9 +229,13 @@ def create_cache(proj_cookie: int) -> bytes: # Data ca += b'\xFF' * 6 + b'\x00' * 4 + b'\xFF' * 2 + b'\x00' * 2 ca += struct.pack("<3H", 0x0257, 0x65BE, 0x11) + + # 64 bytes? ca += b'\xFF' * 8 ca += struct.pack(" Date: Tue, 3 Mar 2026 13:45:49 -0500 Subject: [PATCH 075/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index f64c5e7a5..fa44ceeee 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -237,10 +237,11 @@ def create_cache(proj_cookie: int) -> bytes: # Footer? ca += struct.pack("<5IH", 1, 0, 0, 0, 0, proj_cookie) - prefix = [0x0018, 0x000C, 0x000E] - # index = 0x0046 - i = 0 + # Modules + prefix = [0x0018, 0x000C, 0x000E] + + ca += struct.pack(" bytes: ca += "65be0257".encode("utf_16_le") ca += struct.pack(" Date: Tue, 3 Mar 2026 13:51:20 -0500 Subject: [PATCH 076/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index fa44ceeee..08ed60b68 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -239,12 +239,10 @@ def create_cache(proj_cookie: int) -> bytes: ca += struct.pack("<5IH", 1, 0, 0, 0, 0, proj_cookie) # Modules - prefix = [0x0018, 0x000C, 0x000E] - ca += struct.pack(" Date: Tue, 3 Mar 2026 13:55:32 -0500 Subject: [PATCH 077/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index 08ed60b68..26d2b1b66 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -243,7 +243,7 @@ def create_cache(proj_cookie: int) -> bytes: for module in modules: name = module.modName.value.encode("utf_16_le") ca += struct.pack(" Date: Tue, 3 Mar 2026 14:00:40 -0500 Subject: [PATCH 078/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index 26d2b1b66..d1e945cc8 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -240,12 +240,13 @@ def create_cache(proj_cookie: int) -> bytes: # Modules ca += struct.pack(" Date: Tue, 3 Mar 2026 14:03:44 -0500 Subject: [PATCH 079/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index d1e945cc8..140c00864 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -245,7 +245,7 @@ def create_cache(proj_cookie: int) -> bytes: name = module.modName.value.encode("utf_16_le") ca += struct.pack(" Date: Tue, 3 Mar 2026 14:05:34 -0500 Subject: [PATCH 080/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index 140c00864..759ecaa03 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -244,7 +244,7 @@ def create_cache(proj_cookie: int) -> bytes: for module in modules: name = module.modName.value.encode("utf_16_le") ca += struct.pack(" Date: Tue, 3 Mar 2026 14:08:47 -0500 Subject: [PATCH 081/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index 759ecaa03..abfeddeb3 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -240,7 +240,7 @@ def create_cache(proj_cookie: int) -> bytes: # Modules ca += struct.pack(" Date: Tue, 3 Mar 2026 14:11:17 -0500 Subject: [PATCH 082/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index abfeddeb3..db23c9060 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -244,7 +244,7 @@ def create_cache(proj_cookie: int) -> bytes: for module in modules: name = module.modName.value.encode("utf_16_le") ca += struct.pack(" Date: Tue, 3 Mar 2026 14:20:32 -0500 Subject: [PATCH 083/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index db23c9060..d73afd5db 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -241,13 +241,15 @@ def create_cache(proj_cookie: int) -> bytes: # Modules ca += struct.pack(" Date: Tue, 3 Mar 2026 14:28:25 -0500 Subject: [PATCH 084/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index d73afd5db..0a5822752 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -241,7 +241,8 @@ def create_cache(proj_cookie: int) -> bytes: # Modules ca += struct.pack(" bytes: ca += struct.pack(" Date: Tue, 3 Mar 2026 14:31:42 -0500 Subject: [PATCH 085/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index 0a5822752..409947a78 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -241,6 +241,7 @@ def create_cache(proj_cookie: int) -> bytes: # Modules ca += struct.pack(" Date: Tue, 3 Mar 2026 14:32:43 -0500 Subject: [PATCH 086/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index 409947a78..20eb24105 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -251,7 +251,7 @@ def create_cache(proj_cookie: int) -> bytes: ca += struct.pack(" Date: Tue, 3 Mar 2026 14:34:47 -0500 Subject: [PATCH 087/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index 20eb24105..642a3f278 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -251,7 +251,7 @@ def create_cache(proj_cookie: int) -> bytes: ca += struct.pack(" Date: Tue, 3 Mar 2026 14:35:20 -0500 Subject: [PATCH 088/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index 642a3f278..482d7813d 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -252,6 +252,7 @@ def create_cache(proj_cookie: int) -> bytes: ca += struct.pack(" Date: Tue, 3 Mar 2026 14:39:22 -0500 Subject: [PATCH 089/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index 482d7813d..5ebd2d46f 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -242,16 +242,17 @@ def create_cache(proj_cookie: int) -> bytes: ca += struct.pack(" Date: Tue, 3 Mar 2026 14:43:21 -0500 Subject: [PATCH 090/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index 5ebd2d46f..0eba4b6f8 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -241,14 +241,16 @@ def create_cache(proj_cookie: int) -> bytes: # Modules ca += struct.pack(" Date: Tue, 3 Mar 2026 14:46:36 -0500 Subject: [PATCH 091/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index 0eba4b6f8..498df3ba3 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -228,7 +228,7 @@ def create_cache(proj_cookie: int) -> bytes: # Data ca += b'\xFF' * 6 + b'\x00' * 4 + b'\xFF' * 2 + b'\x00' * 2 - ca += struct.pack("<3H", 0x0257, 0x65BE, 0x11) + ca += struct.pack(" bytes: ca += struct.pack(" Date: Tue, 3 Mar 2026 15:03:34 -0500 Subject: [PATCH 092/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index 498df3ba3..156d58dfd 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -257,6 +257,13 @@ def create_cache(proj_cookie: int) -> bytes: ca += struct.pack(" Date: Tue, 3 Mar 2026 15:07:44 -0500 Subject: [PATCH 093/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index 156d58dfd..a95a8abd6 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -262,8 +262,6 @@ def create_cache(proj_cookie: int) -> bytes: record = (neg_one_4b * 13 + struct.pack("<2I", 0x0230, 0x0218) + neg_one_4b * 28 + struct.pack(" Date: Tue, 3 Mar 2026 15:24:32 -0500 Subject: [PATCH 094/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index a95a8abd6..6799f93bc 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -260,7 +260,8 @@ def create_cache(proj_cookie: int) -> bytes: ca += struct.pack(" Date: Tue, 3 Mar 2026 15:26:54 -0500 Subject: [PATCH 095/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index 6799f93bc..3f8fc844d 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -261,7 +261,7 @@ def create_cache(proj_cookie: int) -> bytes: neg_one_4b = b'\xFF\xFF\xFF\xFF' record = (neg_one_4b * 13 + struct.pack("<2I", 0x0230, 0x0218) + neg_one_4b * 28 + struct.pack(" Date: Tue, 3 Mar 2026 15:43:11 -0500 Subject: [PATCH 096/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index 3f8fc844d..85f145c77 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -261,7 +261,7 @@ def create_cache(proj_cookie: int) -> bytes: neg_one_4b = b'\xFF\xFF\xFF\xFF' record = (neg_one_4b * 13 + struct.pack("<2I", 0x0230, 0x0218) + neg_one_4b * 28 + struct.pack(" Date: Tue, 3 Mar 2026 15:57:19 -0500 Subject: [PATCH 097/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index 85f145c77..804ab1160 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -261,7 +261,7 @@ def create_cache(proj_cookie: int) -> bytes: neg_one_4b = b'\xFF\xFF\xFF\xFF' record = (neg_one_4b * 13 + struct.pack("<2I", 0x0230, 0x0218) + neg_one_4b * 28 + struct.pack(" Date: Tue, 3 Mar 2026 16:11:58 -0500 Subject: [PATCH 098/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index 804ab1160..8c26ea8dc 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -261,7 +261,7 @@ def create_cache(proj_cookie: int) -> bytes: neg_one_4b = b'\xFF\xFF\xFF\xFF' record = (neg_one_4b * 13 + struct.pack("<2I", 0x0230, 0x0218) + neg_one_4b * 28 + struct.pack(" Date: Tue, 3 Mar 2026 16:20:15 -0500 Subject: [PATCH 099/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index 8c26ea8dc..11dbaa21a 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -259,9 +259,10 @@ def create_cache(proj_cookie: int) -> bytes: ca += struct.pack(" Date: Tue, 3 Mar 2026 16:28:57 -0500 Subject: [PATCH 100/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index 11dbaa21a..596447b8b 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -260,9 +260,17 @@ def create_cache(proj_cookie: int) -> bytes: ca += struct.pack(" Date: Tue, 3 Mar 2026 16:32:37 -0500 Subject: [PATCH 101/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index 596447b8b..04c0a6d5e 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -262,7 +262,7 @@ def create_cache(proj_cookie: int) -> bytes: neg_one_one = neg_one_4b + struct.pack(" Date: Tue, 3 Mar 2026 16:35:33 -0500 Subject: [PATCH 102/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index 04c0a6d5e..18afe6906 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -263,7 +263,7 @@ def create_cache(proj_cookie: int) -> bytes: bin_array = [ b'\xf1q\x9a\xee\xc0\xe0\xc4F\xa2\xf8l|\xf9{s', b'vS\x9e\xe1B\x85\xfeF\xa1\x8b0E\x08tCU' - b'' + b'"?º>A?üD?Ev\x96\xe5\x061"' ] record = (neg_one_4b * 13 + struct.pack("<2I", 0x0230, 0x0218) + From 9cdd7aea63a12adbc6f2c550d68d2b72d32a1e70 Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Tue, 3 Mar 2026 16:37:54 -0500 Subject: [PATCH 103/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index 18afe6906..9f7b26970 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -263,7 +263,7 @@ def create_cache(proj_cookie: int) -> bytes: bin_array = [ b'\xf1q\x9a\xee\xc0\xe0\xc4F\xa2\xf8l|\xf9{s', b'vS\x9e\xe1B\x85\xfeF\xa1\x8b0E\x08tCU' - b'"?º>A?üD?Ev\x96\xe5\x061"' + b'"?º>A?üD\x88\xcav\x96\xe5\x061"' ] record = (neg_one_4b * 13 + struct.pack("<2I", 0x0230, 0x0218) + From 3cf570ba56ecc17496900c41258639b3dc8307cd Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Tue, 3 Mar 2026 16:39:58 -0500 Subject: [PATCH 104/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index 9f7b26970..29b9218b5 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -263,7 +263,7 @@ def create_cache(proj_cookie: int) -> bytes: bin_array = [ b'\xf1q\x9a\xee\xc0\xe0\xc4F\xa2\xf8l|\xf9{s', b'vS\x9e\xe1B\x85\xfeF\xa1\x8b0E\x08tCU' - b'"?º>A?üD\x88\xcav\x96\xe5\x061"' + b'"?º>\xc3\x82\xfcD\x88\xcav\x96\xe5\x061"' ] record = (neg_one_4b * 13 + struct.pack("<2I", 0x0230, 0x0218) + From 662817df8db5d4bc95b68810b447d86b575e079d Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Tue, 3 Mar 2026 16:43:49 -0500 Subject: [PATCH 105/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index 29b9218b5..99696cc54 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -263,7 +263,7 @@ def create_cache(proj_cookie: int) -> bytes: bin_array = [ b'\xf1q\x9a\xee\xc0\xe0\xc4F\xa2\xf8l|\xf9{s', b'vS\x9e\xe1B\x85\xfeF\xa1\x8b0E\x08tCU' - b'"?º>\xc3\x82\xfcD\x88\xcav\x96\xe5\x061"' + b'"\x93\xba>\xc3\x82\xfcD\x88\xcav\x96\xe5\x061"' ] record = (neg_one_4b * 13 + struct.pack("<2I", 0x0230, 0x0218) + From 2f03be89a5379689d8c070309c74d5b13bf67faa Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Tue, 3 Mar 2026 16:48:32 -0500 Subject: [PATCH 106/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index 99696cc54..b174318aa 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -265,7 +265,7 @@ def create_cache(proj_cookie: int) -> bytes: b'vS\x9e\xe1B\x85\xfeF\xa1\x8b0E\x08tCU' b'"\x93\xba>\xc3\x82\xfcD\x88\xcav\x96\xe5\x061"' ] - + record = (neg_one_4b * 13 + struct.pack("<2I", 0x0230, 0x0218) + neg_one_4b * 28 + struct.pack(" Date: Tue, 3 Mar 2026 16:51:14 -0500 Subject: [PATCH 107/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index b174318aa..a6758486c 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -262,7 +262,7 @@ def create_cache(proj_cookie: int) -> bytes: neg_one_one = neg_one_4b + struct.pack("\xc3\x82\xfcD\x88\xcav\x96\xe5\x061"' ] @@ -270,7 +270,7 @@ def create_cache(proj_cookie: int) -> bytes: neg_one_4b * 28 + struct.pack(" Date: Tue, 3 Mar 2026 16:55:29 -0500 Subject: [PATCH 108/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index a6758486c..e268946fb 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -261,7 +261,7 @@ def create_cache(proj_cookie: int) -> bytes: neg_one_4b = b'\xFF\xFF\xFF\xFF' neg_one_one = neg_one_4b + struct.pack("\xc3\x82\xfcD\x88\xcav\x96\xe5\x061"' ] @@ -271,6 +271,7 @@ def create_cache(proj_cookie: int) -> bytes: for byte_string in bin_array: record += byte_string + neg_one_one + record += neg_one_4b + struct.pack(" Date: Tue, 3 Mar 2026 17:02:10 -0500 Subject: [PATCH 109/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index e268946fb..2a39d879a 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -271,7 +271,7 @@ def create_cache(proj_cookie: int) -> bytes: for byte_string in bin_array: record += byte_string + neg_one_one - record += neg_one_4b + struct.pack(" Date: Tue, 3 Mar 2026 17:24:14 -0500 Subject: [PATCH 110/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index 2a39d879a..071826bf4 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -273,6 +273,9 @@ def create_cache(proj_cookie: int) -> bytes: record += neg_one_4b + struct.pack(" Date: Tue, 3 Mar 2026 17:27:22 -0500 Subject: [PATCH 111/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index 071826bf4..b883e0a76 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -273,7 +273,11 @@ def create_cache(proj_cookie: int) -> bytes: record += neg_one_4b + struct.pack(" Date: Tue, 3 Mar 2026 17:28:56 -0500 Subject: [PATCH 112/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index b883e0a76..82d798767 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -274,7 +274,7 @@ def create_cache(proj_cookie: int) -> bytes: record += neg_one_4b + struct.pack(" Date: Tue, 3 Mar 2026 17:32:54 -0500 Subject: [PATCH 113/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index 82d798767..7b9204d6c 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -279,7 +279,7 @@ def create_cache(proj_cookie: int) -> bytes: "Evaluate", "Sheet1", "Module1", "Workbook" ] for name in names: - ca += struct.pack(" Date: Tue, 3 Mar 2026 17:34:05 -0500 Subject: [PATCH 114/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index 7b9204d6c..4dff0554a 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -279,7 +279,8 @@ def create_cache(proj_cookie: int) -> bytes: "Evaluate", "Sheet1", "Module1", "Workbook" ] for name in names: - ca += struct.pack(" Date: Tue, 3 Mar 2026 18:39:36 -0500 Subject: [PATCH 115/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index 4dff0554a..0336adcd2 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -274,9 +274,9 @@ def create_cache(proj_cookie: int) -> bytes: record += neg_one_4b + struct.pack(" Date: Tue, 3 Mar 2026 18:41:46 -0500 Subject: [PATCH 116/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index 0336adcd2..3e508c23b 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -274,9 +274,9 @@ def create_cache(proj_cookie: int) -> bytes: record += neg_one_4b + struct.pack(" Date: Tue, 3 Mar 2026 19:09:11 -0500 Subject: [PATCH 117/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index 3e508c23b..d0e21bdbf 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -278,6 +278,7 @@ def create_cache(proj_cookie: int) -> bytes: b"VBA7", b"Project1", b"stdole", b"VBAProject", b"Office", b"ThisWorkbook", b"Evaluate", b"Sheet1", b"Module1", b"Workbook" ] + ca += struct.pack(" Date: Tue, 3 Mar 2026 19:16:39 -0500 Subject: [PATCH 118/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index d0e21bdbf..8abb9489d 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -280,8 +280,8 @@ def create_cache(proj_cookie: int) -> bytes: ] ca += struct.pack(" Date: Tue, 3 Mar 2026 19:26:43 -0500 Subject: [PATCH 119/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index 8abb9489d..b7c69de81 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -278,10 +278,10 @@ def create_cache(proj_cookie: int) -> bytes: b"VBA7", b"Project1", b"stdole", b"VBAProject", b"Office", b"ThisWorkbook", b"Evaluate", b"Sheet1", b"Module1", b"Workbook" ] - ca += struct.pack(" Date: Tue, 3 Mar 2026 19:38:35 -0500 Subject: [PATCH 120/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index b7c69de81..f370a8ba4 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -274,14 +274,17 @@ def create_cache(proj_cookie: int) -> bytes: record += neg_one_4b + struct.pack(" Date: Tue, 3 Mar 2026 19:43:54 -0500 Subject: [PATCH 121/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index f370a8ba4..e855ecaf3 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -276,7 +276,7 @@ def create_cache(proj_cookie: int) -> bytes: names = [ (0x12b80, b"Excel"), (0x01e2f7, b"VBA"), (0x17ec1, b"Win16"), (0x17f07, b"Win32"), (0x12f78, b"Win64"), (0x1b2b3, b"Mac"), - (0,b"VBA6"), (0, b"VBA7"), (0, b"Project1"), + (0, b"VBA6"), (0, b"VBA7"), (0, b"Project1"), (0, b"stdole"), (0, b"VBAProject"), (0, b"Office"), (0, b"ThisWorkbook"), (0, b"Evaluate"), (0, b"Sheet1"), (0, b"Module1"), (0, b"Workbook") From a04a97d0462ad585cae18e6d364971d459bf2f83 Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Tue, 3 Mar 2026 19:50:43 -0500 Subject: [PATCH 122/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index e855ecaf3..f3415514b 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -274,7 +274,7 @@ def create_cache(proj_cookie: int) -> bytes: record += neg_one_4b + struct.pack(" Date: Tue, 3 Mar 2026 20:25:32 -0500 Subject: [PATCH 123/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index f3415514b..2f865ddc4 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -274,17 +274,17 @@ def create_cache(proj_cookie: int) -> bytes: record += neg_one_4b + struct.pack(" Date: Tue, 3 Mar 2026 20:29:01 -0500 Subject: [PATCH 124/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index 2f865ddc4..9772ac1a7 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -275,9 +275,9 @@ def create_cache(proj_cookie: int) -> bytes: ca += struct.pack(" Date: Tue, 3 Mar 2026 20:39:14 -0500 Subject: [PATCH 125/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index 9772ac1a7..9aadd15ef 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -278,7 +278,7 @@ def create_cache(proj_cookie: int) -> bytes: (0x7f07, b"Win32"), (0x7f78, b"Win64"), (0xb2b3, b"Mac"), (0x23ad, b"VBA6"), (0x23ae, b"VBA7"), (0x170a, b"Project1"), (0x6093, b"stdole"), (0xbfbe, b"VBAProject"), (0x7515, b"Office"), - (0, b"ThisWorkbook"), (0, b"Evaluate"), + (0xe37c, b"ThisWorkbook"), (0xd918, b"Evaluate"), (0, b"Sheet1"), (0, b"Module1"), (0, b"Workbook") ] ca += struct.pack(" Date: Tue, 3 Mar 2026 21:02:54 -0500 Subject: [PATCH 126/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index 9aadd15ef..50293e85e 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -278,7 +278,7 @@ def create_cache(proj_cookie: int) -> bytes: (0x7f07, b"Win32"), (0x7f78, b"Win64"), (0xb2b3, b"Mac"), (0x23ad, b"VBA6"), (0x23ae, b"VBA7"), (0x170a, b"Project1"), (0x6093, b"stdole"), (0xbfbe, b"VBAProject"), (0x7515, b"Office"), - (0xe37c, b"ThisWorkbook"), (0xd918, b"Evaluate"), + (0xe37c, b"ThisWorkbook"), (0xd918, b"Evaluate", 0x103FF00, 0x5f00), (0, b"Sheet1"), (0, b"Module1"), (0, b"Workbook") ] ca += struct.pack(" Date: Tue, 3 Mar 2026 21:45:25 -0500 Subject: [PATCH 127/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index 50293e85e..e2363ef9f 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -283,8 +283,11 @@ def create_cache(proj_cookie: int) -> bytes: ] ca += struct.pack(" Date: Tue, 3 Mar 2026 22:03:26 -0500 Subject: [PATCH 128/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index e2363ef9f..fdf6c785a 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -287,7 +287,7 @@ def create_cache(proj_cookie: int) -> bytes: ca += struct.pack(" Date: Tue, 3 Mar 2026 22:09:54 -0500 Subject: [PATCH 129/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index fdf6c785a..04f89f55f 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -287,7 +287,8 @@ def create_cache(proj_cookie: int) -> bytes: ca += struct.pack(" Date: Tue, 3 Mar 2026 22:17:05 -0500 Subject: [PATCH 130/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index 04f89f55f..a8458ad37 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -287,8 +287,8 @@ def create_cache(proj_cookie: int) -> bytes: ca += struct.pack(" Date: Tue, 3 Mar 2026 22:18:06 -0500 Subject: [PATCH 131/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index a8458ad37..2aa76c6ba 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -278,7 +278,7 @@ def create_cache(proj_cookie: int) -> bytes: (0x7f07, b"Win32"), (0x7f78, b"Win64"), (0xb2b3, b"Mac"), (0x23ad, b"VBA6"), (0x23ae, b"VBA7"), (0x170a, b"Project1"), (0x6093, b"stdole"), (0xbfbe, b"VBAProject"), (0x7515, b"Office"), - (0xe37c, b"ThisWorkbook"), (0xd918, b"Evaluate", 0x103FF00, 0x5f00), + (0xe37c, b"ThisWorkbook"), (0xd918, b"_Evaluate", 0x103FF00, 0x5f00), (0, b"Sheet1"), (0, b"Module1"), (0, b"Workbook") ] ca += struct.pack(" Date: Tue, 3 Mar 2026 22:20:05 -0500 Subject: [PATCH 132/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index 2aa76c6ba..58cb80361 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -287,8 +287,8 @@ def create_cache(proj_cookie: int) -> bytes: ca += struct.pack(" Date: Tue, 3 Mar 2026 22:24:31 -0500 Subject: [PATCH 133/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index 58cb80361..87fd787a8 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -278,7 +278,7 @@ def create_cache(proj_cookie: int) -> bytes: (0x7f07, b"Win32"), (0x7f78, b"Win64"), (0xb2b3, b"Mac"), (0x23ad, b"VBA6"), (0x23ae, b"VBA7"), (0x170a, b"Project1"), (0x6093, b"stdole"), (0xbfbe, b"VBAProject"), (0x7515, b"Office"), - (0xe37c, b"ThisWorkbook"), (0xd918, b"_Evaluate", 0x103FF00, 0x5f00), + (0xe37c, b"ThisWorkbook"), (0xd918, b"_Evaluate", 0x103FF), (0, b"Sheet1"), (0, b"Module1"), (0, b"Workbook") ] ca += struct.pack(" bytes: len(name[1]), 4, name[1], name[0], 16) else: ca += struct.pack(" Date: Tue, 3 Mar 2026 22:29:49 -0500 Subject: [PATCH 134/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index 87fd787a8..809086b22 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -287,8 +287,9 @@ def create_cache(proj_cookie: int) -> bytes: ca += struct.pack(" Date: Tue, 3 Mar 2026 22:32:01 -0500 Subject: [PATCH 135/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index 809086b22..ae817ae6e 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -279,7 +279,7 @@ def create_cache(proj_cookie: int) -> bytes: (0x23ad, b"VBA6"), (0x23ae, b"VBA7"), (0x170a, b"Project1"), (0x6093, b"stdole"), (0xbfbe, b"VBAProject"), (0x7515, b"Office"), (0xe37c, b"ThisWorkbook"), (0xd918, b"_Evaluate", 0x103FF), - (0, b"Sheet1"), (0, b"Module1"), (0, b"Workbook") + (0x1ae8, b"Sheet1"), (0x1162, b"Module1"), (0x186b, b"Workbook") ] ca += struct.pack(" Date: Wed, 4 Mar 2026 06:21:30 -0500 Subject: [PATCH 136/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index ae817ae6e..9bd7ec970 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -290,6 +290,16 @@ def create_cache(proj_cookie: int) -> bytes: ca += struct.pack(" Date: Wed, 4 Mar 2026 06:24:31 -0500 Subject: [PATCH 137/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index 9bd7ec970..124c019d2 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -297,7 +297,7 @@ def create_cache(proj_cookie: int) -> bytes: "03 00 2D 02 02 00 05 00 0E 02 01 00 FF FF 10 02" + "00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF" + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF" + - "FF FF FF FF FF FF FF FF FF FF FF FF FF FF 06 00" +. + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF 06 00" + "10 00 00 00 01 00 36 00 00 00 00 00 00 00 00 00") ca += bytes.fromhex(" ".join(hex)) return ca From 2df69e1e810af17be97975eef8dcbb1f6835494a Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Wed, 4 Mar 2026 06:26:37 -0500 Subject: [PATCH 138/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index 124c019d2..1c481a0d9 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -293,7 +293,7 @@ def create_cache(proj_cookie: int) -> bytes: hex = ("02 FF FF 01 01 60 00 00 00 20 02" + "02 00 FF FF 22 02 FF FF FF FF 24 02 03 00 FF FF" + - "27 02 00 00 03 00 FF FF FF FF FF FF 2B 02 01 00" +. + "27 02 00 00 03 00 FF FF FF FF FF FF 2B 02 01 00" + "03 00 2D 02 02 00 05 00 0E 02 01 00 FF FF 10 02" + "00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF" + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF" + From 3fb40f580b43f924a5d2c546ba7f4b898b6b9f49 Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Wed, 4 Mar 2026 06:37:53 -0500 Subject: [PATCH 139/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index 1c481a0d9..de4a6beda 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -291,13 +291,13 @@ def create_cache(proj_cookie: int) -> bytes: len(name[1]), 0x80, 0, name[2], name[1], name[0], 16) - hex = ("02 FF FF 01 01 60 00 00 00 20 02" + - "02 00 FF FF 22 02 FF FF FF FF 24 02 03 00 FF FF" + - "27 02 00 00 03 00 FF FF FF FF FF FF 2B 02 01 00" + - "03 00 2D 02 02 00 05 00 0E 02 01 00 FF FF 10 02" + - "00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF" + - "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF" + - "FF FF FF FF FF FF FF FF FF FF FF FF FF FF 06 00" + + hex = ("02 FF FF 01 01 60 00 00 00 20 02", + "02 00 FF FF 22 02 FF FF FF FF 24 02 03 00 FF FF", + "27 02 00 00 03 00 FF FF FF FF FF FF 2B 02 01 00", + "03 00 2D 02 02 00 05 00 0E 02 01 00 FF FF 10 02", + "00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF 06 00", "10 00 00 00 01 00 36 00 00 00 00 00 00 00 00 00") ca += bytes.fromhex(" ".join(hex)) return ca From 1f0a7901f0241e4ae54a33bc9495defa0fdf7c6b Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Wed, 4 Mar 2026 07:10:15 -0500 Subject: [PATCH 140/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index de4a6beda..821f2953f 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -298,7 +298,8 @@ def create_cache(proj_cookie: int) -> bytes: "00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF", "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", "FF FF FF FF FF FF FF FF FF FF FF FF FF FF 06 00", - "10 00 00 00 01 00 36 00 00 00 00 00 00 00 00 00") + "10 00 00 00 01 00 36 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00") ca += bytes.fromhex(" ".join(hex)) return ca From e5dc3e55472bace93d1ec60100f3979f39cc3883 Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Wed, 4 Mar 2026 07:12:18 -0500 Subject: [PATCH 141/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index 821f2953f..7874b4021 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -299,6 +299,7 @@ def create_cache(proj_cookie: int) -> bytes: "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", "FF FF FF FF FF FF FF FF FF FF FF FF FF FF 06 00", "10 00 00 00 01 00 36 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00") ca += bytes.fromhex(" ".join(hex)) return ca From 84f9cb81b0e37a549d24d49f2baef9619a2715f2 Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Wed, 4 Mar 2026 07:21:02 -0500 Subject: [PATCH 142/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index 7874b4021..f8903c259 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -300,6 +300,7 @@ def create_cache(proj_cookie: int) -> bytes: "FF FF FF FF FF FF FF FF FF FF FF FF FF FF 06 00", "10 00 00 00 01 00 36 00 00 00 00 00 00 00 00 00", "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00") ca += bytes.fromhex(" ".join(hex)) return ca From ea30d2c33de71340cc7adce1fe896c28d111467c Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Wed, 4 Mar 2026 07:46:44 -0500 Subject: [PATCH 143/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index f8903c259..0fc7ca81e 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -281,7 +281,7 @@ def create_cache(proj_cookie: int) -> bytes: (0xe37c, b"ThisWorkbook"), (0xd918, b"_Evaluate", 0x103FF), (0x1ae8, b"Sheet1"), (0x1162, b"Module1"), (0x186b, b"Workbook") ] - ca += struct.pack(" Date: Wed, 4 Mar 2026 08:16:11 -0500 Subject: [PATCH 144/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index 0fc7ca81e..47aa6cf48 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -75,6 +75,15 @@ def module_matches_bin(module_path: str, return m_uncompressed == b_uncompressed +stdole_lib = LibidReference( + uuid.UUID("00020430-0000-0000-C000-000000000046"), + "2.0", + "0", + "C:\\Windows\\System32\\stdole2.tlb", + "OLE Automation" + ) + + @unittest.mock.patch('random.randint', NotSoRandom.randint) def test_full_file() -> None: rand = [0x41, 0xBC, 0x7B, 0x7B, 0x37, 0x7B, 0x7B, 0x7B] @@ -82,13 +91,7 @@ def test_full_file() -> None: project = VbaProject() project.default_date = Filetime.from_msfiletime(0x01D92433C2B823C0) project.set_include_projectwm(True) - libid_ref = ReferenceRegistered(LibidReference( - uuid.UUID("0002043000000000C000000000000046"), - "2.0", - "0", - "C:\\Windows\\System32\\stdole2.tlb", - "OLE Automation" - )) + libid_ref = ReferenceRegistered(stde_lib) ole_reference = Reference(libid_ref, "stdole") libid_ref2 = ReferenceRegistered(LibidReference( uuid.UUID("2DF8D04C5BFA101BBDE500AA0044DE52"), @@ -196,13 +199,7 @@ def create_cache(proj_cookie: int) -> bytes: "C:\\Program Files\\Microsoft Office\\root\\Office16\\EXCEL.EXE", "Microsoft Excel 16.0 Object Library" )) - libraries.append(LibidReference( - uuid.UUID("00020430-0000-0000-C000-000000000046"), - "2.0", - "0", - "C:\\Windows\\System32\\stdole2.tlb", - "OLE Automation" - )) + libraries.append(stdole_lib) libraries.append(LibidReference( uuid.UUID("2DF8D04C-5BFA-101B-BDE5-00AA0044DE52"), "2.8", From 7a29c88aca8778af2a99045e076a5174cbc6511e Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Wed, 4 Mar 2026 09:27:55 -0500 Subject: [PATCH 145/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index 47aa6cf48..a400e0326 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -86,12 +86,15 @@ def module_matches_bin(module_path: str, @unittest.mock.patch('random.randint', NotSoRandom.randint) def test_full_file() -> None: + """ + Create an exact reproduction of a complete "empty" vba excel addin. + """ rand = [0x41, 0xBC, 0x7B, 0x7B, 0x37, 0x7B, 0x7B, 0x7B] NotSoRandom.set_seed(rand) project = VbaProject() project.default_date = Filetime.from_msfiletime(0x01D92433C2B823C0) project.set_include_projectwm(True) - libid_ref = ReferenceRegistered(stde_lib) + libid_ref = ReferenceRegistered(stdole_lib) ole_reference = Reference(libid_ref, "stdole") libid_ref2 = ReferenceRegistered(LibidReference( uuid.UUID("2DF8D04C5BFA101BBDE500AA0044DE52"), From bd3a16a1cdca06f21542b479ecefc85052b253cd Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Wed, 11 Mar 2026 16:03:24 -0400 Subject: [PATCH 146/160] Setters and getters --- src/ms_ovba/Models/Entities/module_base.py | 48 ++++-- src/ms_ovba/Models/Fields/idSizeField.py | 4 + src/ms_ovba/Views/dirStream.py | 4 +- src/ms_ovba/Views/project.py | 12 +- src/ms_ovba/Views/project_ole_file.py | 4 +- src/ms_ovba/Views/project_view.py | 4 +- src/ms_ovba/vbaProject.py | 77 ++++++--- tests/Functional/test_dirObject.py | 42 ++--- tests/Functional/test_fullFile.py | 187 +++++++++------------ tests/Unit/Views/test_project.py | 19 +-- 10 files changed, 200 insertions(+), 201 deletions(-) diff --git a/src/ms_ovba/Models/Entities/module_base.py b/src/ms_ovba/Models/Entities/module_base.py index 90c08c8e2..d871c0002 100644 --- a/src/ms_ovba/Models/Entities/module_base.py +++ b/src/ms_ovba/Models/Entities/module_base.py @@ -19,7 +19,7 @@ def __init__(self: T, name: str) -> None: self.streamName = DoubleEncodedString([0x001A, 0x0032], name) self.docString = DoubleEncodedString([0x001C, 0x0048], "") self.helpContext = IdSizeField(0x001E, 4, 0) - self.cookie = IdSizeField(0x002C, 2, 0xFFFF) + self._cookie = IdSizeField(0x002C, 2, 0xFFFF) # self.readonly = SimpleRecord(0x001E, 4, helpContext) # self.private = SimpleRecord(0x001E, 4, helpContext) @@ -32,33 +32,47 @@ def __init__(self: T, name: str) -> None: self._size = 0 # GUIDs - self._guid = [] + self._guids = [] - def set_guid(self: T, guid: str) -> None: + @property + def guids(self: T) -> str: + return self._guids + + @guids.setter + def guids(self: T, guid: str) -> None: if isinstance(guid, list): - self._guid = guid + self._guids = guid else: - self._guid = [guid] + self._guids = [guid] def add_guid(self: T, guid: str) -> None: - self._guid += guid - - def set_cache(self: T, cache: bytes) -> None: - self._cache = cache + """ + Append a guid to the list + """ + self._guid += [guid] - def get_cache(self: T) -> bytes: + @property + def cache(self: T) -> bytes: return self._cache - def set_cookie(self: T, value: int) -> None: - self.cookie = IdSizeField(0x002C, 2, value) + @cache.setter + def cache(self: T, cache: bytes) -> None: + self._cache = cache + + @property + def cookie(self: T) -> int: + return self._cookie.value - def get_cookie(self: T) -> int: - return self.cookie.value + @cookie.setter + def cookie(self: T, value: int) -> None: + self._cookie = IdSizeField(0x002C, 2, value) - def get_name(self: T) -> str: + @property + def name(self: T) -> str: return self.modName.value - def get_bin_path(self: T) -> str: + @property + def bin_path(self: T) -> str: return self._file_path + ".bin" def add_workspace(self: T, val1: int, val2: int, @@ -77,7 +91,7 @@ def pack(self: T, endien: str, cp_name: str) -> bytes: + self.docString.pack(endien, cp_name) + self.offsetRec.pack(endien) + self.helpContext.pack(endien, cp_name) - + self.cookie.pack(endien) + + self._cookie.pack(endien) + type_id.pack(endien)) footer = PackedData("HI", 0x002B, 0) output += footer.pack(endien) diff --git a/src/ms_ovba/Models/Fields/idSizeField.py b/src/ms_ovba/Models/Fields/idSizeField.py index 1fb96134b..6a1b5cae8 100644 --- a/src/ms_ovba/Models/Fields/idSizeField.py +++ b/src/ms_ovba/Models/Fields/idSizeField.py @@ -16,6 +16,10 @@ def __init__(self: T, id: int, size: int, value: Any) -> None: self._size = size self._value = value + @property + def value(self: T) -> Any: + return self._value + def pack(self: T, endien: str, cp_name: str = None) -> bytes: endien_symbol = '<' if endien == 'little' else '>' format = endien_symbol + "HI" diff --git a/src/ms_ovba/Views/dirStream.py b/src/ms_ovba/Views/dirStream.py index 09cdcc5b0..5ea9aaffb 100644 --- a/src/ms_ovba/Views/dirStream.py +++ b/src/ms_ovba/Views/dirStream.py @@ -24,10 +24,10 @@ def __init__(self: T, project: VbaProject) -> None: def to_bytes(self: T) -> bytes: information = self._load_information() endien = self.project.endien - cp_name = self.project.get_codepage_name() + cp_name = self.project.codepage_name pack_symbol = '<' if endien == 'little' else '>' # should be 0xFFFF - cookie_value = self.project.get_project_cookie() + cookie_value = self.project.project_cookie self.project_cookie = IdSizeField(19, 2, cookie_value) references = self.project.references modules = self.project.modules diff --git a/src/ms_ovba/Views/project.py b/src/ms_ovba/Views/project.py index 5f6eff9de..bb4b9fc2f 100644 --- a/src/ms_ovba/Views/project.py +++ b/src/ms_ovba/Views/project.py @@ -27,10 +27,10 @@ def add_attribute(self: T, name: str, value: str) -> None: def to_bytes(self: T) -> bytes: project = self.project - codepage_name = project.get_codepage_name() + codepage_name = project.codepage_name # Use \x0D0A line endings...however python encodes that. eol = b'\x0D\x0A' - project_id = project.get_project_id() + project_id = project.project_id id = bytearray(project_id, codepage_name) result = b'ID="' + id + b'"' + eol modules = project.modules @@ -42,10 +42,10 @@ def to_bytes(self: T) -> bytes: result += self._attr(key, self.attributes[key]) cmg = ms_ovba_crypto.encrypt( project_id, - project.get_protection_state() + project.protection_state ) - dpb = ms_ovba_crypto.encrypt(project_id, project.get_password()) - gc = ms_ovba_crypto.encrypt(project_id, project.get_visibility_state()) + dpb = ms_ovba_crypto.encrypt(project_id, project.password) + gc = ms_ovba_crypto.encrypt(project_id, project.visibility_state) result += (bytes('CMG="', codepage_name) + binascii.hexlify(cmg).upper() + b'\x22\x0D\x0A') @@ -74,7 +74,7 @@ def write_file(self: T) -> None: bin_f.close() def _attr(self: T, name: str, value: str) -> str: - codepage_name = self.project.get_codepage_name() + codepage_name = self.project.codepage_name eol = b'\x0D\x0A' b_name = bytes(name, codepage_name) b_value = bytes(value, codepage_name) diff --git a/src/ms_ovba/Views/project_ole_file.py b/src/ms_ovba/Views/project_ole_file.py index b88c52e26..86c07fc5b 100644 --- a/src/ms_ovba/Views/project_ole_file.py +++ b/src/ms_ovba/Views/project_ole_file.py @@ -33,7 +33,7 @@ def _build_ole_directory(project: VbaProject) -> RootDirectory: storage.set_modified(project.default_date) for module in project.get_modules(): module.write_file() - dir = StreamDirectory(module.get_name(), module.get_bin_path()) + dir = StreamDirectory(module.name, module.bin_path) storage.add_directory(dir) module = DirStream(project) @@ -48,7 +48,7 @@ def _build_ole_directory(project: VbaProject) -> RootDirectory: directory.add_directory(storage) - if project.get_include_projectwm(): + if project.projectwm: module = ProjectWm(project) module.write_file() stream = StreamDirectory("PROJECTwm", "projectwm.bin") diff --git a/src/ms_ovba/Views/project_view.py b/src/ms_ovba/Views/project_view.py index 865d0d596..dc3f918cf 100644 --- a/src/ms_ovba/Views/project_view.py +++ b/src/ms_ovba/Views/project_view.py @@ -23,11 +23,11 @@ def to_bytes(self: T) -> bytes: output = b'' reserved1 = 0x61CC reserved2 = 0x00 - cache_version = self.project.get_performance_cache_version() + cache_version = self.project.performance_cache_version output += struct.pack(format, reserved1, cache_version, reserved2, self._reserved3) - return output + self.project.get_performance_cache() + return output + self.project.performance_cache def write_file(self: T) -> None: bin_f = open("vba_project.bin", "wb") diff --git a/src/ms_ovba/vbaProject.py b/src/ms_ovba/vbaProject.py index a610f4f5b..ebbe6e8a1 100644 --- a/src/ms_ovba/vbaProject.py +++ b/src/ms_ovba/vbaProject.py @@ -43,19 +43,28 @@ def default_date(self: T) -> Filetime: def default_date(self: T, date: Filetime) -> None: self._default_date = date - def set_project_id(self: T, id: str) -> None: + @property + def project_id(self: T) -> str: + return self._project_id + + @project_id.setter + def project_id(self: T, id: str) -> None: self._project_id = id - def get_project_id(self: T) -> str: - return self._project_id + @property + def protection_state(self: T) -> int: + return self._protection_state - def set_protection_state(self: T, state: int) -> None: + @protection_state.setter + def protection_state(self: T, state: int) -> None: self._protection_state = state - def get_protection_state(self: T) -> int: - return self._protection_state + @property + def visibility_state(self: T) -> bytes: + return self._visibility_state - def set_visibility_state(self: T, state: int) -> None: + @visibility_state.setter + def visibility_state(self: T, state: int) -> None: """ 0 = not visible 255 = visible @@ -64,45 +73,59 @@ def set_visibility_state(self: T, state: int) -> None: raise Exception("Bad visibility value.") self._visibility_state = state - def get_visibility_state(self: T) -> bytes: - return self._visibility_state + @property + def password(self: T) -> bytes: + return self._password - def set_password(self: T, value: bytes) -> None: + @password.setter + def password(self: T, value: bytes) -> None: self._password = value - def get_password(self: T) -> bytes: - return self._password + @property + def performance_cache(self: T) -> bytes: + return self._performance_cache - def set_performance_cache(self: T, cache: bytes) -> None: + @performance_cache.setter + def performance_cache(self: T, cache: bytes) -> None: self._performance_cache = cache - def get_performance_cache(self: T) -> None: - return self._performance_cache + @property + def performance_cache_version(self: T) -> int: + return self._performance_cache_version - def set_performance_cache_version(self: T, version: int) -> None: + @performance_cache_version.setter + def performance_cache_version(self: T, version: int) -> None: self._performance_cache_version = version - def get_performance_cache_version(self: T) -> int: - return self._performance_cache_version - - def get_codepage_name(self: T) -> str: + @property + def codepage_name(self: T) -> str: return self._codepage_name - def set_project_cookie(self: T, value: int) -> None: - self._project_cookie = value + @codepage_name.setter + def codepage_name(self: T, name: str) -> None: + self._codepage_name = name - def get_project_cookie(self: T) -> int: + @property + def project_cookie(self: T) -> int: return self._project_cookie + @project_cookie.setter + def project_cookie(self: T, value: int) -> None: + self._project_cookie = value + def get_modules(self: T) -> list: return self.modules - def set_include_projectwm(self: T, value: bool) -> None: - self._project_wm = value - - def get_include_projectwm(self: T) -> bool: + @property + def projectwm(self: T) -> bool: return self._project_wm + def include_projectwm(self: T) -> bool: + self._project_wm = True + + def exclude_projectwm(self: T) -> bool: + self._project_wm = False + # Appenders def add_module(self: T, mod: ModuleBase) -> None: self.modules.append(mod) diff --git a/tests/Functional/test_dirObject.py b/tests/Functional/test_dirObject.py index 6195bbdd2..6e04ab152 100644 --- a/tests/Functional/test_dirObject.py +++ b/tests/Functional/test_dirObject.py @@ -53,7 +53,7 @@ def test_dirstream() -> None: office_reference = Reference(libid_ref2, "Office") project.add_reference(ole_reference) project.add_reference(office_reference) - project.set_project_cookie(0x08F3) + project.project_cookie = 0x08F3 indirect_table = ("02 80 FE FF FF FF FF FF 20 00 00 00 FF FF FF FF", "30 00 00 00 02 01 FF FF 00 00 00 00 00 00 00 00", @@ -64,41 +64,45 @@ def test_dirstream() -> None: "FF FF 00 00 01 00 53 94 FF FF FF FF 00 00 00 00", "02 3C FF FF FF FF 00 00") module_cache.object_table = bytes.fromhex(" ".join(object_table)) - module_cache.misc = [[-1, 0x18], 0xFF, 0, [1, "00000000"]] - module_cache.header.data2 = 0x0123 - module_cache.header.data3 = 0x88 - module_cache.header.sata4 = 8 + module_cache.misc = [[-1, 8], 0x18, 0, [1, "00000000"]] + module_cache.header.data2 = 0 + module_cache.header.data3 = 0x123 + module_cache.header.data4 = 0x88 this_workbook = DocModule("ThisWorkbook") - this_workbook.set_cookie(0xB81C) - module_cache.cookie = 0xB81C + this_workbook.cookie = 0xB81C + module_cache.module_cookie = 0xB81C guid = uuid.UUID('0002081900000000C000000000000046') - this_workbook.set_guid(guid) + this_workbook.add_guid(guid) module_cache.guid = [guid] - this_workbook.set_cache(module_cache.to_bytes()) + this_workbook.cache = module_cache.to_bytes() sheet1 = DocModule("Sheet1") - sheet1.set_cookie(0x9B9A) - module_cache.cookie = 0x9B9A + sheet1.cookie = 0x9B9A + module_cache.module_cookie = 0x9B9A guid = uuid.UUID('0002082000000000C000000000000046') module_cache.guid = [guid] - sheet1.set_guid(guid) - sheet1.set_cache(module_cache.to_bytes()) + sheet1.add_guid(guid) + sheet1.cache = module_cache.to_bytes() module1 = StdModule("Module1") - module1.set_cookie(0xB241) + module1.cookie = 0xB241 module_cache.clear_variables() - module_cache.cookie = 0xB241 + module_cache.module_cookie = 0xB241 module_cache.misc = [[-1, 2], 0xFFFF, 0, [0, "FFFFFFFF"]] - module_cache.header.data2 = 3 - module_cache.header.data3 = 0 - module_cache.header.sata4 = 7 + module_cache.header.data2 = 0 + module_cache.header.data3 = 3 + module_cache.header.data4 = 0 module_cache.indirect_table = struct.pack(" None: NotSoRandom.set_seed(rand) project = VbaProject() project.default_date = Filetime.from_msfiletime(0x01D92433C2B823C0) - project.set_include_projectwm(True) + project.include_projectwm() libid_ref = ReferenceRegistered(stdole_lib) ole_reference = Reference(libid_ref, "stdole") libid_ref2 = ReferenceRegistered(LibidReference( @@ -107,10 +108,9 @@ def test_full_file() -> None: project.add_reference(ole_reference) project.add_reference(office_reference) proj_cookie = 0x08F3 - project.set_project_cookie(proj_cookie) - project.set_project_id('{9E394C0B-697E-4AEE-9FA6-446F51FB30DC}') - project.set_performance_cache(create_cache(proj_cookie)) - project.set_performance_cache_version(0x00B5) + project.project_cookie = proj_cookie + project.project_id = '{9E394C0B-697E-4AEE-9FA6-446F51FB30DC}' + project.performance_cache_version = 0x00B5 base_path = "src/ms_ovba/blank_files/" # Add Modules @@ -124,7 +124,7 @@ def test_full_file() -> None: module1 = StdModule("Module1") cookie = 0xB241 - module1.set_cookie(cookie) + module1.cookie = cookie module_cache = ModuleCache(0xB5, proj_cookie, signature=3) module_cache.header.data2 = 3 module_cache.header.data4 = 2 @@ -135,12 +135,16 @@ def test_full_file() -> None: module_path = "tests/blank/Module1.bas" module1.add_file(module_path) module1.normalize_file() - module1.set_cache(module_cache.to_bytes()) + module1.cache = module_cache.to_bytes() project.add_module(this_workbook) project.add_module(sheet1) project.add_module(module1) + project.performance_cache = create_cache( + proj_cookie, + [this_workbook, sheet1, module1] + ) # Check ProjectWm wm_bytes = ProjectWm(project).to_bytes() # Read from file instead of pasting @@ -174,150 +178,111 @@ def test_full_file() -> None: # compare raw or uncompressed streams. -def create_cache(proj_cookie: int) -> bytes: - modules = [] - this_workbook = DocModule("ThisWorkbook") - this_workbook.cookie.value = 0xB81C - modules.append(this_workbook) - sheet1 = DocModule("Sheet1") - sheet1.cookie.value = 0x9B9A - modules.append(sheet1) - module1 = StdModule("Module1") - module1.cookie.value = 0xB241 - modules.append(module1) +def create_cache(proj_cookie: int, modules) -> bytes: + cache = ProjectCache(0x04E4, proj_cookie, 0x65BE0257) + cache._hex = 0x65BE0257 + module_array = [] + i = 0 + id = [0x227, 0x22B, 0x22C] + for module in modules: + hex = 0x65BE0263 if i == 2 else cache._hex + module_array.append( + (module.name, 50, 70 + i, hex, id[i], + module.cookie, len(module.cache), [], -1) + ) + i += 1 + + cache._modules = module_array - libraries = [] - libraries.append(LibidReference( + cache.add_library(str(LibidReference( uuid.UUID("000204EF-0000-0000-C000-000000000046"), "4.2", "9", "C:\\Program Files\\Common Files\\Microsoft Shared\\VBA" "\\VBA7.1\\VBE7.DLL", "Visual Basic For Applications" - )) - libraries.append(LibidReference( + ))) + cache.add_library(str(LibidReference( uuid.UUID("00020813-0000-0000-C000-000000000046"), "1.9", "0", "C:\\Program Files\\Microsoft Office\\root\\Office16\\EXCEL.EXE", "Microsoft Excel 16.0 Object Library" - )) - libraries.append(stdole_lib) - libraries.append(LibidReference( + ))) + cache.add_library(str(stdole_lib)) + cache.add_library(str(LibidReference( uuid.UUID("2DF8D04C-5BFA-101B-BDE5-00AA0044DE52"), "2.8", "0", "C:\\Program Files\\Common Files\\Microsoft Shared\\OFFICE16\\MSO.DLL", "Microsoft Office 16.0 Object Library" - )) - ca = struct.pack("\xc3\x82\xfcD\x88\xcav\x96\xe5\x061"' ] + cache._post_footer = 0x30 + cache._w0 = 0x117 + cache._w2 = 0x2ba0 + cache._identifiers = [ + (b"Excel", 4, 0x2b80), (b"VBA", 4, 0xe2f7), (b"Win16", 4, 0x7ec1), + (b"Win32", 4, 0x7f07), (b"Win64", 4, 0x7f78), (b"Mac", 4, 0xb2b3), + (b"VBA6", 4, 0x23ad), (b"VBA7", 4, 0x23ae), + (b"Project1", 4, 0x170a), + (b"stdole", 4, 0x6093), (b"VBAProject", 4, 0xbfbe), + (b"Office", 4, 0x7515), (b"ThisWorkbook", 4, 0xe37c), + (b"_Evaluate", 128, 0xd918, 0, 0x103, -1), + (b"Sheet1", 4, 0x1ae8), (b"Module1", 4, 0x1162), + (b"Workbook", 4, 0x186b) + ] - record = (neg_one_4b * 13 + struct.pack("<2I", 0x0230, 0x0218) + - neg_one_4b * 28 + struct.pack(" DocModule: mod = DocModule(name) - mod.set_cookie(cookie) + mod.cookie = cookie guid = uuid.UUID(guid_s) - mod.set_guid(guid) + mod.add_guid(guid) module_path = path mod.add_file(module_path) mod.normalize_file() - cache_ver = project.get_performance_cache_version() - proj_cookie = project.get_project_cookie() + cache_ver = project.performance_cache_version + proj_cookie = project.project_cookie module_cache = ModuleCache(cache_ver, proj_cookie, signature=3) module_cache.header.data3 = 0x88 module_cache.header.data4 = 8 @@ -337,5 +302,5 @@ def create_doc_module(project: VbaProject, name: str, module_cache.guid = [guid] module_cache.module_cookie = cookie - mod.set_cache(module_cache.to_bytes()) + mod.cache = module_cache.to_bytes() return mod diff --git a/tests/Unit/Views/test_project.py b/tests/Unit/Views/test_project.py index 6fae080d0..c7fc68599 100644 --- a/tests/Unit/Views/test_project.py +++ b/tests/Unit/Views/test_project.py @@ -47,21 +47,10 @@ def __init__(self) -> None: self.modules = [Mod("ThisWorkbook"), Mod("Sheet1"), mod1] self.project_id = '{9E394C0B-697E-4AEE-9FA6-446F51FB30DC}' - - def get_codepage_name(self): - return 'cp1252' - - def get_project_id(self): - return self.project_id - - def get_protection_state(self): - return b'\x00\x00\x00\x00' - - def get_password(self): - return b'\x00' - - def get_visibility_state(self): - return b'\xFF' + self.codepage_name = 'cp1252' + self.protection_state = b'\x00\x00\x00\x00' + self.password = b'\x00' + self.visibility_state = b'\xFF' @unittest.mock.patch('random.randint', NotSoRandom.randint) From 007e1a5f44f993af22c97f773a9362a5bf850fe2 Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Wed, 11 Mar 2026 16:13:54 -0400 Subject: [PATCH 147/160] Update and rename test_vbaProject.pyt to test_vbaProject.py --- .../{test_vbaProject.pyt => test_vbaProject.py} | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) rename tests/Unit/{test_vbaProject.pyt => test_vbaProject.py} (59%) diff --git a/tests/Unit/test_vbaProject.pyt b/tests/Unit/test_vbaProject.py similarity index 59% rename from tests/Unit/test_vbaProject.pyt rename to tests/Unit/test_vbaProject.py index dfe9ae557..86b13db8a 100644 --- a/tests/Unit/test_vbaProject.pyt +++ b/tests/Unit/test_vbaProject.py @@ -4,20 +4,20 @@ def test_set_get_visibility() -> None: project = VbaProject() - project.set_visibility_state(0) - assert project.get_visibility_state() == 0 + project.visibility_state = 0 + assert project.visibility_state == 0 def test_set_get_protection() -> None: project = VbaProject() - project.set_protection_state(0) - assert project.get_protection_state() == 0 + project.protection_state = 0 + assert project.protection_state == 0 def test_set_get_password() -> None: project = VbaProject() - project.set_password(0) - assert project.get_password() == 0 + project.password = 0 + assert project.password == 0 def test_bad_visibility() -> None: @@ -26,4 +26,4 @@ def test_bad_visibility() -> None: """ project = VbaProject() with pytest.raises(Exception): - project.set_visibility_state(1) + project.visibility_state = 1 From c381a0ce158a9a320146dcc0914e7bd15dbba044 Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Wed, 11 Mar 2026 16:29:04 -0400 Subject: [PATCH 148/160] Update test_vbaProject.py --- tests/Unit/test_vbaProject.py | 43 +++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/tests/Unit/test_vbaProject.py b/tests/Unit/test_vbaProject.py index 86b13db8a..4f24845f0 100644 --- a/tests/Unit/test_vbaProject.py +++ b/tests/Unit/test_vbaProject.py @@ -2,6 +2,19 @@ from ms_ovba.vbaProject import VbaProject +def test_set_get_default_date() -> None: + project = VbaProject() + date = project.default_date + project.default_date = date + assert project.default_date == date + + +def test_set_get_project_id() -> None: + project = VbaProject() + project.project_id = '{test}' + assert project.project_id == '{test}' + + def test_set_get_visibility() -> None: project = VbaProject() project.visibility_state = 0 @@ -14,12 +27,42 @@ def test_set_get_protection() -> None: assert project.protection_state == 0 +def test_set_get_visibility() -> None: + project = VbaProject() + project.visibility_state = 0 + assert project.visibility_state == 0 + + def test_set_get_password() -> None: project = VbaProject() project.password = 0 assert project.password == 0 +def test_set_get_cache() -> None: + project = VbaProject() + project.performance_cache = b'0' + assert project.performance_cache == b'0' + + +def test_set_get_cache_version() -> None: + project = VbaProject() + project.performance_cache_version = 0x01 + assert project.performance_cache_version == 1 + + +def test_set_get_codepage() -> None: + project = VbaProject() + project.codepage_name = 'cp1253' + assert project.codepage_name == 'cp1252' + + +def test_set_get_cookie() -> None: + project = VbaProject() + project.project_cookie = 0x02 + assert project.project_cookie == 2 + + def test_bad_visibility() -> None: """ Visibility must be zero or 0xFF From 49b29c4183cd68b58b5cd1bbada8a04319b4dd91 Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Wed, 11 Mar 2026 17:39:00 -0400 Subject: [PATCH 149/160] Update test_vbaProject.py --- tests/Unit/test_vbaProject.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Unit/test_vbaProject.py b/tests/Unit/test_vbaProject.py index 4f24845f0..16b2ce89c 100644 --- a/tests/Unit/test_vbaProject.py +++ b/tests/Unit/test_vbaProject.py @@ -54,7 +54,7 @@ def test_set_get_cache_version() -> None: def test_set_get_codepage() -> None: project = VbaProject() project.codepage_name = 'cp1253' - assert project.codepage_name == 'cp1252' + assert project.codepage_name == 'cp1253' def test_set_get_cookie() -> None: From 171417af24a43ba21a3eba10a8b4830fb4c0ce7a Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Thu, 12 Mar 2026 07:32:06 -0400 Subject: [PATCH 150/160] Update test_vbaProject.py --- tests/Unit/test_vbaProject.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/tests/Unit/test_vbaProject.py b/tests/Unit/test_vbaProject.py index 16b2ce89c..6d9c4baa4 100644 --- a/tests/Unit/test_vbaProject.py +++ b/tests/Unit/test_vbaProject.py @@ -63,6 +63,18 @@ def test_set_get_cookie() -> None: assert project.project_cookie == 2 +def test_include_projectwm() -> None: + project = VbaProject() + project.include_projectwm() + assert project.projectwm + + +def test_exclude_projectwm() -> None: + project = VbaProject() + project.exclude_projectwm() + assert not project.projectwm + + def test_bad_visibility() -> None: """ Visibility must be zero or 0xFF From 6b9060fc6b57ad2b887c9f9c200efb9c97455320 Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Thu, 12 Mar 2026 07:35:32 -0400 Subject: [PATCH 151/160] Update test_vbaProject.py --- tests/Unit/test_vbaProject.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/tests/Unit/test_vbaProject.py b/tests/Unit/test_vbaProject.py index 6d9c4baa4..1ca43dcc6 100644 --- a/tests/Unit/test_vbaProject.py +++ b/tests/Unit/test_vbaProject.py @@ -27,12 +27,6 @@ def test_set_get_protection() -> None: assert project.protection_state == 0 -def test_set_get_visibility() -> None: - project = VbaProject() - project.visibility_state = 0 - assert project.visibility_state == 0 - - def test_set_get_password() -> None: project = VbaProject() project.password = 0 From 3e7eab7b745a5e9e510143bbdf12ccc15408bd61 Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Thu, 12 Mar 2026 07:37:02 -0400 Subject: [PATCH 152/160] Update project_view.py --- src/ms_ovba/Views/project_view.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/ms_ovba/Views/project_view.py b/src/ms_ovba/Views/project_view.py index dc3f918cf..5fe5304dc 100644 --- a/src/ms_ovba/Views/project_view.py +++ b/src/ms_ovba/Views/project_view.py @@ -10,13 +10,10 @@ class ProjectView: """ The _VBA_PROJECT data view for the vbaProject """ - def __init__(self: T, project: VbaProject) -> None: + def __init__(self: T, project: VbaProject, reserved: int = 3) -> None: self.project = project - self._reserved3 = 0x0003 - - def set_reserved3(self: T, value: int) -> None: - self._reserved3 = value - + self._reserved3 = reserved + def to_bytes(self: T) -> bytes: endien_symbol = '<' if self.project.endien == 'little' else '>' format = endien_symbol + "HHBH" From 767cb280581cd0a4de5adc28dd75180dfe86fa00 Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Thu, 12 Mar 2026 07:43:05 -0400 Subject: [PATCH 153/160] Update project_view.py --- src/ms_ovba/Views/project_view.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ms_ovba/Views/project_view.py b/src/ms_ovba/Views/project_view.py index 5fe5304dc..b030a1287 100644 --- a/src/ms_ovba/Views/project_view.py +++ b/src/ms_ovba/Views/project_view.py @@ -13,7 +13,7 @@ class ProjectView: def __init__(self: T, project: VbaProject, reserved: int = 3) -> None: self.project = project self._reserved3 = reserved - + def to_bytes(self: T) -> bytes: endien_symbol = '<' if self.project.endien == 'little' else '>' format = endien_symbol + "HHBH" From 4330c1813a416dca37d8ee23ea67eb27de167707 Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Thu, 12 Mar 2026 07:59:24 -0400 Subject: [PATCH 154/160] Update test_fullFile.py --- tests/Functional/test_fullFile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Functional/test_fullFile.py b/tests/Functional/test_fullFile.py index 75094f6d0..306a6152f 100644 --- a/tests/Functional/test_fullFile.py +++ b/tests/Functional/test_fullFile.py @@ -170,7 +170,7 @@ def test_full_file() -> None: b.seek(bin_offset) file_bytes = b.read(cache_size) assert pv_bytes == file_bytes - # assert len(pv_bytes) == 0x09F0 + assert len(pv_bytes) == 0x09F0 ProjectOleFile.write_file(project) From 200f08d7cbc92799b9e943d2c52cafc855d250e6 Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Thu, 12 Mar 2026 09:14:36 -0400 Subject: [PATCH 155/160] Update test_reference_registered.py --- .../Models/Entities/test_reference_registered.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/tests/Unit/Models/Entities/test_reference_registered.py b/tests/Unit/Models/Entities/test_reference_registered.py index 18d356590..aeeca0234 100644 --- a/tests/Unit/Models/Entities/test_reference_registered.py +++ b/tests/Unit/Models/Entities/test_reference_registered.py @@ -57,3 +57,18 @@ def test_unpack(): b'000000000046}#2.0#0#' + b'C:\\Windows\\system32\\stdole2.tlb#' + b'OLE Automation') + +def test_bad_id(): + hex = ("0C 00 68 00 00 00 5E 00 00 00 2A 5C 47 7B 30 30", + "30 32 30 34 33 30 2D 30 30 30 30 2D 30 30 30 30", + "2D 43 30 30 30 2D 30 30 30 30 30 30 30 30 30 30", + "34 36 7D 23 32 2E 30 23 30 23 43 3A 5C 57 69 6E", + "64 6F 77 73 5C 73 79 73 74 65 6D 33 32 5C 73 74", + "64 6F 6C 65 32 2E 74 6C 62 23 4F 4C 45 20 41 75", + "74 6F 6D 61 74 69 6F 6E 00 00 00 00 00 00") + data = bytes.fromhex(" ".join(hex)) + path = 'ms_ovba.Models.Entities.reference_registered.LibidReference' + with mock.patch(path, MockLibid2): + with pytest.raises(Exception): + ref = ReferenceRegistered.unpack(data, "little") + From 1ab5359fa423ef19e0a5d5e29ec5b7f99be9a512 Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Thu, 12 Mar 2026 09:16:55 -0400 Subject: [PATCH 156/160] Update test_reference_registered.py --- tests/Unit/Models/Entities/test_reference_registered.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/Unit/Models/Entities/test_reference_registered.py b/tests/Unit/Models/Entities/test_reference_registered.py index aeeca0234..0834b8a93 100644 --- a/tests/Unit/Models/Entities/test_reference_registered.py +++ b/tests/Unit/Models/Entities/test_reference_registered.py @@ -1,3 +1,4 @@ +import pytest from unittest import mock from ms_ovba.Models.Entities.reference_registered import ReferenceRegistered @@ -70,5 +71,4 @@ def test_bad_id(): path = 'ms_ovba.Models.Entities.reference_registered.LibidReference' with mock.patch(path, MockLibid2): with pytest.raises(Exception): - ref = ReferenceRegistered.unpack(data, "little") - + ReferenceRegistered.unpack(data, "little") From 5e5d7b5dd6633d4e34bacabf23be0a3b0094ccc0 Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Thu, 12 Mar 2026 09:17:23 -0400 Subject: [PATCH 157/160] Update test_reference_registered.py --- tests/Unit/Models/Entities/test_reference_registered.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/Unit/Models/Entities/test_reference_registered.py b/tests/Unit/Models/Entities/test_reference_registered.py index 0834b8a93..f29ffa011 100644 --- a/tests/Unit/Models/Entities/test_reference_registered.py +++ b/tests/Unit/Models/Entities/test_reference_registered.py @@ -59,6 +59,7 @@ def test_unpack(): b'C:\\Windows\\system32\\stdole2.tlb#' + b'OLE Automation') + def test_bad_id(): hex = ("0C 00 68 00 00 00 5E 00 00 00 2A 5C 47 7B 30 30", "30 32 30 34 33 30 2D 30 30 30 30 2D 30 30 30 30", From cf9e8643f3b6f1ed14a02a822740351b7a2c9de5 Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Thu, 12 Mar 2026 09:18:11 -0400 Subject: [PATCH 158/160] Update test_reference_registered.py --- tests/Unit/Models/Entities/test_reference_registered.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/Unit/Models/Entities/test_reference_registered.py b/tests/Unit/Models/Entities/test_reference_registered.py index f29ffa011..92fd7f370 100644 --- a/tests/Unit/Models/Entities/test_reference_registered.py +++ b/tests/Unit/Models/Entities/test_reference_registered.py @@ -54,10 +54,10 @@ def test_unpack(): path = 'ms_ovba.Models.Entities.reference_registered.LibidReference' with mock.patch(path, MockLibid2): ref = ReferenceRegistered.unpack(data, "little") - assert ref.libid.data == (b'*\\G{00020430-0000-0000-C000-' + - b'000000000046}#2.0#0#' + - b'C:\\Windows\\system32\\stdole2.tlb#' + - b'OLE Automation') + assert ref.libid.data == ( + b'*\\G{00020430-0000-0000-C000-000000000046}#2.0#0#' + + b'C:\\Windows\\system32\\stdole2.tlb#OLE Automation' + ) def test_bad_id(): From ef70975bf581b3ba0a928447c3387ac0fc912a90 Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Thu, 12 Mar 2026 09:21:21 -0400 Subject: [PATCH 159/160] Update test_dirObject.py --- tests/Functional/test_dirObject.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/tests/Functional/test_dirObject.py b/tests/Functional/test_dirObject.py index 6e04ab152..a9643711e 100644 --- a/tests/Functional/test_dirObject.py +++ b/tests/Functional/test_dirObject.py @@ -99,10 +99,6 @@ def test_dirstream() -> None: project.add_module(sheet1) project.add_module(module1) - f.seek(0x1200) - expected_cache = f.read(len(module1.cache)) - assert module1.cache == expected_cache - assert stream.to_bytes() == decompressed_stream # The OEM and 3rd party compression results are not the same, From 064e820a954c77b7e9441a692d8fafe794d737ef Mon Sep 17 00:00:00 2001 From: Kevin Nowaczyk Date: Thu, 12 Mar 2026 21:21:17 -0400 Subject: [PATCH 160/160] Update test_fullFile.py (#126) * full file functional test --- .github/workflows/python-package.yml | 1 + src/ms_ovba/Views/dirStream.py | 2 +- src/ms_ovba/Views/project.py | 2 +- src/ms_ovba/vbaProject.py | 17 ++++ tests/Functional/test_dirObject.py | 107 ------------------------ tests/Functional/test_fullFile.py | 119 +++++++++++++++++++-------- tests/Unit/Views/test_project.py | 1 + 7 files changed, 105 insertions(+), 144 deletions(-) delete mode 100644 tests/Functional/test_dirObject.py diff --git a/.github/workflows/python-package.yml b/.github/workflows/python-package.yml index 00471a527..d31e50507 100644 --- a/.github/workflows/python-package.yml +++ b/.github/workflows/python-package.yml @@ -41,6 +41,7 @@ jobs: run: | pytest --cov=src coveralls --service=github + ls -al flake8: runs-on: ubuntu-latest diff --git a/src/ms_ovba/Views/dirStream.py b/src/ms_ovba/Views/dirStream.py index 5ea9aaffb..f0cf29191 100644 --- a/src/ms_ovba/Views/dirStream.py +++ b/src/ms_ovba/Views/dirStream.py @@ -19,7 +19,7 @@ class DirStream(): def __init__(self: T, project: VbaProject) -> None: self.project = project - self._include_compat = False + self._include_compat = project.compat def to_bytes(self: T) -> bytes: information = self._load_information() diff --git a/src/ms_ovba/Views/project.py b/src/ms_ovba/Views/project.py index bb4b9fc2f..6c03fe844 100644 --- a/src/ms_ovba/Views/project.py +++ b/src/ms_ovba/Views/project.py @@ -16,7 +16,7 @@ def __init__(self: T, project: VbaProject) -> None: # Attributes # A list of attributes and values - self.attributes = {} + self.attributes = project.attributes # The HostExtenderInfo string guid = "{3832D640-CF90-11CF-8E43-00A0C911005A}" diff --git a/src/ms_ovba/vbaProject.py b/src/ms_ovba/vbaProject.py index ebbe6e8a1..bad5457f3 100644 --- a/src/ms_ovba/vbaProject.py +++ b/src/ms_ovba/vbaProject.py @@ -29,9 +29,13 @@ def __init__(self: T) -> None: self.references = [] self.modules = [] + # A list of attributes and values + self.attributes = {} + self._project_cookie = 0xFFFF self._project_wm = False + self._compat = False self._default_date = Filetime.from_msfiletime(0x0000000000000000) # Getters and Setters @@ -126,9 +130,22 @@ def include_projectwm(self: T) -> bool: def exclude_projectwm(self: T) -> bool: self._project_wm = False + @property + def compat(self: T) -> bool: + return self._compat + + def include_compat(self: T) -> None: + self._compat = True + + def exclude_compat(self: T) -> None: + self._compat = False + # Appenders def add_module(self: T, mod: ModuleBase) -> None: self.modules.append(mod) def add_reference(self: T, ref: ReferenceRegistered) -> None: self.references.append(ref) + + def add_attribute(self: T, name: str, value: str) -> None: + self.attributes[name] = value diff --git a/tests/Functional/test_dirObject.py b/tests/Functional/test_dirObject.py deleted file mode 100644 index a9643711e..000000000 --- a/tests/Functional/test_dirObject.py +++ /dev/null @@ -1,107 +0,0 @@ -import struct -import uuid -from ms_ovba_compression.ms_ovba import MsOvba -from ms_pcode_assembler.module_cache import ModuleCache -from ms_ovba.vbaProject import VbaProject -from ms_ovba.Views.dirStream import DirStream -from ms_ovba.Models.Fields.libid_reference import LibidReference -from ms_ovba.Models.Entities.doc_module import DocModule -from ms_ovba.Models.Entities.std_module import StdModule -from ms_ovba.Models.Entities.reference import ( - Reference -) -from ms_ovba.Models.Entities.reference_registered import ( - ReferenceRegistered -) - - -def test_dirstream() -> None: - ''' - The cache is not yet tested. - ''' - module_cache = ModuleCache(0xB5, 0x08F3, signature=3) - # Read the data from the demo file and decompress it. - f = open('tests/blank/vbaProject.bin', 'rb') - offset = 0x1EC0 - length = 0x0232 - f.seek(offset) - container = f.read(length) - ms_ovba = MsOvba() - decompressed_stream = ms_ovba.decompress(container) - - # Create a project with the same attributes - project = VbaProject() - stream = DirStream(project) - stream.include_compat() - guid = uuid.UUID('0002043000000000C000000000000046') - libid_ref = ReferenceRegistered(LibidReference( - guid, - "2.0", - "0", - "C:\\Windows\\System32\\stdole2.tlb", - "OLE Automation" - )) - ole_reference = Reference(libid_ref, "stdole") - guid = uuid.UUID('2DF8D04C5BFA101BBDE500AA0044DE52') - libid_ref2 = ReferenceRegistered(LibidReference( - guid, - "2.0", - "0", - "C:\\Program Files\\Common Files\\Microsoft Shared\\OFFICE16\\MSO.DLL", - "Microsoft Office 16.0 Object Library" - )) - office_reference = Reference(libid_ref2, "Office") - project.add_reference(ole_reference) - project.add_reference(office_reference) - project.project_cookie = 0x08F3 - - indirect_table = ("02 80 FE FF FF FF FF FF 20 00 00 00 FF FF FF FF", - "30 00 00 00 02 01 FF FF 00 00 00 00 00 00 00 00", - "FF FF FF FF FF FF FF FF 00 00 00 00 2E 00 43 00", - "1D 00 00 00 25 00 00 00 FF FF FF FF 40 00 00 00") - module_cache.indirect_table = bytes.fromhex(" ".join(indirect_table)) - object_table = ("02 00 53 4C FF FF FF FF 00 00 01 00 53 10 FF FF", - "FF FF 00 00 01 00 53 94 FF FF FF FF 00 00 00 00", - "02 3C FF FF FF FF 00 00") - module_cache.object_table = bytes.fromhex(" ".join(object_table)) - module_cache.misc = [[-1, 8], 0x18, 0, [1, "00000000"]] - module_cache.header.data2 = 0 - module_cache.header.data3 = 0x123 - module_cache.header.data4 = 0x88 - this_workbook = DocModule("ThisWorkbook") - this_workbook.cookie = 0xB81C - module_cache.module_cookie = 0xB81C - guid = uuid.UUID('0002081900000000C000000000000046') - this_workbook.add_guid(guid) - module_cache.guid = [guid] - this_workbook.cache = module_cache.to_bytes() - - sheet1 = DocModule("Sheet1") - sheet1.cookie = 0x9B9A - module_cache.module_cookie = 0x9B9A - guid = uuid.UUID('0002082000000000C000000000000046') - module_cache.guid = [guid] - sheet1.add_guid(guid) - sheet1.cache = module_cache.to_bytes() - - module1 = StdModule("Module1") - module1.cookie = 0xB241 - module_cache.clear_variables() - module_cache.module_cookie = 0xB241 - module_cache.misc = [[-1, 2], 0xFFFF, 0, [0, "FFFFFFFF"]] - module_cache.header.data2 = 0 - module_cache.header.data3 = 3 - module_cache.header.data4 = 0 - module_cache.indirect_table = struct.pack(" None: names = [root + "ThisWorkbook.cls", root + "Sheet1.cls", root2 + "Module1.bas"] remove_module(names) - names = ["dir.bin", "projectWm.bin", "project.bin", "vba_project.bin"] + names = ["dir.bin", "projectwm.bin", "project.bin", "vba_project.bin"] map(os.remove, names) @@ -60,20 +58,19 @@ def remove_module(names: str) -> None: os.remove(name + ".bin") -def module_matches_bin(module_path: str, - cache_size: int, - bin_path: str, - bin_offset: int, - bin_length: int) -> bool: +def assert_module_matches_bin(module_path: str, + cache_size: int, + bin_path: str, + bin_offset: int, + bin_length: int) -> bool: m = open(module_path, "rb") b = open(bin_path, "rb") b.seek(bin_offset) - if m.read(cache_size) != b.read(cache_size): - return False + assert m.read(cache_size) == b.read(cache_size) ms_ovba = MsOvba() m_uncompressed = ms_ovba.decompress(m.read()) - b_uncompressed = ms_ovba.decompress(b.read(bin_length)) - return m_uncompressed == b_uncompressed + b_uncompressed = ms_ovba.decompress(b.read(bin_length - cache_size)) + assert m_uncompressed == b_uncompressed stdole_lib = LibidReference( @@ -126,9 +123,10 @@ def test_full_file() -> None: cookie = 0xB241 module1.cookie = cookie module_cache = ModuleCache(0xB5, proj_cookie, signature=3) - module_cache.header.data2 = 3 - module_cache.header.data4 = 2 - module_cache.misc = [[-1, 0], 0xFFFF, 0, [0, "FFFFFFFF"]] + module_cache.misc = [[-1, 2], 0xFFFF, 0, [0, "FFFFFFFF"]] + module_cache.header.data2 = 0 + module_cache.header.data3 = 3 + module_cache.header.data4 = 0 module_cache.indirect_table = struct.pack(" None: proj_cookie, [this_workbook, sheet1, module1] ) + + project.add_attribute("HelpContextID", "0") + project.add_attribute("VersionCompatible32", "393222000") + project.include_compat() + project.include_projectwm() + + ProjectOleFile.write_file(project) + + # Check _VBA_Project + g = open('vba_project.bin', 'rb') + given = g.read() + bin_offset = 0x14C0 + bin_length = 0x09F0 + bin_path = "tests/blank/vbaProject.bin" + b = open(bin_path, "rb") + b.seek(bin_offset) + expected = b.read(bin_length) + assert given == expected + # Check ProjectWm - wm_bytes = ProjectWm(project).to_bytes() + f = open('tests/blank/vbaProject.bin', 'rb') + g = open('projectwm.bin', 'rb') + given = g.read() # Read from file instead of pasting expected = (b'ThisWorkbook\x00T\x00h' + b'\x00i\x00s\x00W\x00o\x00r\x00k\x00b\x00o' + @@ -154,28 +173,57 @@ def test_full_file() -> None: b'h\x00e\x00e\x00t\x001\x00\x00\x00Modu' + b'le1\x00M\x00o\x00d\x00u\x00l\x00e\x00' + b'1\x00\x00\x00\x00\x00') - assert len(wm_bytes) == 0x56 - assert wm_bytes == expected + assert given == expected - # Check Project + # Check Modules + path = "src/ms_ovba/blank_files/Sheet1.cls.bin" + cache_size = 0x333 + bin_path = "tests/blank/vbaProject.bin" + bin_offset = 0xC00 + bin_length = 0x3df + assert_module_matches_bin( + path, cache_size, bin_path, + bin_offset, bin_length + ) - # Check Dir + path = "src/ms_ovba/blank_files/ThisWorkbook.cls.bin" + bin_offset = 0x800 + bin_length = 0x3e7 # From vbaProject.bin OLE Directory + assert_module_matches_bin( + path, cache_size, bin_path, + bin_offset, bin_length + ) - # Check _VBA_Project - pv_bytes = ProjectView(project).to_bytes() + path = "tests/blank/Module1.bas.bin" + cache_size = 0x283 bin_path = "tests/blank/vbaProject.bin" - bin_offset = 0x14C0 - cache_size = 0x09F0 - b = open(bin_path, "rb") - b.seek(bin_offset) - file_bytes = b.read(cache_size) - assert pv_bytes == file_bytes - assert len(pv_bytes) == 0x09F0 + bin_offset = 0x1200 + bin_length = 0x2a9 # From vbaProject.bin OLE Directory + assert_module_matches_bin( + path, cache_size, bin_path, + bin_offset, bin_length + ) - ProjectOleFile.write_file(project) + # Check Project + length = 0x1d2 + offset = 0x2180 + f.seek(offset) + expected = f.read(0x80) + f.seek(0x2400) + expected += f.read(length - 0x80) + g = open('project.bin', 'rb') + assert g.read() == expected - # combine sectors from bin into the streams - # compare raw or uncompressed streams. + # Check Dir + ms_ovba = MsOvba() + g = open('dir.bin', 'rb') + given = ms_ovba.decompress(g.read()) + offset = 0x1EC0 + length = 0x0232 + f.seek(offset) + container = f.read(length) + expected = ms_ovba.decompress(container) + assert given == expected def create_cache(proj_cookie: int, modules) -> bytes: @@ -284,9 +332,10 @@ def create_doc_module(project: VbaProject, name: str, cache_ver = project.performance_cache_version proj_cookie = project.project_cookie module_cache = ModuleCache(cache_ver, proj_cookie, signature=3) - module_cache.header.data3 = 0x88 - module_cache.header.data4 = 8 - module_cache.misc = [[-1, 0x18], 0x18, 0, [1, "00000000"]] + module_cache.header.data2 = 0 + module_cache.header.data3 = 0x123 + module_cache.header.data4 = 0x88 + module_cache.misc = [[-1, 8], 0x18, 0, [1, "00000000"]] indirect_table = ("02 80 FE FF FF FF FF FF 20 00 00 00 FF FF FF FF", "30 00 00 00 02 01 FF FF 00 00 00 00 00 00 00 00", "FF FF FF FF FF FF FF FF 00 00 00 00 2E 00 43 00", diff --git a/tests/Unit/Views/test_project.py b/tests/Unit/Views/test_project.py index c7fc68599..659cc1c94 100644 --- a/tests/Unit/Views/test_project.py +++ b/tests/Unit/Views/test_project.py @@ -51,6 +51,7 @@ def __init__(self) -> None: self.protection_state = b'\x00\x00\x00\x00' self.password = b'\x00' self.visibility_state = b'\xFF' + self.attributes = {} @unittest.mock.patch('random.randint', NotSoRandom.randint)