1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-25 23:21:54 +03:00

* fixed lsa_LookupPrivName

* added levels 2 and 3 of dfs_Enum
(This used to be commit 3fa61c1982)
This commit is contained in:
Andrew Tridgell 2003-11-14 07:56:43 +00:00
parent 565fd2da76
commit 57529207ca
8 changed files with 580 additions and 72 deletions

View File

@ -49,16 +49,49 @@
/* Function: 0x05 */
typedef struct {
unistr *str;
} dfs_String;
unistr *path;
} dfs_Info1;
typedef struct {
uint32 count;
[size_is(count)] dfs_String *s;
} dfs_Enum1;
[size_is(count)] dfs_Info1 *s;
} dfs_EnumArray1;
typedef struct {
unistr *path;
unistr *comment;
uint32 state;
uint32 num_stores;
} dfs_Info2;
typedef struct {
uint32 count;
[size_is(count)] dfs_Info2 *s;
} dfs_EnumArray2;
typedef struct {
uint32 state;
unistr *server;
unistr *share;
} dfs_StorageInfo;
typedef struct {
unistr *path;
unistr *comment;
uint32 state;
uint32 num_stores;
[size_is(num_stores)] dfs_StorageInfo *stores;
} dfs_Info3;
typedef struct {
uint32 count;
[size_is(count)] dfs_Info3 *s;
} dfs_EnumArray3;
typedef union {
case(1) dfs_Enum1 *enum1;
case(1) dfs_EnumArray1 *info1;
case(2) dfs_EnumArray2 *info2;
case(3) dfs_EnumArray3 *info3;
} dfs_EnumInfo;
typedef struct {

View File

@ -376,8 +376,7 @@
/* Function: 0x20 */
NTSTATUS lsa_LookupPrivName (
[in,ref] policy_handle *handle,
[in] uint32 luid_high,
[in] uint32 luid_low,
[in,ref] lsa_LUID *luid,
[out] lsa_Name *name
);

View File

@ -68,21 +68,21 @@ NTSTATUS ndr_push_dfs_Info(struct ndr_push *ndr, struct dfs_Info *r)
return NT_STATUS_OK;
}
static NTSTATUS ndr_push_dfs_String(struct ndr_push *ndr, int ndr_flags, struct dfs_String *r)
static NTSTATUS ndr_push_dfs_Info1(struct ndr_push *ndr, int ndr_flags, struct dfs_Info1 *r)
{
NDR_CHECK(ndr_push_align(ndr, 4));
if (!(ndr_flags & NDR_SCALARS)) goto buffers;
NDR_CHECK(ndr_push_ptr(ndr, r->str));
NDR_CHECK(ndr_push_ptr(ndr, r->path));
buffers:
if (!(ndr_flags & NDR_BUFFERS)) goto done;
if (r->str) {
NDR_CHECK(ndr_push_unistr(ndr, r->str));
if (r->path) {
NDR_CHECK(ndr_push_unistr(ndr, r->path));
}
done:
return NT_STATUS_OK;
}
static NTSTATUS ndr_push_dfs_Enum1(struct ndr_push *ndr, int ndr_flags, struct dfs_Enum1 *r)
static NTSTATUS ndr_push_dfs_EnumArray1(struct ndr_push *ndr, int ndr_flags, struct dfs_EnumArray1 *r)
{
NDR_CHECK(ndr_push_align(ndr, 4));
if (!(ndr_flags & NDR_SCALARS)) goto buffers;
@ -92,7 +92,103 @@ buffers:
if (!(ndr_flags & NDR_BUFFERS)) goto done;
if (r->s) {
NDR_CHECK(ndr_push_uint32(ndr, r->count));
NDR_CHECK(ndr_push_array(ndr, ndr_flags, r->s, sizeof(r->s[0]), r->count, (ndr_push_flags_fn_t)ndr_push_dfs_String));
NDR_CHECK(ndr_push_array(ndr, ndr_flags, r->s, sizeof(r->s[0]), r->count, (ndr_push_flags_fn_t)ndr_push_dfs_Info1));
}
done:
return NT_STATUS_OK;
}
static NTSTATUS ndr_push_dfs_Info2(struct ndr_push *ndr, int ndr_flags, struct dfs_Info2 *r)
{
NDR_CHECK(ndr_push_align(ndr, 4));
if (!(ndr_flags & NDR_SCALARS)) goto buffers;
NDR_CHECK(ndr_push_ptr(ndr, r->path));
NDR_CHECK(ndr_push_ptr(ndr, r->comment));
NDR_CHECK(ndr_push_uint32(ndr, r->state));
NDR_CHECK(ndr_push_uint32(ndr, r->num_stores));
buffers:
if (!(ndr_flags & NDR_BUFFERS)) goto done;
if (r->path) {
NDR_CHECK(ndr_push_unistr(ndr, r->path));
}
if (r->comment) {
NDR_CHECK(ndr_push_unistr(ndr, r->comment));
}
done:
return NT_STATUS_OK;
}
static NTSTATUS ndr_push_dfs_EnumArray2(struct ndr_push *ndr, int ndr_flags, struct dfs_EnumArray2 *r)
{
NDR_CHECK(ndr_push_align(ndr, 4));
if (!(ndr_flags & NDR_SCALARS)) goto buffers;
NDR_CHECK(ndr_push_uint32(ndr, r->count));
NDR_CHECK(ndr_push_ptr(ndr, r->s));
buffers:
if (!(ndr_flags & NDR_BUFFERS)) goto done;
if (r->s) {
NDR_CHECK(ndr_push_uint32(ndr, r->count));
NDR_CHECK(ndr_push_array(ndr, ndr_flags, r->s, sizeof(r->s[0]), r->count, (ndr_push_flags_fn_t)ndr_push_dfs_Info2));
}
done:
return NT_STATUS_OK;
}
static NTSTATUS ndr_push_dfs_StorageInfo(struct ndr_push *ndr, int ndr_flags, struct dfs_StorageInfo *r)
{
NDR_CHECK(ndr_push_align(ndr, 4));
if (!(ndr_flags & NDR_SCALARS)) goto buffers;
NDR_CHECK(ndr_push_uint32(ndr, r->state));
NDR_CHECK(ndr_push_ptr(ndr, r->server));
NDR_CHECK(ndr_push_ptr(ndr, r->share));
buffers:
if (!(ndr_flags & NDR_BUFFERS)) goto done;
if (r->server) {
NDR_CHECK(ndr_push_unistr(ndr, r->server));
}
if (r->share) {
NDR_CHECK(ndr_push_unistr(ndr, r->share));
}
done:
return NT_STATUS_OK;
}
static NTSTATUS ndr_push_dfs_Info3(struct ndr_push *ndr, int ndr_flags, struct dfs_Info3 *r)
{
NDR_CHECK(ndr_push_align(ndr, 4));
if (!(ndr_flags & NDR_SCALARS)) goto buffers;
NDR_CHECK(ndr_push_ptr(ndr, r->path));
NDR_CHECK(ndr_push_ptr(ndr, r->comment));
NDR_CHECK(ndr_push_uint32(ndr, r->state));
NDR_CHECK(ndr_push_uint32(ndr, r->num_stores));
NDR_CHECK(ndr_push_ptr(ndr, r->stores));
buffers:
if (!(ndr_flags & NDR_BUFFERS)) goto done;
if (r->path) {
NDR_CHECK(ndr_push_unistr(ndr, r->path));
}
if (r->comment) {
NDR_CHECK(ndr_push_unistr(ndr, r->comment));
}
if (r->stores) {
NDR_CHECK(ndr_push_uint32(ndr, r->num_stores));
NDR_CHECK(ndr_push_array(ndr, ndr_flags, r->stores, sizeof(r->stores[0]), r->num_stores, (ndr_push_flags_fn_t)ndr_push_dfs_StorageInfo));
}
done:
return NT_STATUS_OK;
}
static NTSTATUS ndr_push_dfs_EnumArray3(struct ndr_push *ndr, int ndr_flags, struct dfs_EnumArray3 *r)
{
NDR_CHECK(ndr_push_align(ndr, 4));
if (!(ndr_flags & NDR_SCALARS)) goto buffers;
NDR_CHECK(ndr_push_uint32(ndr, r->count));
NDR_CHECK(ndr_push_ptr(ndr, r->s));
buffers:
if (!(ndr_flags & NDR_BUFFERS)) goto done;
if (r->s) {
NDR_CHECK(ndr_push_uint32(ndr, r->count));
NDR_CHECK(ndr_push_array(ndr, ndr_flags, r->s, sizeof(r->s[0]), r->count, (ndr_push_flags_fn_t)ndr_push_dfs_Info3));
}
done:
return NT_STATUS_OK;
@ -104,7 +200,15 @@ static NTSTATUS ndr_push_dfs_EnumInfo(struct ndr_push *ndr, int ndr_flags, uint1
NDR_CHECK(ndr_push_uint16(ndr, level));
switch (level) {
case 1:
NDR_CHECK(ndr_push_ptr(ndr, r->enum1));
NDR_CHECK(ndr_push_ptr(ndr, r->info1));
break;
case 2:
NDR_CHECK(ndr_push_ptr(ndr, r->info2));
break;
case 3:
NDR_CHECK(ndr_push_ptr(ndr, r->info3));
break;
default:
@ -114,8 +218,20 @@ buffers:
if (!(ndr_flags & NDR_BUFFERS)) goto done;
switch (level) {
case 1:
if (r->enum1) {
NDR_CHECK(ndr_push_dfs_Enum1(ndr, ndr_flags, r->enum1));
if (r->info1) {
NDR_CHECK(ndr_push_dfs_EnumArray1(ndr, ndr_flags, r->info1));
}
break;
case 2:
if (r->info2) {
NDR_CHECK(ndr_push_dfs_EnumArray2(ndr, ndr_flags, r->info2));
}
break;
case 3:
if (r->info3) {
NDR_CHECK(ndr_push_dfs_EnumArray3(ndr, ndr_flags, r->info3));
}
break;
@ -194,27 +310,27 @@ NTSTATUS ndr_pull_dfs_Info(struct ndr_pull *ndr, struct dfs_Info *r)
return NT_STATUS_OK;
}
static NTSTATUS ndr_pull_dfs_String(struct ndr_pull *ndr, int ndr_flags, struct dfs_String *r)
static NTSTATUS ndr_pull_dfs_Info1(struct ndr_pull *ndr, int ndr_flags, struct dfs_Info1 *r)
{
uint32 _ptr_str;
uint32 _ptr_path;
NDR_CHECK(ndr_pull_align(ndr, 4));
if (!(ndr_flags & NDR_SCALARS)) goto buffers;
NDR_CHECK(ndr_pull_uint32(ndr, &_ptr_str));
if (_ptr_str) {
NDR_ALLOC(ndr, r->str);
NDR_CHECK(ndr_pull_uint32(ndr, &_ptr_path));
if (_ptr_path) {
NDR_ALLOC(ndr, r->path);
} else {
r->str = NULL;
r->path = NULL;
}
buffers:
if (!(ndr_flags & NDR_BUFFERS)) goto done;
if (r->str) {
NDR_CHECK(ndr_pull_unistr(ndr, &r->str));
if (r->path) {
NDR_CHECK(ndr_pull_unistr(ndr, &r->path));
}
done:
return NT_STATUS_OK;
}
static NTSTATUS ndr_pull_dfs_Enum1(struct ndr_pull *ndr, int ndr_flags, struct dfs_Enum1 *r)
static NTSTATUS ndr_pull_dfs_EnumArray1(struct ndr_pull *ndr, int ndr_flags, struct dfs_EnumArray1 *r)
{
uint32 _ptr_s;
NDR_CHECK(ndr_pull_align(ndr, 4));
@ -237,7 +353,178 @@ buffers:
}
}
NDR_ALLOC_N_SIZE(ndr, r->s, r->count, sizeof(r->s[0]));
NDR_CHECK(ndr_pull_array(ndr, ndr_flags, (void **)r->s, sizeof(r->s[0]), r->count, (ndr_pull_flags_fn_t)ndr_pull_dfs_String));
NDR_CHECK(ndr_pull_array(ndr, NDR_SCALARS|NDR_BUFFERS, (void **)r->s, sizeof(r->s[0]), r->count, (ndr_pull_flags_fn_t)ndr_pull_dfs_Info1));
}
done:
return NT_STATUS_OK;
}
static NTSTATUS ndr_pull_dfs_Info2(struct ndr_pull *ndr, int ndr_flags, struct dfs_Info2 *r)
{
uint32 _ptr_path;
uint32 _ptr_comment;
NDR_CHECK(ndr_pull_align(ndr, 4));
if (!(ndr_flags & NDR_SCALARS)) goto buffers;
NDR_CHECK(ndr_pull_uint32(ndr, &_ptr_path));
if (_ptr_path) {
NDR_ALLOC(ndr, r->path);
} else {
r->path = NULL;
}
NDR_CHECK(ndr_pull_uint32(ndr, &_ptr_comment));
if (_ptr_comment) {
NDR_ALLOC(ndr, r->comment);
} else {
r->comment = NULL;
}
NDR_CHECK(ndr_pull_uint32(ndr, &r->state));
NDR_CHECK(ndr_pull_uint32(ndr, &r->num_stores));
buffers:
if (!(ndr_flags & NDR_BUFFERS)) goto done;
if (r->path) {
NDR_CHECK(ndr_pull_unistr(ndr, &r->path));
}
if (r->comment) {
NDR_CHECK(ndr_pull_unistr(ndr, &r->comment));
}
done:
return NT_STATUS_OK;
}
static NTSTATUS ndr_pull_dfs_EnumArray2(struct ndr_pull *ndr, int ndr_flags, struct dfs_EnumArray2 *r)
{
uint32 _ptr_s;
NDR_CHECK(ndr_pull_align(ndr, 4));
if (!(ndr_flags & NDR_SCALARS)) goto buffers;
NDR_CHECK(ndr_pull_uint32(ndr, &r->count));
NDR_CHECK(ndr_pull_uint32(ndr, &_ptr_s));
if (_ptr_s) {
NDR_ALLOC(ndr, r->s);
} else {
r->s = NULL;
}
buffers:
if (!(ndr_flags & NDR_BUFFERS)) goto done;
if (r->s) {
{
uint32 _array_size;
NDR_CHECK(ndr_pull_uint32(ndr, &_array_size));
if (r->count > _array_size) {
return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should be %u", _array_size, r->count);
}
}
NDR_ALLOC_N_SIZE(ndr, r->s, r->count, sizeof(r->s[0]));
NDR_CHECK(ndr_pull_array(ndr, NDR_SCALARS|NDR_BUFFERS, (void **)r->s, sizeof(r->s[0]), r->count, (ndr_pull_flags_fn_t)ndr_pull_dfs_Info2));
}
done:
return NT_STATUS_OK;
}
static NTSTATUS ndr_pull_dfs_StorageInfo(struct ndr_pull *ndr, int ndr_flags, struct dfs_StorageInfo *r)
{
uint32 _ptr_server;
uint32 _ptr_share;
NDR_CHECK(ndr_pull_align(ndr, 4));
if (!(ndr_flags & NDR_SCALARS)) goto buffers;
NDR_CHECK(ndr_pull_uint32(ndr, &r->state));
NDR_CHECK(ndr_pull_uint32(ndr, &_ptr_server));
if (_ptr_server) {
NDR_ALLOC(ndr, r->server);
} else {
r->server = NULL;
}
NDR_CHECK(ndr_pull_uint32(ndr, &_ptr_share));
if (_ptr_share) {
NDR_ALLOC(ndr, r->share);
} else {
r->share = NULL;
}
buffers:
if (!(ndr_flags & NDR_BUFFERS)) goto done;
if (r->server) {
NDR_CHECK(ndr_pull_unistr(ndr, &r->server));
}
if (r->share) {
NDR_CHECK(ndr_pull_unistr(ndr, &r->share));
}
done:
return NT_STATUS_OK;
}
static NTSTATUS ndr_pull_dfs_Info3(struct ndr_pull *ndr, int ndr_flags, struct dfs_Info3 *r)
{
uint32 _ptr_path;
uint32 _ptr_comment;
uint32 _ptr_stores;
NDR_CHECK(ndr_pull_align(ndr, 4));
if (!(ndr_flags & NDR_SCALARS)) goto buffers;
NDR_CHECK(ndr_pull_uint32(ndr, &_ptr_path));
if (_ptr_path) {
NDR_ALLOC(ndr, r->path);
} else {
r->path = NULL;
}
NDR_CHECK(ndr_pull_uint32(ndr, &_ptr_comment));
if (_ptr_comment) {
NDR_ALLOC(ndr, r->comment);
} else {
r->comment = NULL;
}
NDR_CHECK(ndr_pull_uint32(ndr, &r->state));
NDR_CHECK(ndr_pull_uint32(ndr, &r->num_stores));
NDR_CHECK(ndr_pull_uint32(ndr, &_ptr_stores));
if (_ptr_stores) {
NDR_ALLOC(ndr, r->stores);
} else {
r->stores = NULL;
}
buffers:
if (!(ndr_flags & NDR_BUFFERS)) goto done;
if (r->path) {
NDR_CHECK(ndr_pull_unistr(ndr, &r->path));
}
if (r->comment) {
NDR_CHECK(ndr_pull_unistr(ndr, &r->comment));
}
if (r->stores) {
{
uint32 _array_size;
NDR_CHECK(ndr_pull_uint32(ndr, &_array_size));
if (r->num_stores > _array_size) {
return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should be %u", _array_size, r->num_stores);
}
}
NDR_ALLOC_N_SIZE(ndr, r->stores, r->num_stores, sizeof(r->stores[0]));
NDR_CHECK(ndr_pull_array(ndr, NDR_SCALARS|NDR_BUFFERS, (void **)r->stores, sizeof(r->stores[0]), r->num_stores, (ndr_pull_flags_fn_t)ndr_pull_dfs_StorageInfo));
}
done:
return NT_STATUS_OK;
}
static NTSTATUS ndr_pull_dfs_EnumArray3(struct ndr_pull *ndr, int ndr_flags, struct dfs_EnumArray3 *r)
{
uint32 _ptr_s;
NDR_CHECK(ndr_pull_align(ndr, 4));
if (!(ndr_flags & NDR_SCALARS)) goto buffers;
NDR_CHECK(ndr_pull_uint32(ndr, &r->count));
NDR_CHECK(ndr_pull_uint32(ndr, &_ptr_s));
if (_ptr_s) {
NDR_ALLOC(ndr, r->s);
} else {
r->s = NULL;
}
buffers:
if (!(ndr_flags & NDR_BUFFERS)) goto done;
if (r->s) {
{
uint32 _array_size;
NDR_CHECK(ndr_pull_uint32(ndr, &_array_size));
if (r->count > _array_size) {
return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should be %u", _array_size, r->count);
}
}
NDR_ALLOC_N_SIZE(ndr, r->s, r->count, sizeof(r->s[0]));
NDR_CHECK(ndr_pull_array(ndr, NDR_SCALARS|NDR_BUFFERS, (void **)r->s, sizeof(r->s[0]), r->count, (ndr_pull_flags_fn_t)ndr_pull_dfs_Info3));
}
done:
return NT_STATUS_OK;
@ -249,12 +536,32 @@ static NTSTATUS ndr_pull_dfs_EnumInfo(struct ndr_pull *ndr, int ndr_flags, uint1
NDR_CHECK(ndr_pull_uint16(ndr, level));
switch (*level) {
case 1: {
uint32 _ptr_enum1;
NDR_CHECK(ndr_pull_uint32(ndr, &_ptr_enum1));
if (_ptr_enum1) {
NDR_ALLOC(ndr, r->enum1);
uint32 _ptr_info1;
NDR_CHECK(ndr_pull_uint32(ndr, &_ptr_info1));
if (_ptr_info1) {
NDR_ALLOC(ndr, r->info1);
} else {
r->enum1 = NULL;
r->info1 = NULL;
}
break; }
case 2: {
uint32 _ptr_info2;
NDR_CHECK(ndr_pull_uint32(ndr, &_ptr_info2));
if (_ptr_info2) {
NDR_ALLOC(ndr, r->info2);
} else {
r->info2 = NULL;
}
break; }
case 3: {
uint32 _ptr_info3;
NDR_CHECK(ndr_pull_uint32(ndr, &_ptr_info3));
if (_ptr_info3) {
NDR_ALLOC(ndr, r->info3);
} else {
r->info3 = NULL;
}
break; }
@ -265,8 +572,20 @@ buffers:
if (!(ndr_flags & NDR_BUFFERS)) goto done;
switch (*level) {
case 1:
if (r->enum1) {
NDR_CHECK(ndr_pull_dfs_Enum1(ndr, NDR_SCALARS|NDR_BUFFERS, r->enum1));
if (r->info1) {
NDR_CHECK(ndr_pull_dfs_EnumArray1(ndr, NDR_SCALARS|NDR_BUFFERS, r->info1));
}
break;
case 2:
if (r->info2) {
NDR_CHECK(ndr_pull_dfs_EnumArray2(ndr, NDR_SCALARS|NDR_BUFFERS, r->info2));
}
break;
case 3:
if (r->info3) {
NDR_CHECK(ndr_pull_dfs_EnumArray3(ndr, NDR_SCALARS|NDR_BUFFERS, r->info3));
}
break;
@ -323,28 +642,124 @@ NTSTATUS ndr_pull_dfs_Enum(struct ndr_pull *ndr, struct dfs_Enum *r)
return NT_STATUS_OK;
}
void ndr_print_dfs_String(struct ndr_print *ndr, const char *name, struct dfs_String *r)
void ndr_print_dfs_Info1(struct ndr_print *ndr, const char *name, struct dfs_Info1 *r)
{
ndr_print_struct(ndr, name, "dfs_String");
ndr_print_struct(ndr, name, "dfs_Info1");
ndr->depth++;
ndr_print_ptr(ndr, "str", r->str);
ndr_print_ptr(ndr, "path", r->path);
ndr->depth++;
if (r->str) {
ndr_print_unistr(ndr, "str", r->str);
if (r->path) {
ndr_print_unistr(ndr, "path", r->path);
}
ndr->depth--;
ndr->depth--;
}
void ndr_print_dfs_Enum1(struct ndr_print *ndr, const char *name, struct dfs_Enum1 *r)
void ndr_print_dfs_EnumArray1(struct ndr_print *ndr, const char *name, struct dfs_EnumArray1 *r)
{
ndr_print_struct(ndr, name, "dfs_Enum1");
ndr_print_struct(ndr, name, "dfs_EnumArray1");
ndr->depth++;
ndr_print_uint32(ndr, "count", r->count);
ndr_print_ptr(ndr, "s", r->s);
ndr->depth++;
if (r->s) {
ndr_print_array(ndr, "s", r->s, sizeof(r->s[0]), r->count, (ndr_print_fn_t)ndr_print_dfs_String);
ndr_print_array(ndr, "s", r->s, sizeof(r->s[0]), r->count, (ndr_print_fn_t)ndr_print_dfs_Info1);
}
ndr->depth--;
ndr->depth--;
}
void ndr_print_dfs_Info2(struct ndr_print *ndr, const char *name, struct dfs_Info2 *r)
{
ndr_print_struct(ndr, name, "dfs_Info2");
ndr->depth++;
ndr_print_ptr(ndr, "path", r->path);
ndr->depth++;
if (r->path) {
ndr_print_unistr(ndr, "path", r->path);
}
ndr->depth--;
ndr_print_ptr(ndr, "comment", r->comment);
ndr->depth++;
if (r->comment) {
ndr_print_unistr(ndr, "comment", r->comment);
}
ndr->depth--;
ndr_print_uint32(ndr, "state", r->state);
ndr_print_uint32(ndr, "num_stores", r->num_stores);
ndr->depth--;
}
void ndr_print_dfs_EnumArray2(struct ndr_print *ndr, const char *name, struct dfs_EnumArray2 *r)
{
ndr_print_struct(ndr, name, "dfs_EnumArray2");
ndr->depth++;
ndr_print_uint32(ndr, "count", r->count);
ndr_print_ptr(ndr, "s", r->s);
ndr->depth++;
if (r->s) {
ndr_print_array(ndr, "s", r->s, sizeof(r->s[0]), r->count, (ndr_print_fn_t)ndr_print_dfs_Info2);
}
ndr->depth--;
ndr->depth--;
}
void ndr_print_dfs_StorageInfo(struct ndr_print *ndr, const char *name, struct dfs_StorageInfo *r)
{
ndr_print_struct(ndr, name, "dfs_StorageInfo");
ndr->depth++;
ndr_print_uint32(ndr, "state", r->state);
ndr_print_ptr(ndr, "server", r->server);
ndr->depth++;
if (r->server) {
ndr_print_unistr(ndr, "server", r->server);
}
ndr->depth--;
ndr_print_ptr(ndr, "share", r->share);
ndr->depth++;
if (r->share) {
ndr_print_unistr(ndr, "share", r->share);
}
ndr->depth--;
ndr->depth--;
}
void ndr_print_dfs_Info3(struct ndr_print *ndr, const char *name, struct dfs_Info3 *r)
{
ndr_print_struct(ndr, name, "dfs_Info3");
ndr->depth++;
ndr_print_ptr(ndr, "path", r->path);
ndr->depth++;
if (r->path) {
ndr_print_unistr(ndr, "path", r->path);
}
ndr->depth--;
ndr_print_ptr(ndr, "comment", r->comment);
ndr->depth++;
if (r->comment) {
ndr_print_unistr(ndr, "comment", r->comment);
}
ndr->depth--;
ndr_print_uint32(ndr, "state", r->state);
ndr_print_uint32(ndr, "num_stores", r->num_stores);
ndr_print_ptr(ndr, "stores", r->stores);
ndr->depth++;
if (r->stores) {
ndr_print_array(ndr, "stores", r->stores, sizeof(r->stores[0]), r->num_stores, (ndr_print_fn_t)ndr_print_dfs_StorageInfo);
}
ndr->depth--;
ndr->depth--;
}
void ndr_print_dfs_EnumArray3(struct ndr_print *ndr, const char *name, struct dfs_EnumArray3 *r)
{
ndr_print_struct(ndr, name, "dfs_EnumArray3");
ndr->depth++;
ndr_print_uint32(ndr, "count", r->count);
ndr_print_ptr(ndr, "s", r->s);
ndr->depth++;
if (r->s) {
ndr_print_array(ndr, "s", r->s, sizeof(r->s[0]), r->count, (ndr_print_fn_t)ndr_print_dfs_Info3);
}
ndr->depth--;
ndr->depth--;
@ -355,10 +770,28 @@ void ndr_print_dfs_EnumInfo(struct ndr_print *ndr, const char *name, uint16 leve
ndr_print_union(ndr, name, level, "dfs_EnumInfo");
switch (level) {
case 1:
ndr_print_ptr(ndr, "enum1", r->enum1);
ndr_print_ptr(ndr, "info1", r->info1);
ndr->depth++;
if (r->enum1) {
ndr_print_dfs_Enum1(ndr, "enum1", r->enum1);
if (r->info1) {
ndr_print_dfs_EnumArray1(ndr, "info1", r->info1);
}
ndr->depth--;
break;
case 2:
ndr_print_ptr(ndr, "info2", r->info2);
ndr->depth++;
if (r->info2) {
ndr_print_dfs_EnumArray2(ndr, "info2", r->info2);
}
ndr->depth--;
break;
case 3:
ndr_print_ptr(ndr, "info3", r->info3);
ndr->depth++;
if (r->info3) {
ndr_print_dfs_EnumArray3(ndr, "info3", r->info3);
}
ndr->depth--;
break;

View File

@ -62,17 +62,50 @@ struct dfs_Info {
};
struct dfs_String {
const char *str;
struct dfs_Info1 {
const char *path;
};
struct dfs_Enum1 {
struct dfs_EnumArray1 {
uint32 count;
struct dfs_String *s;
struct dfs_Info1 *s;
};
struct dfs_Info2 {
const char *path;
const char *comment;
uint32 state;
uint32 num_stores;
};
struct dfs_EnumArray2 {
uint32 count;
struct dfs_Info2 *s;
};
struct dfs_StorageInfo {
uint32 state;
const char *server;
const char *share;
};
struct dfs_Info3 {
const char *path;
const char *comment;
uint32 state;
uint32 num_stores;
struct dfs_StorageInfo *stores;
};
struct dfs_EnumArray3 {
uint32 count;
struct dfs_Info3 *s;
};
union dfs_EnumInfo {
/* [case(1)] */ struct dfs_Enum1 *enum1;
/* [case(1)] */ struct dfs_EnumArray1 *info1;
/* [case(2)] */ struct dfs_EnumArray2 *info2;
/* [case(3)] */ struct dfs_EnumArray3 *info3;
};
struct dfs_EnumStruct {

View File

@ -310,6 +310,18 @@ NTSTATUS ndr_push_lsa_OpenAccount(struct ndr_push *ndr, struct lsa_OpenAccount *
return NT_STATUS_OK;
}
static NTSTATUS ndr_push_lsa_LUID(struct ndr_push *ndr, int ndr_flags, struct lsa_LUID *r)
{
NDR_CHECK(ndr_push_align(ndr, 4));
if (!(ndr_flags & NDR_SCALARS)) goto buffers;
NDR_CHECK(ndr_push_uint32(ndr, r->low));
NDR_CHECK(ndr_push_uint32(ndr, r->high));
buffers:
if (!(ndr_flags & NDR_BUFFERS)) goto done;
done:
return NT_STATUS_OK;
}
NTSTATUS ndr_push_lsa_EnumPrivsAccount(struct ndr_push *ndr, struct lsa_EnumPrivsAccount *r)
{
NDR_CHECK(ndr_push_policy_handle(ndr, r->in.handle));
@ -398,8 +410,7 @@ NTSTATUS ndr_push_LOOKUPPRIVVALUE(struct ndr_push *ndr, struct LOOKUPPRIVVALUE *
NTSTATUS ndr_push_lsa_LookupPrivName(struct ndr_push *ndr, struct lsa_LookupPrivName *r)
{
NDR_CHECK(ndr_push_policy_handle(ndr, r->in.handle));
NDR_CHECK(ndr_push_uint32(ndr, r->in.luid_high));
NDR_CHECK(ndr_push_uint32(ndr, r->in.luid_low));
NDR_CHECK(ndr_push_lsa_LUID(ndr, NDR_SCALARS|NDR_BUFFERS, r->in.luid));
return NT_STATUS_OK;
}
@ -570,7 +581,7 @@ buffers:
}
}
NDR_ALLOC_N_SIZE(ndr, r->privs, r->count, sizeof(r->privs[0]));
NDR_CHECK(ndr_pull_array(ndr, ndr_flags, (void **)r->privs, sizeof(r->privs[0]), r->count, (ndr_pull_flags_fn_t)ndr_pull_lsa_PrivEntry));
NDR_CHECK(ndr_pull_array(ndr, NDR_SCALARS|NDR_BUFFERS, (void **)r->privs, sizeof(r->privs[0]), r->count, (ndr_pull_flags_fn_t)ndr_pull_lsa_PrivEntry));
}
done:
return NT_STATUS_OK;
@ -1006,7 +1017,7 @@ buffers:
}
}
NDR_ALLOC_N_SIZE(ndr, r->sids, r->num_sids, sizeof(r->sids[0]));
NDR_CHECK(ndr_pull_array(ndr, ndr_flags, (void **)r->sids, sizeof(r->sids[0]), r->num_sids, (ndr_pull_flags_fn_t)ndr_pull_lsa_SidPtr));
NDR_CHECK(ndr_pull_array(ndr, NDR_SCALARS|NDR_BUFFERS, (void **)r->sids, sizeof(r->sids[0]), r->num_sids, (ndr_pull_flags_fn_t)ndr_pull_lsa_SidPtr));
}
done:
return NT_STATUS_OK;
@ -1073,7 +1084,7 @@ buffers:
}
}
NDR_ALLOC_N_SIZE(ndr, r->domains, r->count, sizeof(r->domains[0]));
NDR_CHECK(ndr_pull_array(ndr, ndr_flags, (void **)r->domains, sizeof(r->domains[0]), r->count, (ndr_pull_flags_fn_t)ndr_pull_lsa_DomainInformation));
NDR_CHECK(ndr_pull_array(ndr, NDR_SCALARS|NDR_BUFFERS, (void **)r->domains, sizeof(r->domains[0]), r->count, (ndr_pull_flags_fn_t)ndr_pull_lsa_DomainInformation));
}
done:
return NT_STATUS_OK;
@ -1124,7 +1135,7 @@ buffers:
}
}
NDR_ALLOC_N_SIZE(ndr, r->sids, r->count, sizeof(r->sids[0]));
NDR_CHECK(ndr_pull_array(ndr, ndr_flags, (void **)r->sids, sizeof(r->sids[0]), r->count, (ndr_pull_flags_fn_t)ndr_pull_lsa_TranslatedSid));
NDR_CHECK(ndr_pull_array(ndr, NDR_SCALARS|NDR_BUFFERS, (void **)r->sids, sizeof(r->sids[0]), r->count, (ndr_pull_flags_fn_t)ndr_pull_lsa_TranslatedSid));
}
done:
return NT_STATUS_OK;
@ -1176,7 +1187,7 @@ buffers:
}
}
NDR_ALLOC_N_SIZE(ndr, r->domains, r->count, sizeof(r->domains[0]));
NDR_CHECK(ndr_pull_array(ndr, ndr_flags, (void **)r->domains, sizeof(r->domains[0]), r->count, (ndr_pull_flags_fn_t)ndr_pull_lsa_TrustInformation));
NDR_CHECK(ndr_pull_array(ndr, NDR_SCALARS|NDR_BUFFERS, (void **)r->domains, sizeof(r->domains[0]), r->count, (ndr_pull_flags_fn_t)ndr_pull_lsa_TrustInformation));
}
done:
return NT_STATUS_OK;
@ -1238,7 +1249,7 @@ buffers:
}
}
NDR_ALLOC_N_SIZE(ndr, r->names, r->count, sizeof(r->names[0]));
NDR_CHECK(ndr_pull_array(ndr, ndr_flags, (void **)r->names, sizeof(r->names[0]), r->count, (ndr_pull_flags_fn_t)ndr_pull_lsa_TranslatedName));
NDR_CHECK(ndr_pull_array(ndr, NDR_SCALARS|NDR_BUFFERS, (void **)r->names, sizeof(r->names[0]), r->count, (ndr_pull_flags_fn_t)ndr_pull_lsa_TranslatedName));
}
done:
return NT_STATUS_OK;
@ -1317,7 +1328,7 @@ buffers:
return ndr_pull_error(ndr, NDR_ERR_CONFORMANT_SIZE, "Bad conformant size %u should be %u", _conformant_size, r->count);
}
NDR_ALLOC_N_SIZE(ndr, r->set, _conformant_size, sizeof(r->set[0]));
NDR_CHECK(ndr_pull_array(ndr, ndr_flags, (void **)r->set, sizeof(r->set[0]), r->count, (ndr_pull_flags_fn_t)ndr_pull_lsa_LUIDAttribute));
NDR_CHECK(ndr_pull_array(ndr, NDR_SCALARS|NDR_BUFFERS, (void **)r->set, sizeof(r->set[0]), r->count, (ndr_pull_flags_fn_t)ndr_pull_lsa_LUIDAttribute));
done:
return NT_STATUS_OK;
}
@ -1491,7 +1502,7 @@ buffers:
}
}
NDR_ALLOC_N_SIZE(ndr, r->names, r->count, sizeof(r->names[0]));
NDR_CHECK(ndr_pull_array(ndr, ndr_flags, (void **)r->names, sizeof(r->names[0]), r->count, (ndr_pull_flags_fn_t)ndr_pull_lsa_Name));
NDR_CHECK(ndr_pull_array(ndr, NDR_SCALARS|NDR_BUFFERS, (void **)r->names, sizeof(r->names[0]), r->count, (ndr_pull_flags_fn_t)ndr_pull_lsa_Name));
}
done:
return NT_STATUS_OK;

