Commit 20ca1d2c8fae68b3f1a31b63e0b1e0810d9ec507

Authored by Vincent Brillault
1 parent f8664a4f

oleform: unify *datablock processing

Showing 1 changed file with 30 additions and 44 deletions
oletools/oleform.py
@@ -24,6 +24,11 @@ class Mask(object): @@ -24,6 +24,11 @@ class Mask(object):
24 def __getitem__(self, key): 24 def __getitem__(self, key):
25 return self._val[self._names.index(key)] 25 return self._val[self._names.index(key)]
26 26
  27 + def consume(self, stream, props):
  28 + for (name, size) in props:
  29 + if self[name]:
  30 + stream.read(size)
  31 +
27 class FormPropMask(Mask): 32 class FormPropMask(Mask):
28 """FormPropMask: [MS-OFORMS] 2.2.10.2""" 33 """FormPropMask: [MS-OFORMS] 2.2.10.2"""
29 _size = 28 34 _size = 28
@@ -253,19 +258,14 @@ def consume_OleSiteConcreteControl(stream): @@ -253,19 +258,14 @@ def consume_OleSiteConcreteControl(stream):
253 tag_len = consume_CountOfBytesWithCompressionFlag(stream) 258 tag_len = consume_CountOfBytesWithCompressionFlag(stream)
254 if propmask.fID: 259 if propmask.fID:
255 id = stream.unpack('<L', 4) 260 id = stream.unpack('<L', 4)
256 - for prop in ['fHelpContextID', 'fBitFlags', 'fObjectStreamSize']:  
257 - if propmask[prop]:  
258 - stream.read(4) 261 + propmask.consume(stream, [('fHelpContextID', 4), ('fBitFlags', 4), ('fObjectStreamSize', 4)])
259 tabindex = ClsidCacheIndex = 0 262 tabindex = ClsidCacheIndex = 0
260 if propmask.fTabIndex: 263 if propmask.fTabIndex:
261 tabindex = stream.unpack('<H', 2) 264 tabindex = stream.unpack('<H', 2)
262 if propmask.fClsidCacheIndex: 265 if propmask.fClsidCacheIndex:
263 ClsidCacheIndex = stream.unpack('<H', 2) 266 ClsidCacheIndex = stream.unpack('<H', 2)
264 - if propmask.fGroupID:  
265 - stream.read(2)  
266 - for prop in ['fControlTipText', 'fRuntimeLicKey', 'fControlSource', 'fRowSource']:  
267 - if propmask[prop]:  
268 - stream.read(4) 267 + propmask.consume(stream, [('fGroupID', 2), ('fControlTipText', 4), ('fRuntimeLicKey', 4),
  268 + ('fControlSource', 4), ('fRowSource', 4)])
269 # SiteExtraDataBlock: [MS-OFORMS] 2.2.10.12.4 269 # SiteExtraDataBlock: [MS-OFORMS] 2.2.10.12.4
270 name = stream.read(name_len) 270 name = stream.read(name_len)
271 tag = stream.read(tag_len) 271 tag = stream.read(tag_len)
@@ -279,9 +279,7 @@ def consume_FormControl(stream): @@ -279,9 +279,7 @@ def consume_FormControl(stream):
279 with stream.will_jump_to(cbform): 279 with stream.will_jump_to(cbform):
280 propmask = FormPropMask(stream.unpack('<L', 4)) 280 propmask = FormPropMask(stream.unpack('<L', 4))
281 # FormDataBlock: [MS-OFORMS] 2.2.10.3 281 # FormDataBlock: [MS-OFORMS] 2.2.10.3
282 - for prop in ['fBackColor', 'fForeColor', 'fNextAvailableID']:  
283 - if propmask[prop]:  
284 - stream.read(4) 282 + propmask.consume(stream, [('fBackColor', 4), ('fForeColor', 4), ('fNextAvailableID', 4)])
285 if propmask.fBooleanProperties: 283 if propmask.fBooleanProperties:
286 BooleanProperties = stream.unpack('<L', 4) 284 BooleanProperties = stream.unpack('<L', 4)
287 FORM_FLAG_DONTSAVECLASSTABLE = (BooleanProperties & (1<<15)) >> 15 285 FORM_FLAG_DONTSAVECLASSTABLE = (BooleanProperties & (1<<15)) >> 15
@@ -317,37 +315,24 @@ def consume_MorphDataControl(stream): @@ -317,37 +315,24 @@ def consume_MorphDataControl(stream):
317 propmask = MorphDataPropMask(stream.unpack('<Q', 8)) 315 propmask = MorphDataPropMask(stream.unpack('<Q', 8))
318 # MorphDataDataBlock: [MS-OFORMS] 2.2.5.3 316 # MorphDataDataBlock: [MS-OFORMS] 2.2.5.3
319 with stream.padded_struct(): 317 with stream.padded_struct():
320 - for prop in ['fVariousPropertyBits', 'fBackColor', 'fForeColor', 'fMaxLength']:  
321 - if propmask[prop]:  
322 - stream.read(4)  
323 - for prop in ['fBorderStyle', 'fScrollBars', 'fDisplayStyle', 'fMousePointer']:  
324 - if propmask[prop]:  
325 - stream.read(1)  
326 - if propmask['fPasswordChar']:  
327 - stream.read(2)  
328 - if propmask['fListWidth']:  
329 - stream.read(4)  
330 - for prop in ['fBoundColumn', 'fTextColumn', 'fColumnCount', 'fListRows']:  
331 - if propmask[prop]:  
332 - stream.read(2)  
333 - if propmask.fcColumnInfo:  
334 - stream.read(2)  
335 - for prop in ['fMatchEntry', 'fListStyle', 'fShowDropButtonWhen',  
336 - 'fDropButtonStyle', 'fMultiSelect']:  
337 - if propmask[prop]:  
338 - stream.read(1) 318 + propmask.consume(stream, [('fVariousPropertyBits', 4), ('fBackColor', 4),
  319 + ('fForeColor', 4), ('fMaxLength', 4),
  320 + ('fBorderStyle', 1), ('fScrollBars', 1),
  321 + ('fDisplayStyle', 1), ('fMousePointer', 1),
  322 + ('fPasswordChar', 2), ('fListWidth', 4),
  323 + ('fBoundColumn', 2), ('fTextColumn', 2),
  324 + ('fColumnCount', 2), ('fListRows', 2),
  325 + ('fcColumnInfo', 2), ('fMatchEntry', 1),
  326 + ('fListStyle', 1), ('fShowDropButtonWhen', 1),
  327 + ('fDropButtonStyle', 1), ('fMultiSelect', 1)])
