From: Jeffrey Altman Date: Tue, 7 Dec 2004 06:15:56 +0000 (+0000) Subject: STABLE14-windows-pioctl-20041204 X-Git-Tag: openafs-devel-1_3_75~20 X-Git-Url: https://git.michaelhowe.org/gitweb/?a=commitdiff_plain;h=97b3c70d76f19154ec65c38576c3d55fc328d19d;p=packages%2Fo%2Fopenafs.git STABLE14-windows-pioctl-20041204 Be more agressive about trying to establish a connection to the SMB server if it fails. This requires adding a new dll: secur32.dll (cherry picked from commit d2d84479cfc9288cfa2c6d7c012ad0418229d225) --- diff --git a/src/libafsauthent/NTMakefile b/src/libafsauthent/NTMakefile index 5b8669e7f..692b2d2d1 100644 --- a/src/libafsauthent/NTMakefile +++ b/src/libafsauthent/NTMakefile @@ -142,7 +142,7 @@ DLLLIBS =\ $(DESTDIR)\lib\lanahelper.lib $(LIBFILE): $(DLLOBJS) $(DLLLIBS) $(RXOBJS) - $(DLLCONLINK) /DEF:afsauthent.def rpcrt4.lib dnsapi.lib mpr.lib + $(DLLCONLINK) /DEF:afsauthent.def rpcrt4.lib dnsapi.lib mpr.lib secur32.lib $(DLLPREP) # Definitions for generating versioninfo resources diff --git a/src/sys/NTMakefile b/src/sys/NTMakefile index c9a805ac4..a7dec7094 100644 --- a/src/sys/NTMakefile +++ b/src/sys/NTMakefile @@ -24,7 +24,7 @@ LIBOBJS =\ $(OUT)\pioctl_nt.obj $(LIBFILE): $(LIBOBJS) $(DESTDIR)\lib\lanahelper.lib - $(LIBARCH) $(DESTDIR)\lib\lanahelper.lib + $(LIBARCH) $(DESTDIR)\lib\lanahelper.lib secur32.lib ############################################################################ # Install target; primary makefile target diff --git a/src/sys/pioctl_nt.c b/src/sys/pioctl_nt.c index 17a64b3a9..aa93298df 100644 --- a/src/sys/pioctl_nt.c +++ b/src/sys/pioctl_nt.c @@ -22,6 +22,8 @@ RCSID #include #include #include +#define SECURITY_WIN32 +#include #include #include @@ -129,6 +131,15 @@ GetIoctlHandle(char *fileNamep, HANDLE * handlep) char netbiosName[MAX_NB_NAME_LENGTH]; char tbuffer[256]=""; HANDLE fh; + HKEY hk; + char szUser[128] = ""; + char szClient[MAX_PATH] = ""; + char szPath[MAX_PATH] = ""; + NETRESOURCE nr; + DWORD res; + DWORD ioctlDebug = IoctlDebug(); + DWORD gle; + DWORD dwSize = sizeof(szUser); if (fileNamep) { drivep = strchr(fileNamep, ':'); @@ -188,15 +199,6 @@ GetIoctlHandle(char *fileNamep, HANDLE * handlep) FILE_FLAG_WRITE_THROUGH, NULL); fflush(stdout); if (fh == INVALID_HANDLE_VALUE) { - HKEY hk; - char szUser[64] = ""; - char szClient[MAX_PATH] = ""; - char szPath[MAX_PATH] = ""; - NETRESOURCE nr; - DWORD res; - DWORD ioctlDebug = IoctlDebug(); - DWORD gle; - gle = GetLastError(); if (gle && ioctlDebug ) { char buf[4096]; @@ -214,60 +216,127 @@ GetIoctlHandle(char *fileNamep, HANDLE * handlep) tbuffer,gle,buf); } } +#ifdef COMMENT if (gle != ERROR_DOWNGRADE_DETECTED) return -1; +#endif lana_GetNetbiosName(szClient, LANA_NETBIOS_NAME_FULL); - sprintf(szPath, "\\\\%s", szClient); - /* We should probably be using GetUserNameEx() for this */ if (RegOpenKey (HKEY_CURRENT_USER, - TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer"), &hk) == 0) + TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer"), &hk) == 0) { - DWORD dwSize = sizeof(szUser); DWORD dwType = REG_SZ; RegQueryValueEx (hk, TEXT("Logon User Name"), NULL, &dwType, (PBYTE)szUser, &dwSize); RegCloseKey (hk); } - if ( ioctlDebug ) - fprintf(stderr, "pioctl logon user: [%s]\r\n",szUser); - - memset (&nr, 0x00, sizeof(NETRESOURCE)); - nr.dwType=RESOURCETYPE_DISK; - nr.lpLocalName=0; - nr.lpRemoteName=szPath; - res = WNetAddConnection2(&nr,NULL,szUser,0); - if (res) { - if ( ioctlDebug ) { - fprintf(stderr, "pioctl WNetAddConnection2(%s,%s) failed: 0x%X\r\n", - szPath,szUser,res); + + if ( szUser[0] ) { + if ( ioctlDebug ) + fprintf(stderr, "pioctl logon user: [%s]\r\n",szUser); + + sprintf(szPath, "\\\\%s", szClient); + memset (&nr, 0x00, sizeof(NETRESOURCE)); + nr.dwType=RESOURCETYPE_DISK; + nr.lpLocalName=0; + nr.lpRemoteName=szPath; + res = WNetAddConnection2(&nr,NULL,szUser,0); + if (res) { + if ( ioctlDebug ) { + fprintf(stderr, "pioctl WNetAddConnection2(%s,%s) failed: 0x%X\r\n", + szPath,szUser,res); + } + + sprintf(szPath, "\\\\%s\\all", szClient); + res = WNetAddConnection2(&nr,NULL,szUser,0); + if (res) { + if ( ioctlDebug ) { + fprintf(stderr, "pioctl WNetAddConnection2(%s,%s) failed: 0x%X\r\n", + szPath,szUser,res); + } + goto next_attempt; + } + } + + fh = CreateFile(tbuffer, GENERIC_READ | GENERIC_WRITE, + FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, + FILE_FLAG_WRITE_THROUGH, NULL); + fflush(stdout); + if (fh == INVALID_HANDLE_VALUE) { + gle = GetLastError(); + if (gle && ioctlDebug ) { + char buf[4096]; + + if ( FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, + NULL, + gle, + MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US), + buf, + 4096, + (va_list *) NULL + ) ) + { + fprintf(stderr,"pioctl CreateFile(%s) failed: 0x%8X\r\n\t[%s]\r\n", + tbuffer,gle,buf); + } + } } - return -1; } + } + + next_attempt: + if ( fh == INVALID_HANDLE_VALUE ) { + if (GetUserNameEx(NameSamCompatible, szUser, &dwSize)) { + if ( ioctlDebug ) + fprintf(stderr, "pioctl logon user: [%s]\r\n",szUser); + + sprintf(szPath, "\\\\%s", szClient); + memset (&nr, 0x00, sizeof(NETRESOURCE)); + nr.dwType=RESOURCETYPE_DISK; + nr.lpLocalName=0; + nr.lpRemoteName=szPath; + res = WNetAddConnection2(&nr,NULL,szUser,0); + if (res) { + if ( ioctlDebug ) { + fprintf(stderr, "pioctl WNetAddConnection2(%s,%s) failed: 0x%X\r\n", + szPath,szUser,res); + } + + sprintf(szPath, "\\\\%s\\all", szClient); + res = WNetAddConnection2(&nr,NULL,szUser,0); + if (res) { + if ( ioctlDebug ) { + fprintf(stderr, "pioctl WNetAddConnection2(%s,%s) failed: 0x%X\r\n", + szPath,szUser,res); + } + return -1; + } + } - fh = CreateFile(tbuffer, GENERIC_READ | GENERIC_WRITE, - FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, - FILE_FLAG_WRITE_THROUGH, NULL); - fflush(stdout); - if (fh == INVALID_HANDLE_VALUE) { - gle = GetLastError(); - if (gle && ioctlDebug ) { - char buf[4096]; - - if ( FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, - NULL, - gle, - MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US), - buf, - 4096, - (va_list *) NULL - ) ) - { - fprintf(stderr,"pioctl CreateFile(%s) failed: 0x%8X\r\n\t[%s]\r\n", - tbuffer,gle,buf); + fh = CreateFile(tbuffer, GENERIC_READ | GENERIC_WRITE, + FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, + FILE_FLAG_WRITE_THROUGH, NULL); + fflush(stdout); + if (fh == INVALID_HANDLE_VALUE) { + gle = GetLastError(); + if (gle && ioctlDebug ) { + char buf[4096]; + + if ( FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, + NULL, + gle, + MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US), + buf, + 4096, + (va_list *) NULL + ) ) + { + fprintf(stderr,"pioctl CreateFile(%s) failed: 0x%8X\r\n\t[%s]\r\n", + tbuffer,gle,buf); + } } + return -1; } - return -1; } }