s4:rpc_server/srvsvc: make use dcesrv_call_session_info()
[samba.git] / source4 / rpc_server / srvsvc / dcesrv_srvsvc.c
index 23e40d997653b95b16665536954f0d3d167b11cd..09673f6345cdcfd6f3fb35fb61ec51cab0d26059 100644 (file)
@@ -24,7 +24,7 @@
 #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 "rpc_server/common/share.h"
 #include "auth/auth.h"
 #include "libcli/security/security.h"
 #include "system/time.h"
 #include "param/param.h"
 
 #define SRVSVC_CHECK_ADMIN_ACCESS do { \
-       struct security_token *t = dce_call->conn->auth_state.session_info->security_token; \
+       struct auth_session_info *si = dcesrv_call_session_info(dce_call); \
+       struct security_token *t = si->security_token; \
        if (!security_token_has_builtin_administrators(t) && \
-           !security_token_has_sid_string(t, SID_BUILTIN_SERVER_OPERATORS)) { \
+           !security_token_has_sid(t, &global_sid_Builtin_Server_Operators)) { \
                return WERR_ACCESS_DENIED; \
        } \
 } while (0)
 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;
 
        default:
-               return WERR_UNKNOWN_LEVEL;
+               return WERR_INVALID_LEVEL;
        }
-
-       return WERR_OK;
 }
 
 
@@ -82,7 +79,7 @@ static WERROR dcesrv_srvsvc_NetCharDevEnum(struct dcesrv_call_state *dce_call, T
 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:
@@ -94,10 +91,8 @@ static WERROR dcesrv_srvsvc_NetCharDevGetInfo(struct dcesrv_call_state *dce_call
                return WERR_NOT_SUPPORTED;
        }
        default:
-               return WERR_UNKNOWN_LEVEL;
+               return WERR_INVALID_LEVEL;
        }
-
-       return WERR_UNKNOWN_LEVEL;
 }
 
 
@@ -117,36 +112,32 @@ static WERROR dcesrv_srvsvc_NetCharDevControl(struct dcesrv_call_state *dce_call
 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;
        }
        default:
-               return WERR_UNKNOWN_LEVEL;
+               return WERR_INVALID_LEVEL;
        }
-
-       return WERR_UNKNOWN_LEVEL;
 }
 
 
@@ -156,7 +147,7 @@ static WERROR dcesrv_srvsvc_NetCharDevQEnum(struct dcesrv_call_state *dce_call,
 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:
@@ -168,10 +159,8 @@ static WERROR dcesrv_srvsvc_NetCharDevQGetInfo(struct dcesrv_call_state *dce_cal
                return WERR_NOT_SUPPORTED;
        }
        default:
-               return WERR_UNKNOWN_LEVEL;
+               return WERR_INVALID_LEVEL;
        }
-
-       return WERR_UNKNOWN_LEVEL;
 }
 
 
@@ -197,10 +186,8 @@ static WERROR dcesrv_srvsvc_NetCharDevQSetInfo(struct dcesrv_call_state *dce_cal
                return WERR_NOT_SUPPORTED;
        }
        default:
-               return WERR_UNKNOWN_LEVEL;
+               return WERR_INVALID_LEVEL;
        }
-
-       return WERR_UNKNOWN_LEVEL;
 }
 
 
@@ -230,36 +217,32 @@ static WERROR dcesrv_srvsvc_NetCharDevQPurgeSelf(struct dcesrv_call_state *dce_c
 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;
        }
        default:
-               return WERR_UNKNOWN_LEVEL;
+               return WERR_INVALID_LEVEL;
        }
-
-       return WERR_UNKNOWN_LEVEL;
 }
 
 
@@ -269,36 +252,32 @@ static WERROR dcesrv_srvsvc_NetConnEnum(struct dcesrv_call_state *dce_call, TALL
 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.totalentries = 0;
 
-       switch (r->in.level) {
+       switch (r->in.info_ctr->level) {
        case 2:
        {
-               r->out.ctr.ctr2 = talloc(mem_ctx, struct srvsvc_NetFileCtr2);
-               W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr2);
+               r->out.info_ctr->ctr.ctr2 = talloc(mem_ctx, struct srvsvc_NetFileCtr2);
+               W_ERROR_HAVE_NO_MEMORY(r->out.info_ctr->ctr.ctr2);
 
-               r->out.ctr.ctr2->count = 0;
-               r->out.ctr.ctr2->array = NULL;
+               r->out.info_ctr->ctr.ctr2->count = 0;
+               r->out.info_ctr->ctr.ctr2->array = NULL;
 
                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.info_ctr->ctr.ctr3 = talloc(mem_ctx, struct srvsvc_NetFileCtr3);
+               W_ERROR_HAVE_NO_MEMORY(r->out.info_ctr->ctr.ctr3);
 
-               r->out.ctr.ctr3->count = 0;
-               r->out.ctr.ctr3->array = NULL;
+               r->out.info_ctr->ctr.ctr3->count = 0;
+               r->out.info_ctr->ctr.ctr3->array = NULL;
 
                return WERR_NOT_SUPPORTED;
        }
        default:
-               return WERR_UNKNOWN_LEVEL;
+               return WERR_INVALID_LEVEL;
        }
-
-       return WERR_UNKNOWN_LEVEL;
 }
 
 
@@ -308,7 +287,7 @@ static WERROR dcesrv_srvsvc_NetFileEnum(struct dcesrv_call_state *dce_call, TALL
 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:
@@ -320,10 +299,8 @@ static WERROR dcesrv_srvsvc_NetFileGetInfo(struct dcesrv_call_state *dce_call, T
                return WERR_NOT_SUPPORTED;
        }
        default:
-               return WERR_UNKNOWN_LEVEL;
+               return WERR_INVALID_LEVEL;
        }
-
-       return WERR_UNKNOWN_LEVEL;
 }
 
 
