s4-srvsvc: merge srvsvc_NetFileGetInfo from s3 idl.
[ira/wip.git] / source4 / rpc_server / srvsvc / dcesrv_srvsvc.c
index 1e5a2105d0e41ef9ecf79f8c99c05c229903dff9..9e43317ae82b58f72f6f13eef07d61a1a56f97b2 100644 (file)
@@ -3,11 +3,11 @@
 
    endpoint server for the srvsvc pipe
 
-   Copyright (C) Stefan (metze) Metzmacher 2004
+   Copyright (C) Stefan (metze) Metzmacher 2004-2006
    
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
    
    This program is distributed in the hope that it will be useful,
    GNU General Public License for more details.
    
    You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
 #include "includes.h"
+#include "ntvfs/ntvfs.h"
+#include "rpc_server/dcerpc_server.h"
+#include "librpc/gen_ndr/ndr_srvsvc.h"
 #include "rpc_server/common/common.h"
+#include "rpc_server/common/proto.h"
+#include "auth/auth.h"
+#include "libcli/security/security.h"
+#include "system/time.h"
+#include "rpc_server/srvsvc/proto.h"
+#include "param/param.h"
+
+#define SRVSVC_CHECK_ADMIN_ACCESS do { \
+       struct security_token *t = dce_call->conn->auth_state.session_info->security_token; \
+       if (!security_token_has_builtin_administrators(t) && \
+           !security_token_has_sid_string(t, SID_BUILTIN_SERVER_OPERATORS)) { \
+               return WERR_ACCESS_DENIED; \
+       } \
+} while (0)
 
 /* 
   srvsvc_NetCharDevEnum 
 */
-static NTSTATUS srvsvc_NetCharDevEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
-                      struct srvsvc_NetCharDevEnum *r)
+static WERROR dcesrv_srvsvc_NetCharDevEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+                                     struct srvsvc_NetCharDevEnum *r)
 {
        r->out.level = r->in.level;
        r->out.totalentries = 0;
        r->out.resume_handle = NULL;
-       r->out.result = WERR_OK;
 
        switch (r->in.level) {
        case 0:
-               r->out.ctr.ctr0 = talloc_p(mem_ctx, struct srvsvc_NetCharDevCtr0);
-               WERR_TALLOC_CHECK(r->out.ctr.ctr0);
+               r->out.ctr.ctr0 = talloc(mem_ctx, struct srvsvc_NetCharDevCtr0);
+               W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr0);
 
                r->out.ctr.ctr0->count = 0;
                r->out.ctr.ctr0->array = NULL;
 
-               r->out.result = WERR_NOT_SUPPORTED;
-               break;
+               return WERR_NOT_SUPPORTED;
+
        case 1:
-               r->out.ctr.ctr1 = talloc_p(mem_ctx, struct srvsvc_NetCharDevCtr1);
-               WERR_TALLOC_CHECK(r->out.ctr.ctr1);
+               r->out.ctr.ctr1 = talloc(mem_ctx, struct srvsvc_NetCharDevCtr1);
+               W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr1);
 
                r->out.ctr.ctr1->count = 0;
                r->out.ctr.ctr1->array = NULL;
 
-               r->out.result = WERR_NOT_SUPPORTED;
-               break;
+               return WERR_NOT_SUPPORTED;
+
        default:
-               r->out.result = WERR_UNKNOWN_LEVEL;
-               break;
+               return WERR_UNKNOWN_LEVEL;
        }
 
-       return NT_STATUS_OK;
+       return WERR_OK;
 }
 
 
 /* 
   srvsvc_NetCharDevGetInfo 
 */
-static NTSTATUS srvsvc_NetCharDevGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR dcesrv_srvsvc_NetCharDevGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
                       struct srvsvc_NetCharDevGetInfo *r)
 {
-       r->out.result = WERR_OK;
+       ZERO_STRUCTP(r->out.info);
 
        switch (r->in.level) {
        case 0:
-               r->out.info.info0 = NULL;
-
-               r->out.result = WERR_NOT_SUPPORTED;
-               break;
+       {
+               return WERR_NOT_SUPPORTED;
+       }
        case 1:
-               r->out.info.info1 = NULL;
-
-               r->out.result = WERR_NOT_SUPPORTED;
-               break;
+       {
+               return WERR_NOT_SUPPORTED;
+       }
        default:
-               r->out.result = WERR_UNKNOWN_LEVEL;
-               break;
+               return WERR_UNKNOWN_LEVEL;
        }
 
-       return NT_STATUS_OK;
+       return WERR_UNKNOWN_LEVEL;
 }
 
 
 /* 
   srvsvc_NetCharDevControl 
 */
-static NTSTATUS srvsvc_NetCharDevControl(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR dcesrv_srvsvc_NetCharDevControl(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
                       struct srvsvc_NetCharDevControl *r)
 {
-       r->out.result = WERR_NOT_SUPPORTED;
-       return NT_STATUS_OK;
+       DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
 }
 
 
 /* 
   srvsvc_NetCharDevQEnum 
 */
-static NTSTATUS srvsvc_NetCharDevQEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
-                      struct srvsvc_NetCharDevQEnum *r)
+static WERROR dcesrv_srvsvc_NetCharDevQEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+                                    struct srvsvc_NetCharDevQEnum *r)
 {
        r->out.level = r->in.level;
        r->out.totalentries = 0;
        r->out.resume_handle = NULL;
-       r->out.result = WERR_OK;
 
        switch (r->in.level) {
        case 0:
-               r->out.ctr.ctr0 = talloc_p(mem_ctx, struct srvsvc_NetCharDevQCtr0);
-               WERR_TALLOC_CHECK(r->out.ctr.ctr0);
+       {
+               r->out.ctr.ctr0 = talloc(mem_ctx, struct srvsvc_NetCharDevQCtr0);
+               W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr0);
 
                r->out.ctr.ctr0->count = 0;
                r->out.ctr.ctr0->array = NULL;
 
-               r->out.result = WERR_NOT_SUPPORTED;
-               break;
+               return WERR_NOT_SUPPORTED;
+       }
        case 1:
-               r->out.ctr.ctr1 = talloc_p(mem_ctx, struct srvsvc_NetCharDevQCtr1);
-               WERR_TALLOC_CHECK(r->out.ctr.ctr1);
+       {
+               r->out.ctr.ctr1 = talloc(mem_ctx, struct srvsvc_NetCharDevQCtr1);
+               W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr1);
 
                r->out.ctr.ctr1->count = 0;
                r->out.ctr.ctr1->array = NULL;
 
-               r->out.result = WERR_NOT_SUPPORTED;
-               break;
+               return WERR_NOT_SUPPORTED;
+       }
        default:
-               r->out.result = WERR_UNKNOWN_LEVEL;
-               break;
+               return WERR_UNKNOWN_LEVEL;
        }
 
-       return NT_STATUS_OK;
+       return WERR_UNKNOWN_LEVEL;
 }
 
 
 /* 
   srvsvc_NetCharDevQGetInfo 
 */
-static NTSTATUS srvsvc_NetCharDevQGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
-                      struct srvsvc_NetCharDevQGetInfo *r)
+static WERROR dcesrv_srvsvc_NetCharDevQGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+                                       struct srvsvc_NetCharDevQGetInfo *r)
 {
-       r->out.result = WERR_OK;
+       ZERO_STRUCTP(r->out.info);
 
        switch (r->in.level) {
        case 0:
-               r->out.info.info0 = NULL;
-
-               r->out.result = WERR_NOT_SUPPORTED;
-               break;
+       {
+               return WERR_NOT_SUPPORTED;
+       }
        case 1:
-               r->out.info.info1 = NULL;
-
-               r->out.result = WERR_NOT_SUPPORTED;
-               break;
+       {
+               return WERR_NOT_SUPPORTED;
+       }
        default:
-               r->out.result = WERR_UNKNOWN_LEVEL;
-               break;
+               return WERR_UNKNOWN_LEVEL;
        }
 
-       return NT_STATUS_OK;
+       return WERR_UNKNOWN_LEVEL;
 }
 
 
 /* 
   srvsvc_NetCharDevQSetInfo 
 */
-static NTSTATUS srvsvc_NetCharDevQSetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR dcesrv_srvsvc_NetCharDevQSetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
                       struct srvsvc_NetCharDevQSetInfo *r)
 {
-       r->out.result = WERR_OK;
-
        switch (r->in.level) {
-       case 0: 
+       case 0:
+       {
                if (r->in.parm_error) {
                        r->out.parm_error = r->in.parm_error;
                }
-               r->out.result = WERR_NOT_SUPPORTED;
-               break;
+               return WERR_NOT_SUPPORTED;
+       }
        case 1:
+       {
                if (r->in.parm_error) {
                        r->out.parm_error = r->in.parm_error;
                }
-               r->out.result = WERR_NOT_SUPPORTED;
-               break;
+               return WERR_NOT_SUPPORTED;
+       }
        default:
-               r->out.result = WERR_UNKNOWN_LEVEL;
-               break;
+               return WERR_UNKNOWN_LEVEL;
        }
 
-       return NT_STATUS_OK;
+       return WERR_UNKNOWN_LEVEL;
 }
 
 
 /* 
   srvsvc_NetCharDevQPurge 
 */
-static NTSTATUS srvsvc_NetCharDevQPurge(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR dcesrv_srvsvc_NetCharDevQPurge(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
                       struct srvsvc_NetCharDevQPurge *r)
 {
-       r->out.result = WERR_NOT_SUPPORTED;
-       return NT_STATUS_OK;
+       DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
 }
 
 
 /* 
   srvsvc_NetCharDevQPurgeSelf 
 */
-static NTSTATUS srvsvc_NetCharDevQPurgeSelf(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
-                      struct srvsvc_NetCharDevQPurgeSelf *r)
+static WERROR dcesrv_srvsvc_NetCharDevQPurgeSelf(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+                                         struct srvsvc_NetCharDevQPurgeSelf *r)
 {
-       r->out.result = WERR_NOT_SUPPORTED;
-       return NT_STATUS_OK;
+       DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);        
 }
 
 
 /* 
   srvsvc_NetConnEnum 
 */
-static NTSTATUS srvsvc_NetConnEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR dcesrv_srvsvc_NetConnEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
                       struct srvsvc_NetConnEnum *r)
 {
        r->out.level = r->in.level;
        r->out.totalentries = 0;
        r->out.resume_handle = NULL;
-       r->out.result = WERR_OK;
 
        switch (r->in.level) {
-       case 0: {
-               r->out.ctr.ctr0 = talloc_p(mem_ctx, struct srvsvc_NetConnCtr0);
-               WERR_TALLOC_CHECK(r->out.ctr.ctr0);
+       case 0:
+       {
+               r->out.ctr.ctr0 = talloc(mem_ctx, struct srvsvc_NetConnCtr0);
+               W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr0);
 
                r->out.ctr.ctr0->count = 0;
                r->out.ctr.ctr0->array = NULL;
 
-               r->out.result = WERR_NOT_SUPPORTED;
-               break;
-               }
-       case 1: {
-               r->out.ctr.ctr1 = talloc_p(mem_ctx, struct srvsvc_NetConnCtr1);
-               WERR_TALLOC_CHECK(r->out.ctr.ctr1);
+               return WERR_NOT_SUPPORTED;
+       }
+       case 1:
+       {
+               r->out.ctr.ctr1 = talloc(mem_ctx, struct srvsvc_NetConnCtr1);
+               W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr1);
 
                r->out.ctr.ctr1->count = 0;
                r->out.ctr.ctr1->array = NULL;
 
-               r->out.result = WERR_NOT_SUPPORTED;
-               break;
-               }
+               return WERR_NOT_SUPPORTED;
+       }
        default:
-               r->out.result = WERR_UNKNOWN_LEVEL;
-               break;
+               return WERR_UNKNOWN_LEVEL;
        }
 
-       return NT_STATUS_OK;
+       return WERR_UNKNOWN_LEVEL;
 }
 
 
 /* 
   srvsvc_NetFileEnum 
 */
-static NTSTATUS srvsvc_NetFileEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
-                      struct srvsvc_NetFileEnum *r)
+static WERROR dcesrv_srvsvc_NetFileEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+                                struct srvsvc_NetFileEnum *r)
 {
        r->out.level = r->in.level;
        r->out.totalentries = 0;
        r->out.resume_handle = NULL;
-       r->out.result = WERR_OK;
 
        switch (r->in.level) {
-       case 2: {
-               r->out.ctr.ctr2 = talloc_p(mem_ctx, struct srvsvc_NetFileCtr2);
-               WERR_TALLOC_CHECK(r->out.ctr.ctr2);
+       case 2:
+       {
+               r->out.ctr.ctr2 = talloc(mem_ctx, struct srvsvc_NetFileCtr2);
+               W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr2);
 
                r->out.ctr.ctr2->count = 0;
                r->out.ctr.ctr2->array = NULL;
 
-               r->out.result = WERR_NOT_SUPPORTED;
-               break;
-               }
-       case 3: {
-               r->out.ctr.ctr3 = talloc_p(mem_ctx, struct srvsvc_NetFileCtr3);
-               WERR_TALLOC_CHECK(r->out.ctr.ctr3);
+               return WERR_NOT_SUPPORTED;
+       }
+       case 3:
+       {
+               r->out.ctr.ctr3 = talloc(mem_ctx, struct srvsvc_NetFileCtr3);
+               W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr3);
 
                r->out.ctr.ctr3->count = 0;
                r->out.ctr.ctr3->array = NULL;
 
-               r->out.result = WERR_NOT_SUPPORTED;
-               break;
-               }
+               return WERR_NOT_SUPPORTED;
+       }
        default:
-               r->out.result = WERR_UNKNOWN_LEVEL;
-               break;
+               return WERR_UNKNOWN_LEVEL;
        }
 
-       return NT_STATUS_OK;
+       return WERR_UNKNOWN_LEVEL;
 }
 
 
 /* 
   srvsvc_NetFileGetInfo 
 */
