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; BOOLEAN Result;
KeAcquireSpinLock(&FileNodeNp->InfoSpinLock, &Irql); KeAcquireSpinLock(&FileNodeNp->InfoSpinLock, &Irql);
if (0 < FileNodeNp->InfoExpirationTime && FileNodeNp->InfoExpirationTime < KeQueryInterruptTime()) if (0 < FileNodeNp->InfoExpirationTime && KeQueryInterruptTime() < FileNodeNp->InfoExpirationTime)
{ {
FileInfoNp->FileAttributes = FileNodeNp->FileAttributes; FileInfoNp->FileAttributes = FileNodeNp->FileAttributes;
FileInfoNp->ReparseTag = FileNodeNp->ReparseTag; FileInfoNp->ReparseTag = FileNodeNp->ReparseTag;

View File

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

View File

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

View File

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

View File

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