2 * Copyright (c) 2008, 2009, 2010, 2011 Kernel Drivers, LLC.
3 * Copyright (c) 2009, 2010, 2011 Your File System, Inc.
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
10 * - Redistributions of source code must retain the above copyright notice,
11 * this list of conditions and the following disclaimer.
12 * - Redistributions in binary form must reproduce the above copyright
14 * this list of conditions and the following disclaimer in the
16 * and/or other materials provided with the distribution.
17 * - Neither the names of Kernel Drivers, LLC and Your File System, Inc.
18 * nor the names of their contributors may be used to endorse or promote
19 * products derived from this software without specific prior written
20 * permission from Kernel Drivers, LLC and Your File System, Inc.
22 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
23 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
24 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
25 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
26 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
27 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
28 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
29 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
30 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
31 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
32 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 #define _WIN32_WINNT 0x0500
49 #define AFS_DEBUG_TRACE 1
51 #ifndef WNNC_NET_OPENAFS
52 #define WNNC_NET_OPENAFS 0x00390000
55 #include "AFSUserDefines.h"
56 #include "AFSUserIoctl.h"
57 #include "AFSUserStructs.h"
58 #include "AFSProvider.h"
59 #include "AFS_Npdll.h"
67 #define SCRATCHSZ 1024
73 ULONG _cdecl AFSDbgPrint( PWCHAR Format, ... );
76 NPGetConnectionCommon( LPWSTR lpLocalName,
81 #define WNNC_DRIVER( major, minor ) ( major * 0x00010000 + minor )
83 #define OPENAFS_PROVIDER_NAME L"OpenAFS Network"
84 #define OPENAFS_PROVIDER_NAME_LENGTH 30
86 #define MAX_PROVIDER_NAME_LENGTH 256
88 static ULONG cbProviderNameLength = OPENAFS_PROVIDER_NAME_LENGTH;
90 static wchar_t wszProviderName[MAX_PROVIDER_NAME_LENGTH+1] = OPENAFS_PROVIDER_NAME;
92 static BOOL bProviderNameRead = FALSE;
94 #define OPENAFS_SERVER_NAME L"AFS"
95 #define OPENAFS_SERVER_NAME_LENGTH 6
97 #define OPENAFS_SERVER_COMMENT L"AFS Root"
98 #define OPENAFS_SERVER_COMMENT_LENGTH 16
100 #define MAX_SERVER_NAME_LENGTH 30
102 static ULONG cbServerNameLength = 0;
104 static ULONG cbServerNameUNCLength = 0;
106 static ULONG cbServerCommentLength = OPENAFS_SERVER_COMMENT_LENGTH;
108 static wchar_t wszServerName[MAX_SERVER_NAME_LENGTH+1];
110 static wchar_t wszServerNameUNC[MAX_SERVER_NAME_LENGTH+3];
112 static wchar_t wszServerComment[] = OPENAFS_SERVER_COMMENT;
114 static BOOL bServerNameRead = FALSE;
117 AFSRetrieveAuthId( void);
120 ReadProviderNameString( void)
126 if ( bProviderNameRead )
129 code = RegOpenKeyExW( HKEY_LOCAL_MACHINE,
130 L"SYSTEM\\CurrentControlSet\\Services\\AFSRedirector\\NetworkProvider",
131 0, KEY_QUERY_VALUE, &hk);
133 if ( code == ERROR_SUCCESS) {
135 dwLen = sizeof(wszProviderName);
137 code = RegQueryValueExW( hk, L"Name", NULL, NULL,
138 (LPBYTE) wszProviderName, &dwLen);
140 if ( code == ERROR_SUCCESS)
143 wszProviderName[MAX_PROVIDER_NAME_LENGTH] = '\0';
145 cbProviderNameLength = wcslen( wszProviderName) * sizeof( WCHAR);
151 bProviderNameRead = TRUE;
155 ReadServerNameString( void)
161 if ( bServerNameRead )
164 code = RegOpenKeyExW( HKEY_LOCAL_MACHINE,
165 L"SYSTEM\\CurrentControlSet\\Services\\TransarcAFSDaemon\\Parameters",
166 0, KEY_QUERY_VALUE, &hk);
168 if ( code == ERROR_SUCCESS) {
170 dwLen = sizeof(wszProviderName);
172 code = RegQueryValueExW( hk, L"NetbiosName", NULL, NULL,
173 (LPBYTE) wszServerName, &dwLen);
175 if ( code == ERROR_SUCCESS)
178 wszServerName[MAX_SERVER_NAME_LENGTH] = '\0';
180 cbServerNameLength = wcslen( wszServerName) * sizeof( WCHAR);
182 wszServerNameUNC[0] = wszServerNameUNC[1] = L'\\';
184 memcpy(&wszServerNameUNC[2], wszServerName, (cbServerNameLength + 1) * sizeof( WCHAR));
186 cbServerNameUNCLength = cbServerNameLength + 2 * sizeof( WCHAR);
192 bServerNameRead = TRUE;
197 /* returns TRUE if the file system is disabled or not installed */
199 NPIsFSDisabled( void)
204 DWORD dwStart = SERVICE_DISABLED;
206 code = RegOpenKeyExW( HKEY_LOCAL_MACHINE,
207 L"SYSTEM\\CurrentControlSet\\Services\\AFSRedirector",
208 0, KEY_QUERY_VALUE, &hk);
210 if ( code != ERROR_SUCCESS)
215 dwLen = sizeof(dwStart);
217 code = RegQueryValueExW( hk, L"Start", NULL, NULL,
218 (LPBYTE) &dwStart, &dwLen);
222 return ( dwStart == SERVICE_DISABLED);
226 #define try_return(S) { S; goto try_exit; }
232 typedef struct _UNICODE_STRING {
234 USHORT MaximumLength;
236 } UNICODE_STRING, *PUNICODE_STRING;
239 OpenRedirector( void);
241 typedef struct _AFS_ENUM_CB
256 // Recursively evaluate drivestr to find the final
257 // dos drive letter to which the source is mapped.
260 DriveSubstitution(LPCWSTR drivestr, LPWSTR subststr, size_t substlen)
263 WCHAR device[MAX_PATH + 1];
266 memset( subststr, 0, substlen);
267 drive[0] = drivestr[0];
268 drive[1] = drivestr[1];
271 if ( QueryDosDevice(drive, device, MAX_PATH) )
273 #ifdef AFS_DEBUG_TRACE
274 AFSDbgPrint( L"DriveSubstitution QueryDosDevice %s [%s -> %s]\n",
279 if ( device[0] == L'\\' &&
282 device[3] == L'\\' &&
283 iswalpha(device[4]) &&
286 drive[0] = device[4];
290 if ( !DriveSubstitution(drive, subststr, substlen) )
293 subststr[0] = drive[0];
303 hr = StringCchCat( subststr, substlen, &device[6]);
305 if ( SUCCEEDED(hr) && drivestr[2] )
307 hr = StringCchCat( subststr, substlen, &drivestr[2]);
310 if ( SUCCEEDED(hr) || hr == STRSAFE_E_INSUFFICIENT_BUFFER)
313 #ifdef AFS_DEBUG_TRACE
314 AFSDbgPrint( L"DriveSubstitution %s -> %s\n",
321 else if ( device[0] == L'\\' &&
324 device[3] == L'\\' &&
333 hr = StringCbCopyN(&subststr[1], substlen - sizeof(WCHAR), &device[7], MAX_PATH);
335 if ( SUCCEEDED(hr) || hr == STRSAFE_E_INSUFFICIENT_BUFFER)
339 hr = StringCchCat( subststr, substlen, &drivestr[2]);
346 if ( SUCCEEDED(hr) || hr == STRSAFE_E_INSUFFICIENT_BUFFER)
349 #ifdef AFS_DEBUG_TRACE
350 AFSDbgPrint( L"DriveSubstitution %s -> %s\n",
358 #ifdef AFS_DEBUG_TRACE
359 AFSDbgPrint( L"DriveSubstitution StringCbCopyN 1 hr 0x%X\n",
363 else if ( _wcsnicmp( AFS_RDR_DEVICE_NAME, device, sizeof( AFS_RDR_DEVICE_NAME) / sizeof( WCHAR) - 1) == 0)
366 // \Device\AFSRedirector\;X:\\afs\cellname
369 hr = StringCbCopyN( subststr, substlen,
370 &device[3 + sizeof( AFS_RDR_DEVICE_NAME) / sizeof( WCHAR)],
371 MAX_PATH * sizeof( WCHAR));
373 if ( SUCCEEDED(hr) || hr == STRSAFE_E_INSUFFICIENT_BUFFER)
378 hr = StringCchCat( subststr, substlen, &drivestr[2]);
385 if ( SUCCEEDED(hr) || hr == STRSAFE_E_INSUFFICIENT_BUFFER)
388 #ifdef AFS_DEBUG_TRACE
389 AFSDbgPrint( L"DriveSubstitution %s -> %s\n",
397 #ifdef AFS_DEBUG_TRACE
398 AFSDbgPrint( L"DriveSubstitution StringCbCopyN 2 hr 0x%X\n",
403 #ifdef AFS_DEBUG_TRACE
404 AFSDbgPrint( L"DriveSubstitution no substitution or match %s !! %s\n",
411 #ifdef AFS_DEBUG_TRACE
412 AFSDbgPrint( L"DriveSubstitution QueryDosDevice failed %s gle 0x%X\n",
425 NPGetCapsQueryString( DWORD nIndex)
428 case WNNC_SPEC_VERSION:
429 return L"WNNC_SPEC_VERSION";
432 return L"WNNC_NET_TYPE";
434 case WNNC_DRIVER_VERSION:
435 return L"WNNC_DRIVER_VERSION";
440 case WNNC_CONNECTION:
441 return L"WNNC_CONNECTION";
444 return L"WNNC_DIALOG";
447 return L"WNNC_ADMIN";
449 case WNNC_ENUMERATION:
450 return L"WNNC_ENUMERATION";
453 return L"WNNC_START";
455 case WNNC_CONNECTION_FLAGS:
456 return L"WNNC_CONNECTION_FLAGS";
464 // This is the only function which must be exported, everything else is optional
469 NPGetCaps( DWORD nIndex )
474 #ifdef AFS_DEBUG_TRACE
475 AFSDbgPrint( L"NPGetCaps Index %u %s\n", nIndex,
476 NPGetCapsQueryString( nIndex));
480 case WNNC_SPEC_VERSION:
483 rc = WNNC_SPEC_VERSION51;
489 rc = WNNC_NET_OPENAFS;
493 case WNNC_DRIVER_VERSION:
496 rc = WNNC_DRIVER(1, 0);
500 case WNNC_CONNECTION:
505 // WNNC_CON_GETPERFORMANCE
509 rc = WNNC_CON_GETCONNECTIONS |
510 WNNC_CON_CANCELCONNECTION |
511 WNNC_CON_ADDCONNECTION |
512 WNNC_CON_ADDCONNECTION3;
517 case WNNC_ENUMERATION:
519 rc = WNNC_ENUM_LOCAL |
529 rc = WNNC_WAIT_FOR_START;
539 // WNNC_DLG_DEVICEMODE
540 // WNNC_DLG_PROPERTYDIALOG
541 // WNNC_DLG_SEARCHDIALOG
542 // WNNC_DLG_PERMISSIONEDITOR
545 rc = WNNC_DLG_FORMATNETWORKNAME |
546 WNNC_DLG_GETRESOURCEINFORMATION |
547 WNNC_DLG_GETRESOURCEPARENT;
566 // WNNC_ADM_GETDIRECTORYTYPE
567 // WNNC_ADM_DIRECTORYNOTIFY
568 // used by the old File Manager
579 NPAddConnection( LPNETRESOURCE lpNetResource,
584 #ifdef AFS_DEBUG_TRACE
585 AFSDbgPrint( L"NPAddConnection forwarding to NPAddConnection3\n");
587 return NPAddConnection3( NULL, lpNetResource, lpPassword, lpUserName, 0 );
592 NPAddConnection3( HWND hwndOwner,
593 LPNETRESOURCE lpNetResource,
599 DWORD dwStatus = WN_SUCCESS;
600 WCHAR wchRemoteName[MAX_PATH+1];
601 WCHAR wchLocalName[3];
602 DWORD dwCopyBytes = 0;
603 AFSNetworkProviderConnectionCB *pConnectCB = NULL;
605 DWORD dwBufferSize = 0;
606 HANDLE hControlDevice = NULL;
607 HANDLE hToken = NULL;
608 LARGE_INTEGER liAuthId = {0,0};
612 if ( NPIsFSDisabled())
615 #ifdef AFS_DEBUG_TRACE
616 AFSDbgPrint( L"NPAddConnection3 AFSRDFS is disabled, returning WN_BAD_NETNAME\n");
619 return WN_BAD_NETNAME;
622 if ((lpNetResource->lpRemoteName == NULL) ||
623 (lpNetResource->lpRemoteName[0] != L'\\') ||
624 (lpNetResource->lpRemoteName[1] != L'\\') ||
625 ((lpNetResource->dwType != RESOURCETYPE_DISK) &&
626 (lpNetResource->dwType != RESOURCETYPE_ANY)))
629 #ifdef AFS_DEBUG_TRACE
630 AFSDbgPrint( L"NPAddConnection3 invalid input, returning WN_BAD_NETNAME\n");
632 return WN_BAD_NETNAME;
635 #ifdef AFS_DEBUG_TRACE
636 AFSDbgPrint( L"NPAddConnection3 processing\n");
638 if( lpNetResource->lpLocalName != NULL)
641 wchLocalName[0] = towupper(lpNetResource->lpLocalName[0]);
642 wchLocalName[1] = L':';
643 wchLocalName[2] = L'\0';
646 StringCchCopy(wchRemoteName, MAX_PATH+1, lpNetResource->lpRemoteName);
647 wchRemoteName[MAX_PATH] = L'\0';
650 // Allocate our buffer to pass to the redirector filter
653 dwBufferSize = sizeof( AFSNetworkProviderConnectionCB) + (wcslen( wchRemoteName) * sizeof( WCHAR));
655 pConnectCB = (AFSNetworkProviderConnectionCB *)HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, dwBufferSize);
657 if( pConnectCB == NULL)
660 try_return( dwStatus = WN_OUT_OF_MEMORY);
663 if( lpNetResource->lpLocalName != NULL)
666 pConnectCB->LocalName = towupper(wchLocalName[0]);
668 #ifdef AFS_DEBUG_TRACE
669 AFSDbgPrint( L"NPAddConnection3 Adding mapping for drive %s remote name %s\n",
677 pConnectCB->LocalName = L'\0';
679 #ifdef AFS_DEBUG_TRACE
680 AFSDbgPrint( L"NPAddConnection3 Adding mapping for NO drive remote name %s\n",
685 pConnectCB->Version = AFS_NETWORKPROVIDER_INTERFACE_VERSION_1;
687 pConnectCB->RemoteNameLength = wcslen( wchRemoteName) * sizeof( WCHAR);
689 memcpy( pConnectCB->RemoteName,
691 pConnectCB->RemoteNameLength);
693 pConnectCB->Type = lpNetResource->dwType;
695 pConnectCB->AuthenticationId = AFSRetrieveAuthId();
697 #ifdef AFS_DEBUG_TRACE
698 AFSDbgPrint( L"NPAddConnection3 Retrieved authentication id %08lX-%08lX\n",
699 pConnectCB->AuthenticationId.HighPart,
700 pConnectCB->AuthenticationId.LowPart);
703 hControlDevice = OpenRedirector();
705 if( hControlDevice == NULL)
708 #ifdef AFS_DEBUG_TRACE
709 AFSDbgPrint( L"NPAddConnection3 OpenRedirector failure, returning WN_NET_ERROR\n");
712 try_return( dwStatus = WN_NET_ERROR);
715 dwError = DeviceIoControl( hControlDevice,
716 IOCTL_AFS_ADD_CONNECTION,
726 #ifdef AFS_DEBUG_TRACE
727 AFSDbgPrint( L"NPAddConnection3 Failed to add connection to file system %d\n", GetLastError());
729 try_return( dwStatus = WN_OUT_OF_MEMORY);
733 // The status returned from the driver will indicate how it was handled
736 if( dwStatus == WN_SUCCESS &&
737 lpNetResource->lpLocalName != NULL)
740 WCHAR TempBuf[MAX_PATH+1];
742 if( !QueryDosDeviceW( wchLocalName,
747 if( GetLastError() != ERROR_FILE_NOT_FOUND)
750 #ifdef AFS_DEBUG_TRACE
751 AFSDbgPrint( L"NPAddConnection3 QueryDosDeviceW failed with file not found\n");
753 NPCancelConnection( wchLocalName, TRUE);
755 dwStatus = ERROR_ALREADY_ASSIGNED;
760 UNICODE_STRING uniConnectionName;
761 UNICODE_STRING uniDeviceName;
763 uniDeviceName.Length = (wcslen( AFS_RDR_DEVICE_NAME) * sizeof( WCHAR));
764 uniDeviceName.MaximumLength = uniDeviceName.Length;
765 uniDeviceName.Buffer = AFS_RDR_DEVICE_NAME;
768 // Create a symbolic link object to the device we are redirecting
771 uniConnectionName.MaximumLength = (USHORT)( uniDeviceName.Length +
772 pConnectCB->RemoteNameLength +
773 8 + // Local name and \;
774 sizeof(WCHAR)); // Space for NULL-termination.
777 // Don't include NULL-termination.
780 uniConnectionName.Length = uniConnectionName.MaximumLength - sizeof(WCHAR);
782 uniConnectionName.Buffer = LocalAlloc( LMEM_ZEROINIT,
783 uniConnectionName.MaximumLength);
785 if( uniConnectionName.Buffer == NULL)
788 try_return( dwStatus = GetLastError());
791 CopyMemory( uniConnectionName.Buffer,
792 uniDeviceName.Buffer,
793 uniDeviceName.Length);
795 StringCchCatW( uniConnectionName.Buffer,
796 uniConnectionName.MaximumLength,
799 StringCchCatW( uniConnectionName.Buffer,
800 uniConnectionName.MaximumLength,
803 StringCchCatW( uniConnectionName.Buffer,
804 uniConnectionName.MaximumLength,
807 #ifdef AFS_DEBUG_TRACE
808 AFSDbgPrint( L"NPAddConnection3 DefineDosDevice Local %s connection name %s\n",
810 uniConnectionName.Buffer);
813 if( !DefineDosDeviceW( DDD_RAW_TARGET_PATH |
814 DDD_NO_BROADCAST_SYSTEM,
816 uniConnectionName.Buffer))
818 #ifdef AFS_DEBUG_TRACE
819 AFSDbgPrint( L"NPAddConnection3 Failed to assign drive\n");
821 dwStatus = GetLastError();
826 #ifdef AFS_DEBUG_TRACE
827 AFSDbgPrint( L"NPAddConnection3 QueryDosDeviceW assigned drive %s\n", wchLocalName);
830 dwStatus = WN_SUCCESS;
833 LocalFree( uniConnectionName.Buffer);
839 #ifdef AFS_DEBUG_TRACE
840 AFSDbgPrint( L"NPAddConnection3 QueryDosDeviceW %Z already existed\n", TempBuf);
842 NPCancelConnection( wchLocalName, TRUE);
844 dwStatus = ERROR_ALREADY_ASSIGNED;
850 if ( hControlDevice != NULL)
853 CloseHandle( hControlDevice);
856 if( pConnectCB != NULL)
859 HeapFree( GetProcessHeap( ), 0, (PVOID) pConnectCB);
868 NPCancelConnection( LPWSTR lpName,
872 WCHAR wchRemoteName[MAX_PATH+1];
873 DWORD dwRemoteNameLength = (MAX_PATH+1) * sizeof(WCHAR);
874 DWORD dwStatus = WN_NOT_CONNECTED;
875 DWORD dwCopyBytes = 0;
876 AFSNetworkProviderConnectionCB *pConnectCB = NULL;
877 AFSCancelConnectionResultCB stCancelConn;
879 DWORD dwBufferSize = 0;
880 BOOL bLocalName = TRUE;
881 HANDLE hControlDevice = NULL;
882 WCHAR wchLocalName[ 3];
883 WCHAR *pwchLocalName = NULL;
888 if ( NPIsFSDisabled())
891 #ifdef AFS_DEBUG_TRACE
892 AFSDbgPrint( L"NPCancelConnection AFSRDFS is disabled, returning WN_NOT_CONNECTED\n");
895 try_return( dwStatus = WN_NOT_CONNECTED);
898 if( *lpName == L'\\' &&
899 *(lpName + 1) == L'\\')
904 wchLocalName[0] = L'\0';
906 StringCchCopyW( wchRemoteName, MAX_PATH+1, lpName);
908 dwRemoteNameLength = (wcslen( wchRemoteName) * sizeof( WCHAR));
913 wchLocalName[0] = towupper(lpName[0]);
914 wchLocalName[1] = L':';
915 wchLocalName[2] = L'\0';
918 // Get the remote name for the connection, if we are handling it
921 dwStatus = NPGetConnectionCommon( wchLocalName,
926 if( dwStatus != WN_SUCCESS ||
927 dwRemoteNameLength == 0)
930 #ifdef AFS_DEBUG_TRACE
931 AFSDbgPrint( L"NPCancelConnection Status 0x%x NameLength %u, returning WN_NOT_CONNECTED\n",
932 dwStatus, dwRemoteNameLength);
934 try_return( dwStatus = WN_NOT_CONNECTED);
938 // NPGetConnection returns the buffer size not the length without NUL
940 dwRemoteNameLength -= sizeof( WCHAR);
943 wchRemoteName[ dwRemoteNameLength/sizeof( WCHAR)] = L'\0';
945 #ifdef AFS_DEBUG_TRACE
946 AFSDbgPrint( L"NPCancelConnection Attempting to cancel '%s' -> '%s'\n",
947 wchLocalName, wchRemoteName);
950 dwBufferSize = sizeof( AFSNetworkProviderConnectionCB) + dwRemoteNameLength;
952 pConnectCB = (AFSNetworkProviderConnectionCB *)HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, dwBufferSize);
954 if( pConnectCB == NULL)
957 try_return( dwStatus = WN_OUT_OF_MEMORY);
963 pConnectCB->LocalName = wchLocalName[0];
968 pConnectCB->LocalName = L'\0';
971 pConnectCB->RemoteNameLength = (USHORT)dwRemoteNameLength;
973 StringCchCopyW( pConnectCB->RemoteName,
977 pConnectCB->Version = AFS_NETWORKPROVIDER_INTERFACE_VERSION_1;
979 pConnectCB->AuthenticationId = AFSRetrieveAuthId();
981 #ifdef AFS_DEBUG_TRACE
982 AFSDbgPrint( L"NPCancelConnection Retrieved authentication id %08lX-%08lX\n",
983 pConnectCB->AuthenticationId.HighPart,
984 pConnectCB->AuthenticationId.LowPart);
987 hControlDevice = OpenRedirector();
989 if( hControlDevice == NULL)
992 #ifdef AFS_DEBUG_TRACE
993 AFSDbgPrint( L"NPCancelConnection OpenRedirector failure, returning WN_NET_ERROR\n");
996 try_return( dwStatus = WN_NET_ERROR);
999 memset( &stCancelConn,
1001 sizeof( AFSCancelConnectionResultCB));
1003 dwError = DeviceIoControl( hControlDevice,
1004 IOCTL_AFS_CANCEL_CONNECTION,
1008 sizeof( AFSCancelConnectionResultCB),
1014 #ifdef AFS_DEBUG_TRACE
1015 DWORD gle = GetLastError();
1017 AFSDbgPrint( L"NPCancelConnection DeviceIoControl failed - gle 0x%x\n", gle);
1019 try_return( dwStatus = WN_NOT_CONNECTED);
1022 dwStatus = stCancelConn.Status;
1024 #ifdef AFS_DEBUG_TRACE
1025 if ( dwStatus == WN_NOT_CONNECTED )
1028 AFSDbgPrint( L"NPCancelConnection Cancel connection to file system - Name %s Status WN_NOT_CONNECTED\n",
1034 AFSDbgPrint( L"NPCancelConnection Cancel connection to file system - Name %s Status %08lX\n",
1040 if( dwStatus == WN_SUCCESS &&
1042 stCancelConn.LocalName != L'\0'))
1045 UNICODE_STRING uniConnectionName;
1046 UNICODE_STRING uniDeviceName;
1048 uniDeviceName.Length = (wcslen( AFS_RDR_DEVICE_NAME) * sizeof( WCHAR));
1049 uniDeviceName.MaximumLength = uniDeviceName.Length;
1050 uniDeviceName.Buffer = AFS_RDR_DEVICE_NAME;
1053 // Create a symbolic link object to the device we are redirecting
1056 uniConnectionName.MaximumLength = (USHORT)( uniDeviceName.Length +
1057 dwRemoteNameLength +
1058 8 + // Local name and \;
1059 sizeof(WCHAR)); // Space for NULL-termination.
1062 // Don't include NULL-termination.
1065 uniConnectionName.Length = uniConnectionName.MaximumLength - sizeof(WCHAR);
1067 uniConnectionName.Buffer = LocalAlloc( LMEM_ZEROINIT,
1068 uniConnectionName.MaximumLength);
1070 if( uniConnectionName.Buffer == NULL)
1073 try_return( dwStatus = GetLastError());
1076 CopyMemory( uniConnectionName.Buffer,
1077 uniDeviceName.Buffer,
1078 uniDeviceName.Length);
1080 StringCchCatW( uniConnectionName.Buffer,
1081 uniConnectionName.MaximumLength,
1087 wchLocalName[ 0] = stCancelConn.LocalName;
1089 wchLocalName[ 1] = L':';
1091 wchLocalName[ 2] = L'\0';
1093 StringCchCatW( uniConnectionName.Buffer,
1094 uniConnectionName.MaximumLength,
1097 pwchLocalName = wchLocalName;
1102 StringCchCatW( uniConnectionName.Buffer,
1103 uniConnectionName.MaximumLength,
1106 pwchLocalName = lpName;
1109 StringCchCatW( uniConnectionName.Buffer,
1110 uniConnectionName.MaximumLength,
1113 if( !DefineDosDevice( DDD_REMOVE_DEFINITION | DDD_RAW_TARGET_PATH | DDD_EXACT_MATCH_ON_REMOVE,
1115 uniConnectionName.Buffer))
1118 #ifdef AFS_DEBUG_TRACE
1119 DWORD gle = GetLastError();
1121 AFSDbgPrint( L"NPCancelConnection Failed to cancel connection to system - gle 0x%x Name %s connection %wZ\n",
1124 &uniConnectionName);
1129 #ifdef AFS_DEBUG_TRACE
1131 AFSDbgPrint( L"NPCancelConnection Canceled connection to system - Name %s connection %wZ\n",
1133 &uniConnectionName);
1140 if ( hControlDevice != NULL)
1143 CloseHandle( hControlDevice);
1147 if( pConnectCB != NULL)
1150 HeapFree( GetProcessHeap( ), 0, (PVOID) pConnectCB);
1160 NPGetConnection( LPWSTR lpLocalName,
1161 LPWSTR lpRemoteName,
1162 LPDWORD lpBufferSize)
1165 return NPGetConnectionCommon( lpLocalName,
1173 NPGetConnectionCommon( LPWSTR lpLocalName,
1174 LPWSTR lpRemoteName,
1175 LPDWORD lpBufferSize,
1179 DWORD dwStatus = WN_NOT_CONNECTED;
1180 WCHAR wchLocalName[3];
1181 WCHAR wchSubstName[MAX_PATH + 1];
1182 AFSNetworkProviderConnectionCB *pConnectCB = NULL;
1184 DWORD dwBufferSize = 0;
1185 HANDLE hControlDevice = NULL;
1191 if ( NPIsFSDisabled())
1194 #ifdef AFS_DEBUG_TRACE
1195 AFSDbgPrint( L"NPGetConnection AFSRDFS is disabled, returning WN_NOT_CONNECTED\n");
1198 try_return( dwStatus = WN_NOT_CONNECTED);
1201 if( lstrlen( lpLocalName) == 0)
1203 #ifdef AFS_DEBUG_TRACE
1204 AFSDbgPrint( L"NPGetConnection No local name, returning WN_BAD_LOCALNAME\n");
1206 try_return( dwStatus = WN_BAD_LOCALNAME);
1209 if ( lpBufferSize == NULL)
1211 #ifdef AFS_DEBUG_TRACE
1212 AFSDbgPrint( L"NPGetConnection No output size, returning WN_BAD_LOCALNAME\n");
1214 try_return( dwStatus = WN_BAD_VALUE);
1217 dwPassedSize = *lpBufferSize;
1219 if ( !bDriveSubstOk ||
1220 !DriveSubstitution( lpLocalName, wchSubstName, sizeof( wchSubstName)))
1222 wchLocalName[0] = towupper(lpLocalName[0]);
1223 wchLocalName[1] = L':';
1224 wchLocalName[2] = L'\0';
1226 #ifdef AFS_DEBUG_TRACE
1227 AFSDbgPrint( L"NPGetConnection Requesting connection for %s\n",
1233 ReadServerNameString();
1235 if ( wchSubstName[0] != L'\\' &&
1236 wchSubstName[1] == L':')
1239 wchLocalName[0] = towupper(wchSubstName[0]);
1240 wchLocalName[1] = L':';
1241 wchLocalName[2] = L'\0';
1243 #ifdef AFS_DEBUG_TRACE
1244 AFSDbgPrint( L"NPGetConnection Requesting connection for drive substitution %s -> %s\n",
1249 else if ( _wcsnicmp( wchSubstName, wszServerNameUNC, cbServerNameUNCLength / sizeof( WCHAR)) == 0 &&
1250 ( wchSubstName[cbServerNameUNCLength / sizeof( WCHAR)] == L'\\' ||
1251 wchSubstName[cbServerNameUNCLength / sizeof( WCHAR)] == 0))
1256 DWORD dwRequiredSize;
1258 #ifdef AFS_DEBUG_TRACE
1259 AFSDbgPrint( L"NPGetConnection drive substitution %s is AFS\n",
1263 dwRequiredSize = wcslen( wchSubstName) * sizeof( WCHAR) + sizeof( WCHAR);
1265 if ( lpRemoteName == NULL ||
1266 dwPassedSize == 0 ||
1267 dwRequiredSize > *lpBufferSize)
1270 *lpBufferSize = dwRequiredSize;
1272 try_return( dwStatus = WN_MORE_DATA);
1276 hr = StringCbCopyN(lpRemoteName, *lpBufferSize, wchSubstName, sizeof( wchSubstName));
1281 for ( dwCount = 0, pwch = lpRemoteName; *pwch && pwch < lpRemoteName + (*lpBufferSize); pwch++ )
1283 if ( *pwch == L'\\' )
1297 *lpBufferSize = wcslen( lpRemoteName) * sizeof( WCHAR) + sizeof( WCHAR);
1299 try_return( dwStatus = WN_SUCCESS);
1301 else if ( hr == STRSAFE_E_INSUFFICIENT_BUFFER)
1304 *lpBufferSize = wcslen( wchSubstName) * sizeof( WCHAR) + sizeof( WCHAR);
1306 for ( dwCount = 0, pwch = lpRemoteName; *pwch; pwch++ )
1308 if ( *pwch == L'\\' )
1316 *lpBufferSize = wcslen( lpRemoteName) * sizeof( WCHAR) + sizeof( WCHAR);
1318 try_return( dwStatus = WN_SUCCESS);
1324 try_return( dwStatus = WN_MORE_DATA);
1329 #ifdef AFS_DEBUG_TRACE
1330 AFSDbgPrint( L"NPGetConnection StringCbCopyN failure 0x%X\n",
1333 try_return( dwStatus = WN_NET_ERROR);
1339 #ifdef AFS_DEBUG_TRACE
1340 AFSDbgPrint( L"NPGetConnection drive substitution %s is not AFS\n",
1343 try_return( dwStatus = WN_NOT_CONNECTED);
1347 #ifdef AFS_DEBUG_TRACE
1348 AFSDbgPrint( L"NPGetConnection Requesting connection for %s\n",
1352 dwBufferSize = 0x1000;
1354 pConnectCB = (AFSNetworkProviderConnectionCB *)HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, dwBufferSize);
1356 if( pConnectCB == NULL)
1359 try_return( dwStatus = WN_OUT_OF_MEMORY);
1362 pConnectCB->LocalName = towupper(wchLocalName[0]);
1364 pConnectCB->RemoteNameLength = 0;
1366 pConnectCB->Version = AFS_NETWORKPROVIDER_INTERFACE_VERSION_1;
1368 pConnectCB->AuthenticationId = AFSRetrieveAuthId();
1370 #ifdef AFS_DEBUG_TRACE
1371 AFSDbgPrint( L"NPGetConnection Retrieved authentication id %08lX-%08lX\n",
1372 pConnectCB->AuthenticationId.HighPart,
1373 pConnectCB->AuthenticationId.LowPart);
1376 hControlDevice = OpenRedirector();
1378 if( hControlDevice == NULL)
1381 #ifdef AFS_DEBUG_TRACE
1382 AFSDbgPrint( L"NPGetConnection OpenRedirector failure, returning WN_NET_ERROR\n");
1385 try_return( dwStatus = WN_NET_ERROR);
1388 dwError = DeviceIoControl( hControlDevice,
1389 IOCTL_AFS_GET_CONNECTION,
1399 #ifdef AFS_DEBUG_TRACE
1400 DWORD gle = GetLastError();
1402 AFSDbgPrint( L"NPGetConnection Failed to get connection from file system for local %s gle 0x%x\n",
1405 try_return( dwStatus = WN_NOT_CONNECTED);
1409 // IOCTL_AFS_GET_CONNECTION returns a counted string
1412 if( lpRemoteName == NULL ||
1413 *lpBufferSize + sizeof( WCHAR) > dwPassedSize)
1416 *lpBufferSize += sizeof( WCHAR);
1418 try_return( dwStatus = WN_MORE_DATA);
1421 memcpy( lpRemoteName,
1425 lpRemoteName[ *lpBufferSize/sizeof( WCHAR)] = L'\0';
1427 *lpBufferSize += sizeof( WCHAR);
1429 #ifdef AFS_DEBUG_TRACE
1430 AFSDbgPrint( L"NPGetConnection local %s remote %s\n",
1434 dwStatus = WN_SUCCESS;
1438 if ( hControlDevice != NULL)
1441 CloseHandle( hControlDevice);
1444 if( pConnectCB != NULL)
1447 HeapFree( GetProcessHeap( ), 0, (PVOID) pConnectCB);
1456 NPGetConnection3( IN LPCWSTR lpLocalName,
1458 OUT LPVOID lpBuffer,
1459 IN OUT LPDWORD lpBufferSize)
1462 DWORD dwStatus = WN_NOT_CONNECTED;
1463 WCHAR wchLocalName[3];
1464 WCHAR wchSubstName[MAX_PATH + 1];
1465 AFSNetworkProviderConnectionCB *pConnectCB = NULL;
1467 DWORD dwBufferSize = 0;
1468 HANDLE hControlDevice = NULL;
1470 DWORD *pConnectState =(DWORD *)lpBuffer;
1475 if ( NPIsFSDisabled())
1478 #ifdef AFS_DEBUG_TRACE
1479 AFSDbgPrint( L"NPGetConnection3 AFSRDFS is disabled, returning WN_NOT_CONNECTED\n");
1482 try_return( dwStatus = WN_NOT_CONNECTED);
1485 if( lstrlen( lpLocalName) == 0)
1487 #ifdef AFS_DEBUG_TRACE
1488 AFSDbgPrint( L"NPGetConnection3 No local name, returning WN_BAD_LOCALNAME\n");
1490 try_return( dwStatus = WN_BAD_LOCALNAME);
1494 // LanMan NPGetConnection3 only responds to level 1
1497 if ( dwLevel != 0x1)
1499 #ifdef AFS_DEBUG_TRACE
1500 AFSDbgPrint( L"NPGetConnection3 Level 0x%X returning WN_BAD_LEVEL\n", dwLevel);
1502 try_return( dwStatus = WN_BAD_LEVEL);
1505 if ( lpBufferSize == NULL)
1507 #ifdef AFS_DEBUG_TRACE
1508 AFSDbgPrint( L"NPGetConnection3 No output size, returning WN_BAD_VALUE\n");
1510 try_return( dwStatus = WN_BAD_VALUE);
1513 dwPassedSize = *lpBufferSize;
1515 if ( dwPassedSize == 0 ||
1519 *lpBufferSize = sizeof( DWORD);
1521 try_return( dwStatus = WN_MORE_DATA);
1524 if ( !DriveSubstitution( lpLocalName, wchSubstName, sizeof( wchSubstName)))
1526 wchLocalName[0] = towupper(lpLocalName[0]);
1527 wchLocalName[1] = L':';
1528 wchLocalName[2] = L'\0';
1530 #ifdef AFS_DEBUG_TRACE
1531 AFSDbgPrint( L"NPGetConnection3 Requesting connection for %s level 0x%X\n",
1539 ReadServerNameString();
1541 if ( wchSubstName[0] != L'\\' &&
1542 wchSubstName[1] == L':')
1545 wchLocalName[0] = towupper(wchSubstName[0]);
1546 wchLocalName[1] = L':';
1547 wchLocalName[2] = L'\0';
1549 #ifdef AFS_DEBUG_TRACE
1550 AFSDbgPrint( L"NPGetConnection3 Requesting connection for drive substitution %s -> %s level 0x%x\n",
1556 else if ( _wcsnicmp( wchSubstName, wszServerNameUNC, cbServerNameUNCLength / sizeof( WCHAR)) == 0 &&
1557 ( wchSubstName[cbServerNameUNCLength / sizeof( WCHAR)] == L'\\' ||
1558 wchSubstName[cbServerNameUNCLength / sizeof( WCHAR)] == 0))
1561 #ifdef AFS_DEBUG_TRACE
1562 AFSDbgPrint( L"NPGetConnection3 drive substitution %s is AFS return connected\n",
1565 *pConnectState = WNGETCON_CONNECTED;
1567 *lpBufferSize = sizeof( DWORD);
1569 try_return( dwStatus = WN_SUCCESS);
1574 #ifdef AFS_DEBUG_TRACE
1575 AFSDbgPrint( L"NPGetConnection3 drive substitution %s is not AFS return not connected\n",
1578 try_return( dwStatus = WN_NOT_CONNECTED);
1582 dwBufferSize = 0x1000;
1584 pConnectCB = (AFSNetworkProviderConnectionCB *)HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, dwBufferSize);
1586 if( pConnectCB == NULL)
1589 try_return( dwStatus = WN_OUT_OF_MEMORY);
1592 pConnectCB->LocalName = towupper(wchLocalName[0]);
1594 pConnectCB->RemoteNameLength = 0;
1596 pConnectCB->Version = AFS_NETWORKPROVIDER_INTERFACE_VERSION_1;
1598 pConnectCB->AuthenticationId = AFSRetrieveAuthId();
1600 #ifdef AFS_DEBUG_TRACE
1601 AFSDbgPrint( L"NPGetConnection3 Retrieved authentication id %08lX-%08lX\n",
1602 pConnectCB->AuthenticationId.HighPart,
1603 pConnectCB->AuthenticationId.LowPart);
1606 hControlDevice = OpenRedirector();
1608 if( hControlDevice == NULL)
1611 #ifdef AFS_DEBUG_TRACE
1612 AFSDbgPrint( L"NPGetConnection3 OpenRedirector failure, returning WN_NET_ERROR\n");
1615 try_return( dwStatus = WN_NET_ERROR);
1618 dwError = DeviceIoControl( hControlDevice,
1619 IOCTL_AFS_GET_CONNECTION,
1629 #ifdef AFS_DEBUG_TRACE
1630 DWORD gle = GetLastError();
1632 AFSDbgPrint( L"NPGetConnection3 Failed to get connection from file system for local %s gle 0x%x\n",
1635 try_return( dwStatus = WN_NOT_CONNECTED);
1638 *lpBufferSize = sizeof( DWORD);
1640 if( sizeof( DWORD) > dwPassedSize)
1643 try_return( dwStatus = WN_MORE_DATA);
1646 *pConnectState = WNGETCON_CONNECTED;
1648 #ifdef AFS_DEBUG_TRACE
1649 AFSDbgPrint( L"NPGetConnection3 local %s connect-state 0x%x\n",
1653 dwStatus = WN_SUCCESS;
1657 if ( hControlDevice != NULL)
1660 CloseHandle( hControlDevice);
1663 if( pConnectCB != NULL)
1666 HeapFree( GetProcessHeap( ), 0, (PVOID) pConnectCB);
1675 NPGetConnectionPerformance( LPCWSTR lpRemoteName,
1676 LPNETCONNECTINFOSTRUCT lpNetConnectInfo)
1679 DWORD dwReturn = WN_SUCCESS;
1680 AFSNetworkProviderConnectionCB *pConnectCB = NULL;
1681 DWORD dwBufferSize = 0;
1682 HANDLE hControlDevice = NULL;
1688 if ( NPIsFSDisabled())
1691 #ifdef AFS_DEBUG_TRACE
1692 AFSDbgPrint( L"NPGetConnectionPerformance AFSRDFS is disabled, returning WN_BAD_NETNAME\n");
1695 return WN_NO_NETWORK;
1698 AFSDbgPrint( L"NPGetConnectionPerformance Entry for remote connection %S\n",
1701 dwBufferSize = 0x1000;
1703 pConnectCB = (AFSNetworkProviderConnectionCB *)HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, dwBufferSize);
1705 if( pConnectCB == NULL)
1707 try_return( dwReturn = WN_OUT_OF_MEMORY);
1710 pConnectCB->RemoteNameLength = wcslen( lpRemoteName) * sizeof( WCHAR);
1712 StringCbCopy( pConnectCB->RemoteName,
1713 dwBufferSize - sizeof(AFSNetworkProviderConnectionCB),
1716 pConnectCB->Version = AFS_NETWORKPROVIDER_INTERFACE_VERSION_1;
1718 pConnectCB->AuthenticationId = AFSRetrieveAuthId();
1720 hControlDevice = OpenRedirector();
1722 if( hControlDevice == NULL)
1724 AFSDbgPrint( L"NPGetConnectionPerformance OpenRedirector failure, returning WN_NET_ERROR\n");
1726 try_return( dwReturn = WN_NET_ERROR);
1729 dwError = DeviceIoControl( hControlDevice,
1730 IOCTL_AFS_GET_CONNECTION_INFORMATION,
1740 #ifdef AFS_DEBUG_TRACE
1741 DWORD gle = GetLastError();
1743 AFSDbgPrint( L"NPGetConnectionPerformance Failed to get connection info from file system for remote %S gle 0x%x\n",
1747 try_return( dwReturn = WN_NOT_CONNECTED);
1750 lpNetConnectInfo->dwFlags = WNCON_DYNAMIC;
1752 lpNetConnectInfo->dwSpeed = 500;
1754 lpNetConnectInfo->dwDelay = 0;
1756 lpNetConnectInfo->dwOptDataSize = 0x1000;
1758 AFSDbgPrint( L"NPGetConnectionPerformance Successfully returned information for remote connection %S\n",
1763 if ( hControlDevice != NULL)
1765 CloseHandle( hControlDevice);
1768 if( pConnectCB != NULL)
1770 HeapFree( GetProcessHeap( ), 0, (PVOID) pConnectCB);
1778 GetUsageString( DWORD dwUsage)
1780 static WCHAR Buffer[128] = L"";
1782 // RESOURCEUSAGE_CONNECTABLE 0x00000001
1783 // RESOURCEUSAGE_CONTAINER 0x00000002
1784 // RESOURCEUSAGE_NOLOCALDEVICE 0x00000004
1785 // RESOURCEUSAGE_SIBLING 0x00000008
1786 // RESOURCEUSAGE_ATTACHED 0x00000010
1787 // RESOURCEUSAGE_ALL (RESOURCEUSAGE_CONNECTABLE | RESOURCEUSAGE_CONTAINER | RESOURCEUSAGE_ATTACHED)
1788 // RESOURCEUSAGE_RESERVED 0x80000000
1793 if ( dwUsage == RESOURCEUSAGE_ALL )
1803 if ( dwUsage & RESOURCEUSAGE_CONNECTABLE )
1805 StringCbCat( Buffer, sizeof(Buffer), L"CONNECTABLE|");
1808 if ( dwUsage & RESOURCEUSAGE_CONTAINER )
1810 StringCbCat( Buffer, sizeof(Buffer), L"CONTAINER|");
1813 if ( dwUsage & RESOURCEUSAGE_NOLOCALDEVICE )
1815 StringCbCat( Buffer, sizeof(Buffer), L"NOLOCALDEVICE|");
1818 if ( dwUsage & RESOURCEUSAGE_SIBLING )
1820 StringCbCat( Buffer, sizeof(Buffer), L"SIBLING|");
1823 if ( dwUsage & RESOURCEUSAGE_ATTACHED )
1825 StringCbCat( Buffer, sizeof(Buffer), L"ATTACHED|");
1828 if ( dwUsage & RESOURCEUSAGE_RESERVED )
1830 StringCbCat( Buffer, sizeof(Buffer), L"RESERVED|");
1833 if ( dwUsage & ~(RESOURCEUSAGE_ALL|RESOURCEUSAGE_NOLOCALDEVICE|RESOURCEUSAGE_SIBLING|RESOURCEUSAGE_RESERVED) )
1835 StringCbCat( Buffer, sizeof(Buffer), L"UNKNOWN|");
1838 Buffer[lstrlen(Buffer)-1] = L'\0';
1844 GetTypeString( DWORD dwType)
1846 static WCHAR Buffer[128] = L"";
1849 // RESOURCETYPE_ANY 0x00000000
1850 // RESOURCETYPE_DISK 0x00000001
1851 // RESOURCETYPE_PRINT 0x00000002
1852 // RESOURCETYPE_RESERVED 0x00000008
1853 // RESOURCETYPE_UNKNOWN 0xFFFFFFFF
1858 if ( dwType == RESOURCETYPE_ANY )
1863 if ( dwType == RESOURCETYPE_UNKNOWN )
1868 if ( dwType & RESOURCETYPE_DISK )
1870 StringCbCat( Buffer, sizeof(Buffer), L"DISK|");
1873 if ( dwType & RESOURCETYPE_PRINT )
1875 StringCbCat( Buffer, sizeof(Buffer), L"PRINT|");
1878 if ( dwType & RESOURCETYPE_RESERVED )
1880 StringCbCat( Buffer, sizeof(Buffer), L"RESERVED|");
1883 if ( dwType & ~(RESOURCETYPE_DISK|RESOURCETYPE_PRINT|RESOURCETYPE_RESERVED) )
1885 StringCbCat( Buffer, sizeof(Buffer), L"UNKNOWN|");
1888 Buffer[lstrlen(Buffer)-1] = L'\0';
1894 GetScopeString( DWORD dwScope)
1896 static WCHAR Buffer[128] = L"";
1899 // RESOURCE_CONNECTED 0x00000001
1900 // RESOURCE_GLOBALNET 0x00000002
1901 // RESOURCE_REMEMBERED 0x00000003
1902 // RESOURCE_RECENT 0x00000004
1903 // RESOURCE_CONTEXT 0x00000005
1908 if ( dwScope == RESOURCE_CONNECTED )
1910 StringCbCat( Buffer, sizeof(Buffer), L"CONNECTED|");
1913 if ( dwScope == RESOURCE_GLOBALNET )
1915 StringCbCat( Buffer, sizeof(Buffer), L"GLOBALNET|");
1918 if ( dwScope == RESOURCE_REMEMBERED )
1920 StringCbCat( Buffer, sizeof(Buffer), L"REMEMBERED|");
1923 if ( dwScope == RESOURCE_RECENT )
1925 StringCbCat( Buffer, sizeof(Buffer), L"RECENT|");
1928 if ( dwScope == RESOURCE_CONTEXT )
1930 StringCbCat( Buffer, sizeof(Buffer), L"CONTEXT|");
1933 if ( dwScope & ~(RESOURCE_CONNECTED|RESOURCE_GLOBALNET|RESOURCE_REMEMBERED|RESOURCE_RECENT|RESOURCE_CONTEXT) )
1935 StringCbCat( Buffer, sizeof(Buffer), L"UNKNOWN|");
1938 Buffer[lstrlen(Buffer)-1] = L'\0';
1944 GetDisplayString( DWORD dwDisplay)
1947 // RESOURCEDISPLAYTYPE_GENERIC 0x00000000
1948 // RESOURCEDISPLAYTYPE_DOMAIN 0x00000001
1949 // RESOURCEDISPLAYTYPE_SERVER 0x00000002
1950 // RESOURCEDISPLAYTYPE_SHARE 0x00000003
1951 // RESOURCEDISPLAYTYPE_FILE 0x00000004
1952 // RESOURCEDISPLAYTYPE_GROUP 0x00000005
1953 // RESOURCEDISPLAYTYPE_NETWORK 0x00000006
1954 // RESOURCEDISPLAYTYPE_ROOT 0x00000007
1955 // RESOURCEDISPLAYTYPE_SHAREADMIN 0x00000008
1956 // RESOURCEDISPLAYTYPE_DIRECTORY 0x00000009
1957 // RESOURCEDISPLAYTYPE_TREE 0x0000000A
1958 // RESOURCEDISPLAYTYPE_NDSCONTAINER 0x0000000B
1961 switch ( dwDisplay ) {
1962 case RESOURCEDISPLAYTYPE_GENERIC:
1964 case RESOURCEDISPLAYTYPE_DOMAIN:
1966 case RESOURCEDISPLAYTYPE_SERVER:
1968 case RESOURCEDISPLAYTYPE_SHARE:
1970 case RESOURCEDISPLAYTYPE_FILE:
1972 case RESOURCEDISPLAYTYPE_GROUP:
1974 case RESOURCEDISPLAYTYPE_NETWORK:
1976 case RESOURCEDISPLAYTYPE_ROOT:
1978 case RESOURCEDISPLAYTYPE_SHAREADMIN:
1979 return L"SHAREADMIN";
1980 case RESOURCEDISPLAYTYPE_DIRECTORY:
1981 return L"DIRECTORY";
1982 case RESOURCEDISPLAYTYPE_TREE:
1984 case RESOURCEDISPLAYTYPE_NDSCONTAINER:
1985 return L"NDSCONTAINER";
1993 NPOpenEnum( DWORD dwScope,
1996 LPNETRESOURCE lpNetResource,
2000 DWORD dwStatus = WN_SUCCESS;
2001 AFSEnumerationCB *pEnumCB = NULL;
2003 #ifdef AFS_DEBUG_TRACE
2004 if ( lpNetResource == NULL)
2006 AFSDbgPrint( L"NPOpenEnum Scope %s Type %s Usage %s NetResource: (Null)\n",
2007 GetScopeString(dwScope), GetTypeString(dwType), GetUsageString(dwUsage));
2011 AFSDbgPrint( L"NPOpenEnum Scope %s Type %s Usage %s NetResource (0x%p): Scope %s Type %s Display %s Usage %s Local %s Remote \"%s\" Comment \"%s\"\n",
2012 GetScopeString(dwScope),
2013 GetTypeString(dwType),
2014 GetUsageString(dwUsage),
2016 GetScopeString(lpNetResource->dwScope),
2017 GetTypeString(lpNetResource->dwType),
2018 GetDisplayString(lpNetResource->dwDisplayType),
2019 GetUsageString(lpNetResource->dwUsage),
2020 lpNetResource->lpLocalName,
2021 lpNetResource->lpRemoteName,
2022 lpNetResource->lpComment);
2028 dwUsage = RESOURCEUSAGE_ALL;
2032 if ( dwType == 0 || dwType == RESOURCEUSAGE_ATTACHED)
2034 dwType |= RESOURCETYPE_DISK | RESOURCETYPE_PRINT;
2038 *lphEnum = HeapAlloc( GetProcessHeap( ), HEAP_ZERO_MEMORY, sizeof( AFSEnumerationCB));
2040 if( *lphEnum == NULL)
2043 return WN_OUT_OF_MEMORY;
2046 pEnumCB = (AFSEnumerationCB *)*lphEnum;
2048 pEnumCB->CurrentIndex = 0;
2050 pEnumCB->Type = dwType;
2054 case RESOURCE_CONNECTED:
2057 pEnumCB->Scope = RESOURCE_CONNECTED;
2062 case RESOURCE_CONTEXT:
2065 pEnumCB->Scope = RESOURCE_CONTEXT;
2070 case RESOURCE_GLOBALNET:
2073 if( lpNetResource != NULL &&
2074 lpNetResource->lpRemoteName != NULL)
2077 pEnumCB->RemoteName = (WCHAR *)HeapAlloc( GetProcessHeap( ), HEAP_ZERO_MEMORY, 0x1000);
2079 if( pEnumCB->RemoteName == NULL)
2082 dwStatus = WN_OUT_OF_MEMORY;
2083 HeapFree( GetProcessHeap( ), 0, (PVOID) *lphEnum );
2089 StringCbCopy( pEnumCB->RemoteName,
2091 lpNetResource->lpRemoteName);
2096 pEnumCB->Scope = RESOURCE_GLOBALNET;
2103 #ifdef AFS_DEBUG_TRACE
2104 AFSDbgPrint( L"NPOpenEnum Processing (Scope %s 0x%x) Type %s Usage %s, returning WN_NOT_SUPPORTED\n",
2105 GetScopeString(dwScope), dwScope, GetTypeString(dwType), GetUsageString(dwUsage));
2108 dwStatus = WN_NOT_SUPPORTED;
2109 HeapFree( GetProcessHeap( ), 0, (PVOID) *lphEnum );
2121 NPEnumResource( HANDLE hEnum,
2124 LPDWORD lpBufferSize)
2127 DWORD dwStatus = WN_NO_MORE_ENTRIES; //WN_SUCCESS;
2129 ULONG EntriesCopied;
2130 ULONG EntriesRequested;
2132 LPNETRESOURCE pNetResource;
2134 ULONG SpaceAvailable;
2136 AFSNetworkProviderConnectionCB *pConnectionCB = NULL;
2137 void *pConnectionCBBase = NULL;
2139 UNICODE_STRING uniRemoteName;
2140 HANDLE hControlDevice = NULL;
2141 AFSEnumerationCB *pEnumCB = (AFSEnumerationCB *)hEnum;
2146 if ( lpBufferSize == NULL)
2148 #ifdef AFS_DEBUG_TRACE
2149 AFSDbgPrint( L"NPEnumResource No output size, returning WN_BAD_VALUE\n");
2151 try_return( dwStatus = WN_BAD_VALUE);
2154 ReadProviderNameString();
2156 pNetResource = (LPNETRESOURCE) lpBuffer;
2157 SpaceAvailable = *lpBufferSize;
2158 EntriesRequested = *lpcCount;
2159 *lpcCount = EntriesCopied = 0;
2160 StringZone = (PWCHAR) ((char *)lpBuffer + *lpBufferSize);
2162 #ifdef AFS_DEBUG_TRACE
2163 AFSDbgPrint( L"NPEnumResource Processing Remote name %s Scope %s Type %s Usage %s Index %d SpaceAvailable 0x%lX RequestedEntries %lu\n",
2164 pEnumCB->RemoteName ? pEnumCB->RemoteName : L"(Null)",
2165 GetScopeString(pEnumCB->Scope),
2166 GetTypeString(pEnumCB->Type),
2167 GetUsageString(pEnumCB->Type),
2168 pEnumCB->CurrentIndex,
2173 if ( NPIsFSDisabled())
2176 #ifdef AFS_DEBUG_TRACE
2177 AFSDbgPrint( L"NPEnumResource AFSRDFS is disabled, returning WN_NO_MORE_ENTRIES\n");
2180 try_return( dwStatus = WN_NO_MORE_ENTRIES);
2183 pConnectionCB = (AFSNetworkProviderConnectionCB *)HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, 0x1000);
2185 if( pConnectionCB == NULL)
2188 #ifdef AFS_DEBUG_TRACE
2189 AFSDbgPrint( L"NPEnumResource Out of Memory\n");
2192 try_return( dwStatus = WN_OUT_OF_MEMORY);
2195 pConnectionCBBase = (void *)pConnectionCB;
2197 hControlDevice = OpenRedirector();
2199 if( hControlDevice == NULL)
2202 #ifdef AFS_DEBUG_TRACE
2203 AFSDbgPrint( L"NPEnumResource OpenRedirector failure, returning WN_NET_ERROR\n");
2206 try_return( dwStatus = WN_NET_ERROR);
2210 // Handle the special cases here
2211 // 0. Provider Network Root
2216 if ( pEnumCB->Scope == RESOURCE_GLOBALNET)
2219 ReadServerNameString();
2221 if ( pEnumCB->CurrentIndex == 0 &&
2222 pEnumCB->RemoteName == NULL)
2225 // Determine the space needed for this entry...
2227 SpaceNeeded = 2 * ( cbProviderNameLength + sizeof( WCHAR));
2229 uniRemoteName.Length = (USHORT)cbProviderNameLength;
2230 uniRemoteName.MaximumLength = uniRemoteName.Length;
2231 uniRemoteName.Buffer = wszProviderName;
2233 if( SpaceNeeded + sizeof( NETRESOURCE) > SpaceAvailable)
2236 *lpBufferSize = SpaceNeeded + sizeof( NETRESOURCE);
2238 #ifdef AFS_DEBUG_TRACE
2239 AFSDbgPrint( L"NPEnumResource Request MORE_DATA for entry %s Len %d\n",
2243 try_return( dwStatus = WN_MORE_DATA);
2246 #ifdef AFS_DEBUG_TRACE
2247 AFSDbgPrint( L"NPEnumResource Processing Entry %wZ\n",
2251 SpaceAvailable -= (SpaceNeeded + sizeof( NETRESOURCE));
2253 pNetResource->dwScope = RESOURCE_GLOBALNET;
2254 pNetResource->dwType = RESOURCETYPE_ANY;
2255 pNetResource->dwDisplayType = RESOURCEDISPLAYTYPE_NETWORK;
2256 pNetResource->dwUsage = RESOURCEUSAGE_CONTAINER | RESOURCEUSAGE_RESERVED;
2258 // setup string area at opposite end of buffer
2259 StringZone = (PWCHAR)( (PBYTE) StringZone - SpaceNeeded);
2261 pNetResource->lpLocalName = NULL;
2264 pNetResource->lpRemoteName = StringZone;
2266 StringCbCopy( StringZone,
2267 cbProviderNameLength + sizeof( WCHAR),
2270 StringZone += cbProviderNameLength / sizeof(WCHAR) + 1;
2272 pNetResource->lpComment = NULL;
2274 // copy provider name
2275 pNetResource->lpProvider = StringZone;
2276 StringCbCopy( StringZone,
2277 cbProviderNameLength + sizeof( WCHAR),
2280 StringZone += cbProviderNameLength / sizeof( WCHAR) + 1;
2282 #ifdef AFS_DEBUG_TRACE
2283 AFSDbgPrint( L"NPEnumResource Entry (0x%p) Scope %s Type %s Display %s Usage %s Local %s Remote \"%s\" Comment \"%s\"\n",
2285 GetScopeString(pNetResource->dwScope),
2286 GetTypeString(pNetResource->dwType),
2287 GetDisplayString(pNetResource->dwDisplayType),
2288 GetUsageString(pNetResource->dwUsage),
2289 pNetResource->lpLocalName,
2290 pNetResource->lpRemoteName,
2291 pNetResource->lpComment);
2294 // setup the new end of buffer
2295 StringZone = (PWCHAR)( (PBYTE) StringZone - SpaceNeeded);
2301 // do not change the index since we did not query the redirector
2302 pEnumCB->CurrentIndex = 0;
2304 // remember that we returned the provider name
2305 pEnumCB->RemoteName = (WCHAR *)HeapAlloc( GetProcessHeap( ), HEAP_ZERO_MEMORY, 0x1000);
2307 if( pEnumCB->RemoteName == NULL)
2310 try_return( dwStatus = WN_OUT_OF_MEMORY);
2315 StringCbCopy( pEnumCB->RemoteName,
2321 if ( pEnumCB->CurrentIndex == 0 &&
2322 lstrlen( pEnumCB->RemoteName) == cbProviderNameLength / sizeof( WCHAR) &&
2323 _wcsnicmp( pEnumCB->RemoteName, wszProviderName, cbProviderNameLength / sizeof( WCHAR)) == 0 &&
2324 EntriesCopied < EntriesRequested)
2328 // After the network provider entry comes the server entry
2331 // Determine the space needed for this entry...
2333 SpaceNeeded = cbProviderNameLength + cbServerNameUNCLength + cbServerCommentLength + 3 * sizeof( WCHAR);
2335 uniRemoteName.Length = (USHORT)cbServerNameUNCLength;
2336 uniRemoteName.MaximumLength = uniRemoteName.Length;
2337 uniRemoteName.Buffer = wszServerNameUNC;
2339 if( SpaceNeeded + sizeof( NETRESOURCE) > SpaceAvailable)
2342 *lpBufferSize = SpaceNeeded + sizeof( NETRESOURCE);
2344 #ifdef AFS_DEBUG_TRACE
2345 AFSDbgPrint( L"NPEnumResource Request MORE_DATA for entry %s Len %d\n",
2349 try_return( dwStatus = WN_MORE_DATA);
2352 #ifdef AFS_DEBUG_TRACE
2353 AFSDbgPrint( L"NPEnumResource Processing Entry %wZ\n",
2357 SpaceAvailable -= (SpaceNeeded + sizeof( NETRESOURCE));
2359 pNetResource->dwScope = 0;
2360 pNetResource->dwType = RESOURCETYPE_ANY;
2361 pNetResource->dwDisplayType = RESOURCEDISPLAYTYPE_SERVER;
2362 pNetResource->dwUsage = RESOURCEUSAGE_CONTAINER;
2364 // setup string area at opposite end of buffer
2365 StringZone = (PWCHAR)( (PBYTE) StringZone - SpaceNeeded);
2367 pNetResource->lpLocalName = NULL;
2370 pNetResource->lpRemoteName = StringZone;
2372 StringCbCopy( StringZone,
2373 cbServerNameUNCLength + sizeof( WCHAR),
2376 StringZone += cbServerNameUNCLength / sizeof(WCHAR) + 1;
2379 pNetResource->lpComment = StringZone;
2381 StringCbCopy( StringZone,
2382 cbServerCommentLength + sizeof( WCHAR),
2385 StringZone += cbServerCommentLength / sizeof( WCHAR) + 1;
2387 // copy provider name
2388 pNetResource->lpProvider = StringZone;
2389 StringCbCopy( StringZone,
2390 cbProviderNameLength + sizeof( WCHAR),
2393 StringZone += cbProviderNameLength / sizeof( WCHAR) + 1;
2395 #ifdef AFS_DEBUG_TRACE
2396 AFSDbgPrint( L"NPEnumResource Entry (0x%p) Scope %s Type %s Display %s Usage %s Local %s Remote \"%s\" Comment \"%s\"\n",
2398 GetScopeString(pNetResource->dwScope),
2399 GetTypeString(pNetResource->dwType),
2400 GetDisplayString(pNetResource->dwDisplayType),
2401 GetUsageString(pNetResource->dwUsage),
2402 pNetResource->lpLocalName,
2403 pNetResource->lpRemoteName,
2404 pNetResource->lpComment);
2407 // setup the new end of buffer
2408 StringZone = (PWCHAR)( (PBYTE) StringZone - SpaceNeeded);
2414 // do not update the index because we did not query the redirector
2415 pEnumCB->CurrentIndex = 0;
2417 // remember that we returned the server
2418 StringCbCopy( pEnumCB->RemoteName,
2426 // Setup what we are going to ask for
2429 pConnectionCB->Scope = pEnumCB->Scope;
2431 pConnectionCB->Type = pEnumCB->Type;
2433 pConnectionCB->CurrentIndex = pEnumCB->CurrentIndex;
2435 pConnectionCB->Version = AFS_NETWORKPROVIDER_INTERFACE_VERSION_1;
2438 // If this is a RESOURCE_GLOBALNET enumeration then pass down the remote name if
2442 pConnectionCB->RemoteNameLength = 0;
2444 if( pEnumCB->Scope == RESOURCE_GLOBALNET &&
2445 pEnumCB->RemoteName != NULL)
2448 pConnectionCB->RemoteNameLength = wcslen( pEnumCB->RemoteName) * sizeof( WCHAR);
2450 StringCbCopy( pConnectionCB->RemoteName,
2451 (0x1000 - sizeof(AFSNetworkProviderConnectionCB)) + sizeof(WCHAR),
2452 pEnumCB->RemoteName);
2455 pConnectionCB->AuthenticationId = AFSRetrieveAuthId();
2457 #ifdef AFS_DEBUG_TRACE
2458 AFSDbgPrint( L"NPEnumResource Retrieved authentication id %08lX-%08lX\n",
2459 pConnectionCB->AuthenticationId.HighPart,
2460 pConnectionCB->AuthenticationId.LowPart);
2463 dwError = DeviceIoControl( hControlDevice,
2464 IOCTL_AFS_LIST_CONNECTIONS,
2474 #ifdef AFS_DEBUG_TRACE
2475 DWORD gle = GetLastError();
2477 AFSDbgPrint( L"NPEnumResource Failed to list connections from file system - gle 0x%x\n",
2480 try_return( dwStatus = WN_NOT_CONNECTED);
2483 if( dwCopyBytes == 0)
2486 #ifdef AFS_DEBUG_TRACE
2487 AFSDbgPrint( L"NPEnumResource No More Entries\n");
2489 try_return( dwStatus = WN_NO_MORE_ENTRIES);
2492 dwIndex = pEnumCB->CurrentIndex;
2494 while( EntriesCopied < EntriesRequested)
2497 uniRemoteName.Length = (USHORT)pConnectionCB->RemoteNameLength;
2498 uniRemoteName.MaximumLength = uniRemoteName.Length;
2499 uniRemoteName.Buffer = pConnectionCB->RemoteName;
2501 // Determine the space needed for this entry...
2505 if( pConnectionCB->LocalName != 0)
2508 SpaceNeeded += 3 * sizeof(WCHAR); // local name
2511 SpaceNeeded += pConnectionCB->RemoteNameLength + sizeof( WCHAR); // remote name
2513 if( pConnectionCB->CommentLength > 0)
2516 SpaceNeeded += pConnectionCB->CommentLength + sizeof( WCHAR); // comment
2519 SpaceNeeded += cbProviderNameLength + sizeof( WCHAR); // provider name
2521 if( SpaceNeeded + sizeof( NETRESOURCE) > SpaceAvailable)
2524 if (EntriesCopied == 0) {
2526 dwStatus = WN_MORE_DATA;
2528 *lpBufferSize = SpaceNeeded + sizeof( NETRESOURCE);
2530 #ifdef AFS_DEBUG_TRACE
2531 AFSDbgPrint( L"NPEnumResource Request MORE_DATA for entry %s Len %d\n",
2538 #ifdef AFS_DEBUG_TRACE
2539 AFSDbgPrint( L"NPEnumResource Return SUCCESS but more entries Index %d\n",
2543 dwStatus = WN_SUCCESS;
2549 SpaceAvailable -= (SpaceNeeded + sizeof( NETRESOURCE));
2551 pNetResource->dwScope = pConnectionCB->Scope;
2552 pNetResource->dwType = pConnectionCB->Type;
2554 pNetResource->dwDisplayType = pConnectionCB->DisplayType;
2556 if ( pNetResource->dwType == RESOURCETYPE_ANY &&
2557 pNetResource->dwDisplayType == RESOURCEDISPLAYTYPE_SHARE)
2560 pNetResource->dwType = RESOURCETYPE_DISK;
2562 pNetResource->dwUsage = pConnectionCB->Usage;
2564 // setup string area at opposite end of buffer
2565 StringZone = (PWCHAR)( (PBYTE) StringZone - SpaceNeeded);
2568 if( pConnectionCB->LocalName != 0)
2571 pNetResource->lpLocalName = StringZone;
2572 *StringZone++ = towupper(pConnectionCB->LocalName);
2573 *StringZone++ = L':';
2574 *StringZone++ = L'\0';
2579 pNetResource->lpLocalName = NULL;
2582 #ifdef AFS_DEBUG_TRACE
2583 AFSDbgPrint( L"NPEnumResource Processing Entry %wZ\n",
2588 pNetResource->lpRemoteName = StringZone;
2590 CopyMemory( StringZone,
2591 pConnectionCB->RemoteName,
2592 pConnectionCB->RemoteNameLength);
2594 StringZone += (pConnectionCB->RemoteNameLength / sizeof(WCHAR));
2596 *StringZone++ = L'\0';
2599 if( pConnectionCB->CommentLength > 0)
2602 pNetResource->lpComment = StringZone;
2604 CopyMemory( StringZone,
2605 (void *)((char *)pConnectionCB + pConnectionCB->CommentOffset),
2606 pConnectionCB->CommentLength);
2608 StringZone += (pConnectionCB->CommentLength / sizeof(WCHAR));
2610 *StringZone++ = L'\0';
2615 pNetResource->lpComment = NULL;
2618 // copy provider name
2619 pNetResource->lpProvider = StringZone;
2620 StringCbCopy( StringZone,
2621 cbProviderNameLength + sizeof( WCHAR),
2624 StringZone += (cbProviderNameLength / sizeof( WCHAR) + 1);
2626 #ifdef AFS_DEBUG_TRACE
2627 AFSDbgPrint( L"NPEnumResource Entry (0x%p) Scope %s Type %s Display %s Usage %s Local %s Remote \"%s\" Comment \"%s\"\n",
2629 GetScopeString(pNetResource->dwScope),
2630 GetTypeString(pNetResource->dwType),
2631 GetDisplayString(pNetResource->dwDisplayType),
2632 GetUsageString(pNetResource->dwUsage),
2633 pNetResource->lpLocalName,
2634 pNetResource->lpRemoteName,
2635 pNetResource->lpComment);
2638 // setup the new end of buffer
2639 StringZone = (PWCHAR)( (PBYTE) StringZone - SpaceNeeded);
2647 dwCopyBytes -= FIELD_OFFSET( AFSNetworkProviderConnectionCB, RemoteName) +
2648 pConnectionCB->RemoteNameLength +
2649 pConnectionCB->CommentLength;
2651 if( dwCopyBytes == 0)
2654 dwStatus = WN_SUCCESS;
2659 pConnectionCB = (AFSNetworkProviderConnectionCB *)((char *)pConnectionCB +
2660 FIELD_OFFSET( AFSNetworkProviderConnectionCB, RemoteName) +
2661 pConnectionCB->RemoteNameLength +
2662 pConnectionCB->CommentLength);
2665 *lpcCount = EntriesCopied;
2667 // update entry index
2668 pEnumCB->CurrentIndex = dwIndex;
2670 #ifdef AFS_DEBUG_TRACE
2671 AFSDbgPrint( L"NPEnumResource Completed Count %d Index %d\n",
2678 if ( hControlDevice != NULL)
2681 CloseHandle( hControlDevice);
2684 if( pConnectionCBBase != NULL)
2687 HeapFree( GetProcessHeap( ), 0, (PVOID) pConnectionCBBase);
2696 Routine Description:
2698 This routine closes the handle for enumeration of resources.
2702 hEnum - the enumeration handle
2706 WN_SUCCESS if successful, otherwise the appropriate error
2710 The sample only supports the notion of enumerating connected shares
2715 NPCloseEnum( HANDLE hEnum )
2718 AFSEnumerationCB *pEnumCB = (AFSEnumerationCB *)hEnum;
2720 #ifdef AFS_DEBUG_TRACE
2721 AFSDbgPrint( L"NPCloseEnum\n");
2724 if( pEnumCB->RemoteName != NULL)
2727 HeapFree( GetProcessHeap( ), 0, (PVOID) pEnumCB->RemoteName);
2730 HeapFree( GetProcessHeap( ), 0, (PVOID) hEnum );
2736 NPGetResourceParent( LPNETRESOURCE lpNetResource,
2738 LPDWORD lpBufferSize )
2741 DWORD dwStatus = WN_ACCESS_DENIED;
2742 WCHAR *pwchRemoteName = NULL, *pwchSearch = NULL, *pwchSystem = NULL;
2743 LPNETRESOURCE lpOutResource = (LPNETRESOURCE) lpBuffer;
2745 if ( lpNetResource == NULL)
2747 #ifdef AFS_DEBUG_TRACE
2748 AFSDbgPrint( L"NPGetResourceParent NULL NETRESOURCE\n");
2750 return WN_MORE_DATA;
2753 if( lpNetResource->lpRemoteName == NULL)
2755 #ifdef AFS_DEBUG_TRACE
2756 AFSDbgPrint( L"NPGetResourceParent NULL NETRESOURCE\n");
2758 return WN_BAD_NETNAME;
2761 if ( lpNetResource->dwType != 0 &&
2762 lpNetResource->dwType != RESOURCETYPE_DISK)
2764 #ifdef AFS_DEBUG_TRACE
2765 AFSDbgPrint( L"NPGetResourceParent Bad dwType\n");
2767 return WN_BAD_VALUE;
2770 if ( lpBufferSize == NULL )
2773 #ifdef AFS_DEBUG_TRACE
2774 AFSDbgPrint( L"NPGetResourceParent Null lpBufferSize\n");
2776 return WN_BAD_VALUE;
2779 #ifdef AFS_DEBUG_TRACE
2780 AFSDbgPrint( L"NPGetResourceParent For remote name %s\n",
2781 lpNetResource->lpRemoteName);
2784 pwchRemoteName = lpNetResource->lpRemoteName;
2786 pwchSearch = pwchRemoteName + (wcslen( pwchRemoteName) - 1);
2788 while( pwchSearch != pwchRemoteName)
2791 if( *pwchSearch == L'\\')
2794 *pwchSearch = L'\0';
2802 if( pwchSearch != pwchRemoteName)
2805 #ifdef AFS_DEBUG_TRACE
2806 AFSDbgPrint( L"NPGetResourceParent Processing parent %s\n",
2807 lpNetResource->lpRemoteName);
2810 dwStatus = NPGetResourceInformation( lpNetResource,
2817 if ( lpOutResource == NULL ||
2818 *lpBufferSize < sizeof( NETRESOURCE) )
2820 *lpBufferSize = sizeof( NETRESOURCE);
2822 return WN_MORE_DATA;
2825 memset( lpOutResource, 0, sizeof( NETRESOURCE));
2835 NPGetResourceInformation( LPNETRESOURCE lpNetResource,
2837 LPDWORD lpBufferSize,
2838 LPWSTR *lplpSystem )
2841 DWORD dwStatus = WN_NOT_CONNECTED;
2842 AFSNetworkProviderConnectionCB *pConnectCB = NULL;
2844 DWORD dwBufferSize = 0;
2845 HANDLE hControlDevice = NULL;
2846 NETRESOURCE *pNetResource = (NETRESOURCE *)lpBuffer;
2847 PWCHAR pStringZone = NULL;
2848 UNICODE_STRING uniRemoteName;
2849 DWORD ulRequiredLen = 0;
2860 ReadProviderNameString();
2862 if ( NPIsFSDisabled())
2865 #ifdef AFS_DEBUG_TRACE
2866 AFSDbgPrint( L"NPGetResourceInformation AFSRDFS is disabled, returning WN_BAD_NETNAME\n");
2869 try_return( dwStatus = WN_BAD_NETNAME);
2872 if ( lpNetResource == NULL ||
2873 lpBufferSize == NULL )
2876 #ifdef AFS_DEBUG_TRACE
2877 AFSDbgPrint( L"NPGetResourceInformaton Null lpNetResource or lpBufferSize\n");
2879 return WN_BAD_VALUE;
2882 if( lpNetResource->lpRemoteName == NULL)
2884 #ifdef AFS_DEBUG_TRACE
2885 AFSDbgPrint( L"NPGetResourceInformation No resource name\n");
2888 try_return( dwStatus = WN_NOT_CONNECTED);
2891 dwPassedSize = *lpBufferSize;
2893 dwBufferSize = 0x1000;
2895 pConnectCB = (AFSNetworkProviderConnectionCB *)HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, dwBufferSize);
2897 if( pConnectCB == NULL)
2900 try_return( dwStatus = WN_OUT_OF_MEMORY);
2903 pConnectCB->RemoteNameLength = wcslen( lpNetResource->lpRemoteName) * sizeof( WCHAR);
2905 StringCbCopy( pConnectCB->RemoteName,
2906 dwBufferSize - sizeof(AFSNetworkProviderConnectionCB),
2907 lpNetResource->lpRemoteName);
2909 pConnectCB->Version = AFS_NETWORKPROVIDER_INTERFACE_VERSION_1;
2911 pConnectCB->AuthenticationId = AFSRetrieveAuthId();
2913 #ifdef AFS_DEBUG_TRACE
2914 AFSDbgPrint( L"NPGetResourceInformation Retrieved authentication id %08lX-%08lX\n",
2915 pConnectCB->AuthenticationId.HighPart,
2916 pConnectCB->AuthenticationId.LowPart);
2919 hControlDevice = OpenRedirector();
2921 if( hControlDevice == NULL)
2924 #ifdef AFS_DEBUG_TRACE
2925 AFSDbgPrint( L"NPGetResourceInformation OpenRedirector failure, returning WN_NET_ERROR\n");
2928 try_return( dwStatus = WN_NET_ERROR);
2931 dwError = DeviceIoControl( hControlDevice,
2932 IOCTL_AFS_GET_CONNECTION_INFORMATION,
2942 #ifdef AFS_DEBUG_TRACE
2943 DWORD gle = GetLastError();
2945 AFSDbgPrint( L"NPGetResourceInformation Failed to get connection info from file system for local %s gle 0x%x\n",
2946 lpNetResource->lpRemoteName, gle);
2948 try_return( dwStatus = WN_BAD_NETNAME);
2951 uniRemoteName.Length = (USHORT)pConnectCB->RemoteNameLength;
2952 uniRemoteName.MaximumLength = uniRemoteName.Length;
2953 uniRemoteName.Buffer = pConnectCB->RemoteName;
2955 #ifdef AFS_DEBUG_TRACE
2956 AFSDbgPrint( L"NPGetResourceInformation For remote name %wZ Scope %08lX Type %08lX Usage %08lX\n",
2963 // Determine the space needed for this entry...
2965 ulRequiredLen = sizeof( NETRESOURCE);
2967 ulRequiredLen += pConnectCB->RemoteNameLength + sizeof( WCHAR);
2969 ulRequiredLen += pConnectCB->CommentLength + sizeof( WCHAR);
2971 ulRequiredLen += cbProviderNameLength + sizeof( WCHAR);
2973 ulRequiredLen += pConnectCB->RemainingPathLength + sizeof( WCHAR);
2975 if( pNetResource == NULL ||
2976 ulRequiredLen > dwPassedSize)
2979 *lpBufferSize = ulRequiredLen;
2981 try_return( dwStatus = WN_MORE_DATA);
2984 pStringZone = (PWCHAR) ((char *)lpBuffer + sizeof( NETRESOURCE));
2986 pNetResource->dwScope = 0 /* pConnectCB->Scope*/;
2987 pNetResource->dwType = 0 /* pConnectCB->Type */;
2989 pNetResource->dwDisplayType = pConnectCB->DisplayType;
2991 pNetResource->dwUsage = pConnectCB->Usage;
2993 pNetResource->lpLocalName = NULL;
2996 pNetResource->lpRemoteName = pStringZone;
2998 CopyMemory( pStringZone,
2999 pConnectCB->RemoteName,
3000 pConnectCB->RemoteNameLength);
3002 pStringZone += (pConnectCB->RemoteNameLength / sizeof(WCHAR));
3004 *pStringZone++ = L'\0';
3007 pNetResource->lpComment = pStringZone;
3009 CopyMemory( pStringZone,
3010 (void *)((char *)pConnectCB + pConnectCB->CommentOffset),
3011 pConnectCB->CommentLength);
3013 pStringZone += (pConnectCB->CommentLength / sizeof(WCHAR));
3015 *pStringZone++ = L'\0';
3017 // copy remaining path
3018 if (pConnectCB->RemainingPathLength > 0)
3020 *lplpSystem = pStringZone;
3022 CopyMemory( pStringZone,
3023 (void *)((char *)pConnectCB + pConnectCB->RemainingPathOffset),
3024 pConnectCB->RemainingPathLength);
3026 pStringZone += (pConnectCB->RemainingPathLength / sizeof(WCHAR));
3028 *pStringZone++ = L'\0';
3030 #ifdef AFS_DEBUG_TRACE
3031 AFSDbgPrint( L"NPGetResourceInformation For remote name %s returning remaining path %s\n",
3032 pNetResource->lpRemoteName,
3037 // copy provider name
3038 pNetResource->lpProvider = pStringZone;
3040 StringCbCopy( pStringZone,
3041 cbProviderNameLength + sizeof( WCHAR),
3044 pStringZone += (cbProviderNameLength / sizeof( WCHAR) + 1);
3046 *lpBufferSize = ulRequiredLen;
3048 dwStatus = WN_SUCCESS;
3052 if ( hControlDevice != NULL)
3055 CloseHandle( hControlDevice);
3058 if( pConnectCB != NULL)
3061 HeapFree( GetProcessHeap( ), 0, (PVOID) pConnectCB);
3069 SeparateRemainingPath( WCHAR * lpConnectionName, WCHAR **lppRemainingPath)
3076 // at this point the lpConnectionName contains the full name. We need to
3077 // truncate it to \\server\share and move the remaining path back one position.
3080 for ( pwch = lpConnectionName, dwCount = 0; *pwch; pwch++)
3082 if ( *pwch == L'\\')
3096 // Found the remaining path that must be moved
3099 *lppRemainingPath = pwch + 1;
3106 for ( ; *pwch; pwch++);
3109 // and work backwards moving the string
3110 // and then make sure that there is at least
3111 // a path separator.
3116 for ( ;pwch > *lppRemainingPath; pwch--)
3118 *pwch = *(pwch - 1);
3126 NPGetUniversalName( LPCWSTR lpLocalPath,
3129 LPDWORD lpBufferSize )
3131 DWORD dwStatus = WN_NOT_CONNECTED;
3132 WCHAR wchLocalName[3];
3133 WCHAR wchSubstName[MAX_PATH + 1];
3134 AFSNetworkProviderConnectionCB *pConnectCB = NULL;
3136 DWORD dwBufferSize = 0;
3137 DWORD dwPassedSize = *lpBufferSize;
3138 DWORD dwRemainingLength = *lpBufferSize;
3139 HANDLE hControlDevice = NULL;
3140 DWORD dwLocalPathLength = 0;
3141 DWORD dwRemainingPathLength = 0;
3147 #ifdef AFS_DEBUG_TRACE
3148 AFSDbgPrint( L"NPGetUniversalName local path %s level 0x%X\n",
3149 lpLocalPath ? lpLocalPath : L"(Null)",
3153 if ( NPIsFSDisabled())
3156 #ifdef AFS_DEBUG_TRACE
3157 AFSDbgPrint( L"NPGetUniversalName AFSRDFS is disabled, returning WN_NOT_CONNECTED\n");
3160 try_return( dwStatus = WN_NOT_CONNECTED);
3163 dwLocalPathLength = lstrlen( lpLocalPath);
3165 dwRemainingPathLength = dwLocalPathLength - 2; // no drive letter
3167 if( dwLocalPathLength == 0)
3170 #ifdef AFS_DEBUG_TRACE
3171 AFSDbgPrint( L"NPGetUniversalName AFSRDFS is disabled, returning WN_BAD_LOCALNAME\n");
3174 try_return( dwStatus = WN_BAD_LOCALNAME);
3177 if( lpBuffer == NULL ||
3178 lpBufferSize == NULL)
3180 #ifdef AFS_DEBUG_TRACE
3181 AFSDbgPrint( L"NPGetUniversalName No output buffer or size\n");
3183 try_return( dwStatus = WN_BAD_VALUE);
3186 memset(lpBuffer, 0, dwPassedSize);
3188 if ( !DriveSubstitution( lpLocalPath, wchSubstName, sizeof( wchSubstName)))
3190 wchLocalName[0] = towupper(lpLocalPath[0]);
3191 wchLocalName[1] = L':';
3192 wchLocalName[2] = L'\0';
3194 #ifdef AFS_DEBUG_TRACE
3195 AFSDbgPrint( L"NPGetUniversalName Requesting UNC for %s level 0x%X\n",
3203 ReadServerNameString();
3205 if ( wchSubstName[0] != L'\\' &&
3206 wchSubstName[1] == L':')
3209 wchLocalName[0] = towupper(wchSubstName[0]);
3210 wchLocalName[1] = L':';
3211 wchLocalName[2] = L'\0';
3213 #ifdef AFS_DEBUG_TRACE
3214 AFSDbgPrint( L"NPGetUniversalName Requesting UNC for drive substitution %s -> %s\n",
3219 else if ( _wcsnicmp( wchSubstName, wszServerNameUNC, cbServerNameUNCLength / sizeof( WCHAR)) == 0 &&
3220 ( wchSubstName[cbServerNameUNCLength / sizeof( WCHAR)] == L'\\' ||
3221 wchSubstName[cbServerNameUNCLength / sizeof( WCHAR)] == 0))
3225 #ifdef AFS_DEBUG_TRACE
3226 AFSDbgPrint( L"NPGetUniversalName drive substitution %s is AFS; Level 0x%x BufferSize 0x%x\n",
3232 dwBufferSize = (wcslen( wchSubstName) + 1) * sizeof( WCHAR);
3234 switch( dwInfoLevel)
3237 case UNIVERSAL_NAME_INFO_LEVEL:
3240 UNIVERSAL_NAME_INFO *pUniversalInfo = (UNIVERSAL_NAME_INFO *)lpBuffer;
3242 *lpBufferSize = sizeof( UNIVERSAL_NAME_INFO) + dwBufferSize;
3244 if( dwPassedSize <= sizeof( UNIVERSAL_NAME_INFO))
3247 #ifdef AFS_DEBUG_TRACE
3248 AFSDbgPrint( L"NPGetUniversalName (UNIVERSAL_NAME_INFO) WN_MORE_DATA\n");
3251 try_return( dwStatus = WN_MORE_DATA);
3254 dwRemainingLength -= sizeof( UNIVERSAL_NAME_INFO);
3256 pUniversalInfo->lpUniversalName = (LPTSTR)((char *)lpBuffer + sizeof( UNIVERSAL_NAME_INFO));
3258 memcpy( pUniversalInfo->lpUniversalName,
3260 min( dwBufferSize, dwRemainingLength));
3262 dwRemainingLength -= min( dwBufferSize, dwRemainingLength);
3264 #ifdef AFS_DEBUG_TRACE
3265 AFSDbgPrint( L"NPGetUniversalName (UNIVERSAL_NAME_INFO_LEVEL) lpBuffer: %p Name: (%p) \"%s\"\n",
3267 pUniversalInfo->lpUniversalName,
3268 pUniversalInfo->lpUniversalName);
3271 if ( dwPassedSize < *lpBufferSize)
3274 try_return( dwStatus = WN_MORE_DATA);
3277 try_return( dwStatus = WN_SUCCESS);
3280 case REMOTE_NAME_INFO_LEVEL:
3283 REMOTE_NAME_INFO *pRemoteInfo = (REMOTE_NAME_INFO *)lpBuffer;
3285 *lpBufferSize = sizeof( REMOTE_NAME_INFO) + 2 * dwBufferSize + sizeof( WCHAR);
3287 if( dwPassedSize <= sizeof( REMOTE_NAME_INFO))
3290 #ifdef AFS_DEBUG_TRACE
3291 AFSDbgPrint( L"NPGetUniversalName (REMOTE_NAME_INFO) WN_MORE_DATA\n");
3294 try_return( dwStatus = WN_MORE_DATA);
3297 dwRemainingLength -= sizeof( REMOTE_NAME_INFO);
3299 pRemoteInfo->lpUniversalName = (LPTSTR)((char *)lpBuffer + sizeof( REMOTE_NAME_INFO));
3301 memcpy( pRemoteInfo->lpUniversalName,
3303 min( dwRemainingLength, dwBufferSize));
3305 dwRemainingLength -= min( dwRemainingLength, dwBufferSize);
3307 #ifdef AFS_DEBUG_TRACE
3308 AFSDbgPrint( L"NPGetUniversalName (REMOTE_NAME_INFO_LEVEL) UNI lpBuffer: %p Name: (%p) \"%s\"\n",
3310 pRemoteInfo->lpUniversalName,
3311 pRemoteInfo->lpUniversalName);
3314 if ( dwRemainingLength > dwBufferSize + sizeof( WCHAR))
3316 pRemoteInfo->lpConnectionName = (LPTSTR)((char *)pRemoteInfo->lpUniversalName + dwBufferSize);
3318 memcpy( pRemoteInfo->lpConnectionName,
3320 min( dwRemainingLength, dwBufferSize));
3322 dwRemainingLength -= min( dwRemainingLength, dwBufferSize) - sizeof( WCHAR);
3324 SeparateRemainingPath( pRemoteInfo->lpConnectionName,
3325 &pRemoteInfo->lpRemainingPath);
3328 #ifdef AFS_DEBUG_TRACE
3329 AFSDbgPrint( L"NPGetUniversalName (REMOTE_NAME_INFO_LEVEL) CONN lpBuffer: %p Name: (%p) \"%s\"\n",
3331 pRemoteInfo->lpConnectionName,
3332 pRemoteInfo->lpConnectionName ? pRemoteInfo->lpConnectionName : L"(null)");
3334 AFSDbgPrint( L"NPGetUniversalName (REMOTE_NAME_INFO_LEVEL) REMAIN lpBuffer: %p Name: (%p) \"%s\"\n",
3336 pRemoteInfo->lpRemainingPath,
3337 pRemoteInfo->lpRemainingPath ? pRemoteInfo->lpRemainingPath : L"(null)");
3340 if ( dwPassedSize < *lpBufferSize)
3343 try_return( dwStatus = WN_MORE_DATA);
3346 try_return( dwStatus = WN_SUCCESS);
3350 #ifdef AFS_DEBUG_TRACE
3351 AFSDbgPrint( L"NPGetUniversalName (UNKNOWN: 0x%X) WN_BAD_VALUE\n",
3354 try_return( dwStatus = WN_BAD_VALUE);
3360 #ifdef AFS_DEBUG_TRACE
3361 AFSDbgPrint( L"NPGetUniversalName drive substitution %s is not AFS\n",
3364 try_return( dwStatus = WN_NOT_CONNECTED);
3368 dwBufferSize = 0x1000;
3370 pConnectCB = (AFSNetworkProviderConnectionCB *)HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, dwBufferSize);
3372 if( pConnectCB == NULL)
3374 try_return( dwStatus = WN_OUT_OF_MEMORY);
3377 pConnectCB->LocalName = towupper(wchLocalName[0]);
3379 pConnectCB->RemoteNameLength = 0;
3381 pConnectCB->Version = AFS_NETWORKPROVIDER_INTERFACE_VERSION_1;
3383 pConnectCB->AuthenticationId = AFSRetrieveAuthId();
3385 #ifdef AFS_DEBUG_TRACE
3386 AFSDbgPrint( L"NPGetUniversalName Retrieved authentication id %08lX-%08lX\n",
3387 pConnectCB->AuthenticationId.HighPart,
3388 pConnectCB->AuthenticationId.LowPart);
3391 hControlDevice = OpenRedirector();
3393 if( hControlDevice == NULL)
3396 try_return( dwStatus = WN_NET_ERROR);
3399 dwError = DeviceIoControl( hControlDevice,
3400 IOCTL_AFS_GET_CONNECTION,
3410 #ifdef AFS_DEBUG_TRACE
3411 DWORD gle = GetLastError();
3413 AFSDbgPrint( L"NPGetUniversalName Failed to get connection from file system for local %s gle 0x%x\n",
3416 try_return( dwStatus = WN_NOT_CONNECTED);
3419 switch( dwInfoLevel)
3422 case UNIVERSAL_NAME_INFO_LEVEL:
3425 UNIVERSAL_NAME_INFO *pUniversalInfo = (UNIVERSAL_NAME_INFO *)lpBuffer;
3427 *lpBufferSize = sizeof( UNIVERSAL_NAME_INFO) + dwBufferSize + sizeof( WCHAR);
3429 *lpBufferSize += dwRemainingPathLength * sizeof( WCHAR);
3431 if( dwPassedSize <= sizeof( UNIVERSAL_NAME_INFO))
3434 #ifdef AFS_DEBUG_TRACE
3435 AFSDbgPrint( L"NPGetUniversalName (UNIVERSAL_NAME_INFO) WN_MORE_DATA\n");
3438 try_return( dwStatus = WN_MORE_DATA);
3441 dwRemainingLength -= sizeof( UNIVERSAL_NAME_INFO);
3443 pUniversalInfo->lpUniversalName = (LPTSTR)((char *)lpBuffer + sizeof( UNIVERSAL_NAME_INFO));
3445 pch = (char *)pUniversalInfo->lpUniversalName;
3449 min( dwBufferSize, dwRemainingLength));
3451 pch += min( dwBufferSize, dwRemainingLength);
3453 dwRemainingLength -= min( dwBufferSize + sizeof(WCHAR), dwRemainingLength);
3457 min(dwRemainingPathLength * sizeof( WCHAR), dwRemainingLength));
3459 pch += min(dwRemainingPathLength * sizeof( WCHAR), dwRemainingLength);
3461 dwRemainingLength -= min(dwRemainingPathLength * sizeof( WCHAR), dwRemainingLength);
3463 #ifdef AFS_DEBUG_TRACE
3464 AFSDbgPrint( L"NPGetUniversalName (UNIVERSAL_NAME_INFO_LEVEL) lpBuffer: %p Name: (%p) \"%s\"\n",
3466 pUniversalInfo->lpUniversalName,
3467 pUniversalInfo->lpUniversalName);
3470 if ( dwPassedSize < *lpBufferSize)
3473 try_return( dwStatus = WN_MORE_DATA);
3476 try_return( dwStatus = WN_SUCCESS);
3479 case REMOTE_NAME_INFO_LEVEL:
3482 REMOTE_NAME_INFO *pRemoteInfo = (REMOTE_NAME_INFO *)lpBuffer;
3484 *lpBufferSize = sizeof( REMOTE_NAME_INFO) + (2 * dwBufferSize + sizeof( WCHAR)) + 2 * sizeof( WCHAR);
3486 *lpBufferSize += 2 * dwRemainingPathLength * sizeof( WCHAR);
3488 if( dwPassedSize <= sizeof( REMOTE_NAME_INFO))
3491 #ifdef AFS_DEBUG_TRACE
3492 AFSDbgPrint( L"NPGetUniversalName (REMOTE_NAME_INFO) WN_MORE_DATA\n");
3495 try_return( dwStatus = WN_MORE_DATA);
3498 dwRemainingLength -= sizeof( REMOTE_NAME_INFO);
3500 pRemoteInfo->lpUniversalName = (LPTSTR)((char *)lpBuffer + sizeof( REMOTE_NAME_INFO));
3502 pch = (char *)pRemoteInfo->lpUniversalName;
3506 min( dwBufferSize, dwRemainingLength));
3508 pch += min( dwBufferSize, dwRemainingLength);
3510 dwRemainingLength -= min( dwBufferSize + sizeof( WCHAR), dwRemainingLength);
3514 min(dwRemainingPathLength * sizeof( WCHAR), dwRemainingLength));
3516 pch += min((dwRemainingPathLength + 1) * sizeof( WCHAR), dwRemainingLength);
3518 dwRemainingLength -= min((dwRemainingPathLength + 1) * sizeof( WCHAR), dwRemainingLength);
3520 #ifdef AFS_DEBUG_TRACE
3521 AFSDbgPrint( L"NPGetUniversalName (REMOTE_NAME_INFO_LEVEL) UNI lpBuffer: %p Name: (%p) \"%s\"\n",
3523 pRemoteInfo->lpUniversalName,
3524 pRemoteInfo->lpUniversalName);
3527 if ( dwRemainingLength > dwBufferSize + sizeof( WCHAR))
3529 pRemoteInfo->lpConnectionName = (LPWSTR)pch;
3533 min( dwBufferSize, dwRemainingLength));
3535 pch += min( dwBufferSize + sizeof( WCHAR), dwRemainingLength);
3537 dwRemainingLength -= min( dwBufferSize + sizeof( WCHAR), dwRemainingLength);
3541 if ( dwRemainingLength > dwRemainingPathLength + sizeof( WCHAR))
3543 pRemoteInfo->lpRemainingPath = (LPWSTR)pch;
3547 min((dwRemainingPathLength + 1) * sizeof( WCHAR), dwRemainingLength));
3549 pch += min((dwRemainingPathLength + 1) * sizeof( WCHAR), dwRemainingLength);
3551 dwRemainingLength -= min((dwLocalPathLength + 1) * sizeof( WCHAR), dwRemainingLength);
3554 #ifdef AFS_DEBUG_TRACE
3555 AFSDbgPrint( L"NPGetUniversalName (REMOTE_NAME_INFO_LEVEL) CONN lpBuffer: %p Name: (%p) \"%s\"\n",
3557 pRemoteInfo->lpConnectionName,
3558 pRemoteInfo->lpConnectionName ? pRemoteInfo->lpConnectionName : L"(null)");
3560 AFSDbgPrint( L"NPGetUniversalName (REMOTE_NAME_INFO_LEVEL) REMAIN lpBuffer: %p Name: (%p) \"%s\"\n",
3562 pRemoteInfo->lpRemainingPath,
3563 pRemoteInfo->lpRemainingPath ? pRemoteInfo->lpRemainingPath : L"(null)");
3566 if ( dwPassedSize < *lpBufferSize)
3569 try_return( dwStatus = WN_MORE_DATA);
3572 try_return( dwStatus = WN_SUCCESS);
3576 #ifdef AFS_DEBUG_TRACE
3577 AFSDbgPrint( L"NPGetUniversalName (UNKNOWN: 0x%X) WN_BAD_VALUE\n",
3580 try_return( dwStatus = WN_BAD_VALUE);
3585 #ifdef AFS_DEBUG_TRACE
3586 AFSDbgPrint( L"NPGetUniversalName BufferSize 0x%X\n",
3589 if ( hControlDevice != NULL)
3592 CloseHandle( hControlDevice);
3595 if( pConnectCB != NULL)
3598 HeapFree( GetProcessHeap( ), 0, (PVOID) pConnectCB);
3607 GetFormatFlags( DWORD dwFlags)
3609 static WCHAR Buffer[128] = L"";
3612 // WNFMT_MULTILINE 0x01
3613 // WNFMT_ABBREVIATED 0x02
3614 // WNFMT_INENUM 0x10
3615 // WNFMT_CONNECTION 0x20
3620 if ( dwFlags & WNFMT_MULTILINE )
3622 StringCbCat( Buffer, sizeof(Buffer), L"MULTILINE|");
3625 if ( dwFlags & WNFMT_INENUM )
3627 StringCbCat( Buffer, sizeof(Buffer), L"ABBREVIATED|");
3630 if ( dwFlags & WNFMT_INENUM )
3632 StringCbCat( Buffer, sizeof(Buffer), L"INENUM|");
3635 if ( dwFlags & WNFMT_CONNECTION )
3637 StringCbCat( Buffer, sizeof(Buffer), L"CONNECTION|");
3640 if ( dwFlags & ~(WNFMT_MULTILINE|WNFMT_ABBREVIATED|WNFMT_INENUM|WNFMT_CONNECTION) )
3642 StringCbCat( Buffer, sizeof(Buffer), L"UNKNOWN|");
3645 Buffer[lstrlen(Buffer)-1] = L'\0';
3651 NPFormatNetworkName( LPTSTR lpRemoteName,
3652 LPTSTR lpFormattedName,
3655 DWORD dwAveCharPerLine)
3658 DWORD dwLen = 0, dwCurrentLen = 0;
3659 LPTSTR pCurrentName = lpRemoteName;
3661 #ifdef AFS_DEBUG_TRACE
3662 AFSDbgPrint( L"NPFormatNetworkName Remote %s Flags %s (0x%x) CharsPerLine %u\n",
3665 GetFormatFlags( dwFlags),
3671 // Walk back in the name until we hit a \
3674 dwLen = wcslen( lpRemoteName);
3676 pCurrentName += (dwLen - 1);
3678 if ( pCurrentName[ 0] != L'\\')
3684 if( pCurrentName[ 0] == L'\\')
3700 if( *lpnLength < dwCurrentLen * sizeof( WCHAR))
3703 *lpnLength = dwCurrentLen * sizeof( WCHAR);
3705 #ifdef AFS_DEBUG_TRACE
3706 AFSDbgPrint( L"NPFormatNetworkName remote name %s WN_MORE_DATA\n",
3710 return WN_MORE_DATA;
3713 StringCbCopy( lpFormattedName,
3717 *lpnLength = dwCurrentLen * sizeof( WCHAR);
3719 #ifdef AFS_DEBUG_TRACE
3720 AFSDbgPrint( L"NPFormatNetworkName remote name %s as %s\n",
3728 /************************************************************
3729 / Unsupported entry points
3730 /************************************************************/
3733 // AuthGroup processing is implemented in src/WINNT/afsd/afslogon.c
3738 LPCWSTR lpAuthentInfoType,
3739 LPVOID lpAuthentInfo,
3740 LPCWSTR lpPreviousAuthentInfoType,
3741 LPVOID lpPreviousAuthentInfo,
3742 LPWSTR lpStationName,
3743 LPVOID StationHandle,
3744 LPWSTR *lpLogonScript)
3747 #ifdef AFS_DEBUG_TRACE
3748 AFSDbgPrint( L"NPLogonNotify, returning WN_NOT_SUPPORTED\n");
3751 return WN_NOT_SUPPORTED;
3755 NPPasswordChangeNotify (
3756 LPCWSTR lpAuthentInfoType,
3757 LPVOID lpAuthentInfo,
3758 LPCWSTR lpPreviousAuthentInfoType,
3759 LPVOID lpPreviousAuthentInfo,
3760 LPWSTR lpStationName,
3761 LPVOID StationHandle,
3762 DWORD dwChangeInfo )
3765 #ifdef AFS_DEBUG_TRACE
3766 AFSDbgPrint( L"NPPasswordChangeNotify, returning WN_NOT_SUPPORTED\n");
3769 SetLastError( WN_NOT_SUPPORTED );
3771 return WN_NOT_SUPPORTED;
3775 NPGetUser( LPTSTR lpName,
3777 LPDWORD lpBufferSize)
3780 DWORD rc = WN_NOT_SUPPORTED;
3782 AFSDbgPrint( L"NPGetUser Entry Name %s\n", lpName);
3790 NPGetReconnectFlags( LPWSTR lpRemoteName,
3791 unsigned char *Parameter2)
3794 DWORD dwStatus = WN_NOT_SUPPORTED;
3796 AFSDbgPrint( L"NPGetReconnectFlags RemoteName %s\n",
3805 I_SystemFocusDialog( VOID)
3808 DWORD dwStatus = WN_NOT_SUPPORTED;
3810 AFSDbgPrint( L"I_SystemFocusDialog\n");
3815 /************************************************************
3816 / END Unsupported entry points
3817 /************************************************************/
3824 HANDLE hControlDevice = NULL;
3825 WCHAR wchError[ 256];
3827 hControlDevice = CreateFile( AFS_SYMLINK_W,
3828 GENERIC_READ | GENERIC_WRITE,
3829 FILE_SHARE_READ | FILE_SHARE_WRITE,
3835 if( hControlDevice == INVALID_HANDLE_VALUE)
3838 hControlDevice = NULL;
3839 #ifdef AFS_DEBUG_TRACE
3840 AFSDbgPrint( L"Failed to open control device error: %d\n",
3846 // only do this if you want network shares to fail to mount
3847 // when the file system is not yet ready
3851 AFSDriverStatusRespCB respCB;
3854 memset( &respCB, '\0', sizeof( AFSDriverStatusRespCB));
3856 if ( !DeviceIoControl( hControlDevice,
3857 IOCTL_AFS_STATUS_REQUEST,
3861 sizeof( AFSDriverStatusRespCB),
3864 dwBytes != sizeof(AFSDriverStatusRespCB) ||
3865 respCB.Status != AFS_DRIVER_STATUS_READY )
3868 CloseHandle( hControlDevice);
3870 hControlDevice = NULL;
3875 return hControlDevice;
3882 LARGE_INTEGER liAuthId = {0,0};
3883 HANDLE hToken = NULL;
3884 TOKEN_STATISTICS stTokenInfo;
3885 DWORD dwCopyBytes = 0;
3887 if ( !OpenThreadToken( GetCurrentThread(),
3889 FALSE, // Impersonation
3892 if( !OpenProcessToken( GetCurrentProcess(),
3897 #ifdef AFS_DEBUG_TRACE
3898 AFSDbgPrint( L"AFSRetrieveAuthId Failed to retrieve Thread and Process tokens 0x%X\n",
3905 #ifdef AFS_DEBUG_TRACE
3906 AFSDbgPrint( L"AFSRetrieveAuthId Retrieved Process Token\n");
3913 #ifdef AFS_DEBUG_TRACE
3914 AFSDbgPrint( L"AFSRetrieveAuthId Retrieved Thread Token\n");
3918 if ( hToken != NULL)
3921 if( !GetTokenInformation( hToken,
3924 sizeof( TOKEN_STATISTICS),
3928 #ifdef AFS_DEBUG_TRACE
3929 AFSDbgPrint( L"AFSRetrieveAuthId Failed to retrieve token information 0x%X\n",
3936 liAuthId.HighPart = stTokenInfo.AuthenticationId.HighPart;
3937 liAuthId.LowPart = stTokenInfo.AuthenticationId.LowPart;
3940 CloseHandle( hToken);
3949 static int init = 0;
3950 static BOOL debug = 0;
3955 if (RegOpenKey (HKEY_LOCAL_MACHINE,
3956 TEXT("SYSTEM\\CurrentControlSet\\Services\\AFSRedirector\\NetworkProvider"), &hk) == 0)
3958 DWORD dwSize = sizeof(BOOL);
3959 DWORD dwType = REG_DWORD;
3960 RegQueryValueEx (hk, TEXT("Debug"), NULL, &dwType, (PBYTE)&debug, &dwSize);
3977 WCHAR wszbuffer[512];
3983 va_start( marker, Format );
3985 StringCbPrintf( wszbuffer, sizeof(wszbuffer), L"[%d-%08X] ",
3991 GetCurrentThreadId());
3993 rc = StringCbVPrintfW( &wszbuffer[ 14], sizeof(wszbuffer) - 14, Format, marker);
3996 OutputDebugString( wszbuffer );
3998 OutputDebugString(L"AFSDbgPrint Failed to create string\n");
4000 return SUCCEEDED(rc) ? 1 : 0;