@@ -343,66 +320,62 @@ static WERROR dcesrv_srvsvc_NetFileClose(struct dcesrv_call_state *dce_call, TAL
 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.totalentries = 0;
 
-       switch (r->in.level) {
+       switch (r->in.info_ctr->level) {
        case 0:
        {
-               r->out.ctr.ctr0 = talloc(mem_ctx, struct srvsvc_NetSessCtr0);
-               W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr0);
+               r->out.info_ctr->ctr.ctr0 = talloc(mem_ctx, struct srvsvc_NetSessCtr0);
+               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_NetSessCtr1);
-               W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr1);
+               r->out.info_ctr->ctr.ctr1 = talloc(mem_ctx, struct srvsvc_NetSessCtr1);
+               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;
        }
        case 2:
        {
-               r->out.ctr.ctr2 = talloc(mem_ctx, struct srvsvc_NetSessCtr2);
-               W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr2);
+               r->out.info_ctr->ctr.ctr2 = talloc(mem_ctx, struct srvsvc_NetSessCtr2);
+               W_ERROR_HAVE_NO_MEMORY(r->out.info_ctr->ctr.ctr2);
 
-               r->out.ctr.ctr2->count = 0;
-               r->out.ctr.ctr2->array = NULL;
+               r->out.info_ctr->ctr.ctr2->count = 0;
+               r->out.info_ctr->ctr.ctr2->array = NULL;
 
                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.info_ctr->ctr.ctr10 = talloc(mem_ctx, struct srvsvc_NetSessCtr10);
+               W_ERROR_HAVE_NO_MEMORY(r->out.info_ctr->ctr.ctr10);
 
-               r->out.ctr.ctr2->count = 0;
-               r->out.ctr.ctr2->array = NULL;
+               r->out.info_ctr->ctr.ctr10->count = 0;
+               r->out.info_ctr->ctr.ctr10->array = NULL;
 
                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.info_ctr->ctr.ctr502 = talloc(mem_ctx, struct srvsvc_NetSessCtr502);
+               W_ERROR_HAVE_NO_MEMORY(r->out.info_ctr->ctr.ctr502);
 
-               r->out.ctr.ctr2->count = 0;
-               r->out.ctr.ctr2->array = NULL;
+               r->out.info_ctr->ctr.ctr502->count = 0;
+               r->out.info_ctr->ctr.ctr502->array = NULL;
 
                return WERR_NOT_SUPPORTED;
        }
        default:
-               return WERR_UNKNOWN_LEVEL;
+               return WERR_INVALID_LEVEL;
        }
-
-       return WERR_UNKNOWN_LEVEL;
 }
 
 
@@ -442,10 +415,10 @@ static WERROR dcesrv_srvsvc_NetShareAdd(struct dcesrv_call_state *dce_call, TALL
                NTSTATUS nterr;
                struct share_info *info;
                struct share_context *sctx;
-               int count = 8;
-               int i;
+               unsigned int count = 8;
+               unsigned int i;
 
-               nterr = share_get_context_by_name(mem_ctx, lp_share_backend(dce_call->conn->dce_ctx->lp_ctx), dce_call->conn->dce_ctx->lp_ctx, &sctx);
+               nterr = share_get_context_by_name(mem_ctx, lpcfg_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);
                }
@@ -458,32 +431,32 @@ static WERROR dcesrv_srvsvc_NetShareAdd(struct dcesrv_call_state *dce_call, TALL
 
                info[i].name = SHARE_TYPE;
                info[i].type = SHARE_INFO_STRING;
-               switch (r->in.info.info2->type) {
-               case 0x00:
+               switch (r->in.info->info2->type) {
+               case STYPE_DISKTREE:
                        info[i].value = talloc_strdup(info, "DISK");
                        break;
-               case 0x01:
+               case STYPE_PRINTQ:
                        info[i].value = talloc_strdup(info, "PRINTER");
                        break;
-               case 0x03:
+               case STYPE_IPC:
                        info[i].value = talloc_strdup(info, "IPC");
                        break;
                default:
-                       return WERR_INVALID_PARAM;
+                       return WERR_INVALID_PARAMETER;
                }
                W_ERROR_HAVE_NO_MEMORY(info[i].value);
                i++;
 
-               if (r->in.info.info2->path && r->in.info.info2->path[0]) {
+               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]);
+                       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);
+                               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);
@@ -491,19 +464,19 @@ static WERROR dcesrv_srvsvc_NetShareAdd(struct dcesrv_call_state *dce_call, TALL
                        i++;
                }
 
-               if (r->in.info.info2->comment && r->in.info.info2->comment[0]) {
+               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);
+                       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]) {
+               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.info502->password);
+                       info[i].value = talloc_strdup(info, r->in.info->info2->password);
                        W_ERROR_HAVE_NO_MEMORY(info[i].value);
 
                        i++;
@@ -512,12 +485,12 @@ static WERROR dcesrv_srvsvc_NetShareAdd(struct dcesrv_call_state *dce_call, TALL
                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;
+               *((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);
+               nterr = share_create(sctx, r->in.info->info2->name, info, i);
                if (!NT_STATUS_IS_OK(nterr)) {
                        return ntstatus_to_werror(nterr);
                }
@@ -540,10 +513,10 @@ static WERROR dcesrv_srvsvc_NetShareAdd(struct dcesrv_call_state *dce_call, TALL
                NTSTATUS nterr;
                struct share_info *info;
                struct share_context *sctx;
-               int count = 10;
-               int i;
+               unsigned int count = 10;
+               unsigned int i;
 
-               nterr = share_get_context_by_name(mem_ctx, lp_share_backend(dce_call->conn->dce_ctx->lp_ctx), dce_call->conn->dce_ctx->lp_ctx, &sctx);
+               nterr = share_get_context_by_name(mem_ctx, lpcfg_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);
                }
@@ -556,7 +529,7 @@ static WERROR dcesrv_srvsvc_NetShareAdd(struct dcesrv_call_state *dce_call, TALL
 
                info[i].name = SHARE_TYPE;
                info[i].type = SHARE_INFO_STRING;
-               switch (r->in.info.info502->type) {
+               switch (r->in.info->info502->type) {
                case 0x00:
                        info[i].value = talloc_strdup(info, "DISK");
                        break;
@@ -567,21 +540,21 @@ static WERROR dcesrv_srvsvc_NetShareAdd(struct dcesrv_call_state *dce_call, TALL
                        info[i].value = talloc_strdup(info, "IPC");
                        break;
                default:
-                       return WERR_INVALID_PARAM;
+                       return WERR_INVALID_PARAMETER;
                }
                W_ERROR_HAVE_NO_MEMORY(info[i].value);
                i++;
 
-               if (r->in.info.info502->path && r->in.info.info502->path[0]) {
+               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.info2->path[1] == ':') {
-                               info[i].value = talloc_strdup(info, &r->in.info.info502->path[2]);
+                       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);
+                               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);
@@ -589,19 +562,19 @@ static WERROR dcesrv_srvsvc_NetShareAdd(struct dcesrv_call_state *dce_call, TALL
                        i++;
                }
 
-               if (r->in.info.info502->comment && r->in.info.info502->comment[0]) {
+               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);
+                       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]) {
+               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);
+                       info[i].value = talloc_strdup(info, r->in.info->info502->password);
                        W_ERROR_HAVE_NO_MEMORY(info[i].value);
 
                        i++;
@@ -610,12 +583,12 @@ static WERROR dcesrv_srvsvc_NetShareAdd(struct dcesrv_call_state *dce_call, TALL
                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;
+               *((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);
+               nterr = share_create(sctx, r->in.info->info502->name, info, i);
                if (!NT_STATUS_IS_OK(nterr)) {
                        return ntstatus_to_werror(nterr);
                }
@@ -627,10 +600,8 @@ static WERROR dcesrv_srvsvc_NetShareAdd(struct dcesrv_call_state *dce_call, TALL
                return WERR_OK;
        }
        default:
-               return WERR_UNKNOWN_LEVEL;
+               return WERR_INVALID_LEVEL;
        }
-
-       return WERR_UNKNOWN_LEVEL;
 }
 
 static WERROR dcesrv_srvsvc_fiel_ShareInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
@@ -652,7 +623,7 @@ static WERROR dcesrv_srvsvc_fiel_ShareInfo(struct dcesrv_call_state *dce_call, T
                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, ""));
+               info->info1->comment    = share_string_option(mem_ctx, scfg, SHARE_COMMENT, "");
                W_ERROR_HAVE_NO_MEMORY(info->info1->comment);
 
                return WERR_OK;
@@ -662,14 +633,14 @@ static WERROR dcesrv_srvsvc_fiel_ShareInfo(struct dcesrv_call_state *dce_call, T
                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, ""));
