Home | Trees | Indices | Help |
---|
|
1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 4 # Copyright (c) 2015, Sandor Nemes 5 # All rights reserved. 6 # 7 # Redistribution and use in source and binary forms, with or without 8 # modification, are permitted provided that the following conditions are met: 9 # 10 # * Redistributions of source code must retain the above copyright notice, 11 # this list of conditions and the following disclaimer. 12 # * Redistributions in binary form must reproduce the above copyright 13 # notice,this list of conditions and the following disclaimer in the 14 # documentation and/or other materials provided with the distribution. 15 # * Neither the name of the copyright holder nor the names of its 16 # contributors may be used to endorse or promote products derived from 17 # this software without specific prior written permission. 18 # 19 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 20 # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22 # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 23 # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 # POSSIBILITY OF SUCH DAMAGE. 30 31 import sys 32 33 import datatypes 34 import caching37 436245 funcname = sys._getframe().f_code.co_name 46 cache = caching.getCache(funcname) 47 result = cache.get(offset) 48 if result is not None: return result 49 50 for i in self.streams["#Strings"].info: 51 cache.put(*i.iteritems().next()) 52 53 return cache.get(offset)5464 708972 funcname = sys._getframe().f_code.co_name 73 cache = caching.getCache(funcname) 74 result = cache.get(offset) 75 if result is not None: return result 76 77 for i in self.streams["#GUID"].info: 78 cache.put(*i.iteritems().next()) 79 80 return cache.get(offset)8191 9711699 funcname = sys._getframe().f_code.co_name 100 cache = caching.getCache(funcname) 101 result = cache.get(offset) 102 if result is not None: return result 103 104 for i in self.streams["#Blob"].info: 105 cache.put(*i.iteritems().next()) 106 107 return cache.get(offset)108119 120 refs = None 121175 183 190123 if not self.refs: raise NotImplementedError 124 self.dt = dt 125 self.streams = streams 126 self.value = None 127 self.hash = "{0:x}".format(hash(self.refs))128 129 @staticmethod131 funcname = sys._getframe().f_code.co_name 132 cache = caching.getCache(funcname) 133 bits = cache.get(value) 134 if bits is not None: return bits 135 136 bits = 0 137 tmp = value - 1 138 while tmp > 0: 139 bits += 1 140 tmp >>= 1 141 142 cache.put(value, bits) 143 return bits144146 funcname = sys._getframe().f_code.co_name 147 cache = caching.getCache(funcname) 148 result = cache.get(self.hash) 149 if result is not None: return result 150 151 largestTable = max(self.dt.tables[_]["rows"] for _ in self.refs if _ != "Not used") 152 result = self.getBits(largestTable) > 16 - self.getBits(len(self.refs)) 153 154 cache.put(self.hash, result) 155 return result156158 funcname = sys._getframe().f_code.co_name 159 cache = caching.getCache(funcname + "#" + self.hash) 160 result = cache.get(value) 161 if result is not None: return result 162 163 bits = self.getBits(len(self.refs)) 164 result = (self.refs[value & (1 << bits)-1], value >> bits) 165 166 cache.put(value, result) 167 return result168170 if self.dwordIndex(): 171 self.value = self.decodeValue(datatypes.DWORD(readDataInstance.readDword()).value) 172 else: 173 self.value = self.decodeValue(datatypes.WORD(readDataInstance.readWord()).value) 174 return self192 refs = ( 193 "MethodDef", 194 "Field", 195 "TypeRef", 196 "TypeDef", 197 "Param", 198 "InterfaceImpl", 199 "MemberRef", 200 "Module", 201 "Permission", 202 "Property", 203 "Event", 204 "StandAloneSig", 205 "ModuleRef", 206 "TypeSpec", 207 "Assembly", 208 "AssemblyRef", 209 "File", 210 "ExportedType", 211 "ManifestResource", 212 )213 220 228 238 245 252 259 267 277 286 293 299 305 311 317 323 329 335 341 347 348 349 MetadataTableNames = { 350 0x00: "Module", 351 0x01: "TypeRef", 352 0x02: "TypeDef", 353 0x03: "FieldPtr", 354 0x04: "Field", 355 0x05: "MethodPtr", 356 0x06: "MethodDef", 357 0x07: "ParamPtr", 358 0x08: "Param", 359 0x09: "InterfaceImpl", 360 0x0a: "MemberRef", 361 0x0b: "Constant", 362 0x0c: "CustomAttribute", 363 0x0d: "FieldMarshal", 364 0x0e: "Permission", # DeclSecurity 365 0x0f: "ClassLayout", 366 0x10: "FieldLayout", 367 0x11: "StandAloneSig", 368 0x12: "EventMap", 369 0x13: "EventPtr", 370 0x14: "Event", 371 0x15: "PropertyMap", 372 0x16: "PropertyPtr", 373 0x17: "Property", 374 0x18: "MethodSemantics", 375 0x19: "MethodImpl", 376 0x1a: "ModuleRef", 377 0x1b: "TypeSpec", 378 0x1c: "ImplMap", 379 0x1d: "FieldRVA", 380 0x1e: None, 381 0x1f: None, 382 0x20: "Assembly", 383 0x21: "AssemblyProcessor", 384 0x22: "AssemblyOS", 385 0x23: "AssemblyRef", 386 0x24: "AssemblyRefProcessor", 387 0x25: "AssemblyRefOS", 388 0x26: "File", 389 0x27: "ExportedType", 390 0x28: "ManifestResource", 391 0x29: "NestedClass", 392 0x2a: "GenericParam", 393 0x2b: "MethodSpec", 394 0x2c: "GenericParamConstraint", 395 0x2d: None, 396 0x2e: None, 397 0x2f: None, 398 0x30: None, 399 0x31: None, 400 0x32: None, 401 0x33: None, 402 0x34: None, 403 0x35: None, 404 0x36: None, 405 0x37: None, 406 0x38: None, 407 0x39: None, 408 0x3a: None, 409 0x3b: None, 410 0x3c: None, 411 0x3d: None, 412 0x3e: None, 413 0x3f: None, 414 }418 return { 419 0x00: [ 420 { "generation": datatypes.WORD() }, 421 { "name": StringHeapIndex(dt, netMetaDataStreams) }, 422 { "mvId": GuidHeapIndex(dt, netMetaDataStreams) }, 423 { "encId": GuidHeapIndex(dt, netMetaDataStreams) }, 424 { "encBaseId": GuidHeapIndex(dt, netMetaDataStreams) }, 425 ], 426 0x01: [ 427 { "resolutionScope": ResolutionScopeIndex(dt, netMetaDataStreams) }, 428 { "typeName": StringHeapIndex(dt, netMetaDataStreams) }, 429 { "typeNamespace": StringHeapIndex(dt, netMetaDataStreams) }, 430 ], 431 0x02: [ 432 { "flags": datatypes.DWORD() }, 433 { "typeName": StringHeapIndex(dt, netMetaDataStreams) }, 434 { "typeNamespace": StringHeapIndex(dt, netMetaDataStreams) }, 435 { "extends": TypeDefOrRefIndex(dt, netMetaDataStreams) }, 436 { "fieldList": FieldIndex(dt, netMetaDataStreams) }, 437 { "methodList": MethodDefIndex(dt, netMetaDataStreams) }, 438 ], 439 0x03: [ 440 { "ref": datatypes.WORD() }, 441 ], 442 0x04: [ 443 { "flags": datatypes.WORD() }, 444 { "name": StringHeapIndex(dt, netMetaDataStreams) }, 445 { "signature": BlobHeapIndex(dt, netMetaDataStreams) }, 446 ], 447 0x05: [ 448 { "ref": datatypes.WORD() }, 449 ], 450 0x06: [ 451 { "rva": datatypes.DWORD() }, 452 { "implFlags": datatypes.WORD() }, 453 { "flags": datatypes.WORD() }, 454 { "name": StringHeapIndex(dt, netMetaDataStreams) }, 455 { "signature": BlobHeapIndex(dt, netMetaDataStreams) }, 456 { "paramList": ParamIndex(dt, netMetaDataStreams) }, 457 ], 458 0x07: [ 459 { "ref": datatypes.WORD() }, 460 ], 461 0x08: [ 462 { "flags": datatypes.WORD() }, 463 { "sequence": datatypes.WORD() }, 464 { "name": StringHeapIndex(dt, netMetaDataStreams) }, 465 ], 466 0x09: [ 467 { "class": TypeDefIndex(dt, netMetaDataStreams) }, 468 { "interface": TypeDefOrRefIndex(dt, netMetaDataStreams) }, 469 ], 470 0x0a: [ 471 { "class": MemberRefParentIndex(dt, netMetaDataStreams) }, 472 { "name": StringHeapIndex(dt, netMetaDataStreams) }, 473 { "signature": BlobHeapIndex(dt, netMetaDataStreams) }, 474 ], 475 0x0b: [ 476 { "type": datatypes.WORD() }, 477 { "parent": HasConstantIndex(dt, netMetaDataStreams) }, 478 { "value": BlobHeapIndex(dt, netMetaDataStreams) }, 479 ], 480 0x0c: [ 481 { "parent": HasCustomAttributeIndex(dt, netMetaDataStreams) }, 482 { "type": CustomAttributeTypeIndex(dt, netMetaDataStreams) }, 483 { "value": BlobHeapIndex(dt, netMetaDataStreams) }, 484 ], 485 0x0d: [ 486 { "parent": HasFieldMarshallIndex(dt, netMetaDataStreams) }, 487 { "nativeType": BlobHeapIndex(dt, netMetaDataStreams) }, 488 ], 489 0x0e: [ 490 { "action": datatypes.WORD() }, 491 { "parent": HasDeclSecurityIndex(dt, netMetaDataStreams) }, 492 { "permissionSet": BlobHeapIndex(dt, netMetaDataStreams) }, 493 ], 494 0x0f: [ 495 { "packingSize": datatypes.WORD() }, 496 { "classSize": datatypes.DWORD() }, 497 { "parent": TypeDefIndex(dt, netMetaDataStreams) }, 498 ], 499 0x10: [ 500 { "offset": datatypes.DWORD() }, 501 { "field": FieldIndex(dt, netMetaDataStreams) }, 502 ], 503 0x11: [ 504 { "signature": BlobHeapIndex(dt, netMetaDataStreams) }, 505 ], 506 0x12: [ 507 { "parent": TypeDefIndex(dt, netMetaDataStreams) }, 508 { "eventList": EventIndex(dt, netMetaDataStreams) }, 509 ], 510 0x13: [ 511 { "ref": datatypes.WORD() }, 512 ], 513 0x14: [ 514 { "eventFlags": datatypes.WORD() }, 515 { "name": StringHeapIndex(dt, netMetaDataStreams) }, 516 { "eventType": TypeDefOrRefIndex(dt, netMetaDataStreams) }, 517 ], 518 0x15: [ 519 { "parent": TypeDefIndex(dt, netMetaDataStreams) }, 520 { "propertyList": PropertyIndex(dt, netMetaDataStreams) }, 521 ], 522 0x16: [ 523 { "ref": datatypes.WORD() }, 524 ], 525 0x17: [ 526 { "flags": datatypes.WORD() }, 527 { "name": StringHeapIndex(dt, netMetaDataStreams) }, 528 { "type": BlobHeapIndex(dt, netMetaDataStreams) }, 529 ], 530 0x18: [ 531 { "semantics": datatypes.WORD() }, 532 { "method": MethodDefIndex(dt, netMetaDataStreams) }, 533 { "association": HasSemanticsIndex(dt, netMetaDataStreams) }, 534 ], 535 0x19: [ 536 { "class": TypeDefIndex(dt, netMetaDataStreams) }, 537 { "methodBody": MethodDefOrRefIndex(dt, netMetaDataStreams) }, 538 { "methodDeclaration": MethodDefOrRefIndex(dt, netMetaDataStreams) }, 539 ], 540 0x1a: [ 541 { "name": StringHeapIndex(dt, netMetaDataStreams) }, 542 ], 543 0x1b: [ 544 { "signature": BlobHeapIndex(dt, netMetaDataStreams) }, 545 ], 546 0x1c: [ 547 { "mappingFlags": datatypes.WORD() }, 548 { "memberForwarded": MemberForwardedIndex(dt, netMetaDataStreams) }, 549 { "importName": StringHeapIndex(dt, netMetaDataStreams) }, 550 { "importScope": ModuleRefIndex(dt, netMetaDataStreams) }, 551 ], 552 0x1d: [ 553 { "rva": datatypes.DWORD() }, 554 { "field": FieldIndex(dt, netMetaDataStreams) }, 555 ], 556 0x1e: None, 557 0x1f: None, 558 0x20: [ 559 { "hashAlgId": datatypes.DWORD() }, 560 { "majorVersion": datatypes.WORD() }, 561 { "minorVersion": datatypes.WORD() }, 562 { "buildNumber": datatypes.WORD() }, 563 { "revisionNumber": datatypes.WORD() }, 564 { "flags": datatypes.DWORD() }, 565 { "publicKey": BlobHeapIndex(dt, netMetaDataStreams) }, 566 { "name": StringHeapIndex(dt, netMetaDataStreams) }, 567 { "culture": StringHeapIndex(dt, netMetaDataStreams) }, 568 ], 569 0x21: [ 570 { "processor": datatypes.DWORD() }, 571 ], 572 0x22: [ 573 { "osPlatformId": datatypes.DWORD() }, 574 { "osMajorVersion": datatypes.DWORD() }, 575 { "osMinorVersion": datatypes.DWORD() }, 576 ], 577 0x23: [ 578 { "majorVersion": datatypes.WORD() }, 579 { "minorVersion": datatypes.WORD() }, 580 { "buildNumber": datatypes.WORD() }, 581 { "revisionNumber": datatypes.WORD() }, 582 { "flags": datatypes.DWORD() }, 583 { "publicKeyOrToken": BlobHeapIndex(dt, netMetaDataStreams) }, 584 { "name": StringHeapIndex(dt, netMetaDataStreams) }, 585 { "culture": StringHeapIndex(dt, netMetaDataStreams) }, 586 { "hashValue": BlobHeapIndex(dt, netMetaDataStreams) }, 587 ], 588 0x24: [ 589 { "processor": datatypes.DWORD() }, 590 { "assemblyRef": AssemblyRefIndex(dt, netMetaDataStreams) }, 591 ], 592 0x25: [ 593 { "osPlatformId": datatypes.DWORD() }, 594 { "osMajorVersion": datatypes.DWORD() }, 595 { "osMinorVersion": datatypes.DWORD() }, 596 { "assemblyRef": AssemblyRefIndex(dt, netMetaDataStreams) }, 597 ], 598 0x26: [ 599 { "flags": datatypes.DWORD() }, 600 { "name": StringHeapIndex(dt, netMetaDataStreams) }, 601 { "hashValue": BlobHeapIndex(dt, netMetaDataStreams) }, 602 ], 603 0x27: [ 604 { "flags": datatypes.DWORD() }, 605 { "typeDefId": datatypes.DWORD() }, 606 { "typeName": StringHeapIndex(dt, netMetaDataStreams) }, 607 { "typeNamespace": StringHeapIndex(dt, netMetaDataStreams) }, 608 { "implementation": ImplementationIndex(dt, netMetaDataStreams) }, 609 ], 610 0x28: [ 611 { "offset": datatypes.DWORD() }, 612 { "flags": datatypes.DWORD() }, 613 { "name": StringHeapIndex(dt, netMetaDataStreams) }, 614 { "implementation": ImplementationIndex(dt, netMetaDataStreams) }, 615 ], 616 0x29: [ 617 { "nestedClass": TypeDefIndex(dt, netMetaDataStreams) }, 618 { "enclosingClass": TypeDefIndex(dt, netMetaDataStreams) }, 619 ], 620 0x2a: [ 621 { "number": datatypes.WORD() }, 622 { "flags": datatypes.WORD() }, 623 { "owner": TypeOrMethodDefIndex(dt, netMetaDataStreams) }, 624 { "name": StringHeapIndex(dt, netMetaDataStreams) }, 625 ], 626 0x2b: [ 627 { "method": MethodDefOrRefIndex(dt, netMetaDataStreams) }, 628 { "instantiation": BlobHeapIndex(dt, netMetaDataStreams) }, 629 ], 630 0x2c: [ 631 { "owner": GenericParamIndex(dt, netMetaDataStreams) }, 632 { "constraint": TypeDefOrRefIndex(dt, netMetaDataStreams) }, 633 ], 634 0x2d: None, 635 0x2e: None, 636 0x2f: None, 637 0x30: None, 638 0x31: None, 639 0x32: None, 640 0x33: None, 641 0x34: None, 642 0x35: None, 643 0x36: None, 644 0x37: None, 645 0x38: None, 646 0x39: None, 647 0x3a: None, 648 0x3b: None, 649 0x3c: None, 650 0x3d: None, 651 0x3e: None, 652 0x3f: None, 653 }654
Home | Trees | Indices | Help |
---|
Generated by Epydoc 3.0.1 on Mon Oct 26 20:15:25 2015 | http://epydoc.sourceforge.net |