From 3f3e83b55d964ee80c48c0b13ac7b9a62e100c37 Mon Sep 17 00:00:00 2001
From: Nikos Skalkotos <skalkoto@grnet.gr>
Date: Sat, 14 Jun 2014 13:40:45 +0300
Subject: [PATCH] Add REG_{SZ,DWORD,BINARY} helper funcs in Registry

Those lambda functions are used to set a value of type REG_SZ,
REG_DWORD and REG_BINARY in a registry node
---
 image_creator/os_type/windows/registry.py | 35 +++++++++--------------
 1 file changed, 14 insertions(+), 21 deletions(-)

diff --git a/image_creator/os_type/windows/registry.py b/image_creator/os_type/windows/registry.py
index 174a648..e839324 100644
--- a/image_creator/os_type/windows/registry.py
+++ b/image_creator/os_type/windows/registry.py
@@ -33,6 +33,10 @@ WINDOWS_SETUP_STATES = (
     "IMAGE_STATE_SPECIALIZE_RESEAL_TO_OOBE",
     "IMAGE_STATE_SPECIALIZE_RESEAL_TO_AUDIT")
 
+REG_SZ = lambda k, v: {'key': k, 't': 1L,
+                       'value': (v + '\x00').encode('utf-16le')}
+REG_BINARY = lambda k, v: {'key': k, 't': 3L, 'value': v}
+REG_DWORD = lambda k, v: {'key': k, 't': 4L, 'value': struct.pack('<I', v)}
 
 class Registry(object):
     """Windows Registry manipulation methods"""
@@ -148,12 +152,11 @@ class Registry(object):
 
             for desc, cmd in commands.items():
                 assert type(desc) is str and type(cmd) is str
-                value = {'key': desc, 't': 1, 'value': cmd.encode('utf-16le')}
-                hive.node_set_value(runonce, value)
+                hive.node_set_value(runonce, REG_SZ(desc, cmd))
 
             hive.commit(None)
 
-    def enable_autologon(self, username, password="", autoadminlogon=True):
+    def enable_autologon(self, username, password=""):
         """Enable automatic logon for a specific user"""
 
         assert type(username) is str and type(password) is str
@@ -165,16 +168,9 @@ class Registry(object):
                           'Winlogon'):
                 winlogon = hive.node_get_child(winlogon, child)
 
-            hive.node_set_value(winlogon,
-                                {'key': 'DefaultUserName', 't': 1,
-                                 'value': username.encode('utf-16le')})
-            hive.node_set_value(winlogon,
-                                {'key': 'DefaultPassword', 't': 1,
-                                 'value':  password.encode('utf-16le')})
-            hive.node_set_value(
-                winlogon,
-                {'key': 'AutoAdminLogon', 't': 1,
-                 'value': ("%d" % int(autoadminlogon)).encode('utf-16le')})
+            hive.node_set_value(winlogon, REG_SZ('DefaultUserName', username))
+            hive.node_set_value(winlogon, REG_SZ('DefaultPassword', password))
+            hive.node_set_value(winlogon, REG_SZ('AutoAdminLogon', "1"))
 
             hive.commit(None)
 
@@ -212,9 +208,8 @@ class Registry(object):
                 assert hive.value_type(old_value)[1] == 4
                 old_values.append(hive.value_dword(old_value))
 
-                hive.node_set_value(
-                    node, {'key': 'EnableFirewall', 't': 4L,
-                           'value': struct.pack("<I", new_values.pop(0))})
+                hive.node_set_value(node, REG_DWORD('EnableFirewall',
+                                                    new_values.pop(0)))
             hive.commit(None)
 
         return old_values
@@ -255,10 +250,8 @@ class Registry(object):
             elif value == 0:
                 return False
 
-            new_value = {'key': "LocalAccountTokenFilterPolicy", 't': 4L,
-                         'value': struct.pack("<I", value)}
-
-            hive.node_set_value(key, new_value)
+            hive.node_set_value(
+                key, REG_DWORD("LocalAccountTokenFilterPolicy", value))
             hive.commit(None)
 
         return True
@@ -326,7 +319,7 @@ class Registry(object):
                 fmt = '%ds4x8s4x%ds' % (0xa0, len(v_val) - 0xb0)
                 new = ("\x00" * 4).join(struct.unpack(fmt,  v_val))
 
-            hive.node_set_value(rid_node, {'key': "V", 't': 3L, 'value': new})
+            hive.node_set_value(rid_node, REG_BINARY('V', new))
             hive.commit(None)
             parent['old'] = v_val
 
-- 
GitLab