+               info->info2->comment            = share_string_option(mem_ctx, 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));
+               info->info2->password           = share_string_option(mem_ctx, scfg, SHARE_PASSWORD, NULL);
 
                return WERR_OK;
        }
@@ -678,7 +649,7 @@ static WERROR dcesrv_srvsvc_fiel_ShareInfo(struct dcesrv_call_state *dce_call, T
                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, ""));
+               info->info501->comment          = share_string_option(mem_ctx, 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);
 
@@ -689,16 +660,15 @@ static WERROR dcesrv_srvsvc_fiel_ShareInfo(struct dcesrv_call_state *dce_call, T
                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, ""));
+               info->info502->comment          = share_string_option(mem_ctx, 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->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->password         = share_string_option(mem_ctx, scfg, SHARE_PASSWORD, NULL);
+               info->info502->sd_buf.sd        = dcesrv_common_get_security_descriptor(mem_ctx, dce_ctx, scfg);
 
                return WERR_OK;
        }
@@ -709,10 +679,8 @@ static WERROR dcesrv_srvsvc_fiel_ShareInfo(struct dcesrv_call_state *dce_call, T
                return WERR_OK;
        }
        default:
-               return WERR_UNKNOWN_LEVEL;
+               return WERR_INVALID_LEVEL;
        }
-
-       return WERR_UNKNOWN_LEVEL;
 }
 
 /* 
@@ -727,15 +695,12 @@ static WERROR dcesrv_srvsvc_NetShareEnumAll(struct dcesrv_call_state *dce_call,
        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.totalentries = 0;
 
        /* TODO: - paging of results 
         */
 
-       nterr = share_get_context_by_name(mem_ctx, lp_share_backend(dce_call->conn->dce_ctx->lp_ctx), dce_call->conn->dce_ctx->lp_ctx, &sctx);
+       nterr = share_get_context_by_name(mem_ctx, lpcfg_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);
        }
@@ -745,10 +710,10 @@ static WERROR dcesrv_srvsvc_NetShareEnumAll(struct dcesrv_call_state *dce_call,
                return ntstatus_to_werror(nterr);
        }
 