-static NTSTATUS srvsvc_NetFileGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
-                      struct srvsvc_NetFileGetInfo *r)
+static WERROR dcesrv_srvsvc_NetFileGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+                                   struct srvsvc_NetFileGetInfo *r)
 {
-       r->out.result = WERR_OK;
+       ZERO_STRUCTP(r->out.info);
 
        switch (r->in.level) {
-       case 2: {
-               r->out.info.info2 = NULL;
-
-               r->out.result = WERR_NOT_SUPPORTED;
-               break;
-               }
-       case 3: {
-               r->out.info.info3 = NULL;
-
-               r->out.result = WERR_NOT_SUPPORTED;
-               break;
-               }
+       case 2:
+       {
+               return WERR_NOT_SUPPORTED;
+       }
+       case 3:
+       {
+               return WERR_NOT_SUPPORTED;
+       }
        default:
-               r->out.result = WERR_UNKNOWN_LEVEL;
-               break;
+               return WERR_UNKNOWN_LEVEL;
        }
 
-       return NT_STATUS_OK;
+       return WERR_UNKNOWN_LEVEL;
 }
 
 
 /* 
   srvsvc_NetFileClose 
 */
-static NTSTATUS srvsvc_NetFileClose(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR dcesrv_srvsvc_NetFileClose(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
                       struct srvsvc_NetFileClose *r)
 {
-       r->out.result = WERR_NOT_SUPPORTED;
-       return NT_STATUS_OK;
+       DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
 }
 
 
 /* 
   srvsvc_NetSessEnum 
 */
-static NTSTATUS srvsvc_NetSessEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR dcesrv_srvsvc_NetSessEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
                       struct srvsvc_NetSessEnum *r)
 {
        r->out.level = r->in.level;
        r->out.totalentries = 0;
        r->out.resume_handle = NULL;
-       r->out.result = WERR_OK;
 
        switch (r->in.level) {
-       case 0: {
-               r->out.ctr.ctr0 = talloc_p(mem_ctx, struct srvsvc_NetSessCtr0);
-               WERR_TALLOC_CHECK(r->out.ctr.ctr0);
+       case 0:
+       {
+               r->out.ctr.ctr0 = talloc(mem_ctx, struct srvsvc_NetSessCtr0);
+               W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr0);
 
                r->out.ctr.ctr0->count = 0;
                r->out.ctr.ctr0->array = NULL;
 
-               r->out.result = WERR_NOT_SUPPORTED;
-               break;
-               }
-       case 1: {
-               r->out.ctr.ctr1 = talloc_p(mem_ctx, struct srvsvc_NetSessCtr1);
-               WERR_TALLOC_CHECK(r->out.ctr.ctr1);
+               return WERR_NOT_SUPPORTED;
+       }
+       case 1:
+       {
+               r->out.ctr.ctr1 = talloc(mem_ctx, struct srvsvc_NetSessCtr1);
+               W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr1);
 
                r->out.ctr.ctr1->count = 0;
                r->out.ctr.ctr1->array = NULL;
 
-               r->out.result = WERR_NOT_SUPPORTED;
-               break;
-               }
-       case 2: {
-               r->out.ctr.ctr2 = talloc_p(mem_ctx, struct srvsvc_NetSessCtr2);
-               WERR_TALLOC_CHECK(r->out.ctr.ctr2);
+               return WERR_NOT_SUPPORTED;
+       }
+       case 2:
+       {
+               r->out.ctr.ctr2 = talloc(mem_ctx, struct srvsvc_NetSessCtr2);
+               W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr2);
 
                r->out.ctr.ctr2->count = 0;
                r->out.ctr.ctr2->array = NULL;
 
-               r->out.result = WERR_NOT_SUPPORTED;
-               break;
-               }
-       case 10:{
-               r->out.ctr.ctr10 = talloc_p(mem_ctx, struct srvsvc_NetSessCtr10);
-               WERR_TALLOC_CHECK(r->out.ctr.ctr10);
+               return WERR_NOT_SUPPORTED;
+       }
+       case 10:
+       {
+               r->out.ctr.ctr10 = talloc(mem_ctx, struct srvsvc_NetSessCtr10);
+               W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr10);
 
                r->out.ctr.ctr2->count = 0;
                r->out.ctr.ctr2->array = NULL;
 
-               r->out.result = WERR_NOT_SUPPORTED;
-               break;
-               }
-       case 502:{
-               r->out.ctr.ctr502 = talloc_p(mem_ctx, struct srvsvc_NetSessCtr502);
-               WERR_TALLOC_CHECK(r->out.ctr.ctr502);
+               return WERR_NOT_SUPPORTED;
+       }
+       case 502:
+       {
+               r->out.ctr.ctr502 = talloc(mem_ctx, struct srvsvc_NetSessCtr502);
+               W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr502);
 
                r->out.ctr.ctr2->count = 0;
                r->out.ctr.ctr2->array = NULL;
 
-               r->out.result = WERR_NOT_SUPPORTED;
-               break;
-               }
+               return WERR_NOT_SUPPORTED;
+       }
        default:
-               r->out.result = WERR_UNKNOWN_LEVEL;
-               break;
+               return WERR_UNKNOWN_LEVEL;
        }
 
-       return NT_STATUS_OK;
+       return WERR_UNKNOWN_LEVEL;
 }
 
 
 /* 
   srvsvc_NetSessDel 
 */
