From 2c7e2007342a86006199039408b7acbb63267235 Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Tue, 4 Dec 2012 13:27:59 -0500 Subject: [PATCH] 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 --- .../afsrdr/kernel/lib/AFSNameSupport.cpp | 32 +++++++++++++++---- 1 file changed, 25 insertions(+), 7 deletions(-) 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)], -- 2.39.5