View File

@ -554,8 +554,7 @@ struct LOOKUPPRIVVALUE {
struct lsa_LookupPrivName {
struct {
struct policy_handle *handle;
uint32 luid_high;
uint32 luid_low;
struct lsa_LUID *luid;
} in;
struct {

View File

@ -48,20 +48,21 @@ static BOOL test_Enum(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx)
uint32 total=0;
struct dfs_EnumStruct e;
uint32 i = 0;
struct dfs_String s;
struct dfs_Enum1 e1;
struct dfs_Info1 s;
struct dfs_EnumArray1 e2;
e.level = 1;
e.e.enum1 = &e1;
e.e.enum1->count = 0;
e.e.enum1->s = &s;
s.str = NULL;
r.in.level = 1;
r.in.level = 3;
r.in.bufsize = (uint32)-1;
r.in.total = &total;
r.in.unknown = NULL;
r.in.info = &e;
e.level = r.in.level;
e.e.info1 = &e2;
e.e.info1->count = 0;
e.e.info1->s = &s;
s.path = NULL;
status = dcerpc_dfs_Enum(p, mem_ctx, &r);
if (!NT_STATUS_IS_OK(status)) {

View File

@ -256,8 +256,7 @@ static BOOL test_LookupPrivName(struct dcerpc_pipe *p,
struct lsa_LookupPrivName r;
r.in.handle = handle;
r.in.luid_high = luid->high;
r.in.luid_low = luid->low;
r.in.luid = luid;
status = dcerpc_lsa_LookupPrivName(p, mem_ctx, &r);
if (!NT_STATUS_IS_OK(status)) {