* License. For details, see the LICENSE file in the top-level source
* directory or online at http://www.openafs.org/dl/license10.html
*/
+/* copyright (c) 2005
+ * the regents of the university of michigan
+ * all rights reserved
+ *
+ * permission is granted to use, copy, create derivative works and
+ * redistribute this software and such derivative works for any purpose,
+ * so long as no fee is charged, and so long as the copyright notice
+ * above, this grant of permission, and the disclaimer below appear
+ * in all copies made; and so long as the name of the university of
+ * michigan is not used in any advertising or publicity pertaining
+ * to the use or distribution of this software without specific, written
+ * prior authorization.
+ *
+ * this software is provided as is, without representation from the
+ * university of michigan as to its fitness for any purpose, and without
+ * warranty by the university of michigan of any kind, either express
+ * or implied, including without limitation the implied warranties of
+ * merchantability and fitness for a particular purpose. the regents
+ * of the university of michigan shall not be liable for nay damages,
+ * including special, indirect, incidental, or consequential damages,
+ * with respect to ant claim arising out of or in connection with the
+ * use of the software, even if it has been or is hereafter advised
+ * of the possibility of such damages.
+ */
extern "C" {
#include <afs/param.h>
#include <stdlib.h>
#include <stdio.h>
#include <WINNT/TaLocale.h>
+#include <WINNT/afsreg.h>
#undef REALLOC
#include "drivemap.h"
#include <time.h>
#include <adssts.h>
+#ifdef DEBUG
#define DEBUG_VERBOSE
+#endif
#include <osilog.h>
#include <lanahelper.h>
+#include <strsafe.h>
extern void Config_GetLanAdapter (ULONG *pnLanAdapter);
*
*/
-#undef AFSConfigKeyName
-const TCHAR sAFSConfigKeyName[] = TEXT("SYSTEM\\CurrentControlSet\\Services\\TransarcAFSDaemon\\Parameters");
-
/*
* PROFILE SECTIONS ___________________________________________________________
#define cREALLOC_SUBMOUNTS 4
-static TCHAR cszSECTION_SUBMOUNTS[] = TEXT("SOFTWARE\\OpenAFS\\Client\\Submounts");
-static TCHAR cszSECTION_MAPPINGS[] = TEXT("SOFTWARE\\OpenAFS\\Client\\Mappings");
-static TCHAR cszSECTION_ACTIVE[] = TEXT("SOFTWARE\\OpenAFS\\Client\\Active Maps");
+static TCHAR cszSECTION_SUBMOUNTS[] = TEXT(AFSREG_CLT_OPENAFS_SUBKEY "\\Submounts");
+static TCHAR cszSECTION_MAPPINGS[] = TEXT(AFSREG_CLT_OPENAFS_SUBKEY "\\Mappings");
+static TCHAR cszSECTION_ACTIVE[] = TEXT(AFSREG_CLT_OPENAFS_SUBKEY "\\Active Maps");
static TCHAR cszAUTOSUBMOUNT[] = TEXT("Auto");
static TCHAR cszLANMANDEVICE[] = TEXT("\\Device\\LanmanRedirector\\");
}
static BOOL
+WriteExpandedRegistryString(HKEY key, TCHAR * subkey, LPTSTR lhs, LPTSTR rhs)
+{
+ HKEY hkSub = NULL;
+ RegCreateKeyEx( key,
+ subkey,
+ 0,
+ NULL,
+ REG_OPTION_NON_VOLATILE,
+ KEY_WRITE,
+ NULL,
+ &hkSub,
+ NULL);
+
+ DWORD status = RegSetValueEx( hkSub, lhs, 0, REG_EXPAND_SZ, (const BYTE *)rhs, strlen(rhs)+1 );
+
+ if ( hkSub )
+ RegCloseKey( hkSub );
+
+ return (status == ERROR_SUCCESS);
+}
+
+static BOOL
ReadRegistryString(HKEY key, TCHAR * subkey, LPTSTR lhs, LPTSTR rhs, DWORD * size)
{
HKEY hkSub = NULL;
&hkSub,
NULL);
- DWORD dwType;
- DWORD status = RegQueryValueEx( hkSub, lhs, 0, &dwType, (LPBYTE)rhs, size );
+ DWORD dwType = 0;
+ DWORD localSize = *size;
+
+ DWORD status = RegQueryValueEx( hkSub, lhs, 0, &dwType, (LPBYTE)rhs, &localSize);
+ if (status == 0 && dwType == REG_EXPAND_SZ) {
+ TCHAR * buf = (TCHAR *)malloc((*size) * sizeof(TCHAR));
+ memcpy(buf, rhs, (*size) * sizeof(TCHAR));
+ localSize = ExpandEnvironmentStrings(buf, rhs, *size);
+ free(buf);
+ if ( localSize > *size )
+ status = !ERROR_SUCCESS;
+ }
+ *size = localSize;
if ( hkSub )
RegCloseKey( hkSub );
0,
NULL,
REG_OPTION_NON_VOLATILE,
- KEY_READ,
+ KEY_WRITE,
NULL,
&hkSub,
NULL);
- DWORD dwType;
DWORD status = RegDeleteValue( hkSub, lhs );
if ( hkSub )
// Otherwise, look up our list of submounts.
//
+#ifdef AFSIFS
+ AdjustAfsPath (pszPath, pszSubmount, TRUE, TRUE);
+#endif
for (size_t ii = 0; ii < pList->cSubmounts; ++ii)
{
+#ifndef AFSIFS
if (!lstrcmpi (pList->aSubmounts[ii].szSubmount, pszSubmount))
+#else
+ if (!lstrcmpi (pList->aSubmounts[ii].szMapping, pszPath))
+#endif
{
if (fMarkInUse)
pList->aSubmounts[ii].fInUse = TRUE;
return FALSE;
for ( ; *pszSubmount; ++pszSubmount)
- {
- if (!isprint(*pszSubmount))
- return FALSE;
- if (*pszSubmount == TEXT(' '))
- return FALSE;
- if (*pszSubmount == TEXT('\t'))
- return FALSE;
- }
+ {
+ if (!isprint(*pszSubmount))
+ return FALSE;
+ if (*pszSubmount == TEXT(' '))
+ return FALSE;
+ if (*pszSubmount == TEXT('/'))
+ return FALSE;
+ if (*pszSubmount == TEXT('\\'))
+ return FALSE;
+ if (*pszSubmount == TEXT('\t'))
+ return FALSE;
+ }
return TRUE;
}
HKEY hkSubmounts;
RegCreateKeyEx( HKEY_LOCAL_MACHINE,
- "SOFTWARE\\OpenAFS\\Client\\Submounts",
+ cszSECTION_SUBMOUNTS,
0,
"AFS",
REG_OPTION_NON_VOLATILE,
DWORD submountPathLen = MAX_PATH;
TCHAR submountName[MAX_PATH];
DWORD submountNameLen = MAX_PATH;
- DWORD dwType;
+ DWORD dwType = 0;
RegEnumValue( hkSubmounts, dwIndex, submountName, &submountNameLen, NULL,
&dwType, (LPBYTE)submountPath, &submountPathLen);
+ if (dwType == REG_EXPAND_SZ) {
+ char buf[MAX_PATH];
+ StringCbCopyA(buf, MAX_PATH, submountPath);
+ submountPathLen = ExpandEnvironmentStrings(buf, submountPath, MAX_PATH);
+ if (submountPathLen > MAX_PATH)
+ continue;
+ }
+
SUBMOUNT Submount;
memset (&Submount, 0x00, sizeof(SUBMOUNT));
lstrcpy (Submount.szSubmount, submountName);
{
HKEY hkMappings;
RegCreateKeyEx( HKEY_CURRENT_USER,
- "SOFTWARE\\OpenAFS\\Client\\Mappings",
+ cszSECTION_MAPPINGS,
0,
"AFS",
REG_OPTION_NON_VOLATILE,
RegEnumValue( hkMappings, dwIndex, drive, &driveLen, NULL,
&dwType, (LPBYTE)mapping, &mappingLen);
+ if ( dwType == REG_EXPAND_SZ ) {
+ TCHAR buf[MAX_PATH];
+ DWORD dummyLen = ExpandEnvironmentStrings(mapping, buf, MAX_PATH);
+ if (dummyLen > MAX_PATH)
+ continue;
+ _tcsncpy(mapping, buf, MAX_PATH);
+ }
- DRIVEMAP DriveMap;
- memset (&DriveMap, 0x00, sizeof(DRIVEMAP));
- DriveMap.chDrive = toupper(*drive);
- DriveMap.fPersistent = TRUE;
- if ((DriveMap.chDrive < chDRIVE_A) || (DriveMap.chDrive > chDRIVE_Z))
- continue;
+ DRIVEMAP DriveMap;
+ memset (&DriveMap, 0x00, sizeof(DRIVEMAP));
+ DriveMap.chDrive = toupper(*drive);
+ DriveMap.fPersistent = TRUE;
+ if ((DriveMap.chDrive < chDRIVE_A) || (DriveMap.chDrive > chDRIVE_Z))
+ continue;
if (mapping[0] != TEXT('\0'))
{
{
HKEY hkMappings;
RegCreateKeyEx( HKEY_CURRENT_USER,
- "SOFTWARE\\OpenAFS\\Client\\Mappings",
+ cszSECTION_MAPPINGS,
0,
"AFS",
REG_OPTION_NON_VOLATILE,
if (!pList->aDriveMap[iDrive].fPersistent)
lstrcat (szRHS, TEXT("*"));
- RegSetValueEx( hkMappings, szLHS, 0, REG_SZ, (const BYTE *)szRHS, lstrlen(szRHS) + 1);
+ RegSetValueEx( hkMappings, szLHS, 0, REG_EXPAND_SZ, (const BYTE *)szRHS, lstrlen(szRHS) + 1);
}
}
RegCloseKey( hkMappings );
TCHAR szValue[128];
HKEY hKey;
- _stprintf(szKeyName, TEXT("%s\\GlobalAutoMapper"), sAFSConfigKeyName);
+ _stprintf(szKeyName, TEXT("%s\\GlobalAutoMapper"), AFSREG_CLT_SVC_PARAM_SUBKEY);
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, szKeyName, 0, KEY_QUERY_VALUE, &hKey) != ERROR_SUCCESS)
return FALSE;
}
// We now have a submount name and drive letter--map the network drive.
+#ifndef AFSIFS
DWORD rc=MountDOSDrive(chDrive,szSubmount,fPersistent,NULL);
+#else
+ DWORD rc=MountDOSDrive(chDrive,/*szSubmount*/pszMapping,fPersistent,NULL);
+#endif
if (rc == NO_ERROR)
return TRUE;
if (!szRHS[0])
lstrcpy (szRHS, TEXT("/"));
- WriteRegistryString(HKEY_LOCAL_MACHINE, cszSECTION_SUBMOUNTS, pszSubmount, szRHS);
+ WriteExpandedRegistryString(HKEY_LOCAL_MACHINE, cszSECTION_SUBMOUNTS, pszSubmount, szRHS);
}
// <AuthID>: Authentication ID, 16 char hex.
// <netbiosname>: Netbios name of server
//
+#ifndef AFSIFS
if (_tcsnicmp(szMapping, cszLANMANDEVICE, _tcslen(cszLANMANDEVICE)))
+#else
+ const TCHAR ker_sub_path[] = "\\Device\\afsrdr\\";
+ if (_tcsnicmp(szMapping, ker_sub_path, _tcslen(ker_sub_path)))
+#endif
return FALSE;
+#ifndef AFSIFS
pszSubmount = &szMapping[ _tcslen(cszLANMANDEVICE) ];
+#else
+ pszSubmount = &szMapping[ _tcslen(ker_sub_path) ];
+#endif
+#ifdef AFSIFS
+ if (*(pszSubmount) < '0' ||
+ *(pszSubmount) > '9')
+ return FALSE;
+ ++pszSubmount;
+#else
if (IsWindows2000())
{
if (*(pszSubmount) != TEXT(';'))
return FALSE;
pszSubmount += _tcslen(szNetBiosName);
+#endif
}
else // (!IsWindowsNT())
{
if (!pszSubmount || !*pszSubmount)
return FALSE;
+#ifndef AFSIFS
lstrcpy (pszSubmountNow, pszSubmount);
+#else
+ lstrcpy (pszSubmountNow, "\\afs");
+ lstrcat (pszSubmountNow, pszSubmount);
+#endif
return TRUE;
}
DWORD dwOldState=0;
TCHAR pUserName[MAXRANDOMNAMELEN]=TEXT("");
BOOL fUserName=FALSE;
-#define AFSLogonOptionName TEXT("System\\CurrentControlSet\\Services\\TransarcAFSDaemon\\NetworkProvider")
+#define AFSLogonOptionName TEXT(AFSREG_CLT_SVC_PROVIDER_SUBKEY)
void SetBitLogonOption(BOOL set,DWORD value)
{
DWORD RWLogonOption(BOOL read,DWORD value)
{
- // if read is true then if value==0 return registry value
- // if read and value!=0 then use value to test registry, return TRUE if value bits match value read
- HKEY hk;
- DWORD dwDisp;
- DWORD LSPtype, LSPsize;
- DWORD rval;
- if (read)
- {
- rval=0;
- if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, AFSLogonOptionName, 0, KEY_QUERY_VALUE, &hk)==ERROR_SUCCESS)
- {
- LSPsize=sizeof(rval);
- RegQueryValueEx(hk, "LogonOptions", NULL,
- &LSPtype, (LPBYTE)&rval, &LSPsize);
- RegCloseKey (hk);
- }
- return (value==0)?rval:((rval & value)==value);
-
- } else { //write
- if (RegCreateKeyEx (HKEY_LOCAL_MACHINE, AFSLogonOptionName, 0, NULL, 0, KEY_SET_VALUE, NULL, &hk, &dwDisp) == ERROR_SUCCESS)
- {
- RegSetValueEx(hk,TEXT("LogonOptions"),NULL,REG_DWORD,(LPBYTE)&value,sizeof(value));
- RegCloseKey (hk);
- }
- return TRUE;
- }
+ // if read is true then if value==0 return registry value
+ // if read and value!=0 then use value to test registry, return TRUE if value bits match value read
+ HKEY hk;
+ DWORD dwDisp;
+ DWORD LSPtype, LSPsize;
+ DWORD rval;
+
+ if (read)
+ {
+ rval=0;
+ if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, AFSLogonOptionName, 0, KEY_QUERY_VALUE, &hk)==ERROR_SUCCESS)
+ {
+ LSPsize=sizeof(rval);
+ RegQueryValueEx(hk, "LogonOptions", NULL,
+ &LSPtype, (LPBYTE)&rval, &LSPsize);
+ RegCloseKey (hk);
+ }
+ return (value==0)?rval:((rval & value)==value);
+ } else { //write
+ if (RegCreateKeyEx (HKEY_LOCAL_MACHINE, AFSLogonOptionName, 0, NULL, 0, KEY_SET_VALUE, NULL, &hk, &dwDisp) == ERROR_SUCCESS)
+ {
+ RegSetValueEx(hk,TEXT("LogonOptions"),NULL,REG_DWORD,(LPBYTE)&value,sizeof(value));
+ RegCloseKey (hk);
+ }
+ return TRUE;
+ }
}
void MapShareName(char *pszCmdLineA)
return TRUE;
if (!GetComputerName(cm_HostName, &dwType))
return TRUE;
- sprintf(szKeyName, "%s\\GlobalAutoMapper", sAFSConfigKeyName);
+ sprintf(szKeyName, "%s\\GlobalAutoMapper", AFSREG_CLT_SVC_PARAM_SUBKEY);
dwResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, szKeyName, 0, KEY_QUERY_VALUE,
&hKey);
DWORD MountDOSDrive(char chDrive,const char *szSubmount,BOOL bPersistent,const char * pUsername)
{
- TCHAR szPath[MAX_PATH];
+ DWORD err;
+ BOOL succ;
+ TCHAR szPath[MAX_PATH], szTokens[MAX_PATH], *tok;
TCHAR szClient[MAX_PATH];
TCHAR szDrive[3] = TEXT("?:");
+
+#ifdef AFSIFS
+ int pathCount, currPos, lastPos, x;
+
+ pathCount = 0;
+
+ pathCount = 0;
+ strcpy(szTokens, szSubmount);
+ tok = strtok(szTokens, "/\\");
+ strcpy(szPath, "");
+ while (tok)
+ {
+ if (pathCount || stricmp(tok, "afs"))
+ {
+ strcat(szPath, "\\");
+ strcat(szPath, tok);
+ pathCount++;
+ }
+ tok = strtok(NULL, "/\\");
+ }
+
+ sprintf(szDrive,"%c:",chDrive);
+ strcpy(szTokens, szPath);
+ sprintf(szPath,"\\Device\\afsrdr\\%d%s",pathCount,szTokens);
+ //succ = DefineDosDevice(DDD_RAW_TARGET_PATH, "J:", "\\Device\\afsrdr\\2\\ericjw\\test");
+ succ = DefineDosDevice(DDD_RAW_TARGET_PATH, szDrive, szPath);
+ err = GetLastError();
+
+ return succ ? NO_ERROR : ERROR_DEVICE_IN_USE;
+
+#else
+
sprintf(szDrive,"%c:",chDrive);
GetClientNetbiosName (szClient);
sprintf(szPath,"\\\\%s\\%s",szClient,szSubmount);
nr.dwType=RESOURCETYPE_DISK;
nr.lpLocalName=szDrive;
nr.lpRemoteName=szPath;
- nr.dwDisplayType = RESOURCEDISPLAYTYPE_SHARE;
+ nr.dwDisplayType = RESOURCEDISPLAYTYPE_SHARE; /* ignored parameter */
DWORD res=WNetAddConnection2(&nr,NULL,pUsername,(bPersistent)?CONNECT_UPDATE_PROFILE:0);
DEBUG_EVENT5("AFS DriveMap","Mount %s Local[%s] Remote[%s] User[%s]=%x",
(bPersistent)?"Persistant" : "NonPresistant",
szDrive,szPath,pUsername?pUsername:"NULL",res);
return res;
+#endif
}
DWORD DisMountDOSDriveFull(const char *szPath,BOOL bForce)
{
+#ifndef AFSIFS
DWORD res=WNetCancelConnection(szPath,bForce);
+#else
+ DWORD res;
+ res = ERROR_DEVICE_IN_USE;
+ // must handle drive letters and afs paths
+ //DDD_REMOVE_DEFINITION
+#endif
DEBUG_EVENT3("AFS DriveMap","%sDismount Remote[%s]=%x",
bForce ? "Forced " : "",szPath,res);
return (res==ERROR_NOT_CONNECTED)?NO_ERROR:res;
DWORD DisMountDOSDrive(const char chDrive,BOOL bForce)
{
TCHAR szPath[MAX_PATH];
- sprintf(szPath,"%c:",chDrive);
+ DWORD succ;
+
+ sprintf(szPath,"%c:",chDrive);
+#ifdef AFSIFS
+ succ = DefineDosDevice(DDD_REMOVE_DEFINITION, szPath, NULL);
+ return (!succ) ? GetLastError() : 0;
+#else
return DisMountDOSDriveFull(szPath,bForce);
+#endif
}