From: Jeffrey Altman Date: Tue, 4 Dec 2012 18:27:59 +0000 (-0500) Subject: Windows: AFSProcessDFSLink to Dos Device X-Git-Tag: upstream/1.8.0_pre1^2~1735 X-Git-Url: https://git.michaelhowe.org/gitweb/?a=commitdiff_plain;h=2c7e2007342a86006199039408b7acbb63267235;p=packages%2Fo%2Fopenafs.git Windows: AFSProcessDFSLink to Dos Device Support msdfs links to :\ Map them to IOMgr as \??\:\ Change-Id: I110dd7e857d4b7984e75611787d2135bc97aaa39 Reviewed-on: http://gerrit.openafs.org/8601 Tested-by: BuildBot Reviewed-by: Jeffrey Altman Tested-by: Jeffrey Altman --- diff --git a/src/WINNT/afsrdr/kernel/lib/AFSNameSupport.cpp b/src/WINNT/afsrdr/kernel/lib/AFSNameSupport.cpp index f924c5a21..dfce8a93b 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSNameSupport.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSNameSupport.cpp @@ -4559,6 +4559,7 @@ AFSProcessDFSLink( IN AFSDirectoryCB *DirEntry, NTSTATUS ntStatus = STATUS_INVALID_DEVICE_REQUEST; UNICODE_STRING uniReparseName; UNICODE_STRING uniMUPDeviceName; + UNICODE_STRING uniIOMgrDeviceName; AFSDirEnumEntry *pDirEntry = NULL; __Enter @@ -4571,6 +4572,9 @@ AFSProcessDFSLink( IN AFSDirectoryCB *DirEntry, RtlInitUnicodeString( &uniMUPDeviceName, L"\\Device\\MUP"); + RtlInitUnicodeString( &uniIOMgrDeviceName, + L"\\??\\"); + uniReparseName.Length = 0; uniReparseName.Buffer = NULL; @@ -4689,18 +4693,32 @@ AFSProcessDFSLink( IN AFSDirectoryCB *DirEntry, // Start building the name // - RtlCopyMemory( uniReparseName.Buffer, - uniMUPDeviceName.Buffer, - uniMUPDeviceName.Length); + if ( DirEntry->NameInformation.TargetName.Buffer[ 0] != L'\\' && + DirEntry->NameInformation.TargetName.Buffer[ 1] == L':') + { - uniReparseName.Length = uniMUPDeviceName.Length; + RtlCopyMemory( uniReparseName.Buffer, + uniIOMgrDeviceName.Buffer, + uniIOMgrDeviceName.Length); - if( DirEntry->NameInformation.TargetName.Buffer[ 0] != L'\\') + uniReparseName.Length = uniIOMgrDeviceName.Length; + } + else { - uniReparseName.Buffer[ uniReparseName.Length/sizeof( WCHAR)] = L'\\'; + RtlCopyMemory( uniReparseName.Buffer, + uniMUPDeviceName.Buffer, + uniMUPDeviceName.Length); + + uniReparseName.Length = uniMUPDeviceName.Length; - uniReparseName.Length += sizeof( WCHAR); + if( DirEntry->NameInformation.TargetName.Buffer[ 0] != L'\\') + { + + uniReparseName.Buffer[ uniReparseName.Length/sizeof( WCHAR)] = L'\\'; + + uniReparseName.Length += sizeof( WCHAR); + } } RtlCopyMemory( &uniReparseName.Buffer[ uniReparseName.Length/sizeof( WCHAR)],