-       switch (r->in.level) {
+       switch (r->in.info_ctr->level) {
        case 0:
        {
-               int i;
+               unsigned int i;
                struct srvsvc_NetShareCtr0 *ctr0;
 
                ctr0 = talloc(mem_ctx, struct srvsvc_NetShareCtr0);
@@ -758,7 +723,7 @@ static WERROR dcesrv_srvsvc_NetShareEnumAll(struct dcesrv_call_state *dce_call,
                ctr0->array = NULL;
 
                if (ctr0->count == 0) {
-                       r->out.ctr.ctr0 = ctr0;
+                       r->out.info_ctr->ctr.ctr0       = ctr0;
                        return WERR_OK;
                }
 
@@ -772,10 +737,10 @@ static WERROR dcesrv_srvsvc_NetShareEnumAll(struct dcesrv_call_state *dce_call,
                        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;
+                               return WERR_GEN_FAILURE;
                        }
                        info.info0 = &ctr0->array[i];
-                       status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
+                       status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.info_ctr->level, &info);
                        if (!W_ERROR_IS_OK(status)) {
                                return status;
                        }
@@ -783,13 +748,13 @@ static WERROR dcesrv_srvsvc_NetShareEnumAll(struct dcesrv_call_state *dce_call,
                }
                talloc_free(snames);
 
-               r->out.ctr.ctr0         = ctr0;
-               r->out.totalentries     = r->out.ctr.ctr0->count;
+               r->out.info_ctr->ctr.ctr0       = ctr0;
+               *r->out.totalentries            = r->out.info_ctr->ctr.ctr0->count;
                return WERR_OK;
        }
        case 1:
        {
-               int i;
+               unsigned int i;
                struct srvsvc_NetShareCtr1 *ctr1;
 
                ctr1 = talloc(mem_ctx, struct srvsvc_NetShareCtr1);
@@ -799,7 +764,7 @@ static WERROR dcesrv_srvsvc_NetShareEnumAll(struct dcesrv_call_state *dce_call,
                ctr1->array = NULL;
 
                if (ctr1->count == 0) {
-                       r->out.ctr.ctr1 = ctr1;
+                       r->out.info_ctr->ctr.ctr1       = ctr1;
                        return WERR_OK;
                }
 
@@ -813,10 +778,10 @@ static WERROR dcesrv_srvsvc_NetShareEnumAll(struct dcesrv_call_state *dce_call,
                        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;
+                               return WERR_GEN_FAILURE;
                        }
                        info.info1 = &ctr1->array[i];
-                       status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
+                       status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.info_ctr->level, &info);
                        if (!W_ERROR_IS_OK(status)) {
                                return status;
                        }
@@ -824,13 +789,14 @@ static WERROR dcesrv_srvsvc_NetShareEnumAll(struct dcesrv_call_state *dce_call,
                }
                talloc_free(snames);
 
-               r->out.ctr.ctr1         = ctr1;
-               r->out.totalentries     = r->out.ctr.ctr1->count;
+               r->out.info_ctr->ctr.ctr1       = ctr1;
+               *r->out.totalentries            = r->out.info_ctr->ctr.ctr1->count;
+
                return WERR_OK;
        }
        case 2:
        {
-               int i;
+               unsigned int i;
                struct srvsvc_NetShareCtr2 *ctr2;
 
                SRVSVC_CHECK_ADMIN_ACCESS;
@@ -842,7 +808,7 @@ static WERROR dcesrv_srvsvc_NetShareEnumAll(struct dcesrv_call_state *dce_call,
                ctr2->array = NULL;
 
                if (ctr2->count == 0) {
-                       r->out.ctr.ctr2 = ctr2;
+                       r->out.info_ctr->ctr.ctr2       = ctr2;
                        return WERR_OK;
                }
 
@@ -856,10 +822,10 @@ static WERROR dcesrv_srvsvc_NetShareEnumAll(struct dcesrv_call_state *dce_call,
                        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;
+                               return WERR_GEN_FAILURE;
                        }
                        info.info2 = &ctr2->array[i];
-                       status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
+                       status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.info_ctr->level, &info);
                        if (!W_ERROR_IS_OK(status)) {
                                return status;
                        }
@@ -867,13 +833,14 @@ static WERROR dcesrv_srvsvc_NetShareEnumAll(struct dcesrv_call_state *dce_call,
                }
                talloc_free(snames);
 
-               r->out.ctr.ctr2         = ctr2;
-               r->out.totalentries     = r->out.ctr.ctr2->count;
+               r->out.info_ctr->ctr.ctr2       = ctr2;
+               *r->out.totalentries            = r->out.info_ctr->ctr.ctr2->count;
+
                return WERR_OK;
        }
        case 501:
        {
-               int i;
+               unsigned int i;
                struct srvsvc_NetShareCtr501 *ctr501;
 
                SRVSVC_CHECK_ADMIN_ACCESS;
@@ -885,7 +852,7 @@ static WERROR dcesrv_srvsvc_NetShareEnumAll(struct dcesrv_call_state *dce_call,
                ctr501->array = NULL;
 
                if (ctr501->count == 0) {
-                       r->out.ctr.ctr501 = ctr501;
+                       r->out.info_ctr->ctr.ctr501     = ctr501;
                        return WERR_OK;
                }
 
@@ -899,10 +866,10 @@ static WERROR dcesrv_srvsvc_NetShareEnumAll(struct dcesrv_call_state *dce_call,
                        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;
+                               return WERR_GEN_FAILURE;
                        }
                        info.info501 = &ctr501->array[i];
-                       status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
+                       status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.info_ctr->level, &info);
                        if (!W_ERROR_IS_OK(status)) {
                                return status;
                        }
@@ -910,13 +877,14 @@ static WERROR dcesrv_srvsvc_NetShareEnumAll(struct dcesrv_call_state *dce_call,
                }
                talloc_free(snames);
 
-               r->out.ctr.ctr501       = ctr501;
-               r->out.totalentries     = r->out.ctr.ctr501->count;
+               r->out.info_ctr->ctr.ctr501     = ctr501;
+               *r->out.totalentries            = r->out.info_ctr->ctr.ctr501->count;
+
                return WERR_OK;
        }
        case 502:
        {
-               int i;
+               unsigned int i;
                struct srvsvc_NetShareCtr502 *ctr502;
 
                SRVSVC_CHECK_ADMIN_ACCESS;
@@ -928,7 +896,7 @@ static WERROR dcesrv_srvsvc_NetShareEnumAll(struct dcesrv_call_state *dce_call,
                ctr502->array = NULL;
 
                if (ctr502->count == 0) {
-                       r->out.ctr.ctr502 = ctr502;
+                       r->out.info_ctr->ctr.ctr502     = ctr502;
                        return WERR_OK;
                }
 
@@ -942,10 +910,10 @@ static WERROR dcesrv_srvsvc_NetShareEnumAll(struct dcesrv_call_state *dce_call,
                        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;
+                               return WERR_GEN_FAILURE;
                        }
                        info.info502 = &ctr502->array[i];
-                       status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
+                       status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.info_ctr->level, &info);
                        if (!W_ERROR_IS_OK(status)) {
                                return status;
                        }
@@ -953,15 +921,14 @@ static WERROR dcesrv_srvsvc_NetShareEnumAll(struct dcesrv_call_state *dce_call,
                }
                talloc_free(snames);
 
-               r->out.ctr.ctr502       = ctr502;
-               r->out.totalentries     = r->out.ctr.ctr502->count;
+               r->out.info_ctr->ctr.ctr502     = ctr502;
+               *r->out.totalentries            = r->out.info_ctr->ctr.ctr502->count;
+
                return WERR_OK;
        }
        default:
-               return WERR_UNKNOWN_LEVEL;
+               return WERR_INVALID_LEVEL;
        }
-
-       return WERR_UNKNOWN_LEVEL;
 }
 
 
@@ -975,16 +942,16 @@ static WERROR dcesrv_srvsvc_NetShareGetInfo(struct dcesrv_call_state *dce_call,
        struct share_context *sctx = NULL;
        struct share_config *scfg = NULL;
 
-       ZERO_STRUCT(r->out);
+       ZERO_STRUCTP(r->out.info);
 
        /* TODO: - access check
         */
 
        if (strcmp("", r->in.share_name) == 0) {
-               return WERR_INVALID_PARAM;
+               return WERR_INVALID_PARAMETER;
        }
 
-       nterr = share_get_context_by_name(mem_ctx, lp_share_backend(dce_call->conn->dce_ctx->lp_ctx), dce_call->conn->dce_ctx->lp_ctx, &sctx);
+       nterr = share_get_context_by_name(mem_ctx, lpcfg_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);
        }
