[NETAPI32]
[reactos.git] / reactos / dll / win32 / netapi32 / srvsvc.c
index e7415c9..a932592 100644 (file)
@@ -70,6 +70,140 @@ SRVSVC_HANDLE_unbind(SRVSVC_HANDLE pszSystemName,
 }
 
 
+NET_API_STATUS
+WINAPI
+NetFileClose(
+    _In_ LMSTR servername,
+    _In_ DWORD fileid)
+{
+    NET_API_STATUS status;
+
+    TRACE("NetFileClose(%s %lu)\n",
+          debugstr_w(servername), fileid);
+
+    RpcTryExcept
+    {
+        status = NetrFileClose(servername,
+                               fileid);
+    }
+    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
+    {
+        status = I_RpcMapWin32Status(RpcExceptionCode());
+    }
+    RpcEndExcept;
+
+    return status;
+}
+
+
+NET_API_STATUS
+WINAPI
+NetFileEnum(
+    _In_ LMSTR servername,
+    _In_ LMSTR basepath,
+    _In_ LMSTR username,
+    _In_ DWORD level,
+    _Out_ LPBYTE *bufptr,
+    _In_ DWORD prefmaxlen,
+    _Out_ LPDWORD entriesread,
+    _Out_ LPDWORD totalentries,
+    _Inout_ PDWORD_PTR resume_handle)
+{
+    FILE_ENUM_STRUCT EnumStruct;
+    FILE_INFO_2_CONTAINER Level2Container = {0, NULL};
+    FILE_INFO_3_CONTAINER Level3Container = {0, NULL};
+    NET_API_STATUS status;
+
+    TRACE("NetFileEnum(%s %s %s %lu %p %lu %p %p %p)\n",
+          debugstr_w(servername), debugstr_w(basepath), debugstr_w(username),
+          level, bufptr, prefmaxlen, entriesread, totalentries, resume_handle);
+
+    if (level != 2 && level != 3)
+        return ERROR_INVALID_LEVEL;
+
+    EnumStruct.Level = level;
+    switch (level)
+    {
+        case 2:
+            EnumStruct.FileInfo.Level2 = &Level2Container;
+            break;
+
+        case 3:
+            EnumStruct.FileInfo.Level3 = &Level3Container;
+            break;
+    }
+
+    RpcTryExcept
+    {
+        status = NetrFileEnum(servername,
+                              basepath,
+                              username,
+                              &EnumStruct,
+                              prefmaxlen,
+                              totalentries,
+                              (PDWORD)resume_handle);
+
+        switch (level)
+        {
+            case 2:
+                if (EnumStruct.FileInfo.Level2->Buffer != NULL)
+                {
+                    *bufptr = (LPBYTE)EnumStruct.FileInfo.Level2->Buffer;
+                    *entriesread = EnumStruct.FileInfo.Level2->EntriesRead;
+                }
+                break;
+
+            case 3:
+                if (EnumStruct.FileInfo.Level3->Buffer != NULL)
+                {
+                    *bufptr = (LPBYTE)EnumStruct.FileInfo.Level3->Buffer;
+                    *entriesread = EnumStruct.FileInfo.Level3->EntriesRead;
+                }
+                break;
+        }
+    }
+    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
+    {
+        status = I_RpcMapWin32Status(RpcExceptionCode());
+    }
+    RpcEndExcept;
+
+    return status;
+}
+
+
+NET_API_STATUS
+WINAPI
+NetFileGetInfo(
+    _In_ LMSTR servername,
+    _In_ DWORD fileid,
+    _In_ DWORD level,
+    _Out_ LPBYTE *bufptr)
+{
+    NET_API_STATUS status;
+
+    TRACE("NetFileGetInfo(%s %lu %lu %p)\n",
+          debugstr_w(servername), fileid, level, bufptr);
+
+    *bufptr = NULL;
+
+    RpcTryExcept
+    {
+        status = NetrFileGetInfo(servername,
+                                 fileid,
+                                 level,
+                                 (LPFILE_INFO)bufptr);
+    }
+    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
+    {
+        status = I_RpcMapWin32Status(RpcExceptionCode());
+    }
+    RpcEndExcept;
+
+    return status;
+}
+
+
 NET_API_STATUS
 WINAPI
 NetRemoteTOD(
@@ -78,8 +212,8 @@ NetRemoteTOD(
 {
     NET_API_STATUS status;
 
-    TRACE("NetRemoteTOD(%s, %p)\n", debugstr_w(UncServerName),
-          BufferPtr);
+    TRACE("NetRemoteTOD(%s %p)\n",
+          debugstr_w(UncServerName), BufferPtr);
 
     *BufferPtr = NULL;
 
@@ -98,6 +232,520 @@ NetRemoteTOD(
 }
 
 
+NET_API_STATUS
+WINAPI
+NetServerDiskEnum(
+    _In_ LMSTR servername,
+    _In_ DWORD level,
+    _Out_ LPBYTE *bufptr,
+    _In_ DWORD prefmaxlen,
+    _Out_ LPDWORD entriesread,
+    _Out_ LPDWORD totalentries,
+    _Inout_ LPDWORD resume_handle)
+{
+    DISK_ENUM_CONTAINER EnumContainer;
+    NET_API_STATUS status;
+
+    TRACE("NetServerDiskEnum(%s %lu %p %lu %p %p %p)\n",
+          debugstr_w(servername), level, bufptr, prefmaxlen,
+          entriesread, totalentries, resume_handle);
+
+    EnumContainer.EntriesRead = 0;
+    EnumContainer.Buffer = NULL;
+
+    RpcTryExcept
+    {
+        status = NetrServerDiskEnum(servername,
+                                    level,
+                                    &EnumContainer,
+                                    prefmaxlen,
+                                    totalentries,
+                                    resume_handle);
+
+        if (EnumContainer.Buffer != NULL)
+        {
+            *bufptr = (LPBYTE)EnumContainer.Buffer;
+        }
+        else
+        {
+            *bufptr = NULL;
+        }
+
+        if (EnumContainer.EntriesRead > 0)
+        {
+            *entriesread = EnumContainer.EntriesRead - 1;
+        }
+        else
+        {
+            *entriesread = 0;
+        }
+    }
+    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
+    {
+        status = I_RpcMapWin32Status(RpcExceptionCode());
+    }
+    RpcEndExcept;
+
+    return status;
+}
+
+
+#if 0
+NET_API_STATUS
+WINAPI
+NetServerGetInfo(
+    LMSTR servername,
+    DWORD level,
+    LPBYTE *bufptr)
+{
+    NET_API_STATUS status;
+
+    TRACE("NetServerGetInfo(%s %lu %p)\n",
+          debugstr_w(servername), level, bufptr);
+
+    *bufptr = NULL;
+
+    RpcTryExcept
+    {
+        status = NetrServerGetInfo(servername,
+                                   level,
+                                   (LPSERVER_INFO)bufptr);
+    }
+    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
+    {
+        status = I_RpcMapWin32Status(RpcExceptionCode());
+    }
+    RpcEndExcept;
+
+    return status;
+}
+#endif
+
+
+NET_API_STATUS
+WINAPI
+NetServerSetInfo(
+    _In_ LPWSTR servername,
+    _In_ DWORD level,
+    _In_ LPBYTE buf,
+    _Out_ LPDWORD parm_err)
+{
+    NET_API_STATUS status;
+
+    TRACE("NetServerSetInfo(%s %lu %p %p)\n",
+          debugstr_w(servername), level, buf, parm_err);
+
+    RpcTryExcept
+    {
+        status = NetrServerSetInfo(servername,
+                                   level,
+                                   (LPSERVER_INFO)&buf,
+                                   parm_err);
+    }
+    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
+    {
+        status = I_RpcMapWin32Status(RpcExceptionCode());
+    }
+    RpcEndExcept;
+
+    return status;
+}
+
+
+NET_API_STATUS
+WINAPI
+NetServerTransportAdd(
+    _In_ LPWSTR servername,
+    _In_ DWORD level,
+    _In_ LPBYTE bufptr)
+{
+    NET_API_STATUS status;
+
+    TRACE("NetServerTransportAdd(%s %lu %p)\n",
+          debugstr_w(servername), level, bufptr);
+
+    RpcTryExcept
+    {
+        status = NetrServerTransportAdd(servername,
+                                        level,
+                                        (LPSERVER_TRANSPORT_INFO_0)bufptr);
+    }
+    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
+    {
+        status = I_RpcMapWin32Status(RpcExceptionCode());
+    }
+    RpcEndExcept;
+
+    return status;
+}
+
+
+NET_API_STATUS
+WINAPI
+NetServerTransportAddEx(
+    _In_ LPWSTR servername,
+    _In_ DWORD level,
+    _In_ LPBYTE bufptr)
+{
+    NET_API_STATUS status;
+
+    TRACE("NetServerTransportAddEx(%s %lu %p)\n",
+          debugstr_w(servername), level, bufptr);
+
+    RpcTryExcept
+    {
+        status = NetrServerTransportAddEx(servername,
+                                          level,
+                                          (LPTRANSPORT_INFO)bufptr);
+    }
+    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
+    {
+        status = I_RpcMapWin32Status(RpcExceptionCode());
+    }
+    RpcEndExcept;
+
+    return status;
+}
+
+
+NET_API_STATUS
+WINAPI
+NetServerTransportDel(
+    _In_ LPWSTR servername,
+    _In_ DWORD level,
+    _In_ LPBYTE bufptr)
+{
+    NET_API_STATUS status;
+
+    TRACE("NetServerTransportDel(%s %lu %p)\n",
+          debugstr_w(servername), level, bufptr);
+
+    RpcTryExcept
+    {
+        status = NetrServerTransportDel(servername,
+                                        level,
+                                        (LPSERVER_TRANSPORT_INFO_0)bufptr);
+    }
+    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
+    {
+        status = I_RpcMapWin32Status(RpcExceptionCode());
+    }
+    RpcEndExcept;
+
+    return status;
+}
+
+
+NET_API_STATUS
+WINAPI
+NetServerTransportEnum(
+    _In_ LPWSTR servername,
+    _In_ DWORD level,
+    _Out_ LPBYTE *bufptr,
+    _In_ DWORD prefmaxlen,
+    _Out_ LPDWORD entriesread,
+    _Out_ LPDWORD totalentries,
+    _Inout_ LPDWORD resume_handle)
+{
+    SERVER_XPORT_ENUM_STRUCT EnumStruct;
+    SERVER_XPORT_INFO_0_CONTAINER Level0Container = {0, NULL};
+    SERVER_XPORT_INFO_1_CONTAINER Level1Container = {0, NULL};
+    NET_API_STATUS status;
+
+    TRACE("NetServerTransportEnum(%s %lu %p %lu %p %p %p)\n",
+          debugstr_w(servername), level, bufptr, prefmaxlen,
+          entriesread, totalentries, resume_handle);
+
+    EnumStruct.Level = level;
+    switch (level)
+    {
+        case 0:
+            EnumStruct.XportInfo.Level0 = &Level0Container;
+            break;
+
+        case 1:
+            EnumStruct.XportInfo.Level1 = &Level1Container;
+            break;
+    }
+
+    RpcTryExcept
+    {
+        status = NetrServerTransportEnum(servername,
+                                         &EnumStruct,
+                                         prefmaxlen,
+                                         totalentries,
+                                         resume_handle);
+
+        switch (level)
+        {
+            case 0:
+                if (EnumStruct.XportInfo.Level0->Buffer != NULL)
+                {
+                    *bufptr = (LPBYTE)EnumStruct.XportInfo.Level0->Buffer;
+                    *entriesread = EnumStruct.XportInfo.Level0->EntriesRead;
+                }
+                break;
+
+            case 1:
+                if (EnumStruct.XportInfo.Level1->Buffer != NULL)
+                {
+                    *bufptr = (LPBYTE)EnumStruct.XportInfo.Level1->Buffer;
+                    *entriesread = EnumStruct.XportInfo.Level1->EntriesRead;
+                }
+                break;
+        }
+    }
+    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
+    {
+        status = I_RpcMapWin32Status(RpcExceptionCode());
+    }
+    RpcEndExcept;
+
+    return status;
+}
+
+
+NET_API_STATUS
+WINAPI
+NetSessionDel(
+    _In_ LMSTR servername,
+    _In_ LMSTR UncClientName,
+    _In_ LMSTR username)
+{
+    NET_API_STATUS status;
+
+    TRACE("NetSessionDel(%s %s %s)\n",
+          debugstr_w(servername), debugstr_w(UncClientName), debugstr_w(username));
+
+    RpcTryExcept
+    {
+        status = NetrSessionDel(servername,
+                                UncClientName,
+                                username);
+    }
+    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
+    {
+        status = I_RpcMapWin32Status(RpcExceptionCode());
+    }
+    RpcEndExcept;
+
+    return status;
+}
+
+
+NET_API_STATUS
+WINAPI
+NetSessionEnum(
+    _In_ LMSTR servername,
+    _In_ LMSTR UncClientName,
+    _In_ LMSTR username,
+    _In_ DWORD level,
+    _Out_ LPBYTE *bufptr,
+    _In_ DWORD prefmaxlen,
+    _Out_ LPDWORD entriesread,
+    _Out_ LPDWORD totalentries,
+    _Inout_ LPDWORD resume_handle)
+{
+    SESSION_ENUM_STRUCT EnumStruct;
+    SESSION_INFO_0_CONTAINER Level0Container = {0, NULL};
+    SESSION_INFO_1_CONTAINER Level1Container = {0, NULL};
+    SESSION_INFO_2_CONTAINER Level2Container = {0, NULL};
+    SESSION_INFO_10_CONTAINER Level10Container = {0, NULL};
+    SESSION_INFO_502_CONTAINER Level502Container = {0, NULL};
+    NET_API_STATUS status;
+
+    TRACE("NetSessionEnum(%s %s %s %lu %p %lu %p %p %p)\n",
+          debugstr_w(servername), debugstr_w(UncClientName), debugstr_w(username),
+          level, bufptr, prefmaxlen, entriesread, totalentries, resume_handle);
+
+    if (level > 2 && level != 10 && level != 502)
+        return ERROR_INVALID_LEVEL;
+
+    if (UncClientName == NULL || username == NULL)
+        return ERROR_INVALID_PARAMETER;
+
+    *bufptr = NULL;
+    *entriesread = 0;
+
+    EnumStruct.Level = level;
+    switch (level)
+    {
+        case 0:
+            EnumStruct.SessionInfo.Level0 = &Level0Container;
+            break;
+
+        case 1:
+            EnumStruct.SessionInfo.Level1 = &Level1Container;
+            break;
+
+        case 2:
+            EnumStruct.SessionInfo.Level2 = &Level2Container;
+            break;
+
+        case 10:
+            EnumStruct.SessionInfo.Level10 = &Level10Container;
+            break;
+
+        case 502:
+            EnumStruct.SessionInfo.Level502 = &Level502Container;
+            break;
+    }
+
+    RpcTryExcept
+    {
+        status = NetrSessionEnum(servername,
+                                 UncClientName,
+                                 username,
+                                 &EnumStruct,
+                                 prefmaxlen,
+                                 totalentries,
+                                 resume_handle);
+
+        switch (level)
+        {
+            case 0:
+                if (EnumStruct.SessionInfo.Level0->Buffer != NULL)
+                {
+                    *bufptr = (LPBYTE)EnumStruct.SessionInfo.Level0->Buffer;
+                    *entriesread = EnumStruct.SessionInfo.Level0->EntriesRead;
+                }
+                break;
+
+            case 1:
+                if (EnumStruct.SessionInfo.Level1->Buffer != NULL)
+                {
+                    *bufptr = (LPBYTE)EnumStruct.SessionInfo.Level1->Buffer;
+                    *entriesread = EnumStruct.SessionInfo.Level1->EntriesRead;
+                }
+                break;
+
+            case 2:
+                if (EnumStruct.SessionInfo.Level2->Buffer != NULL)
+                {
+                    *bufptr = (LPBYTE)EnumStruct.SessionInfo.Level2->Buffer;
+                    *entriesread = EnumStruct.SessionInfo.Level2->EntriesRead;
+                }
+                break;
+
+            case 10:
+                if (EnumStruct.SessionInfo.Level10->Buffer != NULL)
+                {
+                    *bufptr = (LPBYTE)EnumStruct.SessionInfo.Level10->Buffer;
+                    *entriesread = EnumStruct.SessionInfo.Level10->EntriesRead;
+                }
+                break;
+
+            case 502:
+                if (EnumStruct.SessionInfo.Level502->Buffer != NULL)
+                {
+                    *bufptr = (LPBYTE)EnumStruct.SessionInfo.Level502->Buffer;
+                    *entriesread = EnumStruct.SessionInfo.Level502->EntriesRead;
+                }
+                break;
+        }
+    }
+    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
+    {
+        status = I_RpcMapWin32Status(RpcExceptionCode());
+    }
+    RpcEndExcept;
+
+    return status;
+}
+
+
+NET_API_STATUS
+WINAPI
+NetSessionGetInfo(
+    _In_ LMSTR servername,
+    _In_ LMSTR UncClientName,
+    _In_ LMSTR username,
+    _In_ DWORD level,
+    _Out_ LPBYTE *bufptr)
+{
+    SESSION_ENUM_STRUCT EnumStruct;
+    SESSION_INFO_0_CONTAINER Level0Container = {0, NULL};
+    SESSION_INFO_1_CONTAINER Level1Container = {0, NULL};
+    SESSION_INFO_2_CONTAINER Level2Container = {0, NULL};
+    SESSION_INFO_10_CONTAINER Level10Container = {0, NULL};
+    DWORD dwTotalEntries;
+    NET_API_STATUS status;
+
+    TRACE("NetSessionGetInfo(%s %s %s %lu %p)\n",
+          debugstr_w(servername), debugstr_w(UncClientName),
+          debugstr_w(username), level, bufptr);
+
+    if (level > 2 && level != 10)
+        return ERROR_INVALID_LEVEL;
+
+    if (UncClientName == NULL || username == NULL)
+        return ERROR_INVALID_PARAMETER;
+
+    *bufptr = NULL;
+
+    EnumStruct.Level = level;
+    switch (level)
+    {
+        case 0:
+            EnumStruct.SessionInfo.Level0 = &Level0Container;
+            break;
+
+        case 1:
+            EnumStruct.SessionInfo.Level1 = &Level1Container;
+            break;
+
+        case 2:
+            EnumStruct.SessionInfo.Level2 = &Level2Container;
+            break;
+
+        case 10:
+            EnumStruct.SessionInfo.Level10 = &Level10Container;
+            break;
+    }
+
+    RpcTryExcept
+    {
+        status = NetrSessionEnum(servername,
+                                 UncClientName,
+                                 username,
+                                 &EnumStruct,
+                                 MAX_PREFERRED_LENGTH, //(DWORD)-1,
+                                 &dwTotalEntries,
+                                 NULL);
+
+        switch (level)
+        {
+            case 0:
+                if (EnumStruct.SessionInfo.Level0->Buffer != NULL)
+                    *bufptr = (LPBYTE)EnumStruct.SessionInfo.Level0->Buffer;
+                break;
+
+            case 1:
+                if (EnumStruct.SessionInfo.Level1->Buffer != NULL)
+                    *bufptr = (LPBYTE)EnumStruct.SessionInfo.Level1->Buffer;
+                break;
+
+            case 2:
+                if (EnumStruct.SessionInfo.Level2->Buffer != NULL)
+                    *bufptr = (LPBYTE)EnumStruct.SessionInfo.Level2->Buffer;
+                break;
+
+            case 10:
+                if (EnumStruct.SessionInfo.Level10->Buffer != NULL)
+                    *bufptr = (LPBYTE)EnumStruct.SessionInfo.Level10->Buffer;
+                break;
+        }
+    }
+    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
+    {
+        status = I_RpcMapWin32Status(RpcExceptionCode());
+    }
+    RpcEndExcept;
+
+    return status;
+}
+
+
 NET_API_STATUS
 WINAPI
 NetShareAdd(
@@ -111,7 +759,7 @@ NetShareAdd(
     TRACE("NetShareAdd(%s %lu %p %p)\n",
           debugstr_w(servername), level, buf, parm_err);
 
-    if (level != 2 || level != 502 || level != 503)
+    if (level != 2 && level != 502 && level != 503)
         return ERROR_INVALID_LEVEL;
 
     RpcTryExcept
@@ -156,7 +804,6 @@ NetShareCheck(
     RpcEndExcept;
 
     return status;
-
 }
 
 
@@ -233,11 +880,94 @@ NetShareEnum(
     _Out_ LPDWORD totalentries,
     _Inout_ LPDWORD resume_handle)
 {
-    FIXME("NetShareEnum(%s %lu %p %lu %p %p %p)\n",
+    SHARE_ENUM_STRUCT EnumStruct;
+    SHARE_INFO_0_CONTAINER Level0Container = {0, NULL};
+    SHARE_INFO_1_CONTAINER Level1Container = {0, NULL};
+    SHARE_INFO_2_CONTAINER Level2Container = {0, NULL};
+    SHARE_INFO_502_CONTAINER Level502Container = {0, NULL};
+    NET_API_STATUS status;
+
+    TRACE("NetShareEnum(%s %lu %p %lu %p %p %p)\n",
           debugstr_w(servername), level, bufptr, prefmaxlen,
           entriesread, totalentries, resume_handle);
 
-    return ERROR_NOT_SUPPORTED;
+    if (level > 2 && level != 502)
+        return ERROR_INVALID_LEVEL;
+
+    *bufptr = NULL;
+    *entriesread = 0;
+    *totalentries = 0;
+
+    EnumStruct.Level = level;
+    switch (level)
+    {
+        case 0:
+            EnumStruct.ShareInfo.Level0 = &Level0Container;
+            break;
+
+        case 1:
+            EnumStruct.ShareInfo.Level1 = &Level1Container;
+            break;
+
+        case 2:
+            EnumStruct.ShareInfo.Level2 = &Level2Container;
+            break;
+
+        case 502:
+            EnumStruct.ShareInfo.Level502 = &Level502Container;
+            break;
+    }
+
+    RpcTryExcept
+    {
+        status = NetrShareEnum(servername,
+                               &EnumStruct,
+                               prefmaxlen,
+                               totalentries,
+                               resume_handle);
+
+        switch (level)
+        {
+            case 0:
+                if (EnumStruct.ShareInfo.Level0->Buffer != NULL)
+                {
+                    *bufptr = (LPBYTE)EnumStruct.ShareInfo.Level0->Buffer;
+                    *entriesread = EnumStruct.ShareInfo.Level0->EntriesRead;
+                }
+                break;
+
+            case 1:
+                if (EnumStruct.ShareInfo.Level1->Buffer != NULL)
+                {
+                    *bufptr = (LPBYTE)EnumStruct.ShareInfo.Level1->Buffer;
+                    *entriesread = EnumStruct.ShareInfo.Level1->EntriesRead;
+                }
+                break;
+
+            case 2:
+                if (EnumStruct.ShareInfo.Level2->Buffer != NULL)
+                {
+                    *bufptr = (LPBYTE)EnumStruct.ShareInfo.Level2->Buffer;
+                    *entriesread = EnumStruct.ShareInfo.Level2->EntriesRead;
+                }
+                break;
+
+            case 502:
+                if (EnumStruct.ShareInfo.Level502->Buffer != NULL)
+                {
+                    *bufptr = (LPBYTE)EnumStruct.ShareInfo.Level502->Buffer;
+                    *entriesread = EnumStruct.ShareInfo.Level502->EntriesRead;
+                }
+                break;
+        }
+    }
+    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
+    {
+        status = I_RpcMapWin32Status(RpcExceptionCode());
+    }
+    RpcEndExcept;
+
+    return status;
 }
 
 
@@ -252,11 +982,94 @@ NetShareEnumSticky(
     _Out_ LPDWORD totalentries,
     _Inout_ LPDWORD resume_handle)
 {
-    FIXME("NetShareEnumSticky(%s %lu %p %lu %p %p %p)\n",
+    SHARE_ENUM_STRUCT EnumStruct;
+    SHARE_INFO_0_CONTAINER Level0Container = {0, NULL};
+    SHARE_INFO_1_CONTAINER Level1Container = {0, NULL};
+    SHARE_INFO_2_CONTAINER Level2Container = {0, NULL};
+    SHARE_INFO_502_CONTAINER Level502Container = {0, NULL};
+    NET_API_STATUS status;
+
+    TRACE("NetShareEnumSticky(%s %lu %p %lu %p %p %p)\n",
           debugstr_w(servername), level, bufptr, prefmaxlen,
           entriesread, totalentries, resume_handle);
 
-    return ERROR_NOT_SUPPORTED;
+    if (level > 2 && level != 502)
+        return ERROR_INVALID_LEVEL;
+
+    *bufptr = NULL;
+    *entriesread = 0;
+    *totalentries = 0;
+
+    EnumStruct.Level = level;
+    switch (level)
+    {
+        case 0:
+            EnumStruct.ShareInfo.Level0 = &Level0Container;
+            break;
+
+        case 1:
+            EnumStruct.ShareInfo.Level1 = &Level1Container;
+            break;
+
+        case 2:
+            EnumStruct.ShareInfo.Level2 = &Level2Container;
+            break;
+
+        case 502:
+            EnumStruct.ShareInfo.Level502 = &Level502Container;
+            break;
+    }
+
+    RpcTryExcept
+    {
+        status = NetrShareEnum(servername,
+                               (LPSHARE_ENUM_STRUCT)&EnumStruct,
+                               prefmaxlen,
+                               totalentries,
+                               resume_handle);
+
+        switch (level)
+        {
+            case 0:
+                if (EnumStruct.ShareInfo.Level0->Buffer != NULL)
+                {
+                    *bufptr = (LPBYTE)EnumStruct.ShareInfo.Level0->Buffer;
+                    *entriesread = EnumStruct.ShareInfo.Level0->EntriesRead;
+                }
+                break;
+
+            case 1:
+                if (EnumStruct.ShareInfo.Level1->Buffer != NULL)
+                {
+                    *bufptr = (LPBYTE)EnumStruct.ShareInfo.Level1->Buffer;
+                    *entriesread = EnumStruct.ShareInfo.Level1->EntriesRead;
+                }
+                break;
+
+            case 2:
+                if (EnumStruct.ShareInfo.Level2->Buffer != NULL)
+                {
+                    *bufptr = (LPBYTE)EnumStruct.ShareInfo.Level2->Buffer;
+                    *entriesread = EnumStruct.ShareInfo.Level2->EntriesRead;
+                }
+                break;
+
+            case 502:
+                if (EnumStruct.ShareInfo.Level502->Buffer != NULL)
+                {
+                    *bufptr = (LPBYTE)EnumStruct.ShareInfo.Level502->Buffer;
+                    *entriesread = EnumStruct.ShareInfo.Level502->EntriesRead;
+                }
+                break;
+        }
+    }
+    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
+    {
+        status = I_RpcMapWin32Status(RpcExceptionCode());
+    }
+    RpcEndExcept;
+
+    return status;
 }
 
 
@@ -268,10 +1081,33 @@ NetShareGetInfo(
     _In_ DWORD level,
     _Out_ LPBYTE *bufptr)
 {
-    FIXME("NetShareGetInfo(%s %s %lu %p)\n",
+    NET_API_STATUS status;
+
+    TRACE("NetShareGetInfo(%s %s %lu %p)\n",
           debugstr_w(servername), debugstr_w(netname), level, bufptr);
 
-    return ERROR_NOT_SUPPORTED;
+    if (level > 2 && level != 502 && level != 1005)
+        return ERROR_INVALID_LEVEL;
+
+    if (netname == NULL || *netname == 0)
+        return ERROR_INVALID_PARAMETER;
+
+    *bufptr = NULL;
+
+    RpcTryExcept
+    {
+        status = NetrShareGetInfo(servername,
+                                  netname,
+                                  level,
+                                  (LPSHARE_INFO)bufptr);
+    }
+    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
+    {
+        status = I_RpcMapWin32Status(RpcExceptionCode());
+    }
+    RpcEndExcept;
+
+    return status;
 }
 
 
@@ -284,10 +1120,30 @@ NetShareSetInfo(
     _In_  LPBYTE buf,
     _Out_ LPDWORD parm_err)
 {
-    FIXME("NetShareSetInfo(%s %s %lu %p %p)\n",
+    NET_API_STATUS status;
+
+    TRACE("NetShareSetInfo(%s %s %lu %p %p)\n",
           debugstr_w(servername), debugstr_w(netname), level, buf, parm_err);
 
-    return ERROR_NOT_SUPPORTED;
+    if (level != 2 && level != 502 && level != 503 && level != 1004 &&
+        level != 1005 && level != 1006 && level != 1501)
+        return ERROR_INVALID_LEVEL;
+
+    RpcTryExcept
+    {
+        status = NetrShareSetInfo(servername,
+                                  netname,
+                                  level,
+                                  (LPSHARE_INFO)&buf,
+                                  parm_err);
+    }
+    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
+    {
+        status = I_RpcMapWin32Status(RpcExceptionCode());
+    }
+    RpcEndExcept;
+
+    return status;
 }
 
 /* EOF */