diff options
Diffstat (limited to 'source4/libcli/ndr')
-rw-r--r-- | source4/libcli/ndr/ndr_lsa.c | 45 | ||||
-rw-r--r-- | source4/libcli/ndr/ndr_lsa.h | 13 | ||||
-rw-r--r-- | source4/libcli/ndr/ndr_sec.c | 10 |
3 files changed, 68 insertions, 0 deletions
diff --git a/source4/libcli/ndr/ndr_lsa.c b/source4/libcli/ndr/ndr_lsa.c index 5955432915..dfe978f9d4 100644 --- a/source4/libcli/ndr/ndr_lsa.c +++ b/source4/libcli/ndr/ndr_lsa.c @@ -108,3 +108,48 @@ NTSTATUS ndr_pull_lsa_OpenPolicy2(struct ndr_pull *ndr, NDR_CHECK(ndr_pull_status(ndr, &r->out.status)); return NT_STATUS_OK; } + + +/* + push a EnumSids +*/ +NTSTATUS ndr_push_lsa_EnumSids(struct ndr_push *ndr, + struct lsa_EnumSids *r) +{ + NDR_CHECK(ndr_push_policy_handle(ndr, r->in.handle)); + NDR_CHECK(ndr_push_u32(ndr, r->in.start_at)); + NDR_CHECK(ndr_push_u32(ndr, r->in.num_entries)); + return NT_STATUS_OK; +} + +/* + pull a EnumSids +*/ +NTSTATUS ndr_pull_lsa_EnumSids(struct ndr_pull *ndr, + struct lsa_EnumSids *r) +{ + uint32 nptrs, asize, i, ptr; + + NDR_CHECK(ndr_pull_u32(ndr, &r->out.num_entries)); + NDR_CHECK(ndr_pull_u32(ndr, &nptrs)); + NDR_CHECK(ndr_pull_u32(ndr, &ptr)); + if (!ptr) goto done; + + NDR_CHECK(ndr_pull_u32(ndr, &asize)); + NDR_ALLOC_N(ndr, r->out.sids, nptrs); + for (i=0;i<nptrs;i++) { + NDR_CHECK(ndr_pull_u32(ndr, &ptr)); + if (ptr) { + NDR_ALLOC(ndr, r->out.sids[i]); + } else { + r->out.sids[i] = NULL; + } + } + for (i=0;i<nptrs;i++) { + if (r->out.sids[i]) NDR_CHECK(ndr_pull_dom_sid2(ndr, r->out.sids[i])); + } + +done: + NDR_CHECK(ndr_pull_status(ndr, &r->out.status)); + return NT_STATUS_OK; +} diff --git a/source4/libcli/ndr/ndr_lsa.h b/source4/libcli/ndr/ndr_lsa.h index cfdd98e24e..0cc43b5f86 100644 --- a/source4/libcli/ndr/ndr_lsa.h +++ b/source4/libcli/ndr/ndr_lsa.h @@ -57,3 +57,16 @@ struct lsa_OpenPolicy2 { NTSTATUS status; } out; }; + +struct lsa_EnumSids { + struct { + struct policy_handle *handle; + uint32 start_at; + uint32 num_entries; + } in; + struct { + uint32 num_entries; + struct dom_sid **sids; + NTSTATUS status; + } out; +}; diff --git a/source4/libcli/ndr/ndr_sec.c b/source4/libcli/ndr/ndr_sec.c index 6b83a09d7a..52578089e6 100644 --- a/source4/libcli/ndr/ndr_sec.c +++ b/source4/libcli/ndr/ndr_sec.c @@ -137,6 +137,16 @@ NTSTATUS ndr_pull_dom_sid(struct ndr_pull *ndr, struct dom_sid *sid) } /* + parse a dom_sid2 - this is a dom_sid but with an extra copy of the num_auths field +*/ +NTSTATUS ndr_pull_dom_sid2(struct ndr_pull *ndr, struct dom_sid *sid) +{ + uint32 num_auths; + NDR_CHECK(ndr_pull_u32(ndr, &num_auths)); + return ndr_pull_dom_sid(ndr, sid); +} + +/* parse a dom_sid offset and structure */ NTSTATUS ndr_pull_dom_sid_ofs(struct ndr_pull *ndr, struct dom_sid **sid) |