source: trunk/python/pyregfi/structures.py @ 209

Last change on this file since 209 was 209, checked in by tim, 13 years ago

worked on pyregfi value data interface

added initial scons target for API/devel documentation

File size: 7.3 KB
Line 
1#!/usr/bin/env python
2
3import sys
4import os
5import traceback
6import ctypes
7import ctypes.util
8from ctypes import *
9
10# XXX: can we always be sure enums are this size?
11REGFI_ENCODING = c_uint32
12REGFI_DATA_TYPE = c_uint32
13
14# Registry value data types
15REG_NONE                       =  0
16REG_SZ                         =  1
17REG_EXPAND_SZ                  =  2
18REG_BINARY                     =  3
19REG_DWORD                      =  4
20REG_DWORD_LE                   =  4 # DWORD, little endian
21REG_DWORD_BE                   =  5 # DWORD, big endian
22REG_LINK                       =  6
23REG_MULTI_SZ                   =  7
24REG_RESOURCE_LIST              =  8
25REG_FULL_RESOURCE_DESCRIPTOR   =  9
26REG_RESOURCE_REQUIREMENTS_LIST = 10
27REG_QWORD                      = 11 # 64-bit little endian
28
29
30# Prototype everything first so we don't have to worry about reference order
31class REGFI_NTTIME(Structure):
32    pass
33
34class REGFI_VK(Structure):
35    pass
36
37class REGFI_SK(Structure):
38    pass
39
40class REGFI_SUBKEY_LIST(Structure):
41    pass
42
43class REGFI_VALUE_LIST(Structure):
44    pass
45
46class REGFI_CLASSNAME(Structure):
47    pass
48
49class REGFI_DATA(Structure):
50    pass
51
52class REGFI_NK(Structure):
53    pass
54
55class REGFI_ITERATOR(Structure):
56    pass
57
58class REGFI_FILE(Structure):
59    pass
60
61class REGFI_RAW_FILE(Structure):
62    fh = None
63   
64    def cb_seek(self, raw_file, offset, whence):
65        try:
66            self.fh.seek(offset, whence)
67        except Exception:
68            traceback.print_exc()
69            # XXX: os.EX_IOERR may not be available on Windoze
70            set_errno(os.EX_IOERR)
71            return -1
72
73        return self.fh.tell()
74
75
76    def cb_read(self, raw_file, buf, count):
77        try:
78            # XXX: anyway to do a readinto() here?
79            tmp = self.fh.read(count)
80            memmove(buf,tmp,len(tmp))
81
82        except Exception:
83            traceback.print_exc()
84            # XXX: os.EX_IOERR may not be available on Windoze
85            set_errno(os.EX_IOERR)
86            return -1
87        return len(tmp)
88
89
90# XXX: how can we know for sure the size of off_t and size_t?
91seek_cb_type = CFUNCTYPE(c_int64, POINTER(REGFI_RAW_FILE), c_uint64, c_int, use_errno=True)
92read_cb_type = CFUNCTYPE(c_int64, POINTER(REGFI_RAW_FILE), POINTER(c_char), c_uint64, use_errno=True)
93
94
95REGFI_NTTIME._fields_ = [('low', c_uint32),
96                         ('high', c_uint32)]
97
98REGFI_VK._fields_ = [('offset', c_uint32),
99                     ('cell_size', c_uint32),
100                     ('name', c_char_p),
101                     ('name_raw', POINTER(c_char)),
102                     ('name_length', c_uint16),
103                     ('hbin_off', c_uint32),
104                     ('data_size', c_uint32),
105                     ('data_off', c_uint32),
106                     ('type', REGFI_DATA_TYPE),
107                     ('magic', c_char * 2),
108                     ('flags', c_uint16),
109                     ('unknown1', c_uint16),
110                     ('data_in_offset', c_bool),
111                     ]
112
113
114REGFI_SK._fields_ = [('offset', c_uint32),
115                     ('cell_size', c_uint32),
116                     ('sec_desc', c_void_p), #XXX
117                     ('hbin_off', c_uint32),
118                     ('prev_sk_off', c_uint32),
119                     ('next_sk_off', c_uint32),
120                     ('ref_count', c_uint32),
121                     ('desc_size', c_uint32),
122                     ('unknown_tag', c_uint16),
123                     ('magic', c_char * 2),
124                     ]
125
126
127REGFI_NK._fields_ = [('offset', c_uint32),
128                     ('cell_size', c_uint32),
129                     ('values', POINTER(REGFI_VALUE_LIST)),
130                     ('subkeys', POINTER(REGFI_SUBKEY_LIST)),
131                     ('flags', c_uint16),
132                     ('magic', c_char * 2),
133                     ('mtime', REGFI_NTTIME),
134                     ('name_length', c_uint16),
135                     ('classname_length', c_uint16),
136                     ('name', c_char_p),
137                     ('name_raw', POINTER(c_char)),
138                     ('parent_off', c_uint32),
139                     ('classname_off', c_uint32),
140                     ('max_bytes_subkeyname', c_uint32),
141                     ('max_bytes_subkeyclassname', c_uint32),
142                     ('max_bytes_valuename', c_uint32),
143                     ('max_bytes_value', c_uint32),
144                     ('unknown1', c_uint32),
145                     ('unknown2', c_uint32),
146                     ('unknown3', c_uint32),
147                     ('unk_index', c_uint32),
148                     ('num_subkeys', c_uint32),
149                     ('subkeys_off', c_uint32),
150                     ('num_values', c_uint32),
151                     ('values_off', c_uint32),
152                     ('sk_off', c_uint32),
153                     ]
154
155
156REGFI_SUBKEY_LIST._fields_ = [('offset', c_uint32),
157                              ('cell_size', c_uint32),
158                              ('num_children', c_uint32),
159                              ('num_keys', c_uint32),
160                              ('elements', c_void_p),
161                              ('magic', c_char * 2),
162                              ('recursive_type', c_bool),
163                              ]
164
165
166REGFI_VALUE_LIST._fields_ = [('offset', c_uint32),
167                             ('cell_size', c_uint32),
168                             ('num_children', c_uint32),
169                             ('num_values', c_uint32),
170                             ('elements', c_void_p),
171                             ]
172
173REGFI_CLASSNAME._fields_ = [('offset', c_uint32),
174                            ('interpreted', c_char_p),
175                            ('raw', POINTER(c_char)),
176                            ('size', c_uint16),
177                            ]
178
179
180class REGFI_DATA__interpreted(Union):
181    _fields_ = [('none',POINTER(c_char)),
182                ('string', c_char_p),
183                ('expand_string', c_char_p),
184                ('binary',POINTER(c_char)),
185                ('dword', c_uint32),
186                ('dword_be', c_uint32),
187                ('link', c_char_p),
188                ('multiple_string', POINTER(c_char_p)),
189                ('qword', c_uint64),
190                ('resource_list',POINTER(c_char)),
191                ('full_resource_descriptor',POINTER(c_char)),
192                ('resource_requirements_list',POINTER(c_char)),
193                ]
194REGFI_DATA._fields_ = [('offset', c_uint32),
195                       ('type', REGFI_DATA_TYPE),
196                       ('size', c_uint32),
197                       ('raw', POINTER(c_char)),
198                       ('interpreted_size', c_uint32),
199                       ('interpreted', REGFI_DATA__interpreted),
200                       ]
201
202
203REGFI_FILE._fields_ = [('magic', c_char * 4),
204                       ('sequence1', c_uint32),
205                       ('sequence2', c_uint32),
206                       ('mtime', REGFI_NTTIME),
207                       ('major_version', c_uint32),
208                       ('minor_version', c_uint32),
209                       ('type', c_uint32),
210                       ('format', c_uint32),
211                       ('root_cell', c_uint32),
212                       ('last_block', c_uint32),
213                       ('cluster', c_uint32),
214                       ]
215
216
217REGFI_RAW_FILE._fields_ = [('seek', seek_cb_type),
218                           ('read', read_cb_type),
219                           ('cur_off', c_uint64),
220                           ('size', c_uint64),
221                           ('state', c_void_p),
222                           ]
Note: See TracBrowser for help on using the repository browser.