-static NTSTATUS srvsvc_NetSessDel(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR dcesrv_srvsvc_NetSessDel(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
                       struct srvsvc_NetSessDel *r)
 {
-       r->out.result = WERR_NOT_SUPPORTED;
-       return NT_STATUS_OK;
+       DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
 }
 
 
 /* 
   srvsvc_NetShareAdd 
 */
-static NTSTATUS srvsvc_NetShareAdd(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR dcesrv_srvsvc_NetShareAdd(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
                       struct srvsvc_NetShareAdd *r)
 {
-       r->out.result = WERR_OK;
-
        switch (r->in.level) {
-       case 0: 
+       case 0:
+       {
                if (r->in.parm_error) {
                        r->out.parm_error = r->in.parm_error;
                }
-               r->out.result = WERR_NOT_SUPPORTED;
-               break;
+               return WERR_NOT_SUPPORTED;
+       }
        case 1:
+       {
                if (r->in.parm_error) {
                        r->out.parm_error = r->in.parm_error;
                }
-               r->out.result = WERR_NOT_SUPPORTED;
-               break;
+               return WERR_NOT_SUPPORTED;
+       }
        case 2:
+       {
+               NTSTATUS nterr;
+               struct share_info *info;
+               struct share_context *sctx;
+               int count = 8;
+               int i;
+
+               nterr = share_get_context_by_name(mem_ctx, lp_share_backend(dce_call->conn->dce_ctx->lp_ctx), dce_call->event_ctx, dce_call->conn->dce_ctx->lp_ctx, &sctx);
+               if (!NT_STATUS_IS_OK(nterr)) {
+                       return ntstatus_to_werror(nterr);
+               }
+
+               /* there are no more than 8 options in struct srvsvc_NetShareInfo2 */
+               info = talloc_array(mem_ctx, struct share_info, count);
+               W_ERROR_HAVE_NO_MEMORY(info);
+
+               i = 0;
+
+               info[i].name = SHARE_TYPE;
+               info[i].type = SHARE_INFO_STRING;
+               switch (r->in.info->info2->type) {
+               case 0x00:
+                       info[i].value = talloc_strdup(info, "DISK");
+                       break;
+               case 0x01:
+                       info[i].value = talloc_strdup(info, "PRINTER");
+                       break;
+               case 0x03:
+                       info[i].value = talloc_strdup(info, "IPC");
+                       break;
+               default:
+                       return WERR_INVALID_PARAM;
+               }
+               W_ERROR_HAVE_NO_MEMORY(info[i].value);
+               i++;
+
+               if (r->in.info->info2->path && r->in.info->info2->path[0]) {
+                       info[i].name = SHARE_PATH;
+                       info[i].type = SHARE_INFO_STRING;
+
+                       /* Windows will send a path in a form of C:\example\path */
+                       if (r->in.info->info2->path[1] == ':') {
+                               info[i].value = talloc_strdup(info, &r->in.info->info2->path[2]);
+                       } else {
+                               /* very strange let's try to set as is */
+                               info[i].value = talloc_strdup(info, r->in.info->info2->path);
+                       }
+                       W_ERROR_HAVE_NO_MEMORY(info[i].value);
+                       all_string_sub((char *)info[i].value, "\\", "/", 0);
+
+                       i++;
+               }
+
+               if (r->in.info->info2->comment && r->in.info->info2->comment[0]) {
+                       info[i].name = SHARE_COMMENT;
+                       info[i].type = SHARE_INFO_STRING;
+                       info[i].value = talloc_strdup(info, r->in.info->info2->comment);
+                       W_ERROR_HAVE_NO_MEMORY(info[i].value);
+
+                       i++;
+               }
+
+               if (r->in.info->info2->password && r->in.info->info2->password[0]) {
+                       info[i].name = SHARE_PASSWORD;
+                       info[i].type = SHARE_INFO_STRING;
+                       info[i].value = talloc_strdup(info, r->in.info->info2->password);
+                       W_ERROR_HAVE_NO_MEMORY(info[i].value);
+
+                       i++;
+               }
+
+               info[i].name = SHARE_MAX_CONNECTIONS;
+               info[i].type = SHARE_INFO_INT;
+               info[i].value = talloc(info, int);
+               *((int *)info[i].value) = r->in.info->info2->max_users;
+               i++;
+
+               /* TODO: security descriptor */
+
+               nterr = share_create(sctx, r->in.info->info2->name, info, i);
+               if (!NT_STATUS_IS_OK(nterr)) {
+                       return ntstatus_to_werror(nterr);
+               }
+
                if (r->in.parm_error) {
                        r->out.parm_error = r->in.parm_error;
                }
-               r->out.result = WERR_NOT_SUPPORTED;
-               break;
+               
+               return WERR_OK;
+       }
        case 501:
+       {       
                if (r->in.parm_error) {
                        r->out.parm_error = r->in.parm_error;
                }
-               r->out.result = WERR_NOT_SUPPORTED;
-               break;
+               return WERR_NOT_SUPPORTED;
+       }
        case 502:
+       {
+               NTSTATUS nterr;
+               struct share_info *info;
+               struct share_context *sctx;
+               int count = 10;
+               int i;
+
+               nterr = share_get_context_by_name(mem_ctx, lp_share_backend(dce_call->conn->dce_ctx->lp_ctx), dce_call->event_ctx, dce_call->conn->dce_ctx->lp_ctx, &sctx);
+               if (!NT_STATUS_IS_OK(nterr)) {
+                       return ntstatus_to_werror(nterr);
+               }
+
+               /* there are no more than 10 options in struct srvsvc_NetShareInfo502 */
+               info = talloc_array(mem_ctx, struct share_info, count);
+               W_ERROR_HAVE_NO_MEMORY(info);
+
+               i = 0;
+
+               info[i].name = SHARE_TYPE;
+               info[i].type = SHARE_INFO_STRING;
+               switch (r->in.info->info502->type) {
+               case 0x00:
+                       info[i].value = talloc_strdup(info, "DISK");
+                       break;
+               case 0x01:
+                       info[i].value = talloc_strdup(info, "PRINTER");
+                       break;
+               case 0x03:
+                       info[i].value = talloc_strdup(info, "IPC");
+                       break;
+               default:
+                       return WERR_INVALID_PARAM;
+               }
+               W_ERROR_HAVE_NO_MEMORY(info[i].value);
+               i++;
+
+               if (r->in.info->info502->path && r->in.info->info502->path[0]) {
+                       info[i].name = SHARE_PATH;
+                       info[i].type = SHARE_INFO_STRING;
+
+                       /* Windows will send a path in a form of C:\example\path */
+                       if (r->in.info->info502->path[1] == ':') {
+                               info[i].value = talloc_strdup(info, &r->in.info->info502->path[2]);
+                       } else {
+                               /* very strange let's try to set as is */
+                               info[i].value = talloc_strdup(info, r->in.info->info502->path);
+                       }
+                       W_ERROR_HAVE_NO_MEMORY(info[i].value);
+                       all_string_sub((char *)info[i].value, "\\", "/", 0);
+
+                       i++;
+               }
+
+               if (r->in.info->info502->comment && r->in.info->info502->comment[0]) {
+                       info[i].name = SHARE_COMMENT;
+                       info[i].type = SHARE_INFO_STRING;
+                       info[i].value = talloc_strdup(info, r->in.info->info502->comment);
+                       W_ERROR_HAVE_NO_MEMORY(info[i].value);
+
+                       i++;
+               }
+
+               if (r->in.info->info502->password && r->in.info->info502->password[0]) {
+                       info[i].name = SHARE_PASSWORD;
+                       info[i].type = SHARE_INFO_STRING;
+                       info[i].value = talloc_strdup(info, r->in.info->info502->password);
+                       W_ERROR_HAVE_NO_MEMORY(info[i].value);
+
+                       i++;
+               }
+
+               info[i].name = SHARE_MAX_CONNECTIONS;
+               info[i].type = SHARE_INFO_INT;
+               info[i].value = talloc(info, int);
+               *((int *)info[i].value) = r->in.info->info502->max_users;
+               i++;
+
+               /* TODO: security descriptor */
+
+               nterr = share_create(sctx, r->in.info->info502->name, info, i);
+               if (!NT_STATUS_IS_OK(nterr)) {
+                       return ntstatus_to_werror(nterr);
+               }
+
                if (r->in.parm_error) {
                        r->out.parm_error = r->in.parm_error;
                }
-               r->out.result = WERR_NOT_SUPPORTED;
-               break;
+               
+               return WERR_OK;
+       }
        default:
-               r->out.result = WERR_UNKNOWN_LEVEL;
-               break;
+               return WERR_UNKNOWN_LEVEL;
        }
 
-       return NT_STATUS_OK;
+       return WERR_UNKNOWN_LEVEL;
 }
 
+static WERROR dcesrv_srvsvc_fiel_ShareInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+                                   struct share_config *scfg, uint32_t level,
+                                   union srvsvc_NetShareInfo *info)
+{
+       struct dcesrv_context *dce_ctx = dce_call->conn->dce_ctx;
+
+       switch (level) {
+       case 0:
+       {
+               info->info0->name       = talloc_strdup(mem_ctx, scfg->name);
+               W_ERROR_HAVE_NO_MEMORY(info->info0->name);
+
+               return WERR_OK;
+       }
+       case 1:
+       {
+               info->info1->name       = talloc_strdup(mem_ctx, scfg->name);
+               W_ERROR_HAVE_NO_MEMORY(info->info1->name);
+               info->info1->type       = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
+               info->info1->comment    = talloc_strdup(mem_ctx, share_string_option(scfg, SHARE_COMMENT, ""));
+               W_ERROR_HAVE_NO_MEMORY(info->info1->comment);
+
+               return WERR_OK;
+       }
+       case 2:
+       {
+               info->info2->name               = talloc_strdup(mem_ctx, scfg->name);
+               W_ERROR_HAVE_NO_MEMORY(info->info2->name);
+               info->info2->type               = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
+               info->info2->comment            = talloc_strdup(mem_ctx, share_string_option(scfg, SHARE_COMMENT, ""));
+               W_ERROR_HAVE_NO_MEMORY(info->info2->comment);
+               info->info2->permissions        = dcesrv_common_get_share_permissions(mem_ctx, dce_ctx, scfg);
+               info->info2->max_users          = share_int_option(scfg, SHARE_MAX_CONNECTIONS, SHARE_MAX_CONNECTIONS_DEFAULT);
+               info->info2->current_users      = dcesrv_common_get_share_current_users(mem_ctx, dce_ctx, scfg);
+               info->info2->path               = dcesrv_common_get_share_path(mem_ctx, dce_ctx, scfg);
+               W_ERROR_HAVE_NO_MEMORY(info->info2->path);
+               info->info2->password           = talloc_strdup(mem_ctx, share_string_option(scfg, SHARE_PASSWORD, NULL));
+
+               return WERR_OK;
+       }
+       case 501:
+       {
+               info->info501->name             = talloc_strdup(mem_ctx, scfg->name);
+               W_ERROR_HAVE_NO_MEMORY(info->info501->name);
+               info->info501->type             = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
+               info->info501->comment          = talloc_strdup(mem_ctx, share_string_option(scfg, SHARE_COMMENT, ""));
+               W_ERROR_HAVE_NO_MEMORY(info->info501->comment);
+               info->info501->csc_policy       = share_int_option(scfg, SHARE_CSC_POLICY, SHARE_CSC_POLICY_DEFAULT);
+
+               return WERR_OK;
+       }
+       case 502:
+       {
+               info->info502->name             = talloc_strdup(mem_ctx, scfg->name);
+               W_ERROR_HAVE_NO_MEMORY(info->info502->name);
+               info->info502->type             = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
+               info->info502->comment          = talloc_strdup(mem_ctx, share_string_option(scfg, SHARE_COMMENT, ""));
+               W_ERROR_HAVE_NO_MEMORY(info->info502->comment);
+               info->info502->permissions      = dcesrv_common_get_share_permissions(mem_ctx, dce_ctx, scfg);
+               info->info502->max_users        = share_int_option(scfg, SHARE_MAX_CONNECTIONS, SHARE_MAX_CONNECTIONS_DEFAULT);
+               info->info502->current_users    = dcesrv_common_get_share_current_users(mem_ctx, dce_ctx, scfg);
+               info->info502->path             = dcesrv_common_get_share_path(mem_ctx, dce_ctx, scfg);
+               W_ERROR_HAVE_NO_MEMORY(info->info502->path);
+               info->info502->password         = talloc_strdup(mem_ctx, share_string_option(scfg, SHARE_PASSWORD, NULL));
+               info->info502->sd_buf.sd        = dcesrv_common_get_security_descriptor(mem_ctx, dce_ctx, scfg);
+
+               return WERR_OK;
+       }
+       case 1005:
+       {
+               info->info1005->dfs_flags       = dcesrv_common_get_share_dfs_flags(mem_ctx, dce_ctx, scfg);
+
+               return WERR_OK;
+       }
+       default:
+               return WERR_UNKNOWN_LEVEL;
+       }
+
+       return WERR_UNKNOWN_LEVEL;
+}
 
 /* 
   srvsvc_NetShareEnumAll
 */
-static NTSTATUS srvsvc_NetShareEnumAll(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
-                      struct srvsvc_NetShareEnumAll *r)
+static WERROR dcesrv_srvsvc_NetShareEnumAll(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+                                    struct srvsvc_NetShareEnumAll *r)
 {
-       struct dcesrv_context *dce_ctx = dce_call->conn->dce_ctx;
+       NTSTATUS nterr;
+       int numshares = 0;
+       const char **snames;
+       struct share_context *sctx;
+       struct share_config *scfg;
+
        r->out.level = r->in.level;
+       ZERO_STRUCT(r->out.ctr);
        r->out.totalentries = 0;
        r->out.resume_handle = NULL;
-       r->out.result = WERR_OK;
 
-       switch (r->in.level) {
-       case 0: {
-               int i;
+       /* TODO: - paging of results 
+        */
 
-               r->out.ctr.ctr0 = talloc_p(mem_ctx, struct srvsvc_NetShareCtr0);
-               WERR_TALLOC_CHECK(r->out.ctr.ctr0);
+       nterr = share_get_context_by_name(mem_ctx, lp_share_backend(dce_call->conn->dce_ctx->lp_ctx), dce_call->event_ctx, dce_call->conn->dce_ctx->lp_ctx, &sctx);
+       if (!NT_STATUS_IS_OK(nterr)) {
+               return ntstatus_to_werror(nterr);
+       }
 
-               r->out.ctr.ctr0->count = dcesrv_common_get_count_of_shares(mem_ctx, dce_ctx);
-               r->out.ctr.ctr0->array = NULL;
+       nterr = share_list_all(mem_ctx, sctx, &numshares, &snames);
+       if (!NT_STATUS_IS_OK(nterr)) {
+               return ntstatus_to_werror(nterr);
+       }
 
-               if (r->out.ctr.ctr0->count == 0) break;
+       switch (r->in.level) {
+       case 0:
+       {
+               int i;
+               struct srvsvc_NetShareCtr0 *ctr0;
 
-               r->out.ctr.ctr0->array = talloc_array_p(mem_ctx, struct srvsvc_NetShareInfo0, r->out.ctr.ctr0->count);
-               WERR_TALLOC_CHECK(r->out.ctr.ctr0->array);
+               ctr0 = talloc(mem_ctx, struct srvsvc_NetShareCtr0);
+               W_ERROR_HAVE_NO_MEMORY(ctr0);
 
-               for (i=0;i<r->out.ctr.ctr0->count;i++) {
-                       r->out.ctr.ctr0->array[i].name = dcesrv_common_get_share_name(mem_ctx, dce_ctx, i);
-                       WERR_TALLOC_CHECK(r->out.ctr.ctr0->array[i].name);
-               }
+               ctr0->count = numshares;
+               ctr0->array = NULL;
 
-               r->out.totalentries = r->out.ctr.ctr0->count;
+               if (ctr0->count == 0) {
+                       r->out.ctr.ctr0 = ctr0;
+                       return WERR_OK;
+               }
 
-               break;
+               ctr0->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo0, ctr0->count);
+               W_ERROR_HAVE_NO_MEMORY(ctr0->array);
+
+               for (i = 0; i < ctr0->count; i++) {
+                       WERROR status;
+                       union srvsvc_NetShareInfo info;
+
+                       nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
+                       if (!NT_STATUS_IS_OK(nterr)) {
+                               DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
+                               return WERR_GENERAL_FAILURE;
+                       }
+                       info.info0 = &ctr0->array[i];
+                       status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
+                       if (!W_ERROR_IS_OK(status)) {
+                               return status;
+                       }
+                       talloc_free(scfg);
                }
-       case 1: {
-               int i;
-               r->out.ctr.ctr1 = talloc_p(mem_ctx, struct srvsvc_NetShareCtr1);
-               WERR_TALLOC_CHECK(r->out.ctr.ctr1);
+               talloc_free(snames);
 
-               r->out.ctr.ctr1->count = dcesrv_common_get_count_of_shares(mem_ctx, dce_ctx);
-               r->out.ctr.ctr1->array = NULL;
+               r->out.ctr.ctr0         = ctr0;
+               r->out.totalentries     = r->out.ctr.ctr0->count;
+               return WERR_OK;
+       }
+       case 1:
+       {
+               int i;
+               struct srvsvc_NetShareCtr1 *ctr1;
 
-               if (r->out.ctr.ctr1->count == 0) break;
+               ctr1 = talloc(mem_ctx, struct srvsvc_NetShareCtr1);
+               W_ERROR_HAVE_NO_MEMORY(ctr1);
 
-               r->out.ctr.ctr1->array = talloc_array_p(mem_ctx, struct srvsvc_NetShareInfo1, r->out.ctr.ctr1->count);
-               WERR_TALLOC_CHECK(r->out.ctr.ctr1->array);
+               ctr1->count = numshares;
+               ctr1->array = NULL;
 
-               for (i=0;i<r->out.ctr.ctr1->count;i++) {
-                       r->out.ctr.ctr1->array[i].name = dcesrv_common_get_share_name(mem_ctx, dce_ctx, i);
-                       r->out.ctr.ctr1->array[i].type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, i);
-                       r->out.ctr.ctr1->array[i].comment = dcesrv_common_get_share_comment(mem_ctx, dce_ctx, i);
+               if (ctr1->count == 0) {
+                       r->out.ctr.ctr1 = ctr1;
+                       return WERR_OK;
                }
 
-               r->out.totalentries = r->out.ctr.ctr1->count;
-
-               break;
+               ctr1->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo1, ctr1->count);
+               W_ERROR_HAVE_NO_MEMORY(ctr1->array);
+
+               for (i=0; i < ctr1->count; i++) {
+                       WERROR status;
+                       union srvsvc_NetShareInfo info;
+
+                       nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
+                       if (!NT_STATUS_IS_OK(nterr)) {
+                               DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
+                               return WERR_GENERAL_FAILURE;
+                       }
+                       info.info1 = &ctr1->array[i];
+                       status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
+                       if (!W_ERROR_IS_OK(status)) {
+                               return status;
+                       }
+                       talloc_free(scfg);
                }
-       case 2: {
+               talloc_free(snames);
+
+               r->out.ctr.ctr1         = ctr1;
+               r->out.totalentries     = r->out.ctr.ctr1->count;
+               return WERR_OK;
+       }
+       case 2:
+       {
                int i;
-               r->out.ctr.ctr2 = talloc_p(mem_ctx, struct srvsvc_NetShareCtr2);
-               WERR_TALLOC_CHECK(r->out.ctr.ctr2);
+               struct srvsvc_NetShareCtr2 *ctr2;
 
-               r->out.ctr.ctr2->count = dcesrv_common_get_count_of_shares(mem_ctx, dce_ctx);
-               r->out.ctr.ctr2->array = NULL;
+               SRVSVC_CHECK_ADMIN_ACCESS;
 
-               if (r->out.ctr.ctr2->count == 0) break;
+               ctr2 = talloc(mem_ctx, struct srvsvc_NetShareCtr2);
+               W_ERROR_HAVE_NO_MEMORY(ctr2);
 
-               r->out.ctr.ctr2->array = talloc_array_p(mem_ctx, struct srvsvc_NetShareInfo2, r->out.ctr.ctr2->count);
-               WERR_TALLOC_CHECK(r->out.ctr.ctr2->array);
+               ctr2->count = numshares;
+               ctr2->array = NULL;
 
-               for (i=0;i<r->out.ctr.ctr2->count;i++) {
-                       r->out.ctr.ctr2->array[i].name = dcesrv_common_get_share_name(mem_ctx, dce_ctx, i);
-                       r->out.ctr.ctr2->array[i].type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, i);
-                       r->out.ctr.ctr2->array[i].comment = dcesrv_common_get_share_comment(mem_ctx, dce_ctx, i);
-                       r->out.ctr.ctr2->array[i].permissions = dcesrv_common_get_share_permissions(mem_ctx, dce_ctx, i);
-                       r->out.ctr.ctr2->array[i].max_users = dcesrv_common_get_share_max_users(mem_ctx, dce_ctx, i);
-                       r->out.ctr.ctr2->array[i].current_users = dcesrv_common_get_share_current_users(mem_ctx, dce_ctx, i);
-                       r->out.ctr.ctr2->array[i].path = dcesrv_common_get_share_path(mem_ctx, dce_ctx, i);
-                       r->out.ctr.ctr2->array[i].password = dcesrv_common_get_share_password(mem_ctx, dce_ctx, i);
+               if (ctr2->count == 0) {
+                       r->out.ctr.ctr2 = ctr2;
+                       return WERR_OK;
                }
 
-               r->out.totalentries = r->out.ctr.ctr2->count;
-
-               break;
+               ctr2->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo2, ctr2->count);
+               W_ERROR_HAVE_NO_MEMORY(ctr2->array);
+
+               for (i=0; i < ctr2->count; i++) {
+                       WERROR status;
+                       union srvsvc_NetShareInfo info;
+
+                       nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
+                       if (!NT_STATUS_IS_OK(nterr)) {
+                               DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
+                               return WERR_GENERAL_FAILURE;
+                       }
+                       info.info2 = &ctr2->array[i];
+                       status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
+                       if (!W_ERROR_IS_OK(status)) {
+                               return status;
+                       }
+                       talloc_free(scfg);
                }
-       case 501:{
+               talloc_free(snames);
+
+               r->out.ctr.ctr2         = ctr2;
+               r->out.totalentries     = r->out.ctr.ctr2->count;
+               return WERR_OK;
+       }
+       case 501:
+       {
                int i;
-               r->out.ctr.ctr501 = talloc_p(mem_ctx, struct srvsvc_NetShareCtr501);
-               WERR_TALLOC_CHECK(r->out.ctr.ctr501);
+               struct srvsvc_NetShareCtr501 *ctr501;
 
-               r->out.ctr.ctr501->count = dcesrv_common_get_count_of_shares(mem_ctx, dce_ctx);
-               r->out.ctr.ctr501->array = NULL;
+               SRVSVC_CHECK_ADMIN_ACCESS;
 
-               if (r->out.ctr.ctr501->count == 0) break;
+               ctr501 = talloc(mem_ctx, struct srvsvc_NetShareCtr501);
+               W_ERROR_HAVE_NO_MEMORY(ctr501);
 
-               r->out.ctr.ctr501->array = talloc_array_p(mem_ctx, struct srvsvc_NetShareInfo501, r->out.ctr.ctr501->count);
-               WERR_TALLOC_CHECK(r->out.ctr.ctr501->array);
+               ctr501->count = numshares;
+               ctr501->array = NULL;
 
-               for (i=0;i<r->out.ctr.ctr501->count;i++) {
-                       r->out.ctr.ctr501->array[i].name = dcesrv_common_get_share_name(mem_ctx, dce_ctx, i);
-                       r->out.ctr.ctr501->array[i].type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, i);
-                       r->out.ctr.ctr501->array[i].comment = dcesrv_common_get_share_comment(mem_ctx, dce_ctx, i);
-                       r->out.ctr.ctr501->array[i].csc_policy = dcesrv_common_get_share_csc_policy(mem_ctx, dce_ctx, i);
+               if (ctr501->count == 0) {
+                       r->out.ctr.ctr501 = ctr501;
+                       return WERR_OK;
                }
 
-               r->out.totalentries = r->out.ctr.ctr501->count;
-
-               break;
+               ctr501->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo501, ctr501->count);
+               W_ERROR_HAVE_NO_MEMORY(ctr501->array);
+
+               for (i=0; i < ctr501->count; i++) {
+                       WERROR status;
+                       union srvsvc_NetShareInfo info;
+
+                       nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
+                       if (!NT_STATUS_IS_OK(nterr)) {
+                               DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
+                               return WERR_GENERAL_FAILURE;
+                       }
+                       info.info501 = &ctr501->array[i];
+                       status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
+                       if (!W_ERROR_IS_OK(status)) {
+                               return status;
+                       }
+                       talloc_free(scfg);
                }
-       case 502:{
+               talloc_free(snames);
+
+               r->out.ctr.ctr501       = ctr501;
+               r->out.totalentries     = r->out.ctr.ctr501->count;
+               return WERR_OK;
+       }
+       case 502:
+       {
                int i;
-               r->out.ctr.ctr502 = talloc_p(mem_ctx, struct srvsvc_NetShareCtr502);
-               WERR_TALLOC_CHECK(r->out.ctr.ctr502);
-
-               r->out.ctr.ctr502->count = dcesrv_common_get_count_of_shares(mem_ctx, dce_ctx);
-               r->out.ctr.ctr502->array = NULL;
-
-               if (r->out.ctr.ctr502->count == 0) break;
-
-               r->out.ctr.ctr502->array = talloc_array_p(mem_ctx, struct srvsvc_NetShareInfo502, r->out.ctr.ctr502->count);
-               WERR_TALLOC_CHECK(r->out.ctr.ctr502->array);
-
-               for (i=0;i<r->out.ctr.ctr502->count;i++) {
-                       r->out.ctr.ctr502->array[i].name = dcesrv_common_get_share_name(mem_ctx, dce_ctx, i);
-                       r->out.ctr.ctr502->array[i].type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, i);
-                       r->out.ctr.ctr502->array[i].comment = dcesrv_common_get_share_comment(mem_ctx, dce_ctx, i);
-                       r->out.ctr.ctr502->array[i].permissions = dcesrv_common_get_share_permissions(mem_ctx, dce_ctx, i);
-                       r->out.ctr.ctr502->array[i].max_users = dcesrv_common_get_share_max_users(mem_ctx, dce_ctx, i);
-                       r->out.ctr.ctr502->array[i].current_users = dcesrv_common_get_share_current_users(mem_ctx, dce_ctx, i);
-                       r->out.ctr.ctr502->array[i].path = dcesrv_common_get_share_path(mem_ctx, dce_ctx, i);
-                       r->out.ctr.ctr502->array[i].password = dcesrv_common_get_share_password(mem_ctx, dce_ctx, i);
-                       r->out.ctr.ctr502->array[i].unknown = dcesrv_common_get_share_unknown(mem_ctx, dce_ctx, i);
-                       r->out.ctr.ctr502->array[i].sd = dcesrv_common_get_security_descriptor(mem_ctx, dce_ctx, i);
-               }
+               struct srvsvc_NetShareCtr502 *ctr502;
 
-               r->out.totalentries = r->out.ctr.ctr502->count;
+               SRVSVC_CHECK_ADMIN_ACCESS;
 
-               break;
+               ctr502 = talloc(mem_ctx, struct srvsvc_NetShareCtr502);
+               W_ERROR_HAVE_NO_MEMORY(ctr502);
+
+               ctr502->count = numshares;
+               ctr502->array = NULL;
+
+               if (ctr502->count == 0) {
+                       r->out.ctr.ctr502 = ctr502;
+                       return WERR_OK;
                }
+
+               ctr502->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo502, ctr502->count);
+               W_ERROR_HAVE_NO_MEMORY(ctr502->array);
+
+               for (i=0; i < ctr502->count; i++) {
+                       WERROR status;
+                       union srvsvc_NetShareInfo info;
+
+                       nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
+                       if (!NT_STATUS_IS_OK(nterr)) {
+                               DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
+                               return WERR_GENERAL_FAILURE;
+                       }
+                       info.info502 = &ctr502->array[i];
+                       status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
+                       if (!W_ERROR_IS_OK(status)) {
+                               return status;
+                       }
+                       talloc_free(scfg);
+               }
+               talloc_free(snames);
+
+               r->out.ctr.ctr502       = ctr502;
+               r->out.totalentries     = r->out.ctr.ctr502->count;
+               return WERR_OK;
+       }
        default:
-               r->out.result = WERR_UNKNOWN_LEVEL;
-               break;
+               return WERR_UNKNOWN_LEVEL;
        }
 
-       return NT_STATUS_OK;
+       return WERR_UNKNOWN_LEVEL;
 }
 
 
 /* 
   srvsvc_NetShareGetInfo 
 */
-static NTSTATUS srvsvc_NetShareGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
-                      struct srvsvc_NetShareGetInfo *r)
+static WERROR dcesrv_srvsvc_NetShareGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+                                    struct srvsvc_NetShareGetInfo *r)
 {
-       r->out.result = WERR_OK;
+       NTSTATUS nterr;
+       struct share_context *sctx = NULL;
+       struct share_config *scfg = NULL;
+
+       ZERO_STRUCTP(r->out.info);
+
+       /* TODO: - access check
+        */
+
+       if (strcmp("", r->in.share_name) == 0) {
+               return WERR_INVALID_PARAM;
+       }
+
+       nterr = share_get_context_by_name(mem_ctx, lp_share_backend(dce_call->conn->dce_ctx->lp_ctx), dce_call->event_ctx, dce_call->conn->dce_ctx->lp_ctx, &sctx);
+       if (!NT_STATUS_IS_OK(nterr)) {
+               return ntstatus_to_werror(nterr);
+       }
+
+       nterr = share_get_config(mem_ctx, sctx, r->in.share_name, &scfg);
+       if (!NT_STATUS_IS_OK(nterr)) {
+               return ntstatus_to_werror(nterr);
+       }
 
        switch (r->in.level) {
-       case 0: {
-               r->out.info.info0 = NULL;
+       case 0:
+       {
+               WERROR status;
+               union srvsvc_NetShareInfo info;
 
-               r->out.result = WERR_NOT_SUPPORTED;
-               break;
+               info.info0 = talloc(mem_ctx, struct srvsvc_NetShareInfo0);
+               W_ERROR_HAVE_NO_MEMORY(info.info0);
+
+               status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
+               if (!W_ERROR_IS_OK(status)) {
+                       return status;
                }
-       case 1: {
-               r->out.info.info0 = NULL;
 
-               r->out.result = WERR_NOT_SUPPORTED;
-               break;
+               r->out.info->info0 = info.info0;
+               return WERR_OK;
+       }
+       case 1:
+       {
+               WERROR status;
+               union srvsvc_NetShareInfo info;
+
+               info.info1 = talloc(mem_ctx, struct srvsvc_NetShareInfo1);
+               W_ERROR_HAVE_NO_MEMORY(info.info1);
+
+               status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
+               if (!W_ERROR_IS_OK(status)) {
+                       return status;
                }
-       case 2: {
-               r->out.info.info0 = NULL;
 
-               r->out.result = WERR_NOT_SUPPORTED;
-               break;
+               r->out.info->info1 = info.info1;
+               return WERR_OK;
+       }
+       case 2:
+       {
+               WERROR status;
+               union srvsvc_NetShareInfo info;
+
+               SRVSVC_CHECK_ADMIN_ACCESS;
+
+               info.info2 = talloc(mem_ctx, struct srvsvc_NetShareInfo2);
+               W_ERROR_HAVE_NO_MEMORY(info.info2);
+
+               status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
+               if (!W_ERROR_IS_OK(status)) {
+                       return status;
                }
-       case 501:{
-               r->out.info.info0 = NULL;
 
-               r->out.result = WERR_NOT_SUPPORTED;
-               break;
+               r->out.info->info2 = info.info2;
+               return WERR_OK;
+       }
+       case 501:
+       {
+               WERROR status;
+               union srvsvc_NetShareInfo info;
+
+               info.info501 = talloc(mem_ctx, struct srvsvc_NetShareInfo501);
+               W_ERROR_HAVE_NO_MEMORY(info.info501);
+
+               status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
+               if (!W_ERROR_IS_OK(status)) {
+                       return status;
                }
-       case 502:{
-               r->out.info.info0 = NULL;
 
-               r->out.result = WERR_NOT_SUPPORTED;
-               break;
+               r->out.info->info501 = info.info501;
+               return WERR_OK;
+       }
+       case 502:
+       {
+               WERROR status;
+               union srvsvc_NetShareInfo info;
+
+               SRVSVC_CHECK_ADMIN_ACCESS;
+
+               info.info502 = talloc(mem_ctx, struct srvsvc_NetShareInfo502);
+               W_ERROR_HAVE_NO_MEMORY(info.info502);
+
+               status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
+               if (!W_ERROR_IS_OK(status)) {
+                       return status;
+               }
+
+               r->out.info->info502 = info.info502;
+               return WERR_OK;
+       }
+       case 1005:
+       {
+               WERROR status;
+               union srvsvc_NetShareInfo info;
+
+               info.info1005 = talloc(mem_ctx, struct srvsvc_NetShareInfo1005);
+               W_ERROR_HAVE_NO_MEMORY(info.info1005);
+
+               status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
+               if (!W_ERROR_IS_OK(status)) {
+                       return status;
                }
+
+               r->out.info->info1005 = info.info1005;
+               return WERR_OK;
+       }
        default:
-               r->out.result = WERR_UNKNOWN_LEVEL;
-               break;
+               return WERR_UNKNOWN_LEVEL;
        }
 
-       return NT_STATUS_OK;
+       return WERR_UNKNOWN_LEVEL;
 }
 
+static WERROR dcesrv_srvsvc_fill_share_info(struct share_info *info, int *count,
+                                       const char *share_name, int level,
+                                       const char *name,
+                                       const char *path,
+                                       const char *comment,
+                                       const char *password,
+                                       enum srvsvc_ShareType type,
+                                       int32_t max_users,
+                                       uint32_t csc_policy,
+                                       struct security_descriptor *sd)
+{
+       int i = 0;
+
+       if (level == 501) {
+               info[i].name = SHARE_CSC_POLICY;
+               info[i].type = SHARE_INFO_INT;
+               info[i].value = talloc(info, int);
+               *((int *)info[i].value) = csc_policy;
+               i++;
+       }
+       
+       switch(level) {
+
+       case 502:
+               /* TODO: check if unknown is csc_policy */
+
+               /* TODO: security descriptor */
+
+       case 2:
+               if (path && path[0]) {
+                       info[i].name = SHARE_PATH;
+                       info[i].type = SHARE_INFO_STRING;
+
+                       /* Windows will send a path in a form of C:\example\path */
+                       if (path[1] == ':') {
+                               info[i].value = talloc_strdup(info, &path[2]);
+                       } else {
+                               /* very strange let's try to set as is */
+                               info[i].value = talloc_strdup(info, path);
+                       }
+                       W_ERROR_HAVE_NO_MEMORY(info[i].value);
+                       all_string_sub((char *)info[i].value, "\\", "/", 0);
+
+                       i++;
+               }
+
+               if (password && password[0]) {
+                       info[i].name = SHARE_PASSWORD;
+                       info[i].type = SHARE_INFO_STRING;
+                       info[i].value = talloc_strdup(info, password);
+                       W_ERROR_HAVE_NO_MEMORY(info[i].value);
+
+                       i++;
+               }
+
+               info[i].name = SHARE_MAX_CONNECTIONS;
+               info[i].type = SHARE_INFO_INT;
+               info[i].value = talloc(info, int);
+               *((int *)info[i].value) = max_users;
+               i++;
+
+       case 501:
+       case 1:
+               info[i].name = SHARE_TYPE;
+               info[i].type = SHARE_INFO_STRING;
+               switch (type) {
+               case 0x00:
+                       info[i].value = talloc_strdup(info, "DISK");
+                       break;
+               case 0x01:
+                       info[i].value = talloc_strdup(info, "PRINTER");
+                       break;
+               case 0x03:
+                       info[i].value = talloc_strdup(info, "IPC");
+                       break;
+               default:
+                       return WERR_INVALID_PARAM;
+               }
+               W_ERROR_HAVE_NO_MEMORY(info[i].value);
+               i++;
+
+       case 1004:
+               if (comment) {
+                       info[i].name = SHARE_COMMENT;
+                       info[i].type = SHARE_INFO_STRING;
+                       info[i].value = talloc_strdup(info, comment);
+                       W_ERROR_HAVE_NO_MEMORY(info[i].value);
+
+                       i++;
+               }
+       case 0:
+               if (name &&
+                   strcasecmp(share_name, name) != 0) {
+                       info[i].name = SHARE_NAME;
+                       info[i].type = SHARE_INFO_STRING;
+                       info[i].value = talloc_strdup(info, name);
+                       W_ERROR_HAVE_NO_MEMORY(info[i].value);
+                       i++;
+               }
+
+               break;
+
+       default:
+               return WERR_UNKNOWN_LEVEL;
+       }
+
+       *count = i;
+
+       return WERR_OK;
+}
 
 /* 
   srvsvc_NetShareSetInfo 
 */
-static NTSTATUS srvsvc_NetShareSetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR dcesrv_srvsvc_NetShareSetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
                       struct srvsvc_NetShareSetInfo *r)
 {
-       return NT_STATUS_NOT_IMPLEMENTED;
-}
+       NTSTATUS nterr;
+       WERROR status;
+       struct share_context *sctx = NULL;
+       struct share_info *info;
+       int count;
 
+       /* TODO: - access check
+        */
 
-/* 
-  srvsvc_NetShareDel 
-*/
-static NTSTATUS srvsvc_NetShareDel(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
-                      struct srvsvc_NetShareDel *r)
-{
-       return NT_STATUS_NOT_IMPLEMENTED;
+       /* there are no more than 10 options in all struct srvsvc_NetShareInfoXXX */
+       info = talloc_array(mem_ctx, struct share_info, 10);
+       W_ERROR_HAVE_NO_MEMORY(info);
+
+       ZERO_STRUCT(r->out);
+
+       if (strcmp("", r->in.share_name) == 0) {
+               return WERR_INVALID_PARAM;
+       }
+
+       nterr = share_get_context_by_name(mem_ctx, lp_share_backend(dce_call->conn->dce_ctx->lp_ctx), dce_call->event_ctx, dce_call->conn->dce_ctx->lp_ctx, &sctx);
+       if (!NT_STATUS_IS_OK(nterr)) {
+               return ntstatus_to_werror(nterr);
+       }
+
+       switch (r->in.level) {
+       case 0:
+       {
+               status = dcesrv_srvsvc_fill_share_info(info, &count,
+                                       r->in.share_name, r->in.level,
+                                       r->in.info->info0->name,
+                                       NULL,
+                                       NULL,
+                                       NULL,
+                                       0,
+                                       0,
+                                       0,
+                                       NULL);
+               if (W_ERROR_EQUAL(status, WERR_OK)) {
+                       return status;
+               }
+               break;
+       }
+       case 1:
+       {
+               status = dcesrv_srvsvc_fill_share_info(info, &count,
+                                       r->in.share_name, r->in.level,
+                                       r->in.info->info1->name,
+                                       NULL,
+                                       r->in.info->info1->comment,
+                                       NULL,
+                                       r->in.info->info1->type,
+                                       0,
+                                       0,
+                                       NULL);
+               if (W_ERROR_EQUAL(status, WERR_OK)) {
+                       return status;
+               }
+               break;
+       }
+       case 2:
+       {
+               status = dcesrv_srvsvc_fill_share_info(info, &count,
+                                       r->in.share_name, r->in.level,
+                                       r->in.info->info2->name,
+                                       r->in.info->info2->path,
+                                       r->in.info->info2->comment,
+                                       r->in.info->info2->password,
+                                       r->in.info->info2->type,
+                                       r->in.info->info2->max_users,
+                                       0,
+                                       NULL);
+               if (W_ERROR_EQUAL(status, WERR_OK)) {
+                       return status;
+               }
+               break;
+       }
+       case 501:
+       {
+               status = dcesrv_srvsvc_fill_share_info(info, &count,
+                                       r->in.share_name, r->in.level,
+                                       r->in.info->info501->name,
+                                       NULL,
+                                       r->in.info->info501->comment,
+                                       NULL,
+                                       r->in.info->info501->type,
+                                       0,
+                                       r->in.info->info501->csc_policy,
+                                       NULL);
+               if (W_ERROR_EQUAL(status, WERR_OK)) {
+                       return status;
+               }
+               break;
+       }
+       case 502:
+       {
+               status = dcesrv_srvsvc_fill_share_info(info, &count,
+                                       r->in.share_name, r->in.level,
+                                       r->in.info->info502->name,
+                                       r->in.info->info502->path,
+                                       r->in.info->info502->comment,
+                                       r->in.info->info502->password,
+                                       r->in.info->info502->type,
+                                       r->in.info->info502->max_users,
+                                       0,
+                                       r->in.info->info502->sd_buf.sd);
+               if (W_ERROR_EQUAL(status, WERR_OK)) {
+                       return status;
+               }
+               break;
+       }
+       case 1004:
+       {
+               status = dcesrv_srvsvc_fill_share_info(info, &count,
+                                       r->in.share_name, r->in.level,
+                                       NULL,
+                                       NULL,
+                                       r->in.info->info1004->comment,
+                                       NULL,
+                                       0,
+                                       0,
+                                       0,
+                                       NULL);
+               if (W_ERROR_EQUAL(status, WERR_OK)) {
+                       return status;
+               }
+               break;
+       }
+       case 1005:
+       {
+               /* r->in.info.dfs_flags; */
+               
+               if (r->in.parm_error) {
+                       r->out.parm_error = r->in.parm_error;
+               }
+
+               return WERR_OK;
+       }
+       default:
+               return WERR_UNKNOWN_LEVEL;
+       }
+
+       nterr = share_set(sctx, r->in.share_name, info, count);
+       if (!NT_STATUS_IS_OK(nterr)) {
+               return ntstatus_to_werror(nterr);
+       }
+
+       if (r->in.parm_error) {
+               r->out.parm_error = r->in.parm_error;
+       }
+               
+       return WERR_OK;
 }
 
 
 /* 
   srvsvc_NetShareDelSticky 
 */
-static NTSTATUS srvsvc_NetShareDelSticky(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR dcesrv_srvsvc_NetShareDelSticky(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
                       struct srvsvc_NetShareDelSticky *r)
 {
-       return NT_STATUS_NOT_IMPLEMENTED;
+       DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
 }
 
 
 /* 
   srvsvc_NetShareCheck 
 */
-static NTSTATUS srvsvc_NetShareCheck(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR dcesrv_srvsvc_NetShareCheck(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
                       struct srvsvc_NetShareCheck *r)
 {
-       return NT_STATUS_NOT_IMPLEMENTED;
+       NTSTATUS nterr;
+       struct share_context *sctx = NULL;
+       struct share_config *scfg = NULL;
+       char *device;
+       const char **names;
+       int count, i;
+
+       *r->out.type = 0;
+
+       /* TODO: - access check
+        */
+
+       if (strcmp("", r->in.device_name) == 0) {
+               *r->out.type = STYPE_IPC;
+               return WERR_OK;
+       }
+
+       /* copy the path skipping C:\ */
+       if (strncasecmp(r->in.device_name, "C:", 2) == 0) {
+               device = talloc_strdup(mem_ctx, &r->in.device_name[2]);
+       } else {
+               /* no chance we have a share that doesn't start with C:\ */
+               return WERR_DEVICE_NOT_SHARED;
+       }
+       all_string_sub(device, "\\", "/", 0);
+
+       nterr = share_get_context_by_name(mem_ctx, lp_share_backend(dce_call->conn->dce_ctx->lp_ctx), dce_call->event_ctx, dce_call->conn->dce_ctx->lp_ctx, &sctx);
+       if (!NT_STATUS_IS_OK(nterr)) {
+               return ntstatus_to_werror(nterr);
+       }
+
+       nterr = share_list_all(mem_ctx, sctx, &count, &names);
+       if (!NT_STATUS_IS_OK(nterr)) {
+               return ntstatus_to_werror(nterr);
+       }
+
+       for (i = 0; i < count; i++) {
+               const char *path;
+               const char *type;
+
+               nterr = share_get_config(mem_ctx, sctx, names[i], &scfg);
+               if (!NT_STATUS_IS_OK(nterr)) {
+                       return ntstatus_to_werror(nterr);
+               }
+               path = share_string_option(scfg, SHARE_PATH, NULL);
+               if (!path) continue;
+
+               if (strcmp(device, path) == 0) {                
+                       type = share_string_option(scfg, SHARE_TYPE, NULL);
+                       if (!type) continue;
+
+                       if (strcmp(type, "DISK") == 0) {
+                               *r->out.type = STYPE_DISKTREE;
+                               return WERR_OK;
+                       }
+
+                       if (strcmp(type, "IPC") == 0) {
+                               *r->out.type = STYPE_IPC;
+                               return WERR_OK;
+                       }
+
+                       if (strcmp(type, "PRINTER") == 0) {
+                               *r->out.type = STYPE_PRINTQ;
+                               return WERR_OK;
+                       }
+               }
+       }
+
+       return WERR_DEVICE_NOT_SHARED;
 }
 
 
 /* 
   srvsvc_NetSrvGetInfo 
 */
-static NTSTATUS srvsvc_NetSrvGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR dcesrv_srvsvc_NetSrvGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
                       struct srvsvc_NetSrvGetInfo *r)
 {
-       return NT_STATUS_NOT_IMPLEMENTED;
+       struct dcesrv_context *dce_ctx = dce_call->conn->dce_ctx;
+
+       ZERO_STRUCTP(r->out.info);
+
+       switch (r->in.level) {
+       case 100:
+       {
+               struct srvsvc_NetSrvInfo100 *info100;
+
+               info100 = talloc(mem_ctx, struct srvsvc_NetSrvInfo100);
+               W_ERROR_HAVE_NO_MEMORY(info100);
+
+               info100->platform_id    = dcesrv_common_get_platform_id(mem_ctx, dce_ctx);
+               info100->server_name    = dcesrv_common_get_server_name(mem_ctx, dce_ctx, r->in.server_unc);
+               W_ERROR_HAVE_NO_MEMORY(info100->server_name);
+
+               r->out.info->info100 = info100;
+               return WERR_OK;
+       }
+       case 101:
+       {
+               struct srvsvc_NetSrvInfo101 *info101;
+
+               info101 = talloc(mem_ctx, struct srvsvc_NetSrvInfo101);
+               W_ERROR_HAVE_NO_MEMORY(info101);
+
+               info101->platform_id    = dcesrv_common_get_platform_id(mem_ctx, dce_ctx);
+               info101->server_name    = dcesrv_common_get_server_name(mem_ctx, dce_ctx, r->in.server_unc);
+               W_ERROR_HAVE_NO_MEMORY(info101->server_name);
+
+               info101->version_major  = dcesrv_common_get_version_major(mem_ctx, dce_ctx->lp_ctx);
+               info101->version_minor  = dcesrv_common_get_version_minor(mem_ctx, dce_ctx->lp_ctx);
+               info101->server_type    = dcesrv_common_get_server_type(mem_ctx, dce_call->event_ctx, dce_ctx);
+               info101->comment        = talloc_strdup(mem_ctx, lp_serverstring(dce_ctx->lp_ctx));
+               W_ERROR_HAVE_NO_MEMORY(info101->comment);
+
+               r->out.info->info101 = info101;
+               return WERR_OK;
+       }
+       case 102:
+       {
+               struct srvsvc_NetSrvInfo102 *info102;
+
+               info102 = talloc(mem_ctx, struct srvsvc_NetSrvInfo102);
+               W_ERROR_HAVE_NO_MEMORY(info102);
+
+               info102->platform_id    = dcesrv_common_get_platform_id(mem_ctx, dce_ctx);
+               info102->server_name    = dcesrv_common_get_server_name(mem_ctx, dce_ctx, r->in.server_unc);
+               W_ERROR_HAVE_NO_MEMORY(info102->server_name);
+
+               info102->version_major  = dcesrv_common_get_version_major(mem_ctx, dce_ctx->lp_ctx);
+               info102->version_minor  = dcesrv_common_get_version_minor(mem_ctx, dce_ctx->lp_ctx);
+               info102->server_type    = dcesrv_common_get_server_type(mem_ctx, dce_call->event_ctx, dce_ctx);
+               info102->comment        = talloc_strdup(mem_ctx, lp_serverstring(dce_ctx->lp_ctx));
+               W_ERROR_HAVE_NO_MEMORY(info102->comment);
+
+               info102->users          = dcesrv_common_get_users(mem_ctx, dce_ctx);
+               info102->disc           = dcesrv_common_get_disc(mem_ctx, dce_ctx);
+               info102->hidden         = dcesrv_common_get_hidden(mem_ctx, dce_ctx);
+               info102->announce       = dcesrv_common_get_announce(mem_ctx, dce_ctx);
+               info102->anndelta       = dcesrv_common_get_anndelta(mem_ctx, dce_ctx);
+               info102->licenses       = dcesrv_common_get_licenses(mem_ctx, dce_ctx);
+               info102->userpath       = dcesrv_common_get_userpath(mem_ctx, dce_ctx);
+               W_ERROR_HAVE_NO_MEMORY(info102->userpath);
+
+               r->out.info->info102 = info102;
+               return WERR_OK;
+       }
+       default:
+               return WERR_UNKNOWN_LEVEL;
+       }
+
+       return WERR_UNKNOWN_LEVEL;
 }
 
 
 /* 
   srvsvc_NetSrvSetInfo 
 */
-static NTSTATUS srvsvc_NetSrvSetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR dcesrv_srvsvc_NetSrvSetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
                       struct srvsvc_NetSrvSetInfo *r)
 {
-       return NT_STATUS_NOT_IMPLEMENTED;
+       DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
 }
 
 
 /* 
   srvsvc_NetDiskEnum 
 */
-static NTSTATUS srvsvc_NetDiskEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR dcesrv_srvsvc_NetDiskEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
                       struct srvsvc_NetDiskEnum *r)
 {
-       r->out.count = 0;
-       r->out.ctr0 = NULL;
+       r->out.info.disks = NULL;
+       r->out.info.count = 0;
        r->out.totalentries = 0;
        r->out.resume_handle = NULL;
-       r->out.result = WERR_OK;
 
        switch (r->in.level) {
-       case 0: {
-               r->out.ctr0 = talloc_p(mem_ctx, struct srvsvc_NetDiskCtr0);
-               WERR_TALLOC_CHECK(r->out.ctr0);
+       case 0:
+       {
+               /* we can safely hardcode the reply and report we have only one disk (C:) */
+               /* for some reason Windows wants 2 entries with the second being empty */
+               r->out.info.disks = talloc_array(mem_ctx, struct srvsvc_NetDiskInfo0, 2);
+               W_ERROR_HAVE_NO_MEMORY(r->out.info.disks);
+               r->out.info.count = 2;
 
-               r->out.ctr0->unknown = 0x1;
-               r->out.ctr0->count = 0;
-               r->out.ctr0->array = NULL;
+               r->out.info.disks[0].disk = talloc_strdup(mem_ctx, "C:");
+               W_ERROR_HAVE_NO_MEMORY(r->out.info.disks[0].disk);
 
-               r->out.result = WERR_NOT_SUPPORTED;
-               break;
-               }
+               r->out.info.disks[1].disk = talloc_strdup(mem_ctx, "");
+               W_ERROR_HAVE_NO_MEMORY(r->out.info.disks[1].disk);
+
+               r->out.totalentries = 1;
+               r->out.resume_handle = r->in.resume_handle;
+
+               return WERR_OK;
+       }
        default:
-               r->out.result = WERR_UNKNOWN_LEVEL;
-               break;
+               return WERR_UNKNOWN_LEVEL;
        }
 
-       return NT_STATUS_OK;
+       return WERR_UNKNOWN_LEVEL;
 }
 
 
 /* 
-  srvsvc_NETRSERVERSTATISTICSGET 
+  srvsvc_NetServerStatisticsGet 
 */
-static NTSTATUS srvsvc_NETRSERVERSTATISTICSGET(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
-                      struct srvsvc_NETRSERVERSTATISTICSGET *r)
+static WERROR dcesrv_srvsvc_NetServerStatisticsGet(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+                      struct srvsvc_NetServerStatisticsGet *r)
 {
-       return NT_STATUS_NOT_IMPLEMENTED;
+       DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
 }
 
 
 /* 
-  srvsvc_NETRSERVERTRANSPORTADD 
+  srvsvc_NetTransportAdd 
 */
-static NTSTATUS srvsvc_NETRSERVERTRANSPORTADD(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
-                      struct srvsvc_NETRSERVERTRANSPORTADD *r)
+static WERROR dcesrv_srvsvc_NetTransportAdd(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+                      struct srvsvc_NetTransportAdd *r)
 {
-       return NT_STATUS_NOT_IMPLEMENTED;
+       DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
 }
 
 
 /* 
   srvsvc_NetTransportEnum 
 */
-static NTSTATUS srvsvc_NetTransportEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR dcesrv_srvsvc_NetTransportEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
                       struct srvsvc_NetTransportEnum *r)
 {
-       r->out.level = r->in.level;
-       r->out.totalentries = 0;
-       r->out.resume_handle = NULL;
-       r->out.result = WERR_OK;
+       r->out.transports->level = r->in.transports->level;
+       *r->out.totalentries = 0;
+       if (r->out.resume_handle) {
+               *r->out.resume_handle = 0;
+       }
 
-       switch (r->in.level) {
-       case 0: {
-               r->out.ctr.ctr0 = talloc_p(mem_ctx, struct srvsvc_NetTransportCtr0);
-               WERR_TALLOC_CHECK(r->out.ctr.ctr0);
+       switch (r->in.transports->level) {
+       case 0:
+       {
+               r->out.transports->ctr.ctr0 = talloc(mem_ctx, struct srvsvc_NetTransportCtr0);
+               W_ERROR_HAVE_NO_MEMORY(r->out.transports->ctr.ctr0);
 
-               r->out.ctr.ctr0->count = 0;
-               r->out.ctr.ctr0->array = NULL;
+               r->out.transports->ctr.ctr0->count = 0;
+               r->out.transports->ctr.ctr0->array = NULL;
 
-               r->out.result = WERR_NOT_SUPPORTED;
-               break;
-               }
-       case 1: {
-               r->out.ctr.ctr1 = talloc_p(mem_ctx, struct srvsvc_NetTransportCtr1);
-               WERR_TALLOC_CHECK(r->out.ctr.ctr1);
+               return WERR_NOT_SUPPORTED;
+       }
+       case 1:
+       {
+               r->out.transports->ctr.ctr1 = talloc(mem_ctx, struct srvsvc_NetTransportCtr1);
+               W_ERROR_HAVE_NO_MEMORY(r->out.transports->ctr.ctr1);
 
-               r->out.ctr.ctr1->count = 0;
-               r->out.ctr.ctr1->array = NULL;
+               r->out.transports->ctr.ctr1->count = 0;
+               r->out.transports->ctr.ctr1->array = NULL;
 
-               r->out.result = WERR_NOT_SUPPORTED;
-               break;
-               }
-       case 2: {
-               r->out.ctr.ctr2 = talloc_p(mem_ctx, struct srvsvc_NetTransportCtr2);
-               WERR_TALLOC_CHECK(r->out.ctr.ctr2);
+               return WERR_NOT_SUPPORTED;
+       }
+       case 2:
+       {
+               r->out.transports->ctr.ctr2 = talloc(mem_ctx, struct srvsvc_NetTransportCtr2);
+               W_ERROR_HAVE_NO_MEMORY(r->out.transports->ctr.ctr2);
 
-               r->out.ctr.ctr2->count = 0;
-               r->out.ctr.ctr2->array = NULL;
+               r->out.transports->ctr.ctr2->count = 0;
+               r->out.transports->ctr.ctr2->array = NULL;
 
-               r->out.result = WERR_NOT_SUPPORTED;
-               break;
-               }
-       case 3: {
-               r->out.ctr.ctr3 = talloc_p(mem_ctx, struct srvsvc_NetTransportCtr3);
-               WERR_TALLOC_CHECK(r->out.ctr.ctr3);
+               return WERR_NOT_SUPPORTED;
+       }
+       case 3:
+       {
+               r->out.transports->ctr.ctr3 = talloc(mem_ctx, struct srvsvc_NetTransportCtr3);
+               W_ERROR_HAVE_NO_MEMORY(r->out.transports->ctr.ctr3);
 
-               r->out.ctr.ctr3->count = 0;
-               r->out.ctr.ctr3->array = NULL;
+               r->out.transports->ctr.ctr3->count = 0;
+               r->out.transports->ctr.ctr3->array = NULL;
 
-               r->out.result = WERR_NOT_SUPPORTED;
-               break;
-               }
+               return WERR_NOT_SUPPORTED;
+       }
        default:
-               r->out.result = WERR_UNKNOWN_LEVEL;
-               break;
+               return WERR_UNKNOWN_LEVEL;
        }
 
-       return NT_STATUS_OK;
+       return WERR_UNKNOWN_LEVEL;
 }
 
-
 /* 
-  srvsvc_NETRSERVERTRANSPORTDEL 
+  srvsvc_NetTransportDel 
 */
-static NTSTATUS srvsvc_NETRSERVERTRANSPORTDEL(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
-                      struct srvsvc_NETRSERVERTRANSPORTDEL *r)
+static WERROR dcesrv_srvsvc_NetTransportDel(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+                      struct srvsvc_NetTransportDel *r)
 {
-       return NT_STATUS_NOT_IMPLEMENTED;
+       DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
 }
 
 
 /* 
-  srvsvc_NET_REMOTE_TOD 
+  srvsvc_NetRemoteTOD 
 */
-static NTSTATUS srvsvc_NET_REMOTE_TOD(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
-                      struct srvsvc_NET_REMOTE_TOD *r)
+static WERROR dcesrv_srvsvc_NetRemoteTOD(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+                      struct srvsvc_NetRemoteTOD *r)
 {
-       return NT_STATUS_NOT_IMPLEMENTED;
+       struct timeval tval;
+       time_t t;
+       struct tm tm;
+       struct srvsvc_NetRemoteTODInfo *info;
+
+       info = talloc(mem_ctx, struct srvsvc_NetRemoteTODInfo);
+       W_ERROR_HAVE_NO_MEMORY(info);
+
+       GetTimeOfDay(&tval);
+       t = tval.tv_sec;
+
+       gmtime_r(&t, &tm);
+
+       info->elapsed   = t;
+       /* TODO: fake the uptime: just return the milliseconds till 0:00:00 today */
+       info->msecs     = (tm.tm_hour*60*60*1000)
+                       + (tm.tm_min*60*1000)
+                       + (tm.tm_sec*1000)
+                       + (tval.tv_usec/1000);
+       info->hours     = tm.tm_hour;
+       info->mins      = tm.tm_min;
+       info->secs      = tm.tm_sec;
+       info->hunds     = tval.tv_usec/10000;
+       info->timezone  = get_time_zone(t)/60;
+       info->tinterval = 310; /* just return the same as windows */
+       info->day       = tm.tm_mday;
+       info->month     = tm.tm_mon + 1;
+       info->year      = tm.tm_year + 1900;
+       info->weekday   = tm.tm_wday;
+
+       *r->out.info = info;
+
+       return WERR_OK;
 }
 
-
 /* 
-  srvsvc_NETRSERVERSETSERVICEBITS 
+  srvsvc_NetPathType 
 */
-static NTSTATUS srvsvc_NETRSERVERSETSERVICEBITS(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
-                      struct srvsvc_NETRSERVERSETSERVICEBITS *r)
+static WERROR dcesrv_srvsvc_NetPathType(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+                      struct srvsvc_NetPathType *r)
 {
-       return NT_STATUS_NOT_IMPLEMENTED;
+       DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
 }
 
 
 /* 
-  srvsvc_NETRPRPATHTYPE 
+  srvsvc_NetPathCanonicalize 
 */
-static NTSTATUS srvsvc_NETRPRPATHTYPE(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
-                      struct srvsvc_NETRPRPATHTYPE *r)
+static WERROR dcesrv_srvsvc_NetPathCanonicalize(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+                      struct srvsvc_NetPathCanonicalize *r)
 {
-       return NT_STATUS_NOT_IMPLEMENTED;
+       DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
 }
 
 
 /* 
-  srvsvc_NETRPRPATHCANONICALIZE 
+  srvsvc_NetPathCompare 
 */
-static NTSTATUS srvsvc_NETRPRPATHCANONICALIZE(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
-                      struct srvsvc_NETRPRPATHCANONICALIZE *r)
+static WERROR dcesrv_srvsvc_NetPathCompare(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+                      struct srvsvc_NetPathCompare *r)
 {
-       return NT_STATUS_NOT_IMPLEMENTED;
+       DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
 }
 
 
 /* 
-  srvsvc_NETRPRPATHCOMPARE 
+  srvsvc_NetNameValidate 
 */
-static NTSTATUS srvsvc_NETRPRPATHCOMPARE(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
-                      struct srvsvc_NETRPRPATHCOMPARE *r)
+static WERROR dcesrv_srvsvc_NetNameValidate(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+                      struct srvsvc_NetNameValidate *r)
 {
-       return NT_STATUS_NOT_IMPLEMENTED;
-}
+       int len;
 
+       if ((r->in.flags != 0x0) && (r->in.flags != 0x80000000)) {
+               return WERR_INVALID_NAME;
+       }
 
-/* 
-  srvsvc_NET_NAME_VALIDATE 
-*/
-static NTSTATUS srvsvc_NET_NAME_VALIDATE(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
-                      struct srvsvc_NET_NAME_VALIDATE *r)
-{
-       return NT_STATUS_NOT_IMPLEMENTED;
-}
+       switch (r->in.name_type) {
+       case 1:
+       case 2:
+       case 3:
+       case 4:
+       case 5:
+       case 6:
+       case 7:
+       case 8:
+               return WERR_NOT_SUPPORTED;
+
+       case 9: /* validate share name */
+
+               len = strlen_m(r->in.name);
+               if ((r->in.flags == 0x0) && (len > 81)) {
+                       return WERR_INVALID_NAME;
+               }
+               if ((r->in.flags == 0x80000000) && (len > 13)) {
+                       return WERR_INVALID_NAME;
+               }
+               if (! dcesrv_common_validate_share_name(mem_ctx, r->in.name)) {
+                       return WERR_INVALID_NAME;
+               }
+               return WERR_OK;
 
+       case 10:
+       case 11:
+       case 12:
+       case 13:
+               return WERR_NOT_SUPPORTED;
+       default:
+               return WERR_INVALID_PARAM;
+       }
 
-/* 
-  srvsvc_NETRPRNAMECANONICALIZE 
-*/
-static NTSTATUS srvsvc_NETRPRNAMECANONICALIZE(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
-                      struct srvsvc_NETRPRNAMECANONICALIZE *r)
-{
-       return NT_STATUS_NOT_IMPLEMENTED;
+       return WERR_INVALID_PARAM;
 }
 
 
 /* 
-  srvsvc_NETRPRNAMECOMPARE 
+  srvsvc_NetPRNameCompare 
 */
-static NTSTATUS srvsvc_NETRPRNAMECOMPARE(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
-                      struct srvsvc_NETRPRNAMECOMPARE *r)
+static WERROR dcesrv_srvsvc_NetPRNameCompare(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+                      struct srvsvc_NetPRNameCompare *r)
 {
-       return NT_STATUS_NOT_IMPLEMENTED;
+       DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
 }
 
 
 /* 
   srvsvc_NetShareEnum 
 */
-static NTSTATUS srvsvc_NetShareEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR dcesrv_srvsvc_NetShareEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
                       struct srvsvc_NetShareEnum *r)
 {
+       NTSTATUS nterr;
+       int numshares = 0;
+       const char **snames;
+       struct share_context *sctx;
+       struct share_config *scfg;
        struct dcesrv_context *dce_ctx = dce_call->conn->dce_ctx;
+
        r->out.level = r->in.level;
+       ZERO_STRUCT(r->out.ctr);
        r->out.totalentries = 0;
        r->out.resume_handle = NULL;
-       r->out.result = WERR_OK;
 
-       switch (r->in.level) {
-       case 0: {
-               int i;
+       /* TODO: - paging of results 
+        */
 
-               r->out.ctr.ctr0 = talloc_p(mem_ctx, struct srvsvc_NetShareCtr0);
-               WERR_TALLOC_CHECK(r->out.ctr.ctr0);
+       nterr = share_get_context_by_name(mem_ctx, lp_share_backend(dce_call->conn->dce_ctx->lp_ctx), dce_call->event_ctx, dce_call->conn->dce_ctx->lp_ctx, &sctx);
+       if (!NT_STATUS_IS_OK(nterr)) {
+               return ntstatus_to_werror(nterr);
+       }
 
-               r->out.ctr.ctr0->count = dcesrv_common_get_count_of_shares(mem_ctx, dce_ctx);
-               r->out.ctr.ctr0->array = NULL;
+       nterr = share_list_all(mem_ctx, sctx, &numshares, &snames);
+       if (!NT_STATUS_IS_OK(nterr)) {
+               return ntstatus_to_werror(nterr);
+       }
+
+       switch (r->in.level) {
+       case 0:
+       {
+               int i, y = 0;
+               int count;
+               struct srvsvc_NetShareCtr0 *ctr0;
 
-               if (r->out.ctr.ctr0->count == 0) break;
+               ctr0 = talloc(mem_ctx, struct srvsvc_NetShareCtr0);
+               W_ERROR_HAVE_NO_MEMORY(ctr0);
 
-               r->out.ctr.ctr0->array = talloc(mem_ctx, r->out.ctr.ctr0->count*sizeof(struct srvsvc_NetShareInfo0));
-               WERR_TALLOC_CHECK(r->out.ctr.ctr0->array);
+               count = numshares;
+               ctr0->count = count;
+               ctr0->array = NULL;
 
-               for (i=0;i<r->out.ctr.ctr0->count;i++) {
-                       r->out.ctr.ctr0->array[i].name = dcesrv_common_get_share_name(mem_ctx, dce_ctx, i);
-                       WERR_TALLOC_CHECK(r->out.ctr.ctr0->array[i].name);
+               if (ctr0->count == 0) {
+                       r->out.ctr.ctr0 = ctr0;
+                       return WERR_OK;
                }
 
-               r->out.totalentries = r->out.ctr.ctr0->count;
-
-               break;
+               ctr0->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo0, count);
+               W_ERROR_HAVE_NO_MEMORY(ctr0->array);
+
+               for (i=0; i < count; i++) {
+                       WERROR status;
+                       union srvsvc_NetShareInfo info;
+                       enum srvsvc_ShareType type;
+
+                       nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
+                       if (!NT_STATUS_IS_OK(nterr)) {
+                               DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
+                               return WERR_GENERAL_FAILURE;
+                       }
+                       
+                       type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
+                       if (type & STYPE_HIDDEN) {
+                               ctr0->count--;
+                               talloc_free(scfg);
+                               continue;
+                       }
+
+                       info.info0 = &ctr0->array[y];
+                       status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
+                       W_ERROR_NOT_OK_RETURN(status);
+                       talloc_free(scfg);
+                       y++;
                }
-       case 1: {
-               int i;
-               r->out.ctr.ctr1 = talloc_p(mem_ctx, struct srvsvc_NetShareCtr1);
-               WERR_TALLOC_CHECK(r->out.ctr.ctr1);
+               talloc_free(snames);
 
-               r->out.ctr.ctr1->count = dcesrv_common_get_count_of_shares(mem_ctx, dce_ctx);
-               r->out.ctr.ctr1->array = NULL;
+               r->out.ctr.ctr0         = ctr0;
+               r->out.totalentries     = r->out.ctr.ctr0->count;
+               return WERR_OK;
+       }
+       case 1:
+       {
+               int i, y = 0;
+               int count;
+               struct srvsvc_NetShareCtr1 *ctr1;
 
-               if (r->out.ctr.ctr1->count == 0) break;
+               ctr1 = talloc(mem_ctx, struct srvsvc_NetShareCtr1);
+               W_ERROR_HAVE_NO_MEMORY(ctr1);
 
-               r->out.ctr.ctr1->array = talloc(mem_ctx, r->out.ctr.ctr1->count*sizeof(struct srvsvc_NetShareInfo1));
-               WERR_TALLOC_CHECK(r->out.ctr.ctr1->array);
+               count = numshares;
+               ctr1->count = count;
+               ctr1->array = NULL;
 
-               for (i=0;i<r->out.ctr.ctr1->count;i++) {
-                       r->out.ctr.ctr1->array[i].name = dcesrv_common_get_share_name(mem_ctx, dce_ctx, i);
-                       r->out.ctr.ctr1->array[i].type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, i);
-                       r->out.ctr.ctr1->array[i].comment = dcesrv_common_get_share_comment(mem_ctx, dce_ctx, i);
+               if (ctr1->count == 0) {
+                       r->out.ctr.ctr1 = ctr1;
+                       return WERR_OK;
                }
 
-               r->out.totalentries = r->out.ctr.ctr1->count;
-
-               break;
+               ctr1->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo1, count);
+               W_ERROR_HAVE_NO_MEMORY(ctr1->array);
+
+               for (i=0; i < count; i++) {
+                       WERROR status;
+                       union srvsvc_NetShareInfo info;
+                       enum srvsvc_ShareType type;
+
+                       nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
+                       if (!NT_STATUS_IS_OK(nterr)) {
+                               DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
+                               return WERR_GENERAL_FAILURE;
+                       }
+
+                       type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
+                       if (type & STYPE_HIDDEN) {
+                               ctr1->count--;
+                               talloc_free(scfg);
+                               continue;
+                       }
+
+                       info.info1 = &ctr1->array[y];
+                       status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
+                       W_ERROR_NOT_OK_RETURN(status);
+                       talloc_free(scfg);
+                       y++;
                }
-       case 2: {
-               int i;
-               r->out.ctr.ctr2 = talloc_p(mem_ctx, struct srvsvc_NetShareCtr2);
-               WERR_TALLOC_CHECK(r->out.ctr.ctr2);
+               talloc_free(snames);
 
-               r->out.ctr.ctr2->count = dcesrv_common_get_count_of_shares(mem_ctx, dce_ctx);
-               r->out.ctr.ctr2->array = NULL;
+               r->out.ctr.ctr1         = ctr1;
+               r->out.totalentries     = r->out.ctr.ctr1->count;
+               return WERR_OK;
+       }
+       case 2:
+       {
+               int i, y = 0;
+               int count;
+               struct srvsvc_NetShareCtr2 *ctr2;
 
-               if (r->out.ctr.ctr2->count == 0) break;
+               SRVSVC_CHECK_ADMIN_ACCESS;
 
-               r->out.ctr.ctr2->array = talloc(mem_ctx, r->out.ctr.ctr2->count*sizeof(struct srvsvc_NetShareInfo2));
-               WERR_TALLOC_CHECK(r->out.ctr.ctr2->array);
+               ctr2 = talloc(mem_ctx, struct srvsvc_NetShareCtr2);
+               W_ERROR_HAVE_NO_MEMORY(ctr2);
 
-               for (i=0;i<r->out.ctr.ctr2->count;i++) {
-                       r->out.ctr.ctr2->array[i].name = dcesrv_common_get_share_name(mem_ctx, dce_ctx, i);
-                       r->out.ctr.ctr2->array[i].type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, i);
-                       r->out.ctr.ctr2->array[i].comment = dcesrv_common_get_share_comment(mem_ctx, dce_ctx, i);
-                       r->out.ctr.ctr2->array[i].permissions = dcesrv_common_get_share_permissions(mem_ctx, dce_ctx, i);
-                       r->out.ctr.ctr2->array[i].max_users = dcesrv_common_get_share_max_users(mem_ctx, dce_ctx, i);
-                       r->out.ctr.ctr2->array[i].current_users = dcesrv_common_get_share_current_users(mem_ctx, dce_ctx, i);
-                       r->out.ctr.ctr2->array[i].path = dcesrv_common_get_share_path(mem_ctx, dce_ctx, i);
-                       r->out.ctr.ctr2->array[i].password = dcesrv_common_get_share_password(mem_ctx, dce_ctx, i);
-               }
+               count = numshares;
+               ctr2->count = count;
+               ctr2->array = NULL;
 
-               r->out.totalentries = r->out.ctr.ctr2->count;
-
-               break;
+               if (ctr2->count == 0) {
+                       r->out.ctr.ctr2 = ctr2;
+                       return WERR_OK;
                }
-       case 501:{
-               int i;
-               r->out.ctr.ctr501 = talloc_p(mem_ctx, struct srvsvc_NetShareCtr501);
-               WERR_TALLOC_CHECK(r->out.ctr.ctr501);
 
-               r->out.ctr.ctr501->count = dcesrv_common_get_count_of_shares(mem_ctx, dce_ctx);
-               r->out.ctr.ctr501->array = NULL;
+               ctr2->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo2, count);
+               W_ERROR_HAVE_NO_MEMORY(ctr2->array);
+
+               for (i=0; i < count; i++) {
+                       WERROR status;
+                       union srvsvc_NetShareInfo info;
+                       enum srvsvc_ShareType type;
+
+                       nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
+                       if (!NT_STATUS_IS_OK(nterr)) {
+                               DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
+                               return WERR_GENERAL_FAILURE;
+                       }
+
+                       type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
+                       if (type & STYPE_HIDDEN) {
+                               ctr2->count--;
+                               talloc_free(scfg);
+                               continue;
+                       }
+
+                       info.info2 = &ctr2->array[y];
+                       status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
+                       W_ERROR_NOT_OK_RETURN(status);
+                       talloc_free(scfg);
+                       y++;
+               }
+               talloc_free(snames);
 
-               if (r->out.ctr.ctr501->count == 0) break;
+               r->out.ctr.ctr2         = ctr2;
+               r->out.totalentries     = r->out.ctr.ctr2->count;
+               return WERR_OK;
+       }
+       case 502:
+       {
+               int i, y = 0;
+               int count;
+               struct srvsvc_NetShareCtr502 *ctr502;
 
-               r->out.ctr.ctr501->array = talloc(mem_ctx, r->out.ctr.ctr501->count*sizeof(struct srvsvc_NetShareInfo501));
-               WERR_TALLOC_CHECK(r->out.ctr.ctr501->array);
+               SRVSVC_CHECK_ADMIN_ACCESS;
 
-               for (i=0;i<r->out.ctr.ctr501->count;i++) {
-                       r->out.ctr.ctr501->array[i].name = dcesrv_common_get_share_name(mem_ctx, dce_ctx, i);
-                       r->out.ctr.ctr501->array[i].type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, i);
-                       r->out.ctr.ctr501->array[i].comment = dcesrv_common_get_share_comment(mem_ctx, dce_ctx, i);
-                       r->out.ctr.ctr501->array[i].csc_policy = dcesrv_common_get_share_csc_policy(mem_ctx, dce_ctx, i);
-               }
+               ctr502 = talloc(mem_ctx, struct srvsvc_NetShareCtr502);
+               W_ERROR_HAVE_NO_MEMORY(ctr502);
 
-               r->out.totalentries = r->out.ctr.ctr501->count;
+               count = numshares;
+               ctr502->count = count;
+               ctr502->array = NULL;
 
-               break;
-               }
-       case 502:{
-               int i;
-               r->out.ctr.ctr502 = talloc_p(mem_ctx, struct srvsvc_NetShareCtr502);
-               WERR_TALLOC_CHECK(r->out.ctr.ctr502);
-
-               r->out.ctr.ctr502->count = dcesrv_common_get_count_of_shares(mem_ctx, dce_ctx);
-               r->out.ctr.ctr502->array = NULL;
-
-               if (r->out.ctr.ctr502->count == 0) break;
-
-               r->out.ctr.ctr502->array = talloc(mem_ctx, r->out.ctr.ctr502->count*sizeof(struct srvsvc_NetShareInfo502));
-               WERR_TALLOC_CHECK(r->out.ctr.ctr502->array);
-
-               for (i=0;i<r->out.ctr.ctr502->count;i++) {
-                       r->out.ctr.ctr502->array[i].name = dcesrv_common_get_share_name(mem_ctx, dce_ctx, i);
-                       r->out.ctr.ctr502->array[i].type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, i);
-                       r->out.ctr.ctr502->array[i].comment = dcesrv_common_get_share_comment(mem_ctx, dce_ctx, i);
-                       r->out.ctr.ctr502->array[i].permissions = dcesrv_common_get_share_permissions(mem_ctx, dce_ctx, i);
-                       r->out.ctr.ctr502->array[i].max_users = dcesrv_common_get_share_max_users(mem_ctx, dce_ctx, i);
-                       r->out.ctr.ctr502->array[i].current_users = dcesrv_common_get_share_current_users(mem_ctx, dce_ctx, i);
-                       r->out.ctr.ctr502->array[i].path = dcesrv_common_get_share_path(mem_ctx, dce_ctx, i);
-                       r->out.ctr.ctr502->array[i].password = dcesrv_common_get_share_password(mem_ctx, dce_ctx, i);
-                       r->out.ctr.ctr502->array[i].unknown = dcesrv_common_get_share_unknown(mem_ctx, dce_ctx, i);
-                       r->out.ctr.ctr502->array[i].sd = dcesrv_common_get_security_descriptor(mem_ctx, dce_ctx, i);
+               if (ctr502->count == 0) {
+                       r->out.ctr.ctr502 = ctr502;
+                       return WERR_OK;
                }
 
-               r->out.totalentries = r->out.ctr.ctr502->count;
-
-               break;
+               ctr502->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo502, count);
+               W_ERROR_HAVE_NO_MEMORY(ctr502->array);
+
+               for (i=0; i < count; i++) {
+                       WERROR status;
+                       union srvsvc_NetShareInfo info;
+                       enum srvsvc_ShareType type;
+
+                       nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
+                       if (!NT_STATUS_IS_OK(nterr)) {
+                               DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
+                               return WERR_GENERAL_FAILURE;
+                       }
+
+                       type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
+                       if (type & STYPE_HIDDEN) {
+                               ctr502->count--;
+                               talloc_free(scfg);
+                               continue;
+                       }
+
+                       info.info502 = &ctr502->array[y];
+                       status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
+                       W_ERROR_NOT_OK_RETURN(status);
+                       talloc_free(scfg);
+                       y++;
                }
+               talloc_free(snames);
+
+               r->out.ctr.ctr502       = ctr502;
+               r->out.totalentries     = r->out.ctr.ctr502->count;
+               return WERR_OK;
+       }
        default:
-               r->out.result = WERR_UNKNOWN_LEVEL;
-               break;
+               return WERR_UNKNOWN_LEVEL;
        }
 
-       return NT_STATUS_OK;
+       return WERR_UNKNOWN_LEVEL;
 }
 
 
 /* 
-  srvsvc_NETRSHAREDELSTART 
+  srvsvc_NetShareDelStart 
 */
-static NTSTATUS srvsvc_NETRSHAREDELSTART(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
-                      struct srvsvc_NETRSHAREDELSTART *r)
+static WERROR dcesrv_srvsvc_NetShareDelStart(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+                      struct srvsvc_NetShareDelStart *r)
 {
-       return NT_STATUS_NOT_IMPLEMENTED;
+       DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
 }
 
 
 /* 
-  srvsvc_NETRSHAREDELCOMMIT 
+  srvsvc_NetShareDelCommit 
 */
-static NTSTATUS srvsvc_NETRSHAREDELCOMMIT(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
-                      struct srvsvc_NETRSHAREDELCOMMIT *r)
+static WERROR dcesrv_srvsvc_NetShareDelCommit(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+                      struct srvsvc_NetShareDelCommit *r)
 {
-       return NT_STATUS_NOT_IMPLEMENTED;
+       DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
 }
 
 
 /* 
-  srvsvc_NET_FILE_QUERY_SECDESC 
+  srvsvc_NetGetFileSecurity 
 */
-static NTSTATUS srvsvc_NET_FILE_QUERY_SECDESC(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
-                      struct srvsvc_NET_FILE_QUERY_SECDESC *r)
+static WERROR dcesrv_srvsvc_NetGetFileSecurity(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+                      struct srvsvc_NetGetFileSecurity *r)
 {
-       return NT_STATUS_NOT_IMPLEMENTED;
+       struct sec_desc_buf *sd_buf;
+       struct ntvfs_context *ntvfs_ctx = NULL;
+       struct ntvfs_request *ntvfs_req;
+       union smb_fileinfo *io;
+       NTSTATUS nt_status;
+
+       nt_status = srvsvc_create_ntvfs_context(dce_call, mem_ctx, r->in.share, &ntvfs_ctx);
+       if (!NT_STATUS_IS_OK(nt_status)) return ntstatus_to_werror(nt_status);
+
+       ntvfs_req = ntvfs_request_create(ntvfs_ctx, mem_ctx,
+                                        dce_call->conn->auth_state.session_info,
+                                        0,
+                                        dce_call->time,
+                                        NULL, NULL, 0);
+       W_ERROR_HAVE_NO_MEMORY(ntvfs_req);
+
+       sd_buf = talloc(mem_ctx, struct sec_desc_buf);
+       W_ERROR_HAVE_NO_MEMORY(sd_buf);
+
+       io = talloc(mem_ctx, union smb_fileinfo);
+       W_ERROR_HAVE_NO_MEMORY(io);
+
+       io->query_secdesc.level                 = RAW_FILEINFO_SEC_DESC;
+       io->query_secdesc.in.file.path          = r->in.file;
+       io->query_secdesc.in.secinfo_flags      = r->in.securityinformation;
+
+       nt_status = ntvfs_qpathinfo(ntvfs_req, io);
+       if (!NT_STATUS_IS_OK(nt_status)) return ntstatus_to_werror(nt_status);
+
+       sd_buf->sd = io->query_secdesc.out.sd;
+
+       *r->out.sd_buf = sd_buf;
+       return WERR_OK;
 }
 
 
 /* 
-  srvsvc_NET_FILE_SET_SECDESC 
+  srvsvc_NetSetFileSecurity 
 */
-static NTSTATUS srvsvc_NET_FILE_SET_SECDESC(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
-                      struct srvsvc_NET_FILE_SET_SECDESC *r)
+static WERROR dcesrv_srvsvc_NetSetFileSecurity(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+                      struct srvsvc_NetSetFileSecurity *r)
 {
-       return NT_STATUS_NOT_IMPLEMENTED;
+       struct ntvfs_context *ntvfs_ctx;
+       struct ntvfs_request *ntvfs_req;
+       union smb_setfileinfo *io;
+       NTSTATUS nt_status;
+
+       nt_status = srvsvc_create_ntvfs_context(dce_call, mem_ctx, r->in.share, &ntvfs_ctx);
+       if (!NT_STATUS_IS_OK(nt_status)) return ntstatus_to_werror(nt_status);
+
+       ntvfs_req = ntvfs_request_create(ntvfs_ctx, mem_ctx,
+                                        dce_call->conn->auth_state.session_info,
+                                        0,
+                                        dce_call->time,
+                                        NULL, NULL, 0);
+       W_ERROR_HAVE_NO_MEMORY(ntvfs_req);
+
+       io = talloc(mem_ctx, union smb_setfileinfo);
+       W_ERROR_HAVE_NO_MEMORY(io);
+
+       io->set_secdesc.level                   = RAW_FILEINFO_SEC_DESC;
+       io->set_secdesc.in.file.path            = r->in.file;
+       io->set_secdesc.in.secinfo_flags        = r->in.securityinformation;
+       io->set_secdesc.in.sd                   = r->in.sd_buf->sd;
+
+       nt_status = ntvfs_setpathinfo(ntvfs_req, io);
+       if (!NT_STATUS_IS_OK(nt_status)) return ntstatus_to_werror(nt_status);
+
+       return WERR_OK;
 }
 
 
 /* 
-  srvsvc_NETRSERVERTRANSPORTADDEX 
+  srvsvc_NetServerTransportAddEx 
 */
-static NTSTATUS srvsvc_NETRSERVERTRANSPORTADDEX(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
-                      struct srvsvc_NETRSERVERTRANSPORTADDEX *r)
+static WERROR dcesrv_srvsvc_NetServerTransportAddEx(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+                      struct srvsvc_NetServerTransportAddEx *r)
 {
-       return NT_STATUS_NOT_IMPLEMENTED;
+       DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
 }
 
 
 /* 
-  srvsvc_NETRSERVERSETSERVICEBITSEX 
+  srvsvc_NetServerSetServiceBitsEx 
 */
-static NTSTATUS srvsvc_NETRSERVERSETSERVICEBITSEX(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
-                      struct srvsvc_NETRSERVERSETSERVICEBITSEX *r)
+static WERROR dcesrv_srvsvc_NetServerSetServiceBitsEx(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+                      struct srvsvc_NetServerSetServiceBitsEx *r)
 {
-       return NT_STATUS_NOT_IMPLEMENTED;
+       DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
 }
 
 
 /* 
   srvsvc_NETRDFSGETVERSION 
 */
-static NTSTATUS srvsvc_NETRDFSGETVERSION(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR dcesrv_srvsvc_NETRDFSGETVERSION(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
                       struct srvsvc_NETRDFSGETVERSION *r)
 {
-       return NT_STATUS_NOT_IMPLEMENTED;
+       DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
 }
 
 
 /* 
   srvsvc_NETRDFSCREATELOCALPARTITION 
 */
-static NTSTATUS srvsvc_NETRDFSCREATELOCALPARTITION(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR dcesrv_srvsvc_NETRDFSCREATELOCALPARTITION(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
                       struct srvsvc_NETRDFSCREATELOCALPARTITION *r)
 {
-       return NT_STATUS_NOT_IMPLEMENTED;
+       DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
 }
 
 
 /* 
   srvsvc_NETRDFSDELETELOCALPARTITION 
 */
-static NTSTATUS srvsvc_NETRDFSDELETELOCALPARTITION(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR dcesrv_srvsvc_NETRDFSDELETELOCALPARTITION(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
                       struct srvsvc_NETRDFSDELETELOCALPARTITION *r)
 {
-       return NT_STATUS_NOT_IMPLEMENTED;
+       DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
 }
 
 
 /* 
   srvsvc_NETRDFSSETLOCALVOLUMESTATE 
 */
-static NTSTATUS srvsvc_NETRDFSSETLOCALVOLUMESTATE(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR dcesrv_srvsvc_NETRDFSSETLOCALVOLUMESTATE(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
                       struct srvsvc_NETRDFSSETLOCALVOLUMESTATE *r)
 {
-       return NT_STATUS_NOT_IMPLEMENTED;
+       DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
 }
 
 
 /* 
   srvsvc_NETRDFSSETSERVERINFO 
 */
-static NTSTATUS srvsvc_NETRDFSSETSERVERINFO(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR dcesrv_srvsvc_NETRDFSSETSERVERINFO(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
                       struct srvsvc_NETRDFSSETSERVERINFO *r)
 {
-       return NT_STATUS_NOT_IMPLEMENTED;
+       DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
 }
 
 
 /* 
   srvsvc_NETRDFSCREATEEXITPOINT 
 */
-static NTSTATUS srvsvc_NETRDFSCREATEEXITPOINT(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR dcesrv_srvsvc_NETRDFSCREATEEXITPOINT(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
                       struct srvsvc_NETRDFSCREATEEXITPOINT *r)
 {
-       return NT_STATUS_NOT_IMPLEMENTED;
+       DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
 }
 
 
 /* 
   srvsvc_NETRDFSDELETEEXITPOINT 
 */
-static NTSTATUS srvsvc_NETRDFSDELETEEXITPOINT(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR dcesrv_srvsvc_NETRDFSDELETEEXITPOINT(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
                       struct srvsvc_NETRDFSDELETEEXITPOINT *r)
 {
-       return NT_STATUS_NOT_IMPLEMENTED;
+       DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
 }
 
 
 /* 
   srvsvc_NETRDFSMODIFYPREFIX 
 */
-static NTSTATUS srvsvc_NETRDFSMODIFYPREFIX(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR dcesrv_srvsvc_NETRDFSMODIFYPREFIX(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
                       struct srvsvc_NETRDFSMODIFYPREFIX *r)
 {
-       return NT_STATUS_NOT_IMPLEMENTED;
+       DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
 }
 
 
 /* 
   srvsvc_NETRDFSFIXLOCALVOLUME 
 */
-static NTSTATUS srvsvc_NETRDFSFIXLOCALVOLUME(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR dcesrv_srvsvc_NETRDFSFIXLOCALVOLUME(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
                       struct srvsvc_NETRDFSFIXLOCALVOLUME *r)
 {
-       return NT_STATUS_NOT_IMPLEMENTED;
+       DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
 }
 
 
 /* 
   srvsvc_NETRDFSMANAGERREPORTSITEINFO 
 */
-static NTSTATUS srvsvc_NETRDFSMANAGERREPORTSITEINFO(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR dcesrv_srvsvc_NETRDFSMANAGERREPORTSITEINFO(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
                       struct srvsvc_NETRDFSMANAGERREPORTSITEINFO *r)
 {
-       return NT_STATUS_NOT_IMPLEMENTED;
+       DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
 }
 
 
 /* 
   srvsvc_NETRSERVERTRANSPORTDELEX 
 */
-static NTSTATUS srvsvc_NETRSERVERTRANSPORTDELEX(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR dcesrv_srvsvc_NETRSERVERTRANSPORTDELEX(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
                       struct srvsvc_NETRSERVERTRANSPORTDELEX *r)
 {
-       return NT_STATUS_NOT_IMPLEMENTED;
+       DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
 }
 
+/* 
+  srvsvc_NetShareDel 
+*/
+static WERROR dcesrv_srvsvc_NetShareDel(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+                      struct srvsvc_NetShareDel *r)
+{
+       NTSTATUS nterr;
+       struct share_context *sctx;
+               
+       nterr = share_get_context_by_name(mem_ctx, lp_share_backend(dce_call->conn->dce_ctx->lp_ctx), dce_call->event_ctx, dce_call->conn->dce_ctx->lp_ctx, &sctx);
+       if (!NT_STATUS_IS_OK(nterr)) {
+               return ntstatus_to_werror(nterr);
+       }
+                       
+       nterr = share_remove(sctx, r->in.share_name);
+       if (!NT_STATUS_IS_OK(nterr)) {
+               return ntstatus_to_werror(nterr);
+       }
+
+       return WERR_OK;
+}
+
+/* 
+  srvsvc_NetSetServiceBits 
+*/
+static WERROR dcesrv_srvsvc_NetSetServiceBits(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+                      struct srvsvc_NetSetServiceBits *r)
+{
+       DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
+}
+
+/* 
+  srvsvc_NETRPRNAMECANONICALIZE 
+*/
+static WERROR dcesrv_srvsvc_NETRPRNAMECANONICALIZE(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+                      struct srvsvc_NETRPRNAMECANONICALIZE *r)
+{
+       DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
+}
 
 /* include the generated boilerplate */
 #include "librpc/gen_ndr/ndr_srvsvc_s.c"