my($var_prefix) = shift;
my $cprefix = util::c_push_prefix($e);
- if (util::has_property($e, "struct_len")) {
- return;
- }
-
if (defined $e->{VALUE}) {
$res .= "\tndr_print_$e->{TYPE}(ndr, \"$e->{NAME}\", $e->{VALUE});\n";
} elsif (util::has_direct_buffers($e)) {
sub ParseStructPush($)
{
my($struct) = shift;
- my($struct_len);
my $conform_e;
if (! defined $struct->{ELEMENTS}) {
return;
}
- # see if we have a structure length
- foreach my $e (@{$struct->{ELEMENTS}}) {
- $e->{PARENT} = $struct;
- if (util::has_property($e, "struct_len")) {
- $struct_len = $e;
- $e->{VALUE} = "0";
- }
- }
-
- if (defined $struct_len) {
- $res .= "\tstruct ndr_push_save _save1, _save2, _save3;\n";
- $res .= "\tndr_push_save(ndr, &_save1);\n";
- }
-
# see if the structure contains a conformant array. If it
# does, then it must be the last element of the structure, and
# we need to push the conformant length early, as it fits on
$res .= "\tif (!(ndr_flags & NDR_SCALARS)) goto buffers;\n";
foreach my $e (@{$struct->{ELEMENTS}}) {
- if (defined($struct_len) && $e == $struct_len) {
- $res .= "\tNDR_CHECK(ndr_push_align(ndr, sizeof($e->{TYPE})));\n";
- $res .= "\tndr_push_save(ndr, &_save2);\n";
- }
+ $e->{PARENT} = $struct;
ParseElementPushScalar($e, "r->", "NDR_SCALARS");
}
ParseElementPushBuffer($e, "r->", "NDR_BUFFERS");
}
- if (defined $struct_len) {
- $res .= "\tndr_push_save(ndr, &_save3);\n";
- $res .= "\tndr_push_restore(ndr, &_save2);\n";
- $struct_len->{VALUE} = "_save3.offset - _save1.offset";
- ParseElementPushScalar($struct_len, "r->", "NDR_SCALARS");
- $res .= "\tndr_push_restore(ndr, &_save3);\n";
- }
-
$res .= "done:\n";
}
sub ParseStructPull($)
{
my($struct) = shift;
- my($struct_len);
my $conform_e;
if (! defined $struct->{ELEMENTS}) {
}
- # see if we have a structure length. If we do then we need to advance
- # the ndr_pull offset to that length past the front of the structure
- # when we have finished with the structure
- # we also need to make sure that we limit the size of our parsing
- # of this structure to the given size
- foreach my $e (@{$struct->{ELEMENTS}}) {
- if (util::has_property($e, "struct_len")) {
- $struct_len = $e;
- $e->{VALUE} = "&_size";
- }
- }
-
- if (defined $struct_len) {
- $res .= "\tuint32 _size;\n";
- $res .= "\tstruct ndr_pull_save _save;\n";
- $res .= "\tndr_pull_save(ndr, &_save);\n";
- }
-
if (defined $conform_e) {
$res .= "\tNDR_CHECK(ndr_pull_uint32(ndr, &$conform_e->{CONFORMANT_SIZE}));\n";
}
$res .= "\tif (!(ndr_flags & NDR_SCALARS)) goto buffers;\n";
foreach my $e (@{$struct->{ELEMENTS}}) {
ParseElementPullScalar($e, "r->", "NDR_SCALARS");
- if (defined($struct_len) && $e == $struct_len) {
- $res .= "\tNDR_CHECK(ndr_pull_limit_size(ndr, _size, 4));\n";
- }
}
$res .= "buffers:\n";
ParseElementPullBuffer($e, "r->", "NDR_BUFFERS");
}
- if (defined $struct_len) {
- $res .= "\tndr_pull_restore(ndr, &_save);\n";
- $res .= "\tNDR_CHECK(ndr_pull_advance(ndr, _size));\n";
- }
-
$res .= "done:\n";
}
/******************/
/* Function: 0x03 */
- NTSTATUS dfs_UNKNOWN3 ();
+ NTSTATUS dfs_SetInfo ();
/******************/
/* Function: 0x04 */
/******************/
/* Function: 0x06 */
typedef struct {
- [struct_len] uint32 _len;
+ uint32 len; /* ignored */
uint16 impersonation_level;
uint8 context_mode;
uint8 effective_only;
} lsa_QosInfo;
typedef struct {
- [struct_len] uint32 _len;
+ uint32 len; /* ignored */
uint8 *root_dir;
unistr *object_name;
uint32 attributes;
return NT_STATUS_OK;
}
-NTSTATUS ndr_push_dfs_UNKNOWN3(struct ndr_push *ndr, struct dfs_UNKNOWN3 *r)
+NTSTATUS ndr_push_dfs_SetInfo(struct ndr_push *ndr, struct dfs_SetInfo *r)
{
return NT_STATUS_OK;
return NT_STATUS_OK;
}
-NTSTATUS ndr_pull_dfs_UNKNOWN3(struct ndr_pull *ndr, struct dfs_UNKNOWN3 *r)
+NTSTATUS ndr_pull_dfs_SetInfo(struct ndr_pull *ndr, struct dfs_SetInfo *r)
{
NDR_CHECK(ndr_pull_NTSTATUS(ndr, &r->out.result));
};
-struct dfs_UNKNOWN3 {
+struct dfs_SetInfo {
struct {
} in;
#define DCERPC_DFS_EXIST 0
#define DCERPC_DFS_ADD 1
#define DCERPC_DFS_REMOVE 2
-#define DCERPC_DFS_UNKNOWN3 3
+#define DCERPC_DFS_SETINFO 3
#define DCERPC_DFS_GETINFO 4
#define DCERPC_DFS_ENUM 5
static NTSTATUS ndr_push_lsa_QosInfo(struct ndr_push *ndr, int ndr_flags, struct lsa_QosInfo *r)
{
- struct ndr_push_save _save1, _save2, _save3;
- ndr_push_save(ndr, &_save1);
NDR_CHECK(ndr_push_align(ndr, 4));
if (!(ndr_flags & NDR_SCALARS)) goto buffers;
- NDR_CHECK(ndr_push_align(ndr, sizeof(uint32)));
- ndr_push_save(ndr, &_save2);
- NDR_CHECK(ndr_push_uint32(ndr, 0));
+ NDR_CHECK(ndr_push_uint32(ndr, r->len));
NDR_CHECK(ndr_push_uint16(ndr, r->impersonation_level));
NDR_CHECK(ndr_push_uint8(ndr, r->context_mode));
NDR_CHECK(ndr_push_uint8(ndr, r->effective_only));
buffers:
if (!(ndr_flags & NDR_BUFFERS)) goto done;
- ndr_push_save(ndr, &_save3);
- ndr_push_restore(ndr, &_save2);
- NDR_CHECK(ndr_push_uint32(ndr, _save3.offset - _save1.offset));
- ndr_push_restore(ndr, &_save3);
done:
return NT_STATUS_OK;
}
static NTSTATUS ndr_push_lsa_ObjectAttribute(struct ndr_push *ndr, int ndr_flags, struct lsa_ObjectAttribute *r)
{
- struct ndr_push_save _save1, _save2, _save3;
- ndr_push_save(ndr, &_save1);
NDR_CHECK(ndr_push_align(ndr, 4));
if (!(ndr_flags & NDR_SCALARS)) goto buffers;
- NDR_CHECK(ndr_push_align(ndr, sizeof(uint32)));
- ndr_push_save(ndr, &_save2);
- NDR_CHECK(ndr_push_uint32(ndr, 0));
+ NDR_CHECK(ndr_push_uint32(ndr, r->len));
NDR_CHECK(ndr_push_ptr(ndr, r->root_dir));
NDR_CHECK(ndr_push_ptr(ndr, r->object_name));
NDR_CHECK(ndr_push_uint32(ndr, r->attributes));
if (r->sec_qos) {
NDR_CHECK(ndr_push_lsa_QosInfo(ndr, NDR_SCALARS|NDR_BUFFERS, r->sec_qos));
}
- ndr_push_save(ndr, &_save3);
- ndr_push_restore(ndr, &_save2);
- NDR_CHECK(ndr_push_uint32(ndr, _save3.offset - _save1.offset));
- ndr_push_restore(ndr, &_save3);
done:
return NT_STATUS_OK;
}
{
ndr_print_struct(ndr, name, "lsa_QosInfo");
ndr->depth++;
+ ndr_print_uint32(ndr, "len", r->len);
ndr_print_uint16(ndr, "impersonation_level", r->impersonation_level);
ndr_print_uint8(ndr, "context_mode", r->context_mode);
ndr_print_uint8(ndr, "effective_only", r->effective_only);
{
ndr_print_struct(ndr, name, "lsa_ObjectAttribute");
ndr->depth++;
+ ndr_print_uint32(ndr, "len", r->len);
ndr_print_ptr(ndr, "root_dir", r->root_dir);
ndr->depth++;
if (r->root_dir) {
};
struct lsa_QosInfo {
+ uint32 len;
uint16 impersonation_level;
uint8 context_mode;
uint8 effective_only;
};
struct lsa_ObjectAttribute {
+ uint32 len;
uint8 *root_dir;
const char *object_name;
uint32 attributes;
return r->out.result;
}
-NTSTATUS dcerpc_dfs_UNKNOWN3(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct dfs_UNKNOWN3 *r)
+NTSTATUS dcerpc_dfs_SetInfo(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct dfs_SetInfo *r)
{
NTSTATUS status;
- status = dcerpc_ndr_request(p, DCERPC_DFS_UNKNOWN3, mem_ctx,
- (ndr_push_fn_t) ndr_push_dfs_UNKNOWN3,
- (ndr_pull_fn_t) ndr_pull_dfs_UNKNOWN3,
+ status = dcerpc_ndr_request(p, DCERPC_DFS_SETINFO, mem_ctx,
+ (ndr_push_fn_t) ndr_push_dfs_SetInfo,
+ (ndr_pull_fn_t) ndr_pull_dfs_SetInfo,
r);
if (!NT_STATUS_IS_OK(status)) {
return status;
printf("\ntesting OpenPolicy\n");
+ qos.len = 0;
qos.impersonation_level = 2;
qos.context_mode = 1;
qos.effective_only = 0;
+ attr.len = 0;
attr.root_dir = NULL;
attr.object_name = NULL;
attr.attributes = 0;
printf("\ntesting OpenPolicy2\n");
+ qos.len = 0;
qos.impersonation_level = 2;
qos.context_mode = 1;
qos.effective_only = 0;
+ attr.len = 0;
attr.root_dir = NULL;
attr.object_name = NULL;
attr.attributes = 0;