sys: IRP_MJ_QUERY_INFORMATION

This commit is contained in:
Bill Zissimopoulos 2016-01-24 22:11:27 -08:00
parent 81bcbb9ea0
commit a0b0f9600c
5 changed files with 25 additions and 10 deletions

View File

@ -343,7 +343,7 @@ static BOOLEAN FspFileNodeTryGetFileInfoNp(FSP_FILE_NODE_NONPAGED *FileNodeNp,
BOOLEAN Result;
KeAcquireSpinLock(&FileNodeNp->InfoSpinLock, &Irql);
if (0 < FileNodeNp->InfoExpirationTime && FileNodeNp->InfoExpirationTime < KeQueryInterruptTime())
if (0 < FileNodeNp->InfoExpirationTime && KeQueryInterruptTime() < FileNodeNp->InfoExpirationTime)
{
FileInfoNp->FileAttributes = FileNodeNp->FileAttributes;
FileInfoNp->ReparseTag = FileNodeNp->ReparseTag;

View File

@ -4,6 +4,7 @@
#include <strsafe.h>
#include "memfs.h"
void *memfs_start_ex(ULONG Flags, ULONG FileInfoTimeout);
void *memfs_start(ULONG Flags);
void memfs_stop(void *data);
PWSTR memfs_volumename(void *data);
@ -12,9 +13,9 @@ extern int NtfsTests;
extern int WinFspDiskTests;
extern int WinFspNetTests;
void getinfo_dotest(ULONG Flags, PWSTR Prefix)
void getinfo_dotest(ULONG Flags, PWSTR Prefix, ULONG FileInfoTimeout)
{
void *memfs = memfs_start(Flags);
void *memfs = memfs_start_ex(Flags, FileInfoTimeout);
HANDLE Handle;
BOOL Success;
@ -125,12 +126,18 @@ void getinfo_test(void)
{
WCHAR DirBuf[MAX_PATH] = L"\\\\?\\";
GetCurrentDirectoryW(MAX_PATH - 4, DirBuf + 4);
getinfo_dotest(-1, DirBuf);
getinfo_dotest(-1, DirBuf, 0);
}
if (WinFspDiskTests)
getinfo_dotest(MemfsDisk, 0);
{
getinfo_dotest(MemfsDisk, 0, 0);
getinfo_dotest(MemfsDisk, 0, 1000);
}
if (WinFspNetTests)
getinfo_dotest(MemfsNet, L"\\\\memfs\\share");
{
getinfo_dotest(MemfsNet, L"\\\\memfs\\share", 0);
getinfo_dotest(MemfsNet, L"\\\\memfs\\share", 1000);
}
}
void getinfo_tests(void)

View File

@ -18,7 +18,7 @@ static unsigned __stdcall memfs_thread(void *Memfs0)
return FspFileSystemLoop(MemfsFileSystem(Memfs));
}
void *memfs_start(ULONG Flags)
void *memfs_start_ex(ULONG Flags, ULONG FileInfoTimeout)
{
if (-1 == Flags)
return 0;
@ -31,7 +31,7 @@ void *memfs_start(ULONG Flags)
data = malloc(sizeof *data);
ASSERT(0 != data);
Result = MemfsCreate(Flags, 1000, 65500, &Memfs);
Result = MemfsCreate(Flags, FileInfoTimeout, 1000, 65500, &Memfs);
ASSERT(NT_SUCCESS(Result));
ASSERT(0 != Memfs);
@ -44,6 +44,11 @@ void *memfs_start(ULONG Flags)
return data;
}
void *memfs_start(ULONG Flags)
{
return memfs_start_ex(Flags, 0);
}
void memfs_stop(void *data)
{
if (0 == data)

View File

@ -399,7 +399,8 @@ static VOID MemfsLeaveOperation(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_
LeaveCriticalSection(&Memfs->Lock);
}
NTSTATUS MemfsCreate(ULONG Flags, ULONG MaxFileNodes, ULONG MaxFileSize,
NTSTATUS MemfsCreate(ULONG Flags, ULONG FileInfoTimeout,
ULONG MaxFileNodes, ULONG MaxFileSize,
MEMFS **PMemfs)
{
NTSTATUS Result;
@ -429,6 +430,7 @@ NTSTATUS MemfsCreate(ULONG Flags, ULONG MaxFileNodes, ULONG MaxFileSize,
memset(&VolumeParams, 0, sizeof VolumeParams);
VolumeParams.SectorSize = MEMFS_SECTOR_SIZE;
VolumeParams.FileInfoTimeout = FileInfoTimeout;
wcscpy_s(VolumeParams.Prefix, sizeof VolumeParams.Prefix / sizeof(WCHAR), L"\\memfs\\share");
Result = FspFileSystemCreate(DevicePath, &VolumeParams, &MemfsInterface, &Memfs->FileSystem);

View File

@ -23,7 +23,8 @@ enum
MemfsThreadPool = 0x02,
};
NTSTATUS MemfsCreate(ULONG Flags, ULONG MaxFileNodes, ULONG MaxFileSize,
NTSTATUS MemfsCreate(ULONG Flags, ULONG FileInfoTimeout,
ULONG MaxFileNodes, ULONG MaxFileSize,
MEMFS **PMemfs);
VOID MemfsDelete(MEMFS *Memfs);
FSP_FILE_SYSTEM *MemfsFileSystem(MEMFS *Memfs);