mirror of
https://github.com/winfsp/winfsp.git
synced 2025-07-03 09:22:57 -05:00
sys: create: FspFsvolCreate
Only check reparse point ECP if running on OS prior to RS4
This commit is contained in:
@ -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
|
||||
|
Reference in New Issue
Block a user