mirror of
https://github.com/winfsp/winfsp.git
synced 2025-04-25 09:52:23 -05:00
sys: ea: testing
This commit is contained in:
parent
67bd49d5d4
commit
91568edc45
101
src/sys/ea.c
101
src/sys/ea.c
@ -90,12 +90,12 @@ static VOID FspFsvolQueryEaGetCopy(
|
|||||||
PFILE_FULL_EA_INFORMATION SrcBuf, SrcBufEnd = (PVOID)((PUINT8)SrcBufBgn + SrcSize);
|
PFILE_FULL_EA_INFORMATION SrcBuf, SrcBufEnd = (PVOID)((PUINT8)SrcBufBgn + SrcSize);
|
||||||
PFILE_FULL_EA_INFORMATION DstBuf, DstBufEnd = (PVOID)((PUINT8)DstBufBgn + DstSize);
|
PFILE_FULL_EA_INFORMATION DstBuf, DstBufEnd = (PVOID)((PUINT8)DstBufBgn + DstSize);
|
||||||
PFILE_FULL_EA_INFORMATION PrevDstBuf;
|
PFILE_FULL_EA_INFORMATION PrevDstBuf;
|
||||||
PVOID Src;
|
PFILE_FULL_EA_INFORMATION Src;
|
||||||
STRING GetName, Name;
|
STRING GetName, Name;
|
||||||
ULONG CopyLength;
|
ULONG CopyLength;
|
||||||
|
|
||||||
IoStatus->Status = STATUS_SUCCESS;
|
|
||||||
IoStatus->Information = 0;
|
IoStatus->Information = 0;
|
||||||
|
|
||||||
DstBuf = DstBufBgn, PrevDstBuf = 0;
|
DstBuf = DstBufBgn, PrevDstBuf = 0;
|
||||||
for (GetBuf = GetBufBgn; GetBufEnd > GetBuf; GetBuf = FSP_NEXT_EA(GetBuf, GetBufEnd))
|
for (GetBuf = GetBufBgn; GetBufEnd > GetBuf; GetBuf = FSP_NEXT_EA(GetBuf, GetBufEnd))
|
||||||
{
|
{
|
||||||
@ -118,10 +118,10 @@ static VOID FspFsvolQueryEaGetCopy(
|
|||||||
{
|
{
|
||||||
IoStatus->Status = STATUS_INVALID_EA_NAME;
|
IoStatus->Status = STATUS_INVALID_EA_NAME;
|
||||||
IoStatus->Information = (ULONG)((PUINT8)GetBuf - (PUINT8)GetBufBgn);
|
IoStatus->Information = (ULONG)((PUINT8)GetBuf - (PUINT8)GetBufBgn);
|
||||||
break;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Src = GetBuf;
|
Src = 0;
|
||||||
for (SrcBuf = SrcBufBgn; SrcBufEnd > SrcBuf; SrcBuf = FSP_NEXT_EA(SrcBuf, SrcBufEnd))
|
for (SrcBuf = SrcBufBgn; SrcBufEnd > SrcBuf; SrcBuf = FSP_NEXT_EA(SrcBuf, SrcBufEnd))
|
||||||
{
|
{
|
||||||
Name.Length = Name.MaximumLength = SrcBuf->EaNameLength;
|
Name.Length = Name.MaximumLength = SrcBuf->EaNameLength;
|
||||||
@ -134,21 +134,29 @@ static VOID FspFsvolQueryEaGetCopy(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (GetBuf != Src)
|
if (0 != Src)
|
||||||
CopyLength = FIELD_OFFSET(FILE_FULL_EA_INFORMATION, EaName) +
|
CopyLength = FIELD_OFFSET(FILE_FULL_EA_INFORMATION, EaName) +
|
||||||
((PFILE_FULL_EA_INFORMATION)Src)->EaNameLength + 1 +
|
Src->EaNameLength + 1 + Src->EaValueLength;
|
||||||
((PFILE_FULL_EA_INFORMATION)Src)->EaValueLength;
|
|
||||||
else
|
else
|
||||||
CopyLength = FIELD_OFFSET(FILE_FULL_EA_INFORMATION, EaName) +
|
CopyLength = FIELD_OFFSET(FILE_FULL_EA_INFORMATION, EaName) +
|
||||||
((PFILE_GET_EA_INFORMATION)Src)->EaNameLength + 1;
|
GetBuf->EaNameLength + 1;
|
||||||
|
|
||||||
if ((PUINT8)DstBuf + CopyLength > (PUINT8)DstBufEnd)
|
if ((PUINT8)DstBuf + CopyLength > (PUINT8)DstBufEnd)
|
||||||
{
|
{
|
||||||
IoStatus->Status = STATUS_BUFFER_OVERFLOW;
|
IoStatus->Status = STATUS_BUFFER_OVERFLOW;
|
||||||
break;
|
IoStatus->Information = 0;
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
RtlMoveMemory(DstBuf, Src, CopyLength);
|
if (0 != Src)
|
||||||
|
RtlMoveMemory(DstBuf, Src, CopyLength);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
DstBuf->Flags = 0;
|
||||||
|
DstBuf->EaNameLength = GetBuf->EaNameLength;
|
||||||
|
DstBuf->EaValueLength = 0;
|
||||||
|
RtlCopyMemory(DstBuf->EaName, GetBuf->EaName, GetBuf->EaNameLength + 1);
|
||||||
|
}
|
||||||
DstBuf->NextEntryOffset = 0;
|
DstBuf->NextEntryOffset = 0;
|
||||||
if (!CasePreservedExtendedAttributes)
|
if (!CasePreservedExtendedAttributes)
|
||||||
{
|
{
|
||||||
@ -159,16 +167,14 @@ static VOID FspFsvolQueryEaGetCopy(
|
|||||||
if (0 != PrevDstBuf)
|
if (0 != PrevDstBuf)
|
||||||
PrevDstBuf->NextEntryOffset = (ULONG)((PUINT8)DstBuf - (PUINT8)PrevDstBuf);
|
PrevDstBuf->NextEntryOffset = (ULONG)((PUINT8)DstBuf - (PUINT8)PrevDstBuf);
|
||||||
PrevDstBuf = DstBuf;
|
PrevDstBuf = DstBuf;
|
||||||
DstBuf = (PVOID)((PUINT8)DstBuf + CopyLength);
|
IoStatus->Information = (ULONG)((PUINT8)DstBuf - (PUINT8)DstBufBgn + CopyLength);
|
||||||
|
DstBuf = (PVOID)((PUINT8)DstBuf + FSP_FSCTL_ALIGN_UP(CopyLength, sizeof(ULONG)));
|
||||||
|
|
||||||
if (ReturnSingleEntry)
|
if (ReturnSingleEntry)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
DstBuf = (PVOID)FSP_FSCTL_ALIGN_UP((UINT_PTR)DstBuf, sizeof(ULONG));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
IoStatus->Information = NT_SUCCESS(IoStatus->Status) ?
|
IoStatus->Status = STATUS_SUCCESS;
|
||||||
(ULONG)((PUINT8)DstBuf - (PUINT8)DstBufBgn) : 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static VOID FspFsvolQueryEaIndexCopy(
|
static VOID FspFsvolQueryEaIndexCopy(
|
||||||
@ -196,25 +202,25 @@ static VOID FspFsvolQueryEaIndexCopy(
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (SrcBuf = SrcBufBgn; EaIndex < *PEaIndex && SrcBufEnd > SrcBuf;
|
for (SrcBuf = SrcBufBgn; EaIndex < *PEaIndex && SrcBufEnd > SrcBuf;
|
||||||
SrcBuf = FSP_NEXT_EA(SrcBuf, SrcBufEnd), EaIndex++)
|
SrcBuf = FSP_NEXT_EA(SrcBuf, SrcBufEnd))
|
||||||
;
|
EaIndex++;
|
||||||
|
|
||||||
IoStatus->Status = STATUS_SUCCESS;
|
|
||||||
IoStatus->Information = 0;
|
IoStatus->Information = 0;
|
||||||
DstBuf = DstBufBgn, PrevDstBuf = 0;
|
|
||||||
for (; SrcBufEnd > SrcBuf; SrcBuf = FSP_NEXT_EA(SrcBuf, SrcBufEnd), EaIndex++)
|
|
||||||
{
|
|
||||||
if ((PUINT8)DstBuf + FIELD_OFFSET(FILE_FULL_EA_INFORMATION, EaName) > (PUINT8)DstBufEnd)
|
|
||||||
break;
|
|
||||||
|
|
||||||
|
DstBuf = DstBufBgn, PrevDstBuf = 0;
|
||||||
|
for (; SrcBufEnd > SrcBuf; SrcBuf = FSP_NEXT_EA(SrcBuf, SrcBufEnd))
|
||||||
|
{
|
||||||
CopyLength = FIELD_OFFSET(FILE_FULL_EA_INFORMATION, EaName) +
|
CopyLength = FIELD_OFFSET(FILE_FULL_EA_INFORMATION, EaName) +
|
||||||
((PFILE_FULL_EA_INFORMATION)SrcBuf)->EaNameLength + 1 +
|
((PFILE_FULL_EA_INFORMATION)SrcBuf)->EaNameLength + 1 +
|
||||||
((PFILE_FULL_EA_INFORMATION)SrcBuf)->EaValueLength;
|
((PFILE_FULL_EA_INFORMATION)SrcBuf)->EaValueLength;
|
||||||
|
|
||||||
if ((PUINT8)DstBuf + CopyLength > (PUINT8)DstBufEnd)
|
if ((PUINT8)DstBuf + CopyLength > (PUINT8)DstBufEnd)
|
||||||
{
|
{
|
||||||
CopyLength = (ULONG)((PUINT8)DstBufEnd - (PUINT8)DstBuf);
|
if (0 != PrevDstBuf)
|
||||||
IoStatus->Status = STATUS_BUFFER_OVERFLOW;
|
break;
|
||||||
|
IoStatus->Status = STATUS_BUFFER_TOO_SMALL;
|
||||||
|
IoStatus->Information = 0;
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
RtlMoveMemory(DstBuf, SrcBuf, CopyLength);
|
RtlMoveMemory(DstBuf, SrcBuf, CopyLength);
|
||||||
@ -228,29 +234,44 @@ static VOID FspFsvolQueryEaIndexCopy(
|
|||||||
if (0 != PrevDstBuf)
|
if (0 != PrevDstBuf)
|
||||||
PrevDstBuf->NextEntryOffset = (ULONG)((PUINT8)DstBuf - (PUINT8)PrevDstBuf);
|
PrevDstBuf->NextEntryOffset = (ULONG)((PUINT8)DstBuf - (PUINT8)PrevDstBuf);
|
||||||
PrevDstBuf = DstBuf;
|
PrevDstBuf = DstBuf;
|
||||||
DstBuf = (PVOID)((PUINT8)DstBuf + CopyLength);
|
IoStatus->Information = (ULONG)((PUINT8)DstBuf - (PUINT8)DstBufBgn + CopyLength);
|
||||||
|
DstBuf = (PVOID)((PUINT8)DstBuf + FSP_FSCTL_ALIGN_UP(CopyLength, sizeof(ULONG)));
|
||||||
|
|
||||||
if (!NT_SUCCESS(IoStatus->Status) || ReturnSingleEntry)
|
EaIndex++;
|
||||||
|
|
||||||
|
if (ReturnSingleEntry)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
DstBuf = (PVOID)FSP_FSCTL_ALIGN_UP((UINT_PTR)DstBuf, sizeof(ULONG));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (0 != PrevDstBuf)
|
if (IndexSpecified)
|
||||||
{
|
{
|
||||||
*PEaIndex = EaIndex;
|
if (0 != PrevDstBuf)
|
||||||
IoStatus->Information = (ULONG)((PUINT8)DstBuf - (PUINT8)DstBufBgn);
|
{
|
||||||
|
*PEaIndex = EaIndex;
|
||||||
|
IoStatus->Status = SrcBufEnd > SrcBuf && !ReturnSingleEntry ?
|
||||||
|
STATUS_BUFFER_OVERFLOW : STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
IoStatus->Status = *PEaIndex == EaIndex ?
|
||||||
|
STATUS_NO_MORE_EAS : STATUS_NONEXISTENT_EA_ENTRY;
|
||||||
|
IoStatus->Information = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (SrcBufBgn == SrcBuf)
|
if (0 != PrevDstBuf)
|
||||||
IoStatus->Status = IndexSpecified ?
|
{
|
||||||
STATUS_NONEXISTENT_EA_ENTRY : STATUS_NO_EAS_ON_FILE;
|
*PEaIndex = EaIndex;
|
||||||
else if (SrcBufEnd > SrcBuf)
|
IoStatus->Status = SrcBufEnd > SrcBuf && !ReturnSingleEntry ?
|
||||||
IoStatus->Status = STATUS_BUFFER_TOO_SMALL;
|
STATUS_BUFFER_OVERFLOW : STATUS_SUCCESS;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
IoStatus->Status = IndexSpecified && *PEaIndex != EaIndex ?
|
{
|
||||||
STATUS_NONEXISTENT_EA_ENTRY : STATUS_NO_MORE_EAS;
|
IoStatus->Status = SrcBufBgn == SrcBuf ?
|
||||||
|
STATUS_NO_EAS_ON_FILE : STATUS_NO_MORE_EAS;
|
||||||
|
IoStatus->Information = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -447,6 +468,8 @@ NTSTATUS FspFsvolQueryEaComplete(
|
|||||||
|
|
||||||
FspFileNodeRelease(FileNode, Main);
|
FspFileNodeRelease(FileNode, Main);
|
||||||
|
|
||||||
|
Result = Irp->IoStatus.Status;
|
||||||
|
|
||||||
FSP_LEAVE_IOC("FileObject=%p",
|
FSP_LEAVE_IOC("FileObject=%p",
|
||||||
IrpSp->FileObject);
|
IrpSp->FileObject);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user