1
0
mirror of https://github.com/samba-team/samba.git synced 2025-01-11 05:18:09 +03:00

misc: mark winreg_Data little-endian except for a REG_DWORD_BIG_ENDIAN.

Guenther
This commit is contained in:
Günther Deschner 2009-11-27 11:18:30 +01:00
parent 79f82998b1
commit 23d77be6cb
3 changed files with 208 additions and 135 deletions

View File

@ -89,6 +89,6 @@ union winreg_Data {
uint32_t value;/* [case(REG_DWORD)] */ uint32_t value;/* [case(REG_DWORD)] */
const char ** string_array;/* [flag(LIBNDR_FLAG_STR_NULLTERM),case(REG_MULTI_SZ)] */ const char ** string_array;/* [flag(LIBNDR_FLAG_STR_NULLTERM),case(REG_MULTI_SZ)] */
DATA_BLOB data;/* [flag(LIBNDR_FLAG_REMAINING),default] */ DATA_BLOB data;/* [flag(LIBNDR_FLAG_REMAINING),default] */
}/* [nodiscriminant,public] */; }/* [public,nodiscriminant,flag(LIBNDR_FLAG_LITTLE_ENDIAN)] */;
#endif /* _HEADER_misc */ #endif /* _HEADER_misc */

View File

