sys: FspSendQueryEaIrp: fix EA related BSOD

This commit is contained in:
Bill Zissimopoulos 2019-04-17 16:04:44 -07:00
parent 859d4250c3
commit a08fdccb17
2 changed files with 59 additions and 53 deletions

View File

@ -344,6 +344,7 @@ NTSTATUS FspSendQueryEaIrp(PDEVICE_OBJECT DeviceObject, PFILE_OBJECT FileObject,
IrpSp = IoGetNextIrpStackLocation(Irp); IrpSp = IoGetNextIrpStackLocation(Irp);
Irp->RequestorMode = KernelMode; Irp->RequestorMode = KernelMode;
Irp->AssociatedIrp.SystemBuffer = Ea; Irp->AssociatedIrp.SystemBuffer = Ea;
Irp->UserBuffer = Ea;
IrpSp->MajorFunction = IRP_MJ_QUERY_EA; IrpSp->MajorFunction = IRP_MJ_QUERY_EA;
IrpSp->FileObject = FileObject; IrpSp->FileObject = FileObject;
IrpSp->Parameters.QueryEa.Length = EaLength; IrpSp->Parameters.QueryEa.Length = EaLength;

View File

@ -94,62 +94,67 @@ static void wsl_stat_dotest(ULONG Flags, PWSTR Prefix, ULONG FileInfoTimeout)
CREATE_NEW, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_DELETE_ON_CLOSE, 0); CREATE_NEW, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_DELETE_ON_CLOSE, 0);
ASSERT(INVALID_HANDLE_VALUE != Handle); ASSERT(INVALID_HANDLE_VALUE != Handle);
Result = NtQueryInformationFile(Handle, &IoStatus, &StatInfo, sizeof StatInfo, for (int repeat = 0; 2 > repeat; repeat++)
68/*FileStatInformation*/);
if (STATUS_SUCCESS == Result)
{ {
ASSERT(STATUS_SUCCESS == Result); /* repeat this test to ensure that any caches are tested */
if (-1 != Flags)
ASSERT(
TimeLo <= StatInfo.CreationTime.QuadPart &&
TimeHi > StatInfo.CreationTime.QuadPart);
ASSERT(
TimeLo <= StatInfo.LastAccessTime.QuadPart &&
TimeHi > StatInfo.LastAccessTime.QuadPart);
ASSERT(
TimeLo <= StatInfo.LastWriteTime.QuadPart &&
TimeHi > StatInfo.LastWriteTime.QuadPart);
ASSERT(
TimeLo <= StatInfo.ChangeTime.QuadPart &&
TimeHi > StatInfo.ChangeTime.QuadPart);
ASSERT(0 == StatInfo.AllocationSize.QuadPart);
ASSERT(0 == StatInfo.EndOfFile.QuadPart);
//ASSERT(FILE_ATTRIBUTE_ARCHIVE == StatInfo.FileAttributes);
ASSERT(0 == StatInfo.ReparseTag);
ASSERT(1 == StatInfo.NumberOfLinks);
//tlib_printf("%lx %lx", FILE_GENERIC_READ | FILE_GENERIC_WRITE, StatInfo.EffectiveAccess);
//ASSERT((FILE_GENERIC_READ | FILE_GENERIC_WRITE) == StatInfo.EffectiveAccess);
Result = NtQueryInformationFile(Handle, &IoStatus, &StatLxInfo, sizeof StatLxInfo, Result = NtQueryInformationFile(Handle, &IoStatus, &StatInfo, sizeof StatInfo,
70/*FileStatLxInformation*/); 68/*FileStatInformation*/);
ASSERT(STATUS_SUCCESS == Result); if (STATUS_SUCCESS == Result)
if (-1 != Flags) {
ASSERT(STATUS_SUCCESS == Result);
if (-1 != Flags)
ASSERT(
TimeLo <= StatInfo.CreationTime.QuadPart &&
TimeHi > StatInfo.CreationTime.QuadPart);
ASSERT( ASSERT(
TimeLo <= StatLxInfo.CreationTime.QuadPart && TimeLo <= StatInfo.LastAccessTime.QuadPart &&
TimeHi > StatLxInfo.CreationTime.QuadPart); TimeHi > StatInfo.LastAccessTime.QuadPart);
ASSERT( ASSERT(
TimeLo <= StatLxInfo.LastAccessTime.QuadPart && TimeLo <= StatInfo.LastWriteTime.QuadPart &&
TimeHi > StatLxInfo.LastAccessTime.QuadPart); TimeHi > StatInfo.LastWriteTime.QuadPart);
ASSERT( ASSERT(
TimeLo <= StatLxInfo.LastWriteTime.QuadPart && TimeLo <= StatInfo.ChangeTime.QuadPart &&
TimeHi > StatLxInfo.LastWriteTime.QuadPart); TimeHi > StatInfo.ChangeTime.QuadPart);
ASSERT( ASSERT(0 == StatInfo.AllocationSize.QuadPart);
TimeLo <= StatLxInfo.ChangeTime.QuadPart && ASSERT(0 == StatInfo.EndOfFile.QuadPart);
TimeHi > StatLxInfo.ChangeTime.QuadPart); //ASSERT(FILE_ATTRIBUTE_ARCHIVE == StatInfo.FileAttributes);
ASSERT(0 == StatLxInfo.AllocationSize.QuadPart); ASSERT(0 == StatInfo.ReparseTag);
ASSERT(0 == StatLxInfo.EndOfFile.QuadPart); ASSERT(1 == StatInfo.NumberOfLinks);
//ASSERT(FILE_ATTRIBUTE_ARCHIVE == StatLxInfo.FileAttributes); //tlib_printf("%lx %lx", FILE_GENERIC_READ | FILE_GENERIC_WRITE, StatInfo.EffectiveAccess);
ASSERT(0 == StatLxInfo.ReparseTag); //ASSERT((FILE_GENERIC_READ | FILE_GENERIC_WRITE) == StatInfo.EffectiveAccess);
ASSERT(1 == StatLxInfo.NumberOfLinks);
//tlib_printf("%lx %lx", FILE_GENERIC_READ | FILE_GENERIC_WRITE, StatLxInfo.EffectiveAccess); Result = NtQueryInformationFile(Handle, &IoStatus, &StatLxInfo, sizeof StatLxInfo,
//ASSERT((FILE_GENERIC_READ | FILE_GENERIC_WRITE) == StatLxInfo.EffectiveAccess); 70/*FileStatLxInformation*/);
} ASSERT(STATUS_SUCCESS == Result);
else if (-1 != Flags)
{ ASSERT(
ASSERT( TimeLo <= StatLxInfo.CreationTime.QuadPart &&
STATUS_INVALID_INFO_CLASS == Result || TimeHi > StatLxInfo.CreationTime.QuadPart);
STATUS_NOT_IMPLEMENTED == Result/* value returned under WOW64 */); ASSERT(
FspDebugLog(__FUNCTION__ ": only works in Win10 with WSLinux\n"); TimeLo <= StatLxInfo.LastAccessTime.QuadPart &&
TimeHi > StatLxInfo.LastAccessTime.QuadPart);
ASSERT(
TimeLo <= StatLxInfo.LastWriteTime.QuadPart &&
TimeHi > StatLxInfo.LastWriteTime.QuadPart);
ASSERT(
TimeLo <= StatLxInfo.ChangeTime.QuadPart &&
TimeHi > StatLxInfo.ChangeTime.QuadPart);
ASSERT(0 == StatLxInfo.AllocationSize.QuadPart);
ASSERT(0 == StatLxInfo.EndOfFile.QuadPart);
//ASSERT(FILE_ATTRIBUTE_ARCHIVE == StatLxInfo.FileAttributes);
ASSERT(0 == StatLxInfo.ReparseTag);
ASSERT(1 == StatLxInfo.NumberOfLinks);
//tlib_printf("%lx %lx", FILE_GENERIC_READ | FILE_GENERIC_WRITE, StatLxInfo.EffectiveAccess);
//ASSERT((FILE_GENERIC_READ | FILE_GENERIC_WRITE) == StatLxInfo.EffectiveAccess);
}
else
{
ASSERT(
STATUS_INVALID_INFO_CLASS == Result ||
STATUS_NOT_IMPLEMENTED == Result/* value returned under WOW64 */);
FspDebugLog(__FUNCTION__ ": only works in Win10 with WSLinux\n");
}
} }
CloseHandle(Handle); CloseHandle(Handle);