0x0010: 'IMAGE_REL_AMD64_SSPAN32',
},
}))),
- ('SymbolName', ('ptr', '+ PointerToSymbolTable * - SymbolTableIndex 1 18', ('scalar', '<8s', symname)))
+ ('SymbolName', ('ptr', '+ PointerToSymbolTable * SymbolTableIndex 18', ('scalar', '<8s', symname)))
])))),
]))),
- ('Symbols', ('ptr', 'PointerToSymbolTable', ('byte-array', '* NumberOfSymbols 18', ('struct', [
+ ('Symbols', ('ptr', 'PointerToSymbolTable', ('byte-array', '18', '* NumberOfSymbols 18', ('struct', [
('Name', ('scalar', '<8s', symname)),
('Value', ('scalar', '<L', '%d' )),
('SectionNumber', ('scalar', '<H', '%d' )),
- ('SimpleType', ('enum', '<B', '%d', {
+ ('_Type', ('scalar', '<H', None )),
+ ('SimpleType', ('enum', '& _Type 15', '%d', {
0: 'IMAGE_SYM_TYPE_NULL',
1: 'IMAGE_SYM_TYPE_VOID',
2: 'IMAGE_SYM_TYPE_CHAR',
13: 'IMAGE_SYM_TYPE_WORD',
14: 'IMAGE_SYM_TYPE_UINT',
15: 'IMAGE_SYM_TYPE_DWORD',
- })),
- ('ComplexType', ('enum', '<B', '%d', {
+ })), # (Type & 0xF0) >> 4
+ ('ComplexType', ('enum', '>> & _Type 240 4', '%d', {
0: 'IMAGE_SYM_DTYPE_NULL',
1: 'IMAGE_SYM_DTYPE_POINTER',
2: 'IMAGE_SYM_DTYPE_FUNCTION',
write("%s|%s|\n" % (bytes, text))
return value
-idlit = re.compile("[a-zA-Z][a-zA-Z0-9_-]*")
+idlit = re.compile("[a-zA-Z_][a-zA-Z0-9_-]*")
numlit = re.compile("[0-9]+")
def read_value(expr):
if expr == 'false':
return False
- if len(token) > 1 and token[0] in ('=', '@', '<', '!', '>'):
- val = read(expr)
- assert(len(val) == 1)
- return val[0]
-
if token == '+':
return eval() + eval()
if token == '-':
return eval() * eval()
if token == '/':
return eval() / eval()
+ if token == '&':
+ return eval() & eval()
+ if token == '|':
+ return eval() | eval()
+ if token == '>>':
+ return eval() >> eval()
+ if token == '<<':
+ return eval() << eval()
+
+ if len(token) > 1 and token[0] in ('=', '@', '<', '!', '>'):
+ val = read(expr)
+ assert(len(val) == 1)
+ return val[0]
if idlit.match(token):
return Fields[token]
raise RuntimeError("unexpected token %s" % repr(token))
- value = eval ()
+ value = eval()
try:
- input.next ()
+ input.next()
except StopIteration:
return value
raise RuntimeError("unexpected input at end of expression")
elif format_type is types.TupleType:
Fields['this'] = value
handle_element(format)
+ elif format_type is types.NoneType:
+ pass
else:
raise RuntimeError("unexpected type: %s" % repr(format_type))
name = member[0]
type = member[1]
- write("%s = "%name.ljust(24))
+ if name[0] != "_":
+ write("%s = " % name.ljust(24))
value = handle_element(type)
- write("\n")
+ if name[0] != "_":
+ write("\n")
Fields[name] = value
newFields[name] = value
return newItems
def handle_byte_array(entry):
- length = entry[1]
- element = entry[2]
+ ent_size = entry[1]
+ length = entry[2]
+ element = entry[3]
newItems = []
write("[\n")
indent()
+ item_size = read_value(ent_size)
value = read_value(length)
end_of_array = Input.tell() + value
+ prev_loc = Input.tell()
index = 0
while Input.tell() < end_of_array:
- write("%d = "%index)
+ write("%d = " % index)
value = handle_element(element)
write("\n")
newItems.append(value)
- index += 1
+ index += (Input.tell() - prev_loc) / item_size
+ prev_loc = Input.tell()
dedent()
write("]")
return handlers[entry[0]](entry)
-Input = open (sys.argv[1], "rb")
+if len(sys.argv) <= 1 or sys.argv[1] == '-':
+ import StringIO
+ Input = StringIO.StringIO(sys.stdin.read())
+else:
+ Input = open (sys.argv[1], "rb")
+
try:
handle_element(file)
finally: