s4:registry - introduce the "REG_DWORD_BIG_ENDIAN" datatype
authorMatthias Dieter Wallnöfer <mwallnoefer@yahoo.de>
Mon, 15 Mar 2010 17:55:33 +0000 (18:55 +0100)
committerMatthias Dieter Wallnöfer <mwallnoefer@yahoo.de>
Tue, 16 Mar 2010 07:58:31 +0000 (08:58 +0100)
It's like the normal REG_DWORD type but the byte order swapped

source4/lib/registry/ldb.c
source4/lib/registry/util.c

index 6676193ef4dc92adc533d31bacb12998420181b0..83905f3e715f7fc242fbd487e58a0bba7a129b50 100644 (file)
@@ -84,6 +84,7 @@ static void reg_ldb_unpack_value(TALLOC_CTX *mem_ctx,
                break;
 
        case REG_DWORD:
+       case REG_DWORD_BIG_ENDIAN:
                if (val != NULL) {
                        if (val->data[0] != '\0') {
                                /* The data is a plain DWORD */
@@ -221,11 +222,22 @@ static struct ldb_message *reg_ldb_pack_value(struct ldb_context *ctx,
                break;
 
        case REG_DWORD:
+       case REG_DWORD_BIG_ENDIAN:
                if ((data.length > 0) && (data.data != NULL)) {
                        if (data.length == sizeof(uint32_t)) {
                                char *conv_str;
 
-                               conv_str = talloc_asprintf(msg, "0x%8.8x", IVAL(data.data, 0));
+                               if (type == REG_DWORD) {
+                                       conv_str = talloc_asprintf(msg, "0x%8.8x",
+                                                                  IVAL(data.data, 0));
+                               } else {
+                                       conv_str = talloc_asprintf(msg, "0x%2.2x%2.2x%2.2x%2.2x",
+                                                                  CVAL(data.data, 0),
+                                                                  CVAL(data.data, 1),
+                                                                  CVAL(data.data, 2),
+                                                                  CVAL(data.data, 3));
+                               }
+
                                if (conv_str == NULL) {
                                        talloc_free(msg);
                                        return NULL;
index fd75f91aac04bfab176f13a85cee150da68beeee..56212906ded34527ca087532f1bee8a067914446 100644 (file)
@@ -85,9 +85,18 @@ _PUBLIC_ char *reg_val_data_string(TALLOC_CTX *mem_ctx,
                        }
                        break;
                case REG_DWORD:
+               case REG_DWORD_BIG_ENDIAN:
                        if (data.length == sizeof(uint32_t)) {
-                               ret = talloc_asprintf(mem_ctx, "0x%8.8x",
-                                                     IVAL(data.data, 0));
+                               if (type == REG_DWORD) {
+                                       ret = talloc_asprintf(mem_ctx, "0x%8.8x",
+                                                             IVAL(data.data, 0));
+                               } else {
+                                       ret = talloc_asprintf(mem_ctx, "0x%2.2x%2.2x%2.2x%2.2x",
+                                                             CVAL(data.data, 0),
+                                                             CVAL(data.data, 1),
+                                                             CVAL(data.data, 2),
+                                                             CVAL(data.data, 3));
+                               }
                        }
                        break;
                case REG_QWORD:
@@ -153,7 +162,8 @@ _PUBLIC_ bool reg_string_to_val(TALLOC_CTX *mem_ctx,
                                                          (void **)&data->data,
                                                          &data->length, false);
                        break;
-               case REG_DWORD: {
+               case REG_DWORD:
+               case REG_DWORD_BIG_ENDIAN: {
                        uint32_t tmp = strtol(data_str, NULL, 0);
                        *data = data_blob_talloc(mem_ctx, NULL, sizeof(uint32_t));
                        SIVAL(data->data, 0, tmp);