From: Jeffrey Altman Date: Mon, 6 Feb 2012 17:00:58 +0000 (-0500) Subject: Windows: OpenAFS reparse points are surrogates X-Git-Tag: upstream/1.8.0_pre1^2~2773 X-Git-Url: https://git.michaelhowe.org/gitweb/?a=commitdiff_plain;h=8bc139b4acdd2c06643abb44d3f5b3bfdcbf639d;p=packages%2Fo%2Fopenafs.git Windows: OpenAFS reparse points are surrogates OpenAFS reparse points represent mount points, symlinks, and dfs referrals. All of which are file system objects that represent another named entity in the system. As a result the reparse tag field must include the Reparse Tag Surrogate bit (0x20000000) set. This permits the IsReparseTagNameSurrogate() macro provided in winnt.h to be used to determine if the reparse point is a surrogate or not. See http://msdn.microsoft.com/en-us/library/windows/desktop/aa365197%28v=vs.85%29.aspx Change-Id: I2561823e23371c2fdf01941da99fe848ca1fa11d Reviewed-on: http://gerrit.openafs.org/6668 Tested-by: BuildBot Tested-by: Jeffrey Altman Reviewed-by: Jeffrey Altman --- diff --git a/src/WINNT/afsrdr/kernel/lib/AFSFSControl.cpp b/src/WINNT/afsrdr/kernel/lib/AFSFSControl.cpp index 29dc20f8c..b5768a9bd 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSFSControl.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSFSControl.cpp @@ -548,7 +548,7 @@ AFSProcessUserFsRequest( IN PIRP Irp) ulRemainingLen -= pReparseBuffer->ReparseDataLength; - pReparseBuffer->ReparseTag = IO_REPARSE_TAG_OPENAFS_DFS; + pReparseBuffer->ReparseTag = IO_REPARSE_TAG_SURROGATE|IO_REPARSE_TAG_OPENAFS_DFS; RtlCopyMemory( &pReparseBuffer->ReparseGuid, &GUID_AFS_REPARSE_GUID, @@ -595,7 +595,7 @@ AFSProcessUserFsRequest( IN PIRP Irp) break; } - if( pReparseBuffer->ReparseTag != IO_REPARSE_TAG_OPENAFS_DFS) + if( (pReparseBuffer->ReparseTag & 0x0000FFFF) != IO_REPARSE_TAG_OPENAFS_DFS) { ntStatus = STATUS_IO_REPARSE_TAG_MISMATCH; @@ -654,7 +654,7 @@ AFSProcessUserFsRequest( IN PIRP Irp) break; } - if( pReparseBuffer->ReparseTag != IO_REPARSE_TAG_OPENAFS_DFS) + if( (pReparseBuffer->ReparseTag & 0x0000FFFF) != IO_REPARSE_TAG_OPENAFS_DFS) { ntStatus = STATUS_IO_REPARSE_TAG_MISMATCH; diff --git a/src/WINNT/afsrdr/kernel/lib/AFSFileInfo.cpp b/src/WINNT/afsrdr/kernel/lib/AFSFileInfo.cpp index ba96adf1e..eb643b380 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSFileInfo.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSFileInfo.cpp @@ -1622,7 +1622,7 @@ AFSQueryAttribTagInfo( IN PIRP Irp, if( BooleanFlagOn( DirectoryCB->ObjectInformation->FileAttributes, FILE_ATTRIBUTE_REPARSE_POINT)) { - Buffer->ReparseTag = IO_REPARSE_TAG_OPENAFS_DFS; + Buffer->ReparseTag = IO_REPARSE_TAG_SURROGATE|IO_REPARSE_TAG_OPENAFS_DFS; } *Length -= sizeof( FILE_ATTRIBUTE_TAG_INFORMATION); diff --git a/src/WINNT/afsrdr/kernel/lib/Include/AFSDefines.h b/src/WINNT/afsrdr/kernel/lib/Include/AFSDefines.h index b4bde8aca..fc5dc2cba 100644 --- a/src/WINNT/afsrdr/kernel/lib/Include/AFSDefines.h +++ b/src/WINNT/afsrdr/kernel/lib/Include/AFSDefines.h @@ -434,6 +434,10 @@ DEFINE_GUID (GUID_SD_AFS_REDIRECTOR_CONTROL_OBJECT, #define IO_REPARSE_TAG_OPENAFS_DFS 0x00000037L #endif +#ifndef IO_REPARSE_TAG_SURROGATE +#define IO_REPARSE_TAG_SURROGATE 0x20000000L +#endif + // {EF21A155-5C92-4470-AB3B-370403D96369} DEFINE_GUID (GUID_AFS_REPARSE_GUID, 0xEF21A155, 0x5C92, 0x4470, 0xAB, 0x3B, 0x37, 0x04, 0x03, 0xD9, 0x63, 0x69);