339 if propmask.fValue: 328 if propmask.fValue:
340 value_size = consume_CountOfBytesWithCompressionFlag(stream) 329 value_size = consume_CountOfBytesWithCompressionFlag(stream)
341 else: 330 else:
342 value_size = 0 331 value_size = 0
343 - for prop in ['fCaption', 'fPicturePosition', 'fBorderColor', 'fSpecialEffect']:  
344 - if propmask[prop]:  
345 - stream.read(4)  
346 - for prop in ['fMouseIcon', 'fPicture', 'fAccelerator']:  
347 - if propmask[prop]:  
348 - stream.read(2)  
349 - if propmask['fGroupName']:  
350 - stream.read(4) 332 + propmask.consume(stream, [('fCaption', 4), ('fPicturePosition', 4),
  333 + ('fBorderColor', 4), ('fSpecialEffect', 4),
  334 + ('fMouseIcon', 2), ('fPicture', 2),
  335 + ('fAccelerator', 2), ('fGroupName', 4)])
351 # MorphDataExtraDataBlock: [MS-OFORMS] 2.2.5.4 336 # MorphDataExtraDataBlock: [MS-OFORMS] 2.2.5.4
352 stream.read(8) 337 stream.read(8)
353 value = stream.read(value_size) 338 value = stream.read(value_size)
@@ -404,12 +389,13 @@ def consume_TabStripControl(stream): @@ -404,12 +389,13 @@ def consume_TabStripControl(stream):
404 with stream.will_jump_to(cbTabStrip): 389 with stream.will_jump_to(cbTabStrip):
405 propmask = TabStripPropMask(stream.unpack('<L', 4)) 390 propmask = TabStripPropMask(stream.unpack('<L', 4))
406 # TabStripDataBlock: [MS-OFORMS] 2.2.9.3 391 # TabStripDataBlock: [MS-OFORMS] 2.2.9.3
407 - # All are 4B (or 4B + pad = 4B), except MousePointer, which is 1B + pad = 4b  
408 - for prop in ['fListIndex', 'fBackColor', 'fForeColor', 'fSize', 'fTabOrientation'  
409 - 'fTabStyle', 'fTabFixedWidth', 'fTabFixedHeight', 'fTipStrings',  
410 - 'fNames', 'fVariousPropertyBits', 'fTabsAllocated', 'fTags']:  
411 - if propmask[prop]:  
412 - stream.read(4) 392 + propmask.consume(stream, [('fListIndex', 4), ('fBackColor', 4),
  393 + ('fForeColor', 4), ('fSize', 4),
  394 + ('fMousePointer', 1), ('fTabOrientation', 4),
  395 + ('fTabStyle', 4), ('fTabFixedWidth', 4),
  396 + ('fTabFixedHeight', 4), ('fTipStrings', 4),
  397 + ('fNames', 4), ('fVariousPropertyBits', 4),
  398 + ('fTabsAllocated', 4), ('fTags', 4)])
413 tabData = 0 399 tabData = 0
414 if propmask['fTabData']: 400 if propmask['fTabData']:
415 tabData = stream.unpack('<L', 4) 401 tabData = stream.unpack('<L', 4)