s4-srvsvc: merge srvsvc_NetConnEnum from s3 idl.
[ira/wip.git] / source4 / rpc_server / srvsvc / dcesrv_srvsvc.c
index d850af5ebd12bab7e9517b93b5fde9c321fef05c..103efa5f234f987014b067e33cea3da50e186cc1 100644 (file)
@@ -7,7 +7,7 @@
    
    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,
@@ -16,8 +16,7 @@
    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 "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; \
 /* 
   srvsvc_NetCharDevEnum 
 */
-static WERROR srvsvc_NetCharDevEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+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.totalentries = 0;
 
-       switch (r->in.level) {
+       switch (r->in.info_ctr->level) {
        case 0:
-               r->out.ctr.ctr0 = talloc(mem_ctx, struct srvsvc_NetCharDevCtr0);
-               W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr0);
+               r->out.info_ctr->ctr.ctr0 = talloc(mem_ctx, struct srvsvc_NetCharDevCtr0);
+               W_ERROR_HAVE_NO_MEMORY(r->out.info_ctr->ctr.ctr0);
 
-               r->out.ctr.ctr0->count = 0;
-               r->out.ctr.ctr0->array = NULL;
+               r->out.info_ctr->ctr.ctr0->count = 0;
+               r->out.info_ctr->ctr.ctr0->array = NULL;
 
                return WERR_NOT_SUPPORTED;
 
        case 1:
-               r->out.ctr.ctr1 = talloc(mem_ctx, struct srvsvc_NetCharDevCtr1);
-               W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr1);
+               r->out.info_ctr->ctr.ctr1 = talloc(mem_ctx, struct srvsvc_NetCharDevCtr1);
+               W_ERROR_HAVE_NO_MEMORY(r->out.info_ctr->ctr.ctr1);
 
-               r->out.ctr.ctr1->count = 0;
-               r->out.ctr.ctr1->array = NULL;
+               r->out.info_ctr->ctr.ctr1->count = 0;
+               r->out.info_ctr->ctr.ctr1->array = NULL;
 
                return WERR_NOT_SUPPORTED;
 
