--
Best wishes,
Vitaly Perov
Russia, Saint-Petersburg. www.etersoft.ru
From a6de7328e41788375bfd8cb4aa646b6834d86f6c Mon Sep 17 00:00:00 2001
From: Vitaly Perov <vitp...@etersoft.ru>
Date: Sat, 1 Nov 2008 17:58:01 +0300
Subject: [PATCH] netapi32: Add partial implementation of NetShareAdd
---
dlls/netapi32/share.c | 99 ++++++++++++++++++++++++++++++++++++++++++++++++-
include/lmshare.h | 11 +++++
2 files changed, 108 insertions(+), 2 deletions(-)
diff --git a/dlls/netapi32/share.c b/dlls/netapi32/share.c
index f19f732..2d38ef7 100644
--- a/dlls/netapi32/share.c
+++ b/dlls/netapi32/share.c
@@ -18,6 +18,9 @@
#include "wine/debug.h"
#include "lm.h"
#include "winerror.h"
+#include "winbase.h"
+#include "winreg.h"
+#include "wine/unicode.h"
WINE_DEFAULT_DEBUG_CHANNEL(share);
@@ -110,6 +113,98 @@ NET_API_STATUS WINAPI NetShareGetInfo(LMSTR servername, LMSTR netname,
NET_API_STATUS WINAPI NetShareAdd(LMSTR servername,
DWORD level, LPBYTE buf, LPDWORD parm_err)
{
- FIXME("Stub (%s %d %p %p)\n", debugstr_w(servername), level, buf, parm_err);
- return ERROR_NOT_SUPPORTED;
+ static const CHAR regKey[] =
+ "SYSTEM\\CurrentControlSet\\Services\\lanmanserver\\Shares";
+ static const WCHAR formatStr[] = { 'C','S','C','F','l','a','g','s','=','%',
+ 'd',' ','M','a','x','U','s','e','s','=','%','u',' ','P','a','t','h',
+ '=','%','s',' ','P','e','r','m','i','s','s','i','o','n','s','=','%',
+ 'd',' ','R','e','m','a','r','k','=','%','s',' ','T','y','p','e','=',
+ '%','d',0};
+ WCHAR paramStr[512];
+ CHAR tmpPath[MAX_PATH];
+ SHARE_INFO_2 *shi2;
+ LPWSTR netname = NULL;
+ DWORD type;
+ LPWSTR remark = NULL;
+ DWORD permissions;
+ DWORD max_uses;
+ DWORD current_uses;
+ LPWSTR path = NULL;
+ LPWSTR passwd = NULL;
+ HKEY hKey;
+ INT result;
+ DWORD disposition;
+
+ TRACE("(%s %d %p %p) partially implemented\n", debugstr_w(servername),
+ level, buf, parm_err);
+
+ *parm_err = 0;
+
+ if (servername && lstrlenW(servername))
+ {
+ FIXME("Only local sharing is supported\n");
+ return ERROR_NOT_SUPPORTED;
+ }
+
+ switch (level)
+ {
+ case 2:
+ shi2 = (SHARE_INFO_2*) buf;
+ netname = shi2->shi2_netname;
+ type = shi2->shi2_type;
+ remark = shi2->shi2_remark;
+ permissions = shi2->shi2_permissions;
+ max_uses = shi2->shi2_max_uses;
+ current_uses = shi2->shi2_current_uses;
+ path = shi2->shi2_path;
+ passwd = shi2->shi2_passwd;
+ break;
+ case 502:
+ FIXME("Information level 502 is not implemented\n");
+ return ERROR_NOT_SUPPORTED;
+ case 503:
+ FIXME("Information level 503 is not implemented\n");
+ return ERROR_NOT_SUPPORTED;
+ default:
+ return ERROR_INVALID_LEVEL;
+ }
+
+ if (passwd) FIXME("password field is not supporded yet\n");
+
+ GetCurrentDirectoryA(MAX_PATH, tmpPath);
+ result = SetCurrentDirectoryW(path);
+ SetCurrentDirectoryA(tmpPath);
+ if (!result) return ERROR_FILE_NOT_FOUND;
+
+ result = RegCreateKeyExA(HKEY_LOCAL_MACHINE, regKey, 0, NULL, 0, KEY_WRITE,
+ NULL, &hKey, &disposition);
+ if (result != ERROR_SUCCESS)
+ {
+ TRACE("Unable to open/create key 'HKLM\\%s'\n", regKey);
+ return result;
+ }
+ if (disposition == REG_CREATED_NEW_KEY)
+ TRACE("New key 'HKLM\\%s' was created\n", regKey);
+
+ result = RegQueryValueExW(hKey, netname, NULL, NULL, NULL, NULL);
+ if (result == ERROR_SUCCESS)
+ {
+ RegCloseKey(hKey);
+ return NERR_DuplicateShare;
+ }
+
+ /* FIXME: A duplicate path checking should be implemented here */
+
+ sprintfW(paramStr, formatStr, 0, (unsigned int) max_uses, path,
+ permissions, remark, type);
+ result = RegSetValueExW(hKey, netname, 0, REG_SZ,
+ (BYTE*) paramStr, (lstrlenW(paramStr) + 1) * sizeof(WCHAR));
+ if (result != ERROR_SUCCESS)
+ {
+ RegCloseKey(hKey);
+ return result;
+ }
+
+ RegCloseKey(hKey);
+ return NERR_Success;
}
diff --git a/include/lmshare.h b/include/lmshare.h
index def3f13..75537d8 100644
--- a/include/lmshare.h
+++ b/include/lmshare.h
@@ -34,6 +34,17 @@ typedef struct _SHARE_INFO_1 {
LMSTR shi1_remark;
} SHARE_INFO_1, *PSHARE_INFO_1, *LPSHARE_INFO_1;
+typedef struct _SHARE_INFO_2 {
+ LMSTR shi2_netname;
+ DWORD shi2_type;
+ LMSTR shi2_remark;
+ DWORD shi2_permissions;
+ DWORD shi2_max_uses;
+ DWORD shi2_current_uses;
+ LMSTR shi2_path;
+ LMSTR shi2_passwd;
+} SHARE_INFO_2, *PSHARE_INFO_2, *LPSHARE_INFO_2;
+
NET_API_STATUS WINAPI NetShareAdd(LMSTR,DWORD,LPBYTE,LPDWORD);
NET_API_STATUS WINAPI NetShareCheck(LMSTR,LMSTR,LPDWORD);
NET_API_STATUS WINAPI NetShareDel(LMSTR,LMSTR,DWORD);
--
1.5.6.5.GIT