sys: ea: testing

This commit is contained in:
Bill Zissimopoulos 2019-03-16 00:04:00 -07:00
parent 67bd49d5d4
commit 91568edc45
No known key found for this signature in database
GPG Key ID: 3D4F95D52C7B3EA3

View File

@ -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);
} }