diff --git a/src/sys/create.c b/src/sys/create.c index f46f148d..0af0e9db 100644 --- a/src/sys/create.c +++ b/src/sys/create.c @@ -169,46 +169,49 @@ static NTSTATUS FspFsvolCreate( !FsRtlIsEcpFromUserMode(ExtraCreateParameter); #if defined(FSP_CREATE_REPARSE_POINT_ECP) - // {73d5118a-88ba-439f-92f4-46d38952d250} - static const GUID FspReparsePointEcpGuid = - { 0x73d5118a, 0x88ba, 0x439f, { 0x92, 0xf4, 0x46, 0xd3, 0x89, 0x52, 0xd2, 0x50 } }; - typedef struct _REPARSE_POINT_ECP + if (!HasReparsePointCaseSensitivityFix) { - USHORT UnparsedNameLength; - USHORT Flags; - USHORT DeviceNameLength; - PVOID Reserved; - UNICODE_STRING Name; - } REPARSE_POINT_ECP; - REPARSE_POINT_ECP *ReparsePointEcp; - - ExtraCreateParameter = 0; - ReparsePointEcp = - NT_SUCCESS(FsRtlFindExtraCreateParameter(ExtraCreateParameters, - &FspReparsePointEcpGuid, &ExtraCreateParameter, 0)) && - 0 != ExtraCreateParameter && - !FsRtlIsEcpFromUserMode(ExtraCreateParameter) ? - ExtraCreateParameter : 0; - if (0 != ReparsePointEcp) - { - //DEBUGLOG("%hu %wZ", ReparsePointEcp->UnparsedNameLength, ReparsePointEcp->Name); - - UNICODE_STRING FileName = IrpSp->FileObject->FileName; - if (0 != ReparsePointEcp->UnparsedNameLength && - FileName.Length == ReparsePointEcp->UnparsedNameLength && - ReparsePointEcp->Name.Length > ReparsePointEcp->UnparsedNameLength) + // {73d5118a-88ba-439f-92f4-46d38952d250} + static const GUID FspReparsePointEcpGuid = + { 0x73d5118a, 0x88ba, 0x439f, { 0x92, 0xf4, 0x46, 0xd3, 0x89, 0x52, 0xd2, 0x50 } }; + typedef struct _REPARSE_POINT_ECP { - /* - * If the ReparsePointEcp name and our file name differ only in case, - * go ahead and overwrite our file name. - */ + USHORT UnparsedNameLength; + USHORT Flags; + USHORT DeviceNameLength; + PVOID Reserved; + UNICODE_STRING Name; + } REPARSE_POINT_ECP; + REPARSE_POINT_ECP *ReparsePointEcp; - UNICODE_STRING UnparsedName; - UnparsedName.Length = UnparsedName.MaximumLength = ReparsePointEcp->UnparsedNameLength; - UnparsedName.Buffer = (PWCH)((UINT8 *)ReparsePointEcp->Name.Buffer + - (ReparsePointEcp->Name.Length - UnparsedName.Length)); - if (0 == FspFileNameCompare(&UnparsedName, &FileName, TRUE, 0)) - RtlMoveMemory(FileName.Buffer, UnparsedName.Buffer, UnparsedName.Length); + ExtraCreateParameter = 0; + ReparsePointEcp = + NT_SUCCESS(FsRtlFindExtraCreateParameter(ExtraCreateParameters, + &FspReparsePointEcpGuid, &ExtraCreateParameter, 0)) && + 0 != ExtraCreateParameter && + !FsRtlIsEcpFromUserMode(ExtraCreateParameter) ? + ExtraCreateParameter : 0; + if (0 != ReparsePointEcp) + { + //DEBUGLOG("%hu %wZ", ReparsePointEcp->UnparsedNameLength, ReparsePointEcp->Name); + + UNICODE_STRING FileName = IrpSp->FileObject->FileName; + if (0 != ReparsePointEcp->UnparsedNameLength && + FileName.Length == ReparsePointEcp->UnparsedNameLength && + ReparsePointEcp->Name.Length > ReparsePointEcp->UnparsedNameLength) + { + /* + * If the ReparsePointEcp name and our file name differ only in case, + * go ahead and overwrite our file name. + */ + + UNICODE_STRING UnparsedName; + UnparsedName.Length = UnparsedName.MaximumLength = ReparsePointEcp->UnparsedNameLength; + UnparsedName.Buffer = (PWCH)((UINT8 *)ReparsePointEcp->Name.Buffer + + (ReparsePointEcp->Name.Length - UnparsedName.Length)); + if (0 == FspFileNameCompare(&UnparsedName, &FileName, TRUE, 0)) + RtlMoveMemory(FileName.Buffer, UnparsedName.Buffer, UnparsedName.Length); + } } } #endif diff --git a/src/sys/driver.c b/src/sys/driver.c index c90df51c..26706b83 100644 --- a/src/sys/driver.c +++ b/src/sys/driver.c @@ -233,6 +233,9 @@ static VOID FspDriverMultiVersionInitialize(VOID) if (RtlIsNtDdiVersionAvailable(NTDDI_WIN8)) FspMvMdlMappingNoWrite = MdlMappingNoWrite; + + if (RtlIsNtDdiVersionAvailable(0x0A000005/*NTDDI_WIN10_RS4*/)) + HasReparsePointCaseSensitivityFix = TRUE; } #if defined(FSP_UNLOAD) @@ -270,3 +273,4 @@ CACHE_MANAGER_CALLBACKS FspCacheManagerCallbacks; ULONG FspProcessorCount; FSP_MV_CcCoherencyFlushAndPurgeCache *FspMvCcCoherencyFlushAndPurgeCache; ULONG FspMvMdlMappingNoWrite = 0; +BOOLEAN HasReparsePointCaseSensitivityFix = FALSE; diff --git a/src/sys/driver.h b/src/sys/driver.h index bc01dae9..d7d85b27 100644 --- a/src/sys/driver.h +++ b/src/sys/driver.h @@ -1577,6 +1577,7 @@ extern const GUID FspMainFileOpenEcpGuid; extern ULONG FspProcessorCount; extern FSP_MV_CcCoherencyFlushAndPurgeCache *FspMvCcCoherencyFlushAndPurgeCache; extern ULONG FspMvMdlMappingNoWrite; +extern BOOLEAN HasReparsePointCaseSensitivityFix; /* * Fixes