Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

145 lines
3.7 KiB

#include "stdafx.h"
#include "common.h"
#include "windns.h"
#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif
#define new DEBUG_NEW
extern HINSTANCE hDLLInstance;
// NOTE: this function only handles limited cases, e.g., no ip address
BOOL IsLocalComputer(IN LPCTSTR lpszComputer)
{
if (!lpszComputer || !*lpszComputer)
{
return TRUE;
}
if ( _tcslen(lpszComputer) > 2 && *lpszComputer == _T('\\') && *(lpszComputer + 1) == _T('\\') )
{
lpszComputer += 2;
}
BOOL bReturn = FALSE;
DWORD dwErr = 0;
TCHAR szBuffer[DNS_MAX_NAME_BUFFER_LENGTH];
DWORD dwSize = DNS_MAX_NAME_BUFFER_LENGTH;
// 1st: compare against local Netbios computer name
if ( !GetComputerNameEx(ComputerNameNetBIOS, szBuffer, &dwSize) )
{
dwErr = GetLastError();
}
else
{
bReturn = (0 == lstrcmpi(szBuffer, lpszComputer));
if (!bReturn)
{
// 2nd: compare against local Dns computer name
dwSize = DNS_MAX_NAME_BUFFER_LENGTH;
if (GetComputerNameEx(ComputerNameDnsFullyQualified, szBuffer, &dwSize))
{
bReturn = (0 == lstrcmpi(szBuffer, lpszComputer));
}
else
{
dwErr = GetLastError();
}
}
}
if (dwErr)
{
TRACE(_T("IsLocalComputer dwErr = %x\n"), dwErr);
}
return bReturn;
}
void GetFullPathLocalOrRemote(
IN LPCTSTR lpszServer,
IN LPCTSTR lpszDir,
OUT CString& cstrPath
)
{
ASSERT(lpszDir && *lpszDir);
if (IsLocalComputer(lpszServer))
{
cstrPath = lpszDir;
}
else
{
// Check if it's already pointing to a share...
if (*lpszDir == _T('\\') || *(lpszDir + 1) == _T('\\'))
{
cstrPath = lpszDir;
}
else
{
if (*lpszServer != _T('\\') || *(lpszServer + 1) != _T('\\'))
{
cstrPath = _T("\\\\");
cstrPath += lpszServer;
}
else
{
cstrPath = lpszServer;
}
cstrPath += _T("\\");
cstrPath += lpszDir;
int i = cstrPath.Find(_T(':'));
ASSERT(-1 != i);
cstrPath.SetAt(i, _T('$'));
}
}
}
BOOL SupportsSecurityACLs(LPCTSTR path)
{
const UINT BUFF_LEN = 32; // Should be large enough to hold the volume and the file system type
// set to true by default, since most likely it will be
// and if this function fails, then no big deal...
BOOL bReturn = TRUE;
TCHAR root[MAX_PATH];
DWORD len = 0;
DWORD flg = 0;
TCHAR fs[BUFF_LEN];
StrCpyN(root, path, MAX_PATH);
if (PathIsUNC(root))
{
LPTSTR p = NULL;
while (!PathIsUNCServerShare(root))
{
p = StrRChr(root, p, _T('\\'));
if (p != NULL)
*p = 0;
}
StrCat(root, _T("\\"));
// NET_API_STATUS rc = NetShareGetInfo(server, share,
if (GetVolumeInformation(root, NULL, 0, NULL, &len, &flg, fs, BUFF_LEN))
{
bReturn = 0 != (flg & FS_PERSISTENT_ACLS);
}
else
{
DWORD err = GetLastError();
}
}
else
{
if (PathStripToRoot(root))
{
if (GetVolumeInformation(root, NULL, 0, NULL, &len, &flg, fs, BUFF_LEN))
{
bReturn = 0 != (flg & FS_PERSISTENT_ACLS);
}
}
}
return bReturn;
}