@@ -1008,7 +975,7 @@ static WERROR dcesrv_srvsvc_NetShareGetInfo(struct dcesrv_call_state *dce_call,
                        return status;
                }
 
-               r->out.info.info0 = info.info0;
+               r->out.info->info0 = info.info0;
                return WERR_OK;
        }
        case 1:
@@ -1024,7 +991,7 @@ static WERROR dcesrv_srvsvc_NetShareGetInfo(struct dcesrv_call_state *dce_call,
                        return status;
                }
 
-               r->out.info.info1 = info.info1;
+               r->out.info->info1 = info.info1;
                return WERR_OK;
        }
        case 2:
@@ -1042,7 +1009,7 @@ static WERROR dcesrv_srvsvc_NetShareGetInfo(struct dcesrv_call_state *dce_call,
                        return status;
                }
 
-               r->out.info.info2 = info.info2;
+               r->out.info->info2 = info.info2;
                return WERR_OK;
        }
        case 501:
@@ -1058,7 +1025,7 @@ static WERROR dcesrv_srvsvc_NetShareGetInfo(struct dcesrv_call_state *dce_call,
                        return status;
                }
 
-               r->out.info.info501 = info.info501;
+               r->out.info->info501 = info.info501;
                return WERR_OK;
        }
        case 502:
@@ -1076,7 +1043,7 @@ static WERROR dcesrv_srvsvc_NetShareGetInfo(struct dcesrv_call_state *dce_call,
                        return status;
                }
 
-               r->out.info.info502 = info.info502;
+               r->out.info->info502 = info.info502;
                return WERR_OK;
        }
        case 1005:
@@ -1092,14 +1059,12 @@ static WERROR dcesrv_srvsvc_NetShareGetInfo(struct dcesrv_call_state *dce_call,
                        return status;
                }
 
-               r->out.info.info1005 = info.info1005;
+               r->out.info->info1005 = info.info1005;
                return WERR_OK;
        }
        default:
-               return WERR_UNKNOWN_LEVEL;
+               return WERR_INVALID_LEVEL;
        }
