From 8bc139b4acdd2c06643abb44d3f5b3bfdcbf639d Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Mon, 6 Feb 2012 12:00:58 -0500 Subject: [PATCH] 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 --- src/WINNT/afsrdr/kernel/lib/AFSFSControl.cpp | 6 +++--- src/WINNT/afsrdr/kernel/lib/AFSFileInfo.cpp | 2 +- src/WINNT/afsrdr/kernel/lib/Include/AFSDefines.h | 4 ++++ 3 files changed, 8 insertions(+), 4 deletions(-) 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); -- 2.39.5