25 #include "../../../core/trace.hpp"
26 #include "../../../core/unicode_conversions.hpp"
30 const TCHAR NetShareAdd_name[]=
_T(
"NetShareAdd");
31 const TCHAR NetShareDel_name[]=
_T(
"NetShareDel");
33 using namespace libNTUtils;
34 using namespace NTUtils;
38 NetShare::NetShare(
void) :
39 LoadLibraryWrapper(OnNT() ? netapi32_nt_lib_name : server_info_9X_lib_name),
40 pNetShareAdd(
reinterpret_cast<NetShareAddType>(::GetProcAddress(Handle(),NetShareAdd_name))),
41 pNetShareDel(
reinterpret_cast<NetShareDelType>(::GetProcAddress(Handle(),NetShareDel_name)))
49 NetShare::NetShare(
const tstring &DirectoryToShare,
const TCHAR *
const Sharename,
const TCHAR *
const description,
const TCHAR *
const Server,
const DWORD max_connections,SECURITY_DESCRIPTOR *sd,
const DWORD share_perms) :
50 LoadLibraryWrapper(OnNT() ? netapi32_nt_lib_name : server_info_9X_lib_name),
51 pNetShareAdd(
reinterpret_cast<NetShareAddType>(::GetProcAddress(Handle(),NetShareAdd_name))),
52 pNetShareDel(
reinterpret_cast<NetShareDelType>(::GetProcAddress(Handle(),NetShareDel_name)))
57 Create(DirectoryToShare,Sharename,description,Server,max_connections,sd,share_perms);
60 NetShare::NetShare(
const tstring &DirectoryToShare,
const TCHAR *
const Sharename,
const TCHAR *
const description,
const TCHAR *
const Username,
const TCHAR *
const Server,
const DWORD access_mask,
const DWORD max_connections,
const DWORD share_perms) :
61 LoadLibraryWrapper(OnNT() ? netapi32_nt_lib_name : server_info_9X_lib_name),
62 pNetShareAdd(
reinterpret_cast<NetShareAddType>(::GetProcAddress(Handle(),NetShareAdd_name))),
63 pNetShareDel(
reinterpret_cast<NetShareDelType>(::GetProcAddress(Handle(),NetShareDel_name))) {
67 Create(DirectoryToShare,Sharename,description,Username,Server,access_mask,max_connections,share_perms);
70 NetShare::~NetShare(
void) {
74 inline bool NetShare::Create(
const tstring &DirectoryToShare,
const TCHAR *
const Sharename,
const TCHAR *
const description,
const TCHAR *
const Server,
const DWORD max_connections,
const SECURITY_DESCRIPTOR *
const sd,
const DWORD share_perms) {
83 sharename_w=TStringToWString(Sharename);
84 si502.shi502_netname =
reinterpret_cast<LPWSTR>(
const_cast<
wchar_t *>(sharename_w.c_str()));
85 si502.shi502_type = STYPE_DISKTREE;
86 std::wstring rmb(TStringToWString(description));
87 si502.shi502_remark =
reinterpret_cast<LPWSTR>(
const_cast<
wchar_t *>(rmb.c_str()));
88 si502.shi502_permissions = share_perms;
89 si502.shi502_max_uses = max_connections;
90 si502.shi502_current_uses = 0;
91 std::wstring dirb(TStringToWString(DirectoryToShare));
92 si502.shi502_path =
reinterpret_cast<LPWSTR>(
const_cast<
wchar_t *>(dirb.c_str()));
93 si502.shi502_passwd = NULL;
94 si502.shi502_reserved = 0;
95 si502.shi502_security_descriptor =
const_cast<SECURITY_DESCRIPTOR *>(sd);
96 machine_w=(Server ? TStringToWString(Server) : L"");
97 NET_API_STATUS nas=(*pNetShareAdd)(
100 reinterpret_cast<BYTE *>(&si502),
103 if (nas==NERR_Success) {
104 JMMCG_TRACE(_T(
"NetShare::Create(...): Successfully created the share '")<<Sharename<<_T(
"' (path '")<<DirectoryToShare<<_T(
"') on machine '")<<(Server ? Server : _T(
""))<<_T(
"'"));
108 JMMCG_TRACE(_T(
"NetShare::Create(...): NetShareAdd error: 0x")<<std::hex<<nas);
109 JMMCG_TRACE(_T(
"\tDid not create the share '")<<Sharename<<_T(
"' (path '")<<DirectoryToShare<<_T(
"') on machine '")<<(Server ? Server : _T(
""))<<_T(
"'"));
116 bool NetShare::Create(
const tstring &DirectoryToShare,
const TCHAR *
const Sharename,
const TCHAR *
const description,
const TCHAR *
const Username,
const TCHAR *
const Server,
const DWORD access_mask,
const DWORD max_connections,
const DWORD share_perms) {
117 register OSVERSIONINFO osinfo;
118 osinfo.dwOSVersionInfoSize=
sizeof(OSVERSIONINFO);
119 if (::GetVersionEx(&osinfo) && osinfo.dwPlatformId!=VER_PLATFORM_WIN32_NT) {
121 return Create(DirectoryToShare,Sharename,description,Server,max_connections,NULL,share_perms);
123 if (!sd.Allow(NULL,Username,access_mask)) {
124 return Create(DirectoryToShare,Sharename,description,Server,max_connections,&sd.SD(),share_perms);
129 bool NetShare::Delete(
void) {
132 bool ret=((*pNetShareDel)(machine_w.c_str(),sharename_w.c_str(),0)==NERR_Success);
133 JMMCG_TRACE(_T(
"NetShare::Create(...): Deleted the share '")<<WStringToTString(sharename_w)<<_T(
"') on machine '")<<WStringToTString(machine_w)<<_T(
"', yes/no: ")<<ret);
139 bool NetFindNTSubDir(NetShare &share,
const TCHAR *
const sharename,
const TCHAR *
const machine,
const TCHAR *
const path,
const TCHAR *
const username,
const DWORD access_mask,
const DWORD max_connections,
const DWORD share_perms) {
140 const TCHAR drive_share_name[]=
_T(
"A1_dir_share$");
141 const TCHAR description[]=
_T(
"Temporary share on drive letter...");
142 const TCHAR search_pattern[]=
_T(
"\\*");
143 NetShare drive_share;
145 tstring dir_ltr(
_T(
"c"));
147 if (!drive_share.Create(dir_ltr+
_T(
":\\"),drive_share_name,description,username,machine,GENERIC_READ,1,ACCESS_READ)) {
150 tstring pattern(machine);
151 pattern+=dir_separator;
152 pattern+=drive_share_name;
153 int len=pattern.length();
155 pattern+=search_pattern;
157 if (finder.FindFile(pattern.c_str()) && finder.FindNextFile()) {
158 assert(finder.IsDirectory());
159 tstring remote_sys_path(dir_ltr);
160 remote_sys_path+=
_T(
':');
161 remote_sys_path+=
static_cast<
const TCHAR *>(finder.GetFilePath().Right(finder.GetFilePath().GetLength()-len));
162 if (!share.Create(remote_sys_path,sharename,NULL,username,machine,access_mask,max_connections,share_perms)) {
167 drive_share.Delete();
169 while (++*dir_ltr.begin()<=
_T(
'z'));