-
-       return WERR_UNKNOWN_LEVEL;
 }
 
 static WERROR dcesrv_srvsvc_fill_share_info(struct share_info *info, int *count,
@@ -1113,7 +1078,7 @@ static WERROR dcesrv_srvsvc_fill_share_info(struct share_info *info, int *count,
                                        uint32_t csc_policy,
                                        struct security_descriptor *sd)
 {
-       int i = 0;
+       unsigned int i = 0;
 
        if (level == 501) {
                info[i].name = SHARE_CSC_POLICY;
@@ -1163,6 +1128,7 @@ static WERROR dcesrv_srvsvc_fill_share_info(struct share_info *info, int *count,
                *((int *)info[i].value) = max_users;
                i++;
 
+               FALL_THROUGH;
        case 501:
        case 1:
                info[i].name = SHARE_TYPE;
@@ -1178,11 +1144,12 @@ static WERROR dcesrv_srvsvc_fill_share_info(struct share_info *info, int *count,
                        info[i].value = talloc_strdup(info, "IPC");
                        break;
                default:
-                       return WERR_INVALID_PARAM;
+                       return WERR_INVALID_PARAMETER;
                }
                W_ERROR_HAVE_NO_MEMORY(info[i].value);
                i++;
 
+               FALL_THROUGH;
        case 1004:
                if (comment) {
                        info[i].name = SHARE_COMMENT;
@@ -1192,6 +1159,8 @@ static WERROR dcesrv_srvsvc_fill_share_info(struct share_info *info, int *count,
 
                        i++;
                }
+
+               FALL_THROUGH;
        case 0:
                if (name &&
                    strcasecmp(share_name, name) != 0) {
@@ -1205,7 +1174,7 @@ static WERROR dcesrv_srvsvc_fill_share_info(struct share_info *info, int *count,
                break;
 
        default:
-               return WERR_UNKNOWN_LEVEL;
+               return WERR_INVALID_LEVEL;
        }
 
        *count = i;
@@ -1232,13 +1201,11 @@ static WERROR dcesrv_srvsvc_NetShareSetInfo(struct dcesrv_call_state *dce_call,
        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;
+               return WERR_INVALID_PARAMETER;
        }
 
-       nterr = share_get_context_by_name(mem_ctx, lp_share_backend(dce_call->conn->dce_ctx->lp_ctx), dce_call->conn->dce_ctx->lp_ctx, &sctx);
+       nterr = share_get_context_by_name(mem_ctx, lpcfg_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);
        }
@@ -1248,7 +1215,7 @@ static WERROR dcesrv_srvsvc_NetShareSetInfo(struct dcesrv_call_state *dce_call,
        {
                status = dcesrv_srvsvc_fill_share_info(info, &count,
                                        r->in.share_name, r->in.level,
-                                       r->in.info.info0->name,
+                                       r->in.info->info0->name,
                                        NULL,
                                        NULL,
                                        NULL,
@@ -1256,7 +1223,7 @@ static WERROR dcesrv_srvsvc_NetShareSetInfo(struct dcesrv_call_state *dce_call,
                                        0,
                                        0,
                                        NULL);
-               if (W_ERROR_EQUAL(status, WERR_OK)) {
+               if (!W_ERROR_EQUAL(status, WERR_OK)) {
                        return status;
                }
                break;
@@ -1265,15 +1232,15 @@ static WERROR dcesrv_srvsvc_NetShareSetInfo(struct dcesrv_call_state *dce_call,
        {
                status = dcesrv_srvsvc_fill_share_info(info, &count,
                                        r->in.share_name, r->in.level,
-                                       r->in.info.info1->name,
+                                       r->in.info->info1->name,
                                        NULL,
-                                       r->in.info.info1->comment,
+                                       r->in.info->info1->comment,
                                        NULL,
-                                       r->in.info.info1->type,
+                                       r->in.info->info1->type,
                                        0,
                                        0,
                                        NULL);
-               if (W_ERROR_EQUAL(status, WERR_OK)) {
+               if (!W_ERROR_EQUAL(status, WERR_OK)) {
                        return status;
                }
                break;
@@ -1282,15 +1249,15 @@ static WERROR dcesrv_srvsvc_NetShareSetInfo(struct dcesrv_call_state *dce_call,
        {
                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,
+                                       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)) {
+               if (!W_ERROR_EQUAL(status, WERR_OK)) {
                        return status;
                }
                break;
@@ -1299,15 +1266,15 @@ static WERROR dcesrv_srvsvc_NetShareSetInfo(struct dcesrv_call_state *dce_call,
        {
                status = dcesrv_srvsvc_fill_share_info(info, &count,
                                        r->in.share_name, r->in.level,
-                                       r->in.info.info501->name,
+                                       r->in.info->info501->name,
                                        NULL,
-                                       r->in.info.info501->comment,
+                                       r->in.info->info501->comment,
                                        NULL,
-                                       r->in.info.info501->type,
+                                       r->in.info->info501->type,
                                        0,
-                                       r->in.info.info501->csc_policy,
+                                       r->in.info->info501->csc_policy,
                                        NULL);
-               if (W_ERROR_EQUAL(status, WERR_OK)) {
+               if (!W_ERROR_EQUAL(status, WERR_OK)) {
                        return status;
                }
                break;
@@ -1316,15 +1283,15 @@ static WERROR dcesrv_srvsvc_NetShareSetInfo(struct dcesrv_call_state *dce_call,
        {
                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,
+                                       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);
-               if (W_ERROR_EQUAL(status, WERR_OK)) {
+                                       r->in.info->info502->sd_buf.sd);
+               if (!W_ERROR_EQUAL(status, WERR_OK)) {
                        return status;
                }
                break;
@@ -1335,13 +1302,13 @@ static WERROR dcesrv_srvsvc_NetShareSetInfo(struct dcesrv_call_state *dce_call,
                                        r->in.share_name, r->in.level,
                                        NULL,
                                        NULL,
-                                       r->in.info.info1004->comment,
+                                       r->in.info->info1004->comment,
                                        NULL,
                                        0,
                                        0,
                                        0,
                                        NULL);
-               if (W_ERROR_EQUAL(status, WERR_OK)) {
+               if (!W_ERROR_EQUAL(status, WERR_OK)) {
                        return status;
                }
                break;
@@ -1357,7 +1324,7 @@ static WERROR dcesrv_srvsvc_NetShareSetInfo(struct dcesrv_call_state *dce_call,
                return WERR_OK;
        }
        default:
-               return WERR_UNKNOWN_LEVEL;
+               return WERR_INVALID_LEVEL;
        }
 
        nterr = share_set(sctx, r->in.share_name, info, count);
@@ -1394,15 +1361,16 @@ static WERROR dcesrv_srvsvc_NetShareCheck(struct dcesrv_call_state *dce_call, TA
        struct share_config *scfg = NULL;
        char *device;
        const char **names;
-       int count, i;
+       int count;
+       int i;
 
-       ZERO_STRUCT(r->out);
+       *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;
        }
 
@@ -1411,11 +1379,11 @@ static WERROR dcesrv_srvsvc_NetShareCheck(struct dcesrv_call_state *dce_call, TA
                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;
+               return WERR_NERR_DEVICENOTSHARED;
        }
        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->conn->dce_ctx->lp_ctx, &sctx);
+       nterr = share_get_context_by_name(mem_ctx, lpcfg_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);
        }
@@ -1433,31 +1401,31 @@ static WERROR dcesrv_srvsvc_NetShareCheck(struct dcesrv_call_state *dce_call, TA
                if (!NT_STATUS_IS_OK(nterr)) {
                        return ntstatus_to_werror(nterr);
                }
-               path = share_string_option(scfg, SHARE_PATH, NULL);
+               path = share_string_option(mem_ctx, scfg, SHARE_PATH, NULL);
                if (!path) continue;
 
-               if (strcmp(device, path) == 0) {                
-                       type = share_string_option(scfg, SHARE_TYPE, NULL);
+               if (strcmp(device, path) == 0) {
+                       type = share_string_option(mem_ctx, scfg, SHARE_TYPE, NULL);
                        if (!type) continue;
 
                        if (strcmp(type, "DISK") == 0) {
-                               r->out.type = STYPE_DISKTREE;
+                               *r->out.type = STYPE_DISKTREE;
                                return WERR_OK;
                        }
 
                        if (strcmp(type, "IPC") == 0) {
-                               r->out.type = STYPE_IPC;
+                               *r->out.type = STYPE_IPC;
                                return WERR_OK;
                        }
 
                        if (strcmp(type, "PRINTER") == 0) {
-                               r->out.type = STYPE_PRINTQ;
+                               *r->out.type = STYPE_PRINTQ;
                                return WERR_OK;
                        }
                }
        }
 
-       return WERR_DEVICE_NOT_SHARED;
+       return WERR_NERR_DEVICENOTSHARED;
 }
 
 
@@ -1468,8 +1436,9 @@ static WERROR dcesrv_srvsvc_NetSrvGetInfo(struct dcesrv_call_state *dce_call, TA
                       struct srvsvc_NetSrvGetInfo *r)
 {
        struct dcesrv_context *dce_ctx = dce_call->conn->dce_ctx;
+       struct dcerpc_server_info *server_info = lpcfg_dcerpc_server_info(mem_ctx, dce_ctx->lp_ctx);
 
-       ZERO_STRUCT(r->out);
+       ZERO_STRUCTP(r->out.info);
 
        switch (r->in.level) {
        case 100:
@@ -1483,7 +1452,7 @@ static WERROR dcesrv_srvsvc_NetSrvGetInfo(struct dcesrv_call_state *dce_call, TA
                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:
@@ -1497,13 +1466,13 @@ static WERROR dcesrv_srvsvc_NetSrvGetInfo(struct dcesrv_call_state *dce_call, TA
                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_ctx);
-               info101->comment        = talloc_strdup(mem_ctx, lp_serverstring(dce_ctx->lp_ctx));
+               info101->version_major  = server_info->version_major;
+               info101->version_minor  = server_info->version_minor;
+               info101->server_type    = dcesrv_common_get_server_type(mem_ctx, dce_call->event_ctx, dce_ctx);
+               info101->comment        = lpcfg_server_string(dce_ctx->lp_ctx, mem_ctx);
                W_ERROR_HAVE_NO_MEMORY(info101->comment);
 
-               r->out.info.info101 = info101;
+               r->out.info->info101 = info101;
                return WERR_OK;
        }
        case 102:
@@ -1517,10 +1486,10 @@ static WERROR dcesrv_srvsvc_NetSrvGetInfo(struct dcesrv_call_state *dce_call, TA
                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_ctx);
-               info102->comment        = talloc_strdup(mem_ctx, lp_serverstring(dce_ctx->lp_ctx));
+               info102->version_major  = server_info->version_major;
+               info102->version_minor  = server_info->version_minor;
+               info102->server_type    = dcesrv_common_get_server_type(mem_ctx, dce_call->event_ctx, dce_ctx);
+               info102->comment        = lpcfg_server_string(dce_ctx->lp_ctx, mem_ctx);
                W_ERROR_HAVE_NO_MEMORY(info102->comment);
 
                info102->users          = dcesrv_common_get_users(mem_ctx, dce_ctx);
@@ -1532,14 +1501,12 @@ static WERROR dcesrv_srvsvc_NetSrvGetInfo(struct dcesrv_call_state *dce_call, TA
                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:
-               return WERR_UNKNOWN_LEVEL;
+               return WERR_INVALID_LEVEL;
        }
-
-       return WERR_UNKNOWN_LEVEL;
 }
 
 
@@ -1559,36 +1526,33 @@ static WERROR dcesrv_srvsvc_NetSrvSetInfo(struct dcesrv_call_state *dce_call, TA
 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;
        }
        default:
-               return WERR_UNKNOWN_LEVEL;
+               return WERR_INVALID_LEVEL;
        }
-
-       return WERR_UNKNOWN_LEVEL;
 }
 
 
@@ -1618,56 +1582,56 @@ static WERROR dcesrv_srvsvc_NetTransportAdd(struct dcesrv_call_state *dce_call,
 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;
        }
        default:
-               return WERR_UNKNOWN_LEVEL;
+               return WERR_INVALID_LEVEL;
        }
-
-       return WERR_UNKNOWN_LEVEL;
 }
 
 /* 
@@ -1689,31 +1653,34 @@ static WERROR dcesrv_srvsvc_NetRemoteTOD(struct dcesrv_call_state *dce_call, TAL
        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;
 }
@@ -1791,10 +1758,8 @@ static WERROR dcesrv_srvsvc_NetNameValidate(struct dcesrv_call_state *dce_call,
        case 13:
                return WERR_NOT_SUPPORTED;
        default:
-               return WERR_INVALID_PARAM;
+               return WERR_INVALID_PARAMETER;
        }
-
-       return WERR_INVALID_PARAM;
 }
 
 
@@ -1821,15 +1786,12 @@ static WERROR dcesrv_srvsvc_NetShareEnum(struct dcesrv_call_state *dce_call, TAL
        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.totalentries = 0;
 
        /* TODO: - paging of results 
         */
 
-       nterr = share_get_context_by_name(mem_ctx, lp_share_backend(dce_call->conn->dce_ctx->lp_ctx), dce_call->conn->dce_ctx->lp_ctx, &sctx);
+       nterr = share_get_context_by_name(mem_ctx, lpcfg_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);
        }
@@ -1839,11 +1801,11 @@ static WERROR dcesrv_srvsvc_NetShareEnum(struct dcesrv_call_state *dce_call, TAL
                return ntstatus_to_werror(nterr);
        }
 
-       switch (r->in.level) {
+       switch (r->in.info_ctr->level) {
        case 0:
        {
-               int i, y = 0;
-               int count;
+               unsigned int i, y = 0;
+               unsigned int count;
                struct srvsvc_NetShareCtr0 *ctr0;
 
                ctr0 = talloc(mem_ctx, struct srvsvc_NetShareCtr0);
@@ -1854,7 +1816,7 @@ static WERROR dcesrv_srvsvc_NetShareEnum(struct dcesrv_call_state *dce_call, TAL
                ctr0->array = NULL;
 
                if (ctr0->count == 0) {
-                       r->out.ctr.ctr0 = ctr0;
+                       r->out.info_ctr->ctr.ctr0       = ctr0;
                        return WERR_OK;
                }
 
@@ -1869,7 +1831,7 @@ static WERROR dcesrv_srvsvc_NetShareEnum(struct dcesrv_call_state *dce_call, TAL
                        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;
+                               return WERR_GEN_FAILURE;
                        }
                        
                        type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
@@ -1880,21 +1842,22 @@ static WERROR dcesrv_srvsvc_NetShareEnum(struct dcesrv_call_state *dce_call, TAL
                        }
 
                        info.info0 = &ctr0->array[y];
-                       status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
+                       status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.info_ctr->level, &info);
                        W_ERROR_NOT_OK_RETURN(status);
                        talloc_free(scfg);
                        y++;
                }
                talloc_free(snames);
 
-               r->out.ctr.ctr0         = ctr0;
-               r->out.totalentries     = r->out.ctr.ctr0->count;
+               r->out.info_ctr->ctr.ctr0       = ctr0;
+               *r->out.totalentries            = r->out.info_ctr->ctr.ctr0->count;
+
                return WERR_OK;
        }
        case 1:
        {
-               int i, y = 0;
-               int count;
+               unsigned int i, y = 0;
+               unsigned int count;
                struct srvsvc_NetShareCtr1 *ctr1;
 
                ctr1 = talloc(mem_ctx, struct srvsvc_NetShareCtr1);
@@ -1905,7 +1868,7 @@ static WERROR dcesrv_srvsvc_NetShareEnum(struct dcesrv_call_state *dce_call, TAL
                ctr1->array = NULL;
 
                if (ctr1->count == 0) {
-                       r->out.ctr.ctr1 = ctr1;
+                       r->out.info_ctr->ctr.ctr1       = ctr1;
                        return WERR_OK;
                }
 
@@ -1920,7 +1883,7 @@ static WERROR dcesrv_srvsvc_NetShareEnum(struct dcesrv_call_state *dce_call, TAL
                        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;
+                               return WERR_GEN_FAILURE;
                        }
 
                        type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
@@ -1931,21 +1894,22 @@ static WERROR dcesrv_srvsvc_NetShareEnum(struct dcesrv_call_state *dce_call, TAL
                        }
 
                        info.info1 = &ctr1->array[y];
-                       status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
+                       status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.info_ctr->level, &info);
                        W_ERROR_NOT_OK_RETURN(status);
                        talloc_free(scfg);
                        y++;
                }
                talloc_free(snames);
 
-               r->out.ctr.ctr1         = ctr1;
-               r->out.totalentries     = r->out.ctr.ctr1->count;
+               r->out.info_ctr->ctr.ctr1       = ctr1;
+               *r->out.totalentries            = r->out.info_ctr->ctr.ctr1->count;
+
                return WERR_OK;
        }
        case 2:
        {
-               int i, y = 0;
-               int count;
+               unsigned int i, y = 0;
+               unsigned int count;
                struct srvsvc_NetShareCtr2 *ctr2;
 
                SRVSVC_CHECK_ADMIN_ACCESS;
@@ -1958,7 +1922,7 @@ static WERROR dcesrv_srvsvc_NetShareEnum(struct dcesrv_call_state *dce_call, TAL
                ctr2->array = NULL;
 
                if (ctr2->count == 0) {
-                       r->out.ctr.ctr2 = ctr2;
+                       r->out.info_ctr->ctr.ctr2       = ctr2;
                        return WERR_OK;
                }
 
@@ -1973,7 +1937,7 @@ static WERROR dcesrv_srvsvc_NetShareEnum(struct dcesrv_call_state *dce_call, TAL
                        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;
+                               return WERR_GEN_FAILURE;
                        }
 
                        type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
@@ -1984,21 +1948,22 @@ static WERROR dcesrv_srvsvc_NetShareEnum(struct dcesrv_call_state *dce_call, TAL
                        }
 
                        info.info2 = &ctr2->array[y];
-                       status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
+                       status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.info_ctr->level, &info);
                        W_ERROR_NOT_OK_RETURN(status);
                        talloc_free(scfg);
                        y++;
                }
                talloc_free(snames);
 
-               r->out.ctr.ctr2         = ctr2;
-               r->out.totalentries     = r->out.ctr.ctr2->count;
+               r->out.info_ctr->ctr.ctr2       = ctr2;
+               *r->out.totalentries            = r->out.info_ctr->ctr.ctr2->count;
+
                return WERR_OK;
        }
        case 502:
        {
-               int i, y = 0;
-               int count;
+               unsigned int i, y = 0;
+               unsigned int count;
                struct srvsvc_NetShareCtr502 *ctr502;
 
                SRVSVC_CHECK_ADMIN_ACCESS;
@@ -2011,7 +1976,7 @@ static WERROR dcesrv_srvsvc_NetShareEnum(struct dcesrv_call_state *dce_call, TAL
                ctr502->array = NULL;
 
                if (ctr502->count == 0) {
-                       r->out.ctr.ctr502 = ctr502;
+                       r->out.info_ctr->ctr.ctr502     = ctr502;
                        return WERR_OK;
                }
 
@@ -2026,7 +1991,7 @@ static WERROR dcesrv_srvsvc_NetShareEnum(struct dcesrv_call_state *dce_call, TAL
                        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;
+                               return WERR_GEN_FAILURE;
                        }
 
                        type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
@@ -2037,22 +2002,21 @@ static WERROR dcesrv_srvsvc_NetShareEnum(struct dcesrv_call_state *dce_call, TAL
                        }
 
                        info.info502 = &ctr502->array[y];
-                       status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
+                       status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.info_ctr->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;
+               r->out.info_ctr->ctr.ctr502     = ctr502;
+               *r->out.totalentries            = r->out.info_ctr->ctr.ctr502->count;
+
                return WERR_OK;
        }
        default:
-               return WERR_UNKNOWN_LEVEL;
+               return WERR_INVALID_LEVEL;
        }
-
-       return WERR_UNKNOWN_LEVEL;
 }
 
 
@@ -2082,6 +2046,8 @@ static WERROR dcesrv_srvsvc_NetShareDelCommit(struct dcesrv_call_state *dce_call
 static WERROR dcesrv_srvsvc_NetGetFileSecurity(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
                       struct srvsvc_NetGetFileSecurity *r)
 {
+       struct auth_session_info *session_info =
+               dcesrv_call_session_info(dce_call);
        struct sec_desc_buf *sd_buf;
        struct ntvfs_context *ntvfs_ctx = NULL;
        struct ntvfs_request *ntvfs_req;
@@ -2092,7 +2058,7 @@ static WERROR dcesrv_srvsvc_NetGetFileSecurity(struct dcesrv_call_state *dce_cal
        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,
+                                        session_info,
                                         0,
                                         dce_call->time,
                                         NULL, NULL, 0);
@@ -2113,7 +2079,7 @@ static WERROR dcesrv_srvsvc_NetGetFileSecurity(struct dcesrv_call_state *dce_cal
 
        sd_buf->sd = io->query_secdesc.out.sd;
 
-       r->out.sd_buf = sd_buf;
+       *r->out.sd_buf = sd_buf;
        return WERR_OK;
 }
 
@@ -2124,6 +2090,8 @@ static WERROR dcesrv_srvsvc_NetGetFileSecurity(struct dcesrv_call_state *dce_cal
 static WERROR dcesrv_srvsvc_NetSetFileSecurity(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
                       struct srvsvc_NetSetFileSecurity *r)
 {
+       struct auth_session_info *session_info =
+               dcesrv_call_session_info(dce_call);
        struct ntvfs_context *ntvfs_ctx;
        struct ntvfs_request *ntvfs_req;
        union smb_setfileinfo *io;
@@ -2133,7 +2101,7 @@ static WERROR dcesrv_srvsvc_NetSetFileSecurity(struct dcesrv_call_state *dce_cal
        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,
+                                        session_info,
                                         0,
                                         dce_call->time,
                                         NULL, NULL, 0);
@@ -2142,10 +2110,10 @@ static WERROR dcesrv_srvsvc_NetSetFileSecurity(struct dcesrv_call_state *dce_cal
        io = talloc(mem_ctx, union smb_setfileinfo);
        W_ERROR_HAVE_NO_MEMORY(io);
 
-       io->set_secdesc.level                   = RAW_FILEINFO_SEC_DESC;
+       io->set_secdesc.level                   = RAW_SFILEINFO_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);
@@ -2292,7 +2260,7 @@ static WERROR dcesrv_srvsvc_NetShareDel(struct dcesrv_call_state *dce_call, TALL
        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->conn->dce_ctx->lp_ctx, &sctx);
+       nterr = share_get_context_by_name(mem_ctx, lpcfg_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);
        }