summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@collabora.com>2021-03-25 09:42:49 +0100
committerMiklos Vajna <vmiklos@collabora.com>2021-03-25 09:49:55 +0100
commit0cbfc5e2b9a5e84d3e164132c682eb79e2cf0a25 (patch)
tree730406bf2e09bcd8a18ce84c7a2bf23c552c36a6
parentf4a566be1dd0e052919ffc1923564a33627ad7b1 (diff)
OLE1: show native data as well
Only preview/presentation data was shown earlier. Change-Id: Ia2ff4c19b53c3d4b968235173704b334e596ca79
-rw-r--r--Makefile2
-rw-r--r--msodumper/ole1previewrecord.py89
-rw-r--r--msodumper/ole1record.py129
-rwxr-xr-xole1-dump.py (renamed from ole1preview-dump.py)10
4 files changed, 135 insertions, 95 deletions
diff --git a/Makefile b/Makefile
index fb90903..0cb047e 100644
--- a/Makefile
+++ b/Makefile
@@ -6,5 +6,5 @@ check:
pycodestyle --ignore=E501 emf-dump.py msodumper/{emf,wmf}record.py
pycodestyle --ignore=E501 vsd-dump.py msodumper/vsdstream.py test/vsd-test.py
pycodestyle --ignore=E501 swlaycache-dump.py msodumper/swlaycacherecord.py
- pycodestyle --ignore=E501 ole1preview-dump.py msodumper/ole1previewrecord.py
+ pycodestyle --ignore=E501 ole1-dump.py msodumper/ole1record.py
pycodestyle --ignore=E501 ole2preview-dump.py msodumper/ole2previewrecord.py
diff --git a/msodumper/ole1previewrecord.py b/msodumper/ole1previewrecord.py
deleted file mode 100644
index 115ec69..0000000
--- a/msodumper/ole1previewrecord.py
+++ /dev/null
@@ -1,89 +0,0 @@
-#!/usr/bin/env python3
-#
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-
-from . import globals
-from .binarystream import BinaryStream
-
-
-class Ole1PreviewStream(BinaryStream):
- def __init__(self, bytes):
- BinaryStream.__init__(self, bytes)
-
- def dump(self):
- print('<stream type="Ole1Preview" size="%d">' % self.size)
- header = StandardPresentationObject(self, "Header")
- header.dump()
- self.printAndSet("PresentationDataSize", self.readuInt32(), hexdump=False, offset=True)
- self.printAndSet("Reserved1", self.readuInt16())
- self.printAndSet("Reserved2", self.readuInt16())
- self.printAndSet("Reserved3", self.readuInt16())
- self.printAndSet("Reserved4", self.readuInt16())
- print('<PresentationData offset="%s" size="%s"/>' % (self.pos, int(self.PresentationDataSize) - 8))
- print('</stream>')
-
-
-class Record(BinaryStream):
- def __init__(self, parent):
- BinaryStream.__init__(self, parent.bytes)
- self.parent = parent
- self.pos = parent.pos
-
-
-class LengthPrefixedAnsiString(Record):
- """Specified by [MS-OLEDS] 2.1.4, specifies a length-prefixed and
- null-terminated ANSI string."""
- def __init__(self, parent, name):
- Record.__init__(self, parent)
- self.parent = parent
- self.pos = parent.pos
- self.name = name
-
- def dump(self):
- print('<%s type="LengthPrefixedAnsiString">' % self.name)
- self.printAndSet("Length", self.readuInt32(), offset=True)
- bytes = []
- for dummy in range(self.Length):
- c = self.readuInt8()
- bytes.append(c)
-
- self.printAndSet("String", globals.encodeName("".join(map(lambda c: chr(c), bytes[:-1])), lowOnly=True).encode('utf-8'), hexdump=False, offset=True)
-
- print('</%s>' % self.name)
- self.parent.pos = self.pos
-
-
-class StandardPresentationObject(Record):
- def __init__(self, parent, name):
- Record.__init__(self, parent)
- self.name = name
-
- def dump(self):
- print('<%s type="StandardPresentationObject">' % self.name)
- header = PresentationObjectHeader(self, "Header")
- header.dump()
- self.printAndSet("Width", self.readuInt32())
- self.printAndSet("Height", self.readInt32() * -1)
-
- print('</%s>' % self.name)
- self.parent.pos = self.pos
-
-
-class PresentationObjectHeader(Record):
- def __init__(self, parent, name):
- Record.__init__(self, parent)
- self.name = name
-
- def dump(self):
- print('<%s type="PresentationObjectHeader">' % self.name)
- self.printAndSet("OLEVersion", self.readuInt32())
- self.printAndSet("FormatID", self.readuInt32())
- LengthPrefixedAnsiString(self, "ClassName").dump()
-
- print('</%s>' % self.name)
- self.parent.pos = self.pos
-
-# vim:set filetype=python shiftwidth=4 softtabstop=4 expandtab:
diff --git a/msodumper/ole1record.py b/msodumper/ole1record.py
new file mode 100644
index 0000000..c2fce14
--- /dev/null
+++ b/msodumper/ole1record.py
@@ -0,0 +1,129 @@
+#!/usr/bin/env python3
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+
+from . import globals
+from .binarystream import BinaryStream
+
+
+class Ole1Stream(BinaryStream):
+ """Specified by [MS-OLEDS] 2.2.5 EmbeddedObject, specifies how an embedded object is laid out in
+ a container document."""
+ def __init__(self, bytes):
+ BinaryStream.__init__(self, bytes)
+
+ def dump(self):
+ print('<stream type="EmbeddedObject" size="%d">' % self.size)
+ header = ObjectHeader(self, "Header")
+ header.dump()
+ self.printAndSet("NativeDataSize", self.readuInt32(), hexdump=False, offset=True)
+ print('<NativeData offset="%s" size="%s"/>' % (self.pos, self.NativeDataSize))
+ self.pos += self.NativeDataSize
+ presentation = MetaFilePresentationObject(self, "Presentation")
+ presentation.dump()
+ print('</stream>')
+
+
+class Record(BinaryStream):
+ def __init__(self, parent):
+ BinaryStream.__init__(self, parent.bytes)
+ self.parent = parent
+ self.pos = parent.pos
+
+
+class LengthPrefixedAnsiString(Record):
+ """Specified by [MS-OLEDS] 2.1.4, specifies a length-prefixed and
+ null-terminated ANSI string."""
+ def __init__(self, parent, name):
+ Record.__init__(self, parent)
+ self.parent = parent
+ self.pos = parent.pos
+ self.name = name
+
+ def dump(self):
+ print('<%s type="LengthPrefixedAnsiString">' % self.name)
+ self.printAndSet("Length", self.readuInt32(), offset=True)
+ bytes = []
+ for dummy in range(self.Length):
+ c = self.readuInt8()
+ bytes.append(c)
+
+ self.printAndSet("String", globals.encodeName("".join(map(lambda c: chr(c), bytes[:-1])), lowOnly=True).encode('utf-8'), hexdump=False, offset=True)
+
+ print('</%s>' % self.name)
+ self.parent.pos = self.pos
+
+
+class StandardPresentationObject(Record):
+ def __init__(self, parent, name):
+ Record.__init__(self, parent)
+ self.name = name
+
+ def dump(self):
+ print('<%s type="StandardPresentationObject">' % self.name)
+ self.standardPresentationObject = PresentationObjectHeader(self, "Header")
+ self.standardPresentationObject.dump()
+ if self.standardPresentationObject.FormatID != 0x00000000:
+ self.printAndSet("Width", self.readuInt32())
+ self.printAndSet("Height", self.readInt32() * -1)
+
+ print('</%s>' % self.name)
+ self.parent.pos = self.pos
+
+
+class PresentationObjectHeader(Record):
+ def __init__(self, parent, name):
+ Record.__init__(self, parent)
+ self.name = name
+
+ def dump(self):
+ print('<%s type="PresentationObjectHeader">' % self.name)
+ self.printAndSet("OLEVersion", self.readuInt32())
+ self.printAndSet("FormatID", self.readuInt32())
+ if self.FormatID != 0x00000000:
+ LengthPrefixedAnsiString(self, "ClassName").dump()
+
+ print('</%s>' % self.name)
+ self.parent.pos = self.pos
+
+
+class ObjectHeader(Record):
+ def __init__(self, parent, name):
+ Record.__init__(self, parent)
+ self.name = name
+
+ def dump(self):
+ print('<%s type="ObjectHeader">' % self.name)
+ self.printAndSet("OLEVersion", self.readuInt32())
+ self.printAndSet("FormatID", self.readuInt32())
+ LengthPrefixedAnsiString(self, "ClassName").dump()
+ LengthPrefixedAnsiString(self, "TopicName").dump()
+ LengthPrefixedAnsiString(self, "ItemName").dump()
+
+ print('</%s>' % self.name)
+ self.parent.pos = self.pos
+
+
+class MetaFilePresentationObject(Record):
+ def __init__(self, parent, name):
+ Record.__init__(self, parent)
+ self.name = name
+
+ def dump(self):
+ print('<%s type="MetaFilePresentationObject">' % self.name)
+ header = StandardPresentationObject(self, "Header")
+ header.dump()
+ if header.standardPresentationObject.FormatID != 0x000000:
+ self.printAndSet("PresentationDataSize", self.readuInt32(), hexdump=False, offset=True)
+ self.printAndSet("Reserved1", self.readuInt16())
+ self.printAndSet("Reserved2", self.readuInt16())
+ self.printAndSet("Reserved3", self.readuInt16())
+ self.printAndSet("Reserved4", self.readuInt16())
+ print('<PresentationData offset="%s" size="%s"/>' % (self.pos, int(self.PresentationDataSize) - 8))
+ print('</%s>' % self.name)
+ self.parent.pos = self.pos
+
+# vim:set filetype=python shiftwidth=4 softtabstop=4 expandtab:
diff --git a/ole1preview-dump.py b/ole1-dump.py
index 045c1d0..ab74212 100755
--- a/ole1preview-dump.py
+++ b/ole1-dump.py
@@ -5,25 +5,25 @@
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
-from msodumper import ole1previewrecord
+from msodumper import ole1record
import sys
-# Dumps the OLE1 preview: see [MS-OLEDS] 2.2.5.
-class Ole1PreviewDumper:
+# Dumps the OLE1 embedded object: see [MS-OLEDS] 2.2.5.
+class Ole1Dumper:
def __init__(self, filepath):
self.filepath = filepath
def dump(self):
file = open(self.filepath, 'rb')
- strm = ole1previewrecord.Ole1PreviewStream(file.read())
+ strm = ole1record.Ole1Stream(file.read())
file.close()
print('<?xml version="1.0"?>')
strm.dump()
def main(args):
- dumper = Ole1PreviewDumper(args[1])
+ dumper = Ole1Dumper(args[1])
dumper.dump()