@@ -78,10 +77,10 @@ static WERROR srvsvc_NetCharDevEnum(struct dcesrv_call_state *dce_call, TALLOC_C
 /* 
   srvsvc_NetCharDevGetInfo 
 */
-static WERROR 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)
 {
-       ZERO_STRUCT(r->out);
+       ZERO_STRUCTP(r->out.info);
 
        switch (r->in.level) {
        case 0:
@@ -103,7 +102,7 @@ static WERROR srvsvc_NetCharDevGetInfo(struct dcesrv_call_state *dce_call, TALLO
 /* 
   srvsvc_NetCharDevControl 
 */
-static WERROR 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)
 {
        DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
@@ -113,31 +112,29 @@ static WERROR srvsvc_NetCharDevControl(struct dcesrv_call_state *dce_call, TALLO
 /* 
   srvsvc_NetCharDevQEnum 
 */
-static WERROR srvsvc_NetCharDevQEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+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.totalentries = 0;
 
-       switch (r->in.level) {
+       switch (r->in.info_ctr->level) {
        case 0:
        {
-               r->out.ctr.ctr0 = talloc(mem_ctx, struct srvsvc_NetCharDevQCtr0);
-               W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr0);
+               r->out.info_ctr->ctr.ctr0 = talloc(mem_ctx, struct srvsvc_NetCharDevQCtr0);
+               W_ERROR_HAVE_NO_MEMORY(r->out.info_ctr->ctr.ctr0);
 
-               r->out.ctr.ctr0->count = 0;
-               r->out.ctr.ctr0->array = NULL;
+               r->out.info_ctr->ctr.ctr0->count = 0;
+               r->out.info_ctr->ctr.ctr0->array = NULL;
 
                return WERR_NOT_SUPPORTED;
        }
        case 1:
        {
-               r->out.ctr.ctr1 = talloc(mem_ctx, struct srvsvc_NetCharDevQCtr1);
-               W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr1);
+               r->out.info_ctr->ctr.ctr1 = talloc(mem_ctx, struct srvsvc_NetCharDevQCtr1);
+               W_ERROR_HAVE_NO_MEMORY(r->out.info_ctr->ctr.ctr1);
 
-               r->out.ctr.ctr1->count = 0;
-               r->out.ctr.ctr1->array = NULL;
+               r->out.info_ctr->ctr.ctr1->count = 0;
+               r->out.info_ctr->ctr.ctr1->array = NULL;
 
                return WERR_NOT_SUPPORTED;
        }
@@ -152,10 +149,10 @@ static WERROR srvsvc_NetCharDevQEnum(struct dcesrv_call_state *dce_call, TALLOC_
 /* 
   srvsvc_NetCharDevQGetInfo 
 */
-static WERROR srvsvc_NetCharDevQGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR dcesrv_srvsvc_NetCharDevQGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
                                        struct srvsvc_NetCharDevQGetInfo *r)
 {
-       ZERO_STRUCT(r->out);
+       ZERO_STRUCTP(r->out.info);
 
        switch (r->in.level) {
        case 0:
@@ -177,7 +174,7 @@ static WERROR srvsvc_NetCharDevQGetInfo(struct dcesrv_call_state *dce_call, TALL
 /* 
   srvsvc_NetCharDevQSetInfo 
 */
-static WERROR 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)
 {
        switch (r->in.level) {
@@ -206,7 +203,7 @@ static WERROR srvsvc_NetCharDevQSetInfo(struct dcesrv_call_state *dce_call, TALL
 /* 
   srvsvc_NetCharDevQPurge 
 */
-static WERROR 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)
 {
        DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
@@ -216,7 +213,7 @@ static WERROR srvsvc_NetCharDevQPurge(struct dcesrv_call_state *dce_call, TALLOC
 /* 
   srvsvc_NetCharDevQPurgeSelf 
 */
-static WERROR srvsvc_NetCharDevQPurgeSelf(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR dcesrv_srvsvc_NetCharDevQPurgeSelf(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
                                          struct srvsvc_NetCharDevQPurgeSelf *r)
 {
        DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);        
@@ -226,31 +223,29 @@ static WERROR srvsvc_NetCharDevQPurgeSelf(struct dcesrv_call_state *dce_call, TA
 /* 
   srvsvc_NetConnEnum 
 */
-static WERROR 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.totalentries = 0;
 
-       switch (r->in.level) {
+       switch (r->in.info_ctr->level) {
        case 0:
        {
-               r->out.ctr.ctr0 = talloc(mem_ctx, struct srvsvc_NetConnCtr0);
-               W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr0);
+               r->out.info_ctr->ctr.ctr0 = talloc(mem_ctx, struct srvsvc_NetConnCtr0);
+               W_ERROR_HAVE_NO_MEMORY(r->out.info_ctr->ctr.ctr0);
 
-               r->out.ctr.ctr0->count = 0;
-               r->out.ctr.ctr0->array = NULL;
+               r->out.info_ctr->ctr.ctr0->count = 0;
+               r->out.info_ctr->ctr.ctr0->array = NULL;
 
                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.info_ctr->ctr.ctr1 = talloc(mem_ctx, struct srvsvc_NetConnCtr1);
+               W_ERROR_HAVE_NO_MEMORY(r->out.info_ctr->ctr.ctr1);
 
-               r->out.ctr.ctr1->count = 0;
-               r->out.ctr.ctr1->array = NULL;
+               r->out.info_ctr->ctr.ctr1->count = 0;
+               r->out.info_ctr->ctr.ctr1->array = NULL;
 
                return WERR_NOT_SUPPORTED;
        }
@@ -265,7 +260,7 @@ static WERROR srvsvc_NetConnEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX
 /* 
   srvsvc_NetFileEnum 
 */
-static WERROR srvsvc_NetFileEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+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;
@@ -304,10 +299,10 @@ static WERROR srvsvc_NetFileEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX
 /* 
   srvsvc_NetFileGetInfo 
 */
-static WERROR srvsvc_NetFileGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR dcesrv_srvsvc_NetFileGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
                                    struct srvsvc_NetFileGetInfo *r)
 {
-       ZERO_STRUCT(r->out);
+       ZERO_STRUCTP(r->out.info);
 
        switch (r->in.level) {
        case 2:
@@ -329,7 +324,7 @@ static WERROR srvsvc_NetFileGetInfo(struct dcesrv_call_state *dce_call, TALLOC_C
 /* 
   srvsvc_NetFileClose 
 */
-static WERROR 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)
 {
        DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
@@ -339,7 +334,7 @@ static WERROR srvsvc_NetFileClose(struct dcesrv_call_state *dce_call, TALLOC_CTX
 /* 
   srvsvc_NetSessEnum 
 */
-static WERROR 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;
@@ -408,7 +403,7 @@ static WERROR srvsvc_NetSessEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX
 /* 
   srvsvc_NetSessDel 
 */
-static WERROR 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)
 {
        DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
@@ -418,7 +413,7 @@ static WERROR srvsvc_NetSessDel(struct dcesrv_call_state *dce_call, TALLOC_CTX *
 /* 
   srvsvc_NetShareAdd 
 */
-static WERROR 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)
 {
        switch (r->in.level) {
@@ -438,10 +433,94 @@ static WERROR srvsvc_NetShareAdd(struct dcesrv_call_state *dce_call, TALLOC_CTX
        }
        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;
                }
-               return WERR_NOT_SUPPORTED;
+               
+               return WERR_OK;
        }
        case 501:
        {       
@@ -452,10 +531,94 @@ static WERROR srvsvc_NetShareAdd(struct dcesrv_call_state *dce_call, TALLOC_CTX
        }
        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;
                }
-               return WERR_NOT_SUPPORTED;
+               
+               return WERR_OK;
        }
        default:
                return WERR_UNKNOWN_LEVEL;
@@ -464,7 +627,7 @@ static WERROR srvsvc_NetShareAdd(struct dcesrv_call_state *dce_call, TALLOC_CTX
        return WERR_UNKNOWN_LEVEL;
 }
 
-static WERROR srvsvc_fiel_ShareInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+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)
 {
@@ -528,8 +691,7 @@ static WERROR srvsvc_fiel_ShareInfo(struct dcesrv_call_state *dce_call, TALLOC_C
                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->unknown          = dcesrv_common_get_share_unknown(mem_ctx, dce_ctx, scfg);
-               info->info502->sd               = dcesrv_common_get_security_descriptor(mem_ctx, dce_ctx, scfg);
+               info->info502->sd_buf.sd        = dcesrv_common_get_security_descriptor(mem_ctx, dce_ctx, scfg);
 
                return WERR_OK;
        }
@@ -549,7 +711,7 @@ static WERROR srvsvc_fiel_ShareInfo(struct dcesrv_call_state *dce_call, TALLOC_C
 /* 
   srvsvc_NetShareEnumAll
 */
-static WERROR srvsvc_NetShareEnumAll(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR dcesrv_srvsvc_NetShareEnumAll(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
                                     struct srvsvc_NetShareEnumAll *r)
 {
        NTSTATUS nterr;
@@ -566,7 +728,7 @@ static WERROR srvsvc_NetShareEnumAll(struct dcesrv_call_state *dce_call, TALLOC_
        /* TODO: - paging of results 
         */
 
-       nterr = share_get_context(mem_ctx, &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);
        }
@@ -606,7 +768,7 @@ static WERROR srvsvc_NetShareEnumAll(struct dcesrv_call_state *dce_call, TALLOC_
                                return WERR_GENERAL_FAILURE;
                        }
                        info.info0 = &ctr0->array[i];
-                       status = srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
+                       status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
                        if (!W_ERROR_IS_OK(status)) {
                                return status;
                        }
@@ -647,7 +809,7 @@ static WERROR srvsvc_NetShareEnumAll(struct dcesrv_call_state *dce_call, TALLOC_
                                return WERR_GENERAL_FAILURE;
                        }
                        info.info1 = &ctr1->array[i];
-                       status = srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
+                       status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
                        if (!W_ERROR_IS_OK(status)) {
                                return status;
                        }
@@ -690,7 +852,7 @@ static WERROR srvsvc_NetShareEnumAll(struct dcesrv_call_state *dce_call, TALLOC_
                                return WERR_GENERAL_FAILURE;
                        }
                        info.info2 = &ctr2->array[i];
-                       status = srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
+                       status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
                        if (!W_ERROR_IS_OK(status)) {
                                return status;
                        }
@@ -733,7 +895,7 @@ static WERROR srvsvc_NetShareEnumAll(struct dcesrv_call_state *dce_call, TALLOC_
                                return WERR_GENERAL_FAILURE;
                        }
                        info.info501 = &ctr501->array[i];
-                       status = srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
+                       status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
                        if (!W_ERROR_IS_OK(status)) {
                                return status;
                        }
@@ -776,7 +938,7 @@ static WERROR srvsvc_NetShareEnumAll(struct dcesrv_call_state *dce_call, TALLOC_
                                return WERR_GENERAL_FAILURE;
                        }
                        info.info502 = &ctr502->array[i];
-                       status = srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
+                       status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
                        if (!W_ERROR_IS_OK(status)) {
                                return status;
                        }
@@ -799,14 +961,14 @@ static WERROR srvsvc_NetShareEnumAll(struct dcesrv_call_state *dce_call, TALLOC_
 /* 
   srvsvc_NetShareGetInfo 
 */
-static WERROR srvsvc_NetShareGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR dcesrv_srvsvc_NetShareGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
                                     struct srvsvc_NetShareGetInfo *r)
 {
        NTSTATUS nterr;
        struct share_context *sctx = NULL;
        struct share_config *scfg = NULL;
 
-       ZERO_STRUCT(r->out);
+       ZERO_STRUCTP(r->out.info);
 
        /* TODO: - access check
         */
@@ -815,7 +977,7 @@ static WERROR srvsvc_NetShareGetInfo(struct dcesrv_call_state *dce_call, TALLOC_
                return WERR_INVALID_PARAM;
        }
 
-       nterr = share_get_context(mem_ctx, &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);
        }
@@ -834,12 +996,12 @@ static WERROR srvsvc_NetShareGetInfo(struct dcesrv_call_state *dce_call, TALLOC_
                info.info0 = talloc(mem_ctx, struct srvsvc_NetShareInfo0);
                W_ERROR_HAVE_NO_MEMORY(info.info0);
 
-               status = srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
+               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.info0 = info.info0;
+               r->out.info->info0 = info.info0;
                return WERR_OK;
        }
        case 1:
@@ -850,12 +1012,12 @@ static WERROR srvsvc_NetShareGetInfo(struct dcesrv_call_state *dce_call, TALLOC_
                info.info1 = talloc(mem_ctx, struct srvsvc_NetShareInfo1);
                W_ERROR_HAVE_NO_MEMORY(info.info1);
 
-               status = srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
+               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.info1 = info.info1;
+               r->out.info->info1 = info.info1;
                return WERR_OK;
        }
        case 2:
@@ -868,12 +1030,12 @@ static WERROR srvsvc_NetShareGetInfo(struct dcesrv_call_state *dce_call, TALLOC_
                info.info2 = talloc(mem_ctx, struct srvsvc_NetShareInfo2);
                W_ERROR_HAVE_NO_MEMORY(info.info2);
 
-               status = srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
+               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.info2 = info.info2;
+               r->out.info->info2 = info.info2;
                return WERR_OK;
        }
        case 501:
@@ -884,12 +1046,12 @@ static WERROR srvsvc_NetShareGetInfo(struct dcesrv_call_state *dce_call, TALLOC_
                info.info501 = talloc(mem_ctx, struct srvsvc_NetShareInfo501);
                W_ERROR_HAVE_NO_MEMORY(info.info501);
 
-               status = srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
+               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.info501 = info.info501;
+               r->out.info->info501 = info.info501;
                return WERR_OK;
        }
        case 502:
@@ -902,12 +1064,12 @@ static WERROR srvsvc_NetShareGetInfo(struct dcesrv_call_state *dce_call, TALLOC_
                info.info502 = talloc(mem_ctx, struct srvsvc_NetShareInfo502);
                W_ERROR_HAVE_NO_MEMORY(info.info502);
 
-               status = srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
+               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;
+               r->out.info->info502 = info.info502;
                return WERR_OK;
        }
        case 1005:
@@ -918,12 +1080,12 @@ static WERROR srvsvc_NetShareGetInfo(struct dcesrv_call_state *dce_call, TALLOC_
                info.info1005 = talloc(mem_ctx, struct srvsvc_NetShareInfo1005);
                W_ERROR_HAVE_NO_MEMORY(info.info1005);
 
-               status = srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
+               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;
+               r->out.info->info1005 = info.info1005;
                return WERR_OK;
        }
        default:
@@ -933,21 +1095,281 @@ static WERROR srvsvc_NetShareGetInfo(struct dcesrv_call_state *dce_call, TALLOC_
        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 WERROR 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)
 {
-       DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
+       NTSTATUS nterr;
+       WERROR status;
+       struct share_context *sctx = NULL;
+       struct share_info *info;
+       int count;
+
+       /* TODO: - access check
+        */
+
+       /* 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 WERROR 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)
 {
        DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
@@ -957,25 +1379,77 @@ static WERROR srvsvc_NetShareDelSticky(struct dcesrv_call_state *dce_call, TALLO
 /* 
   srvsvc_NetShareCheck 
 */
-static WERROR 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)
 {
-       ZERO_STRUCT(r->out);
+       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;
+               *r->out.type = STYPE_IPC;
                return WERR_OK;
        }
 
-       if (strcmp("C:\\", r->in.device_name) == 0) {
-               r->out.type = STYPE_DISKTREE;
-               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;
+                       }
+               }
        }
 
-       /* TODO: - lookup the share be devicename (path) */
        return WERR_DEVICE_NOT_SHARED;
 }
 
@@ -983,12 +1457,12 @@ static WERROR srvsvc_NetShareCheck(struct dcesrv_call_state *dce_call, TALLOC_CT
 /* 
   srvsvc_NetSrvGetInfo 
 */
-static WERROR 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)
 {
        struct dcesrv_context *dce_ctx = dce_call->conn->dce_ctx;
 
-       ZERO_STRUCT(r->out);
+       ZERO_STRUCTP(r->out.info);
 
        switch (r->in.level) {
        case 100:
@@ -1002,7 +1476,7 @@ static WERROR srvsvc_NetSrvGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CT
                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;
+               r->out.info->info100 = info100;
                return WERR_OK;
        }
        case 101:
@@ -1016,13 +1490,13 @@ static WERROR srvsvc_NetSrvGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CT
                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);
-               info101->version_minor  = dcesrv_common_get_version_minor(mem_ctx, dce_ctx);
-               info101->server_type    = dcesrv_common_get_server_type(mem_ctx, dce_ctx);
-               info101->comment        = talloc_strdup(mem_ctx, lp_serverstring());
+               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;
+               r->out.info->info101 = info101;
                return WERR_OK;
        }
        case 102:
@@ -1036,10 +1510,10 @@ static WERROR srvsvc_NetSrvGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CT
                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);
-               info102->version_minor  = dcesrv_common_get_version_minor(mem_ctx, dce_ctx);
-               info102->server_type    = dcesrv_common_get_server_type(mem_ctx, dce_ctx);
-               info102->comment        = talloc_strdup(mem_ctx, lp_serverstring());
+               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);
@@ -1051,7 +1525,7 @@ static WERROR srvsvc_NetSrvGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CT
                info102->userpath       = dcesrv_common_get_userpath(mem_ctx, dce_ctx);
                W_ERROR_HAVE_NO_MEMORY(info102->userpath);
 
-               r->out.info.info102 = info102;
+               r->out.info->info102 = info102;
                return WERR_OK;
        }
        default:
@@ -1065,7 +1539,7 @@ static WERROR srvsvc_NetSrvGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CT
 /* 
   srvsvc_NetSrvSetInfo 
 */
-static WERROR 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)
 {
        DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
@@ -1075,30 +1549,29 @@ static WERROR srvsvc_NetSrvSetInfo(struct dcesrv_call_state *dce_call, TALLOC_CT
 /* 
   srvsvc_NetDiskEnum 
 */
-static WERROR 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.info.disks = NULL;
-       r->out.info.count = 0;
-       r->out.totalentries = 0;
-       r->out.resume_handle = NULL;
+       r->out.info->disks = NULL;
+       r->out.info->count = 0;
+       *r->out.totalentries = 0;
 
        switch (r->in.level) {
        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.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.info.disks[0].disk = talloc_strdup(mem_ctx, "C:");
-               W_ERROR_HAVE_NO_MEMORY(r->out.info.disks[0].disk);
+               r->out.info->disks[0].disk = talloc_strdup(mem_ctx, "C:");
+               W_ERROR_HAVE_NO_MEMORY(r->out.info->disks[0].disk);
 
-               r->out.info.disks[1].disk = talloc_strdup(mem_ctx, "");
-               W_ERROR_HAVE_NO_MEMORY(r->out.info.disks[1].disk);
+               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.totalentries = 1;
                r->out.resume_handle = r->in.resume_handle;
 
                return WERR_OK;
@@ -1114,7 +1587,7 @@ static WERROR srvsvc_NetDiskEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX
 /* 
   srvsvc_NetServerStatisticsGet 
 */
-static WERROR srvsvc_NetServerStatisticsGet(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR dcesrv_srvsvc_NetServerStatisticsGet(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
                       struct srvsvc_NetServerStatisticsGet *r)
 {
        DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
@@ -1124,7 +1597,7 @@ static WERROR srvsvc_NetServerStatisticsGet(struct dcesrv_call_state *dce_call,
 /* 
   srvsvc_NetTransportAdd 
 */
-static WERROR srvsvc_NetTransportAdd(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR dcesrv_srvsvc_NetTransportAdd(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
                       struct srvsvc_NetTransportAdd *r)
 {
        DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
@@ -1134,51 +1607,53 @@ static WERROR srvsvc_NetTransportAdd(struct dcesrv_call_state *dce_call, TALLOC_
 /* 
   srvsvc_NetTransportEnum 
 */
-static WERROR 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.transports->level = r->in.transports->level;
+       *r->out.totalentries = 0;
+       if (r->out.resume_handle) {
+               *r->out.resume_handle = 0;
+       }
 
-       switch (r->in.level) {
+       switch (r->in.transports->level) {
        case 0:
        {
-               r->out.transports.ctr0 = talloc(mem_ctx, struct srvsvc_NetTransportCtr0);
-               W_ERROR_HAVE_NO_MEMORY(r->out.transports.ctr0);
+               r->out.transports->ctr.ctr0 = talloc(mem_ctx, struct srvsvc_NetTransportCtr0);
+               W_ERROR_HAVE_NO_MEMORY(r->out.transports->ctr.ctr0);
 
-               r->out.transports.ctr0->count = 0;
-               r->out.transports.ctr0->array = NULL;
+               r->out.transports->ctr.ctr0->count = 0;
+               r->out.transports->ctr.ctr0->array = NULL;
 
                return WERR_NOT_SUPPORTED;
        }
        case 1:
        {
-               r->out.transports.ctr1 = talloc(mem_ctx, struct srvsvc_NetTransportCtr1);
-               W_ERROR_HAVE_NO_MEMORY(r->out.transports.ctr1);
+               r->out.transports->ctr.ctr1 = talloc(mem_ctx, struct srvsvc_NetTransportCtr1);
+               W_ERROR_HAVE_NO_MEMORY(r->out.transports->ctr.ctr1);
 
-               r->out.transports.ctr1->count = 0;
-               r->out.transports.ctr1->array = NULL;
+               r->out.transports->ctr.ctr1->count = 0;
+               r->out.transports->ctr.ctr1->array = NULL;
 
                return WERR_NOT_SUPPORTED;
        }
        case 2:
        {
-               r->out.transports.ctr2 = talloc(mem_ctx, struct srvsvc_NetTransportCtr2);
-               W_ERROR_HAVE_NO_MEMORY(r->out.transports.ctr2);
+               r->out.transports->ctr.ctr2 = talloc(mem_ctx, struct srvsvc_NetTransportCtr2);
+               W_ERROR_HAVE_NO_MEMORY(r->out.transports->ctr.ctr2);
 
-               r->out.transports.ctr2->count = 0;
-               r->out.transports.ctr2->array = NULL;
+               r->out.transports->ctr.ctr2->count = 0;
+               r->out.transports->ctr.ctr2->array = NULL;
 
                return WERR_NOT_SUPPORTED;
        }
        case 3:
        {
-               r->out.transports.ctr3 = talloc(mem_ctx, struct srvsvc_NetTransportCtr3);
-               W_ERROR_HAVE_NO_MEMORY(r->out.transports.ctr3);
+               r->out.transports->ctr.ctr3 = talloc(mem_ctx, struct srvsvc_NetTransportCtr3);
+               W_ERROR_HAVE_NO_MEMORY(r->out.transports->ctr.ctr3);
 
-               r->out.transports.ctr3->count = 0;
-               r->out.transports.ctr3->array = NULL;
+               r->out.transports->ctr.ctr3->count = 0;
+               r->out.transports->ctr.ctr3->array = NULL;
 
                return WERR_NOT_SUPPORTED;
        }
@@ -1192,7 +1667,7 @@ static WERROR srvsvc_NetTransportEnum(struct dcesrv_call_state *dce_call, TALLOC
 /* 
   srvsvc_NetTransportDel 
 */
-static WERROR srvsvc_NetTransportDel(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR dcesrv_srvsvc_NetTransportDel(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
                       struct srvsvc_NetTransportDel *r)
 {
        DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
@@ -1202,37 +1677,40 @@ static WERROR srvsvc_NetTransportDel(struct dcesrv_call_state *dce_call, TALLOC_
 /* 
   srvsvc_NetRemoteTOD 
 */
-static WERROR srvsvc_NetRemoteTOD(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR dcesrv_srvsvc_NetRemoteTOD(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
                       struct srvsvc_NetRemoteTOD *r)
 {
        struct timeval tval;
        time_t t;
        struct tm tm;
+       struct srvsvc_NetRemoteTODInfo *info;
 
-       r->out.info = talloc(mem_ctx, struct srvsvc_NetRemoteTODInfo);
-       W_ERROR_HAVE_NO_MEMORY(r->out.info);
+       info = talloc(mem_ctx, struct srvsvc_NetRemoteTODInfo);
+       W_ERROR_HAVE_NO_MEMORY(info);
 
        GetTimeOfDay(&tval);
        t = tval.tv_sec;
 
        gmtime_r(&t, &tm);
 
-       r->out.info->elapsed    = t;
+       info->elapsed   = t;
        /* TODO: fake the uptime: just return the milliseconds till 0:00:00 today */
-       r->out.info->msecs      = (tm.tm_hour*60*60*1000)
-                               + (tm.tm_min*60*1000)
-                               + (tm.tm_sec*1000)
-                               + (tval.tv_usec/1000);
-       r->out.info->hours      = tm.tm_hour;
-       r->out.info->mins       = tm.tm_min;
-       r->out.info->secs       = tm.tm_sec;
-       r->out.info->hunds      = tval.tv_usec/10000;
-       r->out.info->timezone   = get_time_zone(t)/60;
-       r->out.info->tinterval  = 310; /* just return the same as windows */
-       r->out.info->day        = tm.tm_mday;
-       r->out.info->month      = tm.tm_mon + 1;
-       r->out.info->year       = tm.tm_year + 1900;
-       r->out.info->weekday    = tm.tm_wday;
+       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;
 }
@@ -1240,7 +1718,7 @@ static WERROR srvsvc_NetRemoteTOD(struct dcesrv_call_state *dce_call, TALLOC_CTX
 /* 
   srvsvc_NetPathType 
 */
-static WERROR srvsvc_NetPathType(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR dcesrv_srvsvc_NetPathType(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
                       struct srvsvc_NetPathType *r)
 {
        DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
@@ -1250,7 +1728,7 @@ static WERROR srvsvc_NetPathType(struct dcesrv_call_state *dce_call, TALLOC_CTX
 /* 
   srvsvc_NetPathCanonicalize 
 */
-static WERROR srvsvc_NetPathCanonicalize(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR dcesrv_srvsvc_NetPathCanonicalize(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
                       struct srvsvc_NetPathCanonicalize *r)
 {
        DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
@@ -1260,7 +1738,7 @@ static WERROR srvsvc_NetPathCanonicalize(struct dcesrv_call_state *dce_call, TAL
 /* 
   srvsvc_NetPathCompare 
 */
-static WERROR srvsvc_NetPathCompare(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR dcesrv_srvsvc_NetPathCompare(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
                       struct srvsvc_NetPathCompare *r)
 {
        DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
@@ -1270,17 +1748,57 @@ static WERROR srvsvc_NetPathCompare(struct dcesrv_call_state *dce_call, TALLOC_C
 /* 
   srvsvc_NetNameValidate 
 */
-static WERROR srvsvc_NetNameValidate(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR dcesrv_srvsvc_NetNameValidate(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
                       struct srvsvc_NetNameValidate *r)
 {
-       DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
+       int len;
+
+       if ((r->in.flags != 0x0) && (r->in.flags != 0x80000000)) {
+               return WERR_INVALID_NAME;
+       }
+
+       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;
+       }
+
+       return WERR_INVALID_PARAM;
 }
 
 
 /* 
   srvsvc_NetPRNameCompare 
 */
-static WERROR srvsvc_NetPRNameCompare(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR dcesrv_srvsvc_NetPRNameCompare(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
                       struct srvsvc_NetPRNameCompare *r)
 {
        DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
@@ -1290,7 +1808,7 @@ static WERROR srvsvc_NetPRNameCompare(struct dcesrv_call_state *dce_call, TALLOC
 /* 
   srvsvc_NetShareEnum 
 */
-static WERROR 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;
@@ -1308,7 +1826,7 @@ static WERROR srvsvc_NetShareEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX
        /* TODO: - paging of results 
         */
 
-       nterr = share_get_context(mem_ctx, &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);
        }
@@ -1359,7 +1877,7 @@ static WERROR srvsvc_NetShareEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX
                        }
 
                        info.info0 = &ctr0->array[y];
-                       status = srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
+                       status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
                        W_ERROR_NOT_OK_RETURN(status);
                        talloc_free(scfg);
                        y++;
@@ -1410,7 +1928,7 @@ static WERROR srvsvc_NetShareEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX
                        }
 
                        info.info1 = &ctr1->array[y];
-                       status = srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
+                       status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
                        W_ERROR_NOT_OK_RETURN(status);
                        talloc_free(scfg);
                        y++;
@@ -1463,7 +1981,7 @@ static WERROR srvsvc_NetShareEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX
                        }
 
                        info.info2 = &ctr2->array[y];
-                       status = srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
+                       status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
                        W_ERROR_NOT_OK_RETURN(status);
                        talloc_free(scfg);
                        y++;
@@ -1516,7 +2034,7 @@ static WERROR srvsvc_NetShareEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX
                        }
 
                        info.info502 = &ctr502->array[y];
-                       status = srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
+                       status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
                        W_ERROR_NOT_OK_RETURN(status);
                        talloc_free(scfg);
                        y++;
@@ -1538,7 +2056,7 @@ static WERROR srvsvc_NetShareEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX
 /* 
   srvsvc_NetShareDelStart 
 */
-static WERROR srvsvc_NetShareDelStart(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR dcesrv_srvsvc_NetShareDelStart(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
                       struct srvsvc_NetShareDelStart *r)
 {
        DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
@@ -1548,7 +2066,7 @@ static WERROR srvsvc_NetShareDelStart(struct dcesrv_call_state *dce_call, TALLOC
 /* 
   srvsvc_NetShareDelCommit 
 */
-static WERROR srvsvc_NetShareDelCommit(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR dcesrv_srvsvc_NetShareDelCommit(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
                       struct srvsvc_NetShareDelCommit *r)
 {
        DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
@@ -1558,7 +2076,7 @@ static WERROR srvsvc_NetShareDelCommit(struct dcesrv_call_state *dce_call, TALLO
 /* 
   srvsvc_NetGetFileSecurity 
 */
-static WERROR srvsvc_NetGetFileSecurity(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR dcesrv_srvsvc_NetGetFileSecurity(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
                       struct srvsvc_NetGetFileSecurity *r)
 {
        struct sec_desc_buf *sd_buf;
@@ -1592,7 +2110,7 @@ static WERROR srvsvc_NetGetFileSecurity(struct dcesrv_call_state *dce_call, TALL
 
        sd_buf->sd = io->query_secdesc.out.sd;
 
-       r->out.sd_buf = sd_buf;
+       *r->out.sd_buf = sd_buf;
        return WERR_OK;
 }
 
@@ -1600,7 +2118,7 @@ static WERROR srvsvc_NetGetFileSecurity(struct dcesrv_call_state *dce_call, TALL
 /* 
   srvsvc_NetSetFileSecurity 
 */
-static WERROR srvsvc_NetSetFileSecurity(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR dcesrv_srvsvc_NetSetFileSecurity(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
                       struct srvsvc_NetSetFileSecurity *r)
 {
        struct ntvfs_context *ntvfs_ctx;
@@ -1624,7 +2142,7 @@ static WERROR srvsvc_NetSetFileSecurity(struct dcesrv_call_state *dce_call, TALL
        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;
+       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);
@@ -1636,7 +2154,7 @@ static WERROR srvsvc_NetSetFileSecurity(struct dcesrv_call_state *dce_call, TALL
 /* 
   srvsvc_NetServerTransportAddEx 
 */
-static WERROR srvsvc_NetServerTransportAddEx(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR dcesrv_srvsvc_NetServerTransportAddEx(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
                       struct srvsvc_NetServerTransportAddEx *r)
 {
        DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
@@ -1646,7 +2164,7 @@ static WERROR srvsvc_NetServerTransportAddEx(struct dcesrv_call_state *dce_call,
 /* 
   srvsvc_NetServerSetServiceBitsEx 
 */
-static WERROR srvsvc_NetServerSetServiceBitsEx(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR dcesrv_srvsvc_NetServerSetServiceBitsEx(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
                       struct srvsvc_NetServerSetServiceBitsEx *r)
 {
        DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
@@ -1656,7 +2174,7 @@ static WERROR srvsvc_NetServerSetServiceBitsEx(struct dcesrv_call_state *dce_cal
 /* 
   srvsvc_NETRDFSGETVERSION 
 */
-static WERROR 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)
 {
        DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
@@ -1666,7 +2184,7 @@ static WERROR srvsvc_NETRDFSGETVERSION(struct dcesrv_call_state *dce_call, TALLO
 /* 
   srvsvc_NETRDFSCREATELOCALPARTITION 
 */
-static WERROR 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)
 {
        DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
@@ -1676,7 +2194,7 @@ static WERROR srvsvc_NETRDFSCREATELOCALPARTITION(struct dcesrv_call_state *dce_c
 /* 
   srvsvc_NETRDFSDELETELOCALPARTITION 
 */
-static WERROR 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)
 {
        DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
@@ -1686,7 +2204,7 @@ static WERROR srvsvc_NETRDFSDELETELOCALPARTITION(struct dcesrv_call_state *dce_c
 /* 
   srvsvc_NETRDFSSETLOCALVOLUMESTATE 
 */
-static WERROR 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)
 {
        DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
@@ -1696,7 +2214,7 @@ static WERROR srvsvc_NETRDFSSETLOCALVOLUMESTATE(struct dcesrv_call_state *dce_ca
 /* 
   srvsvc_NETRDFSSETSERVERINFO 
 */
-static WERROR 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)
 {
        DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
@@ -1706,7 +2224,7 @@ static WERROR srvsvc_NETRDFSSETSERVERINFO(struct dcesrv_call_state *dce_call, TA
 /* 
   srvsvc_NETRDFSCREATEEXITPOINT 
 */
-static WERROR 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)
 {
        DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
@@ -1716,7 +2234,7 @@ static WERROR srvsvc_NETRDFSCREATEEXITPOINT(struct dcesrv_call_state *dce_call,
 /* 
   srvsvc_NETRDFSDELETEEXITPOINT 
 */
-static WERROR 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)
 {
        DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
@@ -1726,7 +2244,7 @@ static WERROR srvsvc_NETRDFSDELETEEXITPOINT(struct dcesrv_call_state *dce_call,
 /* 
   srvsvc_NETRDFSMODIFYPREFIX 
 */
-static WERROR 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)
 {
        DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
@@ -1736,7 +2254,7 @@ static WERROR srvsvc_NETRDFSMODIFYPREFIX(struct dcesrv_call_state *dce_call, TAL
 /* 
   srvsvc_NETRDFSFIXLOCALVOLUME 
 */
-static WERROR 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)
 {
        DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
@@ -1746,7 +2264,7 @@ static WERROR srvsvc_NETRDFSFIXLOCALVOLUME(struct dcesrv_call_state *dce_call, T
 /* 
   srvsvc_NETRDFSMANAGERREPORTSITEINFO 
 */
-static WERROR 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)
 {
        DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
@@ -1756,7 +2274,7 @@ static WERROR srvsvc_NETRDFSMANAGERREPORTSITEINFO(struct dcesrv_call_state *dce_
 /* 
   srvsvc_NETRSERVERTRANSPORTDELEX 
 */
-static WERROR 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)
 {
        DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
@@ -1765,16 +2283,29 @@ static WERROR srvsvc_NETRSERVERTRANSPORTDELEX(struct dcesrv_call_state *dce_call
 /* 
   srvsvc_NetShareDel 
 */
-static WERROR srvsvc_NetShareDel(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR dcesrv_srvsvc_NetShareDel(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
                       struct srvsvc_NetShareDel *r)
 {
-       DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
+       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 srvsvc_NetSetServiceBits(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+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);
@@ -1783,7 +2314,7 @@ static WERROR srvsvc_NetSetServiceBits(struct dcesrv_call_state *dce_call, TALLO
 /* 
   srvsvc_NETRPRNAMECANONICALIZE 
 */
-static WERROR srvsvc_NETRPRNAMECANONICALIZE(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+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);