On Sun, Aug 10, 2014 at 10:19:39PM +0200, Peter Wu wrote:
The Python documentation is scare on the type of the various parameters and return values. Moreover, it states
"Read the hivex(3) man page to find out how to use the API."
Perhaps a second API should be created that is more pythonic (read: easier to use)?
One (negative) thing we learned doing libvirt is that unless you generate the language bindings and C API together, the language bindings inevitably get out of date, or (worse) contain non-systematic errors which are difficult to discover and correct. Therefore you're welcome to create a more Pythonic hivex API either on top of the existing Python API or talking directly to C, but we couldn't accept it upstream (well, unless it was fully generated and included in generator.ml, but that seems unlikely to be possible). Having said that ...
hive = hivex.Hivex2("system", write=True) ccs_name = "ControlSet001" svc_viostor = hive.root()[ccs_name].Services.viostor if svc_viostor.Start != 4: # Automatically detect that int '4' is an DWORD svc_viostor.Start = 4 svc.commit()
... a possible exception would be if it just involves adding some extra code to the existing hivex.py file, eg. adding a just the extra classes with __setattr__ and __getattr__ functions.
I (ab)use the __getattr__ methods if an object to allow this kind of modifications. See also the RegistryHandle helper class at https://github.com/Lekensteyn/qemu-tools/blob/master/vbox-to-qemu.py (_import_callback at line 216 may also be interesting)
Noted. If this could be added to the existing hivex.py ... [...]
In the current implementation, Python 3 bytes (Python 2 strings) are treated as plain bytes(*). That is fine, but Unicode is not handled correctly. This might also be an opportunity to treat Unicode strings as UTF-16 (LE) strings which must be nul-terminated. So u'Bar' should become b'B\0a\0r\0\0\0'.
It's worth saying that encoding in the registry itself is not always UTF-16LE. It's sometimes UTF-8, ASCII or (in a case I found last week) an NLS like ISO-8859-1 or Big5. Essentially the consuming app always has to know what encoding to use. Doing "clever" stuff in the bindings is therefore almost always going to be wrong in some case. (This is also why the C functions like hivex_value_string are deprecated).
(*) Actually, Hivex 1.3.10 is broken in Python 3 and tries to convert all strings from UTF-8 to bytes and segfaults on other input which does not work for UTF-16 strings[0].
In Ruby it seems as if the length could be calculated from the string. On the other hand, I'm not sure there is any point in intentionally removing the length from the return value, as that might break callers for no particular reason.
The best plan here is probably to add a note to the Ruby documentation for RLenTypeVal saying what the hash contains on Ruby.
... and mention that all other language bindings return a tuple / list / array with just two elements as the length can be found from the value?
Yup. Rich. -- Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones Read my programming and virtualization blog: http://rwmj.wordpress.com virt-top is 'top' for virtual machines. Tiny program with many powerful monitoring features, net stats, disk stats, logging, etc. http://people.redhat.com/~rjones/virt-top