[Libguestfs] Python Hivex Assertion Failed
Richard W.M. Jones
rjones at redhat.com
Thu Mar 31 18:51:52 UTC 2011
On Thu, Mar 31, 2011 at 01:17:19PM -0400, Elizabeth Schweinsberg wrote:
> Good afternoon,
>
> I am working with the hivex python bindings and having trouble with an
> assertion failure.
>
> The code I run is based on the blog post from 11/28/10 and is:
>
> import hivex
> h = hivex.Hivex("ntuser.dat")
> r = h.root()
> key = h.node_get_child(r)
node_get_child needs 2 args there, and it returns a node (not a "key"
although the terminology for Registry entries is confusing and
contradictory). You probably mean something like:
node = h.node_get_child (r, "foo")
where "foo" is the case-insensitive name of the child you want to get.
> The assert failure happens when I call any of the "node" functions,
> even "node_name()".
>
> The error message I get each time is:
> python: hivex-py.c:52: get_handle:
> Assertion 'obj' failed
>
> When I print r (h.root() result), I get a long integer "4128". (Which
> makes sense -- that would be shortly into the second bin, where the
> root of the hive should be). The hivex.3 man page indicates that the
> return value for the root() function should be a handle, aka integer,
> so it seems to be right.
>
> I don't think it's the hive -- i tried a couple different ones, albeit
> all from the same machine. I also ran it with a perl based registry
> library and it was fine.
>
> I'm using Ubuntu and python 2.6.
>
> Any suggestions on what the problem might be? Thanks!
How are you calling node_name? Note that the Python API isn't really
"object oriented", it's just the C API translated literally into
Python. All "methods" are part of the hivex base class, and there are
no other classes. Therefore:
s = r.node_name() // wrong
s = h.node_name (r) // correct
This program works for me:
----------------------------------------------------------------------
#!/usr/bin/python
import hivex
h = hivex.Hivex ("/tmp/software")
r = h.root ()
node = h.node_get_child (r, "Microsoft")
print r
print h.node_name (r)
print h.node_name (node)
----------------------------------------------------------------------
----------------------------------------------------------------------
$ chmod +x /tmp/test.py
$ /tmp/test.py
4128
CMI-CreateHive{199DAFC2-6F16-4946-BF90-5A3FC3A60902}
Microsoft
----------------------------------------------------------------------
hivex-1.2.4-7.fc15.x86_64
python-2.7.1-6.fc15.x86_64
The "name" of the root node isn't necessarily something that makes
sense. There is a note about this in the man page.
If you can't make it work, please send a more complete example, and if
you think the fault lies in the hive itself, then put the hive online.
Rich.
--
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
libguestfs lets you edit virtual machines. Supports shell scripting,
bindings from many languages. http://libguestfs.org
More information about the Libguestfs
mailing list