@ -213,77 +213,106 @@ _PUBLIC_ void ndr_print_winreg_Type(struct ndr_print *ndr, const char *name, enu
_PUBLIC_ enum ndr_err_code ndr_push_winreg_Data(struct ndr_push *ndr, int ndr_flags, const union winreg_Data *r) _PUBLIC_ enum ndr_err_code ndr_push_winreg_Data(struct ndr_push *ndr, int ndr_flags, const union winreg_Data *r)
{ {
if (ndr_flags & NDR_SCALARS) { {
int level = ndr_push_get_switch_value(ndr, r); uint32_t _flags_save_UNION = ndr->flags;
NDR_CHECK(ndr_push_union_align(ndr, 4)); ndr_set_flags(&ndr->flags, LIBNDR_FLAG_LITTLE_ENDIAN);
switch (level) { if (ndr_flags & NDR_SCALARS) {
case REG_NONE: { int level = ndr_push_get_switch_value(ndr, r);
break; } NDR_CHECK(ndr_push_union_align(ndr, 4));
switch (level) {
case REG_NONE: {
break; }
case REG_SZ: { case REG_SZ: {
{ {
uint32_t _flags_save_string = ndr->flags; uint32_t _flags_save_string = ndr->flags;
ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM); ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->string)); NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->string));
ndr->flags = _flags_save_string; ndr->flags = _flags_save_string;
} }
break; } break; }
case REG_BINARY: { case REG_EXPAND_SZ: {
{ {
uint32_t _flags_save_DATA_BLOB = ndr->flags; uint32_t _flags_save_string = ndr->flags;
ndr_set_flags(&ndr->flags, LIBNDR_FLAG_REMAINING); ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
NDR_CHECK(ndr_push_DATA_BLOB(ndr, NDR_SCALARS, r->binary)); NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->string));
ndr->flags = _flags_save_DATA_BLOB; ndr->flags = _flags_save_string;
} }
break; } break; }
case REG_DWORD: { case REG_BINARY: {
NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->value)); {
break; } uint32_t _flags_save_DATA_BLOB = ndr->flags;
ndr_set_flags(&ndr->flags, LIBNDR_FLAG_REMAINING);
NDR_CHECK(ndr_push_DATA_BLOB(ndr, NDR_SCALARS, r->binary));
ndr->flags = _flags_save_DATA_BLOB;
}
break; }
case REG_MULTI_SZ: { case REG_DWORD: {
{ NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->value));
uint32_t _flags_save_string_array = ndr->flags; break; }
ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
NDR_CHECK(ndr_push_string_array(ndr, NDR_SCALARS, r->string_array));
ndr->flags = _flags_save_string_array;
}
break; }
default: { case REG_DWORD_BIG_ENDIAN: {
{ {
uint32_t _flags_save_DATA_BLOB = ndr->flags; uint32_t _flags_save_uint32 = ndr->flags;
ndr_set_flags(&ndr->flags, LIBNDR_FLAG_REMAINING); ndr_set_flags(&ndr->flags, LIBNDR_FLAG_BIGENDIAN);
NDR_CHECK(ndr_push_DATA_BLOB(ndr, NDR_SCALARS, r->data)); NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->value));
ndr->flags = _flags_save_DATA_BLOB; ndr->flags = _flags_save_uint32;
} }
break; } break; }
case REG_MULTI_SZ: {
{
uint32_t _flags_save_string_array = ndr->flags;
ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
NDR_CHECK(ndr_push_string_array(ndr, NDR_SCALARS, r->string_array));
ndr->flags = _flags_save_string_array;
}
break; }
default: {
{
uint32_t _flags_save_DATA_BLOB = ndr->flags;
ndr_set_flags(&ndr->flags, LIBNDR_FLAG_REMAINING);
NDR_CHECK(ndr_push_DATA_BLOB(ndr, NDR_SCALARS, r->data));
ndr->flags = _flags_save_DATA_BLOB;
}
break; }
}
} }
} if (ndr_flags & NDR_BUFFERS) {
if (ndr_flags & NDR_BUFFERS) { int level = ndr_push_get_switch_value(ndr, r);
int level = ndr_push_get_switch_value(ndr, r); switch (level) {
switch (level) { case REG_NONE:
case REG_NONE: break;
break;
case REG_SZ: case REG_SZ:
break; break;
case REG_BINARY: case REG_EXPAND_SZ:
break; break;
case REG_DWORD: case REG_BINARY:
break; break;
case REG_MULTI_SZ: case REG_DWORD:
break; break;
default: case REG_DWORD_BIG_ENDIAN:
break; break;
case REG_MULTI_SZ:
break;
default:
break;
}
} }
ndr->flags = _flags_save_UNION;
} }
return NDR_ERR_SUCCESS; return NDR_ERR_SUCCESS;
} }
@ -291,76 +320,105 @@ _PUBLIC_ enum ndr_err_code ndr_push_winreg_Data(struct ndr_push *ndr, int ndr_fl
_PUBLIC_ enum ndr_err_code ndr_pull_winreg_Data(struct ndr_pull *ndr, int ndr_flags, union winreg_Data *r) _PUBLIC_ enum ndr_err_code ndr_pull_winreg_Data(struct ndr_pull *ndr, int ndr_flags, union winreg_Data *r)
{ {
int level; int level;
level = ndr_pull_get_switch_value(ndr, r); {
if (ndr_flags & NDR_SCALARS) { uint32_t _flags_save_UNION = ndr->flags;
NDR_CHECK(ndr_pull_union_align(ndr, 4)); ndr_set_flags(&ndr->flags, LIBNDR_FLAG_LITTLE_ENDIAN);
switch (level) { level = ndr_pull_get_switch_value(ndr, r);
case REG_NONE: { if (ndr_flags & NDR_SCALARS) {
break; } NDR_CHECK(ndr_pull_union_align(ndr, 4));
switch (level) {
case REG_NONE: {
break; }
case REG_SZ: { case REG_SZ: {
{ {
uint32_t _flags_save_string = ndr->flags; uint32_t _flags_save_string = ndr->flags;
ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM); ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->string)); NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->string));
ndr->flags = _flags_save_string; ndr->flags = _flags_save_string;
} }
break; } break; }
case REG_BINARY: { case REG_EXPAND_SZ: {
{ {
uint32_t _flags_save_DATA_BLOB = ndr->flags; uint32_t _flags_save_string = ndr->flags;
ndr_set_flags(&ndr->flags, LIBNDR_FLAG_REMAINING); ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
NDR_CHECK(ndr_pull_DATA_BLOB(ndr, NDR_SCALARS, &r->binary)); NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->string));
ndr->flags = _flags_save_DATA_BLOB; ndr->flags = _flags_save_string;
} }
break; } break; }
case REG_DWORD: { case REG_BINARY: {
NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->value)); {
break; } uint32_t _flags_save_DATA_BLOB = ndr->flags;
ndr_set_flags(&ndr->flags, LIBNDR_FLAG_REMAINING);
NDR_CHECK(ndr_pull_DATA_BLOB(ndr, NDR_SCALARS, &r->binary));
ndr->flags = _flags_save_DATA_BLOB;
}
break; }
case REG_MULTI_SZ: { case REG_DWORD: {
{ NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->value));
uint32_t _flags_save_string_array = ndr->flags; break; }
ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
NDR_CHECK(ndr_pull_string_array(ndr, NDR_SCALARS, &r->string_array));
ndr->flags = _flags_save_string_array;
}
break; }
default: { case REG_DWORD_BIG_ENDIAN: {
{ {
uint32_t _flags_save_DATA_BLOB = ndr->flags; uint32_t _flags_save_uint32 = ndr->flags;
ndr_set_flags(&ndr->flags, LIBNDR_FLAG_REMAINING); ndr_set_flags(&ndr->flags, LIBNDR_FLAG_BIGENDIAN);
NDR_CHECK(ndr_pull_DATA_BLOB(ndr, NDR_SCALARS, &r->data)); NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->value));
ndr->flags = _flags_save_DATA_BLOB; ndr->flags = _flags_save_uint32;
} }
break; } break; }
case REG_MULTI_SZ: {
{
uint32_t _flags_save_string_array = ndr->flags;
ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
NDR_CHECK(ndr_pull_string_array(ndr, NDR_SCALARS, &r->string_array));
ndr->flags = _flags_save_string_array;
}
break; }
default: {
{
uint32_t _flags_save_DATA_BLOB = ndr->flags;
ndr_set_flags(&ndr->flags, LIBNDR_FLAG_REMAINING);
NDR_CHECK(ndr_pull_DATA_BLOB(ndr, NDR_SCALARS, &r->data));
ndr->flags = _flags_save_DATA_BLOB;
}
break; }
}
} }
} if (ndr_flags & NDR_BUFFERS) {
if (ndr_flags & NDR_BUFFERS) { switch (level) {
switch (level) { case REG_NONE:
case REG_NONE: break;
break;
case REG_SZ: case REG_SZ:
break; break;
case REG_BINARY: case REG_EXPAND_SZ:
break; break;
case REG_DWORD: case REG_BINARY:
break; break;
case REG_MULTI_SZ: case REG_DWORD:
break; break;
default: case REG_DWORD_BIG_ENDIAN:
break; break;
case REG_MULTI_SZ:
break;
default:
break;
}
} }
ndr->flags = _flags_save_UNION;
} }
return NDR_ERR_SUCCESS; return NDR_ERR_SUCCESS;
} }
@ -368,32 +426,45 @@ _PUBLIC_ enum ndr_err_code ndr_pull_winreg_Data(struct ndr_pull *ndr, int ndr_fl
_PUBLIC_ void ndr_print_winreg_Data(struct ndr_print *ndr, const char *name, const union winreg_Data *r) _PUBLIC_ void ndr_print_winreg_Data(struct ndr_print *ndr, const char *name, const union winreg_Data *r)
{ {
int level; int level;
level = ndr_print_get_switch_value(ndr, r); {
ndr_print_union(ndr, name, level, "winreg_Data"); uint32_t _flags_save_UNION = ndr->flags;
switch (level) { ndr_set_flags(&ndr->flags, LIBNDR_FLAG_LITTLE_ENDIAN);
case REG_NONE: level = ndr_print_get_switch_value(ndr, r);
break; ndr_print_union(ndr, name, level, "winreg_Data");
switch (level) {
case REG_NONE:
break;
case REG_SZ: case REG_SZ:
ndr_print_string(ndr, "string", r->string); ndr_print_string(ndr, "string", r->string);
break; break;
case REG_BINARY: case REG_EXPAND_SZ:
ndr_print_DATA_BLOB(ndr, "binary", r->binary); ndr_print_string(ndr, "string", r->string);
break; break;
case REG_DWORD: case REG_BINARY:
ndr_print_uint32(ndr, "value", r->value); ndr_print_DATA_BLOB(ndr, "binary", r->binary);
break; break;
case REG_MULTI_SZ: case REG_DWORD:
ndr_print_string_array(ndr, "string_array", r->string_array); ndr_print_uint32(ndr, "value", r->value);
break; break;
default: case REG_DWORD_BIG_ENDIAN:
ndr_print_DATA_BLOB(ndr, "data", r->data); ndr_print_uint32(ndr, "value", r->value);
break; break;
case REG_MULTI_SZ:
ndr_print_string_array(ndr, "string_array", r->string_array);
break;
default:
ndr_print_DATA_BLOB(ndr, "data", r->data);
break;
}
ndr->flags = _flags_save_UNION;
} }
} }

View File

@ -61,11 +61,13 @@ interface misc
REG_QWORD = 11 REG_QWORD = 11
} winreg_Type; } winreg_Type;
typedef [nodiscriminant,public] union { typedef [nodiscriminant,public,flag(NDR_LITTLE_ENDIAN)] union {
[case(REG_NONE)]; [case(REG_NONE)];
[case(REG_SZ)] nstring string; [case(REG_SZ)] nstring string;
[case(REG_EXPAND_SZ)] nstring string;
[case(REG_BINARY),flag(NDR_REMAINING)] DATA_BLOB binary; [case(REG_BINARY),flag(NDR_REMAINING)] DATA_BLOB binary;
[case(REG_DWORD)] uint32 value; [case(REG_DWORD)] uint32 value;
[case(REG_DWORD_BIG_ENDIAN),flag(NDR_BIG_ENDIAN)] uint32 value;
[case(REG_MULTI_SZ)] nstring_array string_array; [case(REG_MULTI_SZ)] nstring_array string_array;
[default,flag(NDR_REMAINING)] DATA_BLOB data; [default,flag(NDR_REMAINING)] DATA_BLOB data;
} winreg_Data; } winreg_Data;