dll: major overhaul of FSP_FILE_SYSTEM dispatching

This commit is contained in:
Bill Zissimopoulos
2016-02-16 17:03:00 -08:00
parent f8d5273e04
commit d8c35f26b0
13 changed files with 337 additions and 476 deletions

View File

@ -6,42 +6,22 @@
extern int WinFspDiskTests;
extern int WinFspNetTests;
struct memfs_data
{
MEMFS *Memfs;
HANDLE Thread;
};
static unsigned __stdcall memfs_thread(void *Memfs0)
{
MEMFS *Memfs = Memfs0;
return FspFileSystemLoop(MemfsFileSystem(Memfs));
}
void *memfs_start_ex(ULONG Flags, ULONG FileInfoTimeout)
{
if (-1 == Flags)
return 0;
struct memfs_data *data;
MEMFS *Memfs;
HANDLE Thread;
NTSTATUS Result;
data = malloc(sizeof *data);
ASSERT(0 != data);
Result = MemfsCreate(Flags, FileInfoTimeout, 1000, 65500, &Memfs);
ASSERT(NT_SUCCESS(Result));
ASSERT(0 != Memfs);
Thread = (HANDLE)_beginthreadex(0, 0, memfs_thread, Memfs, 0, 0);
ASSERT(0 != Thread);
Result = MemfsStart(Memfs);
ASSERT(NT_SUCCESS(Result));
data->Memfs = Memfs;
data->Thread = Thread;
return data;
return Memfs;
}
void *memfs_start(ULONG Flags)
@ -54,24 +34,16 @@ void memfs_stop(void *data)
if (0 == data)
return;
MEMFS *Memfs = ((struct memfs_data *)data)->Memfs;
HANDLE Thread = ((struct memfs_data *)data)->Thread;
DWORD ExitCode;
MEMFS *Memfs = data;
FspFileSystemSetDispatcherResult(MemfsFileSystem(Memfs), STATUS_CANCELLED);
WaitForSingleObject(Thread, INFINITE);
GetExitCodeThread(Thread, &ExitCode);
CloseHandle(Thread);
ASSERT(STATUS_CANCELLED == ExitCode);
MemfsStop(Memfs);
MemfsDelete(Memfs);
}
PWSTR memfs_volumename(void *data)
{
MEMFS *Memfs = ((struct memfs_data *)data)->Memfs;
MEMFS *Memfs = data;
return MemfsFileSystem(Memfs)->VolumeName;
}

View File

@ -553,13 +553,15 @@ static FSP_FILE_SYSTEM_INTERFACE MemfsInterface =
Rename,
};
static VOID MemfsEnterOperation(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request)
static VOID MemfsEnterOperation(FSP_FILE_SYSTEM *FileSystem,
FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response)
{
MEMFS *Memfs = (MEMFS *)FileSystem->UserContext;
EnterCriticalSection(&Memfs->Lock);
}
static VOID MemfsLeaveOperation(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request)
static VOID MemfsLeaveOperation(FSP_FILE_SYSTEM *FileSystem,
FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response)
{
MEMFS *Memfs = (MEMFS *)FileSystem->UserContext;
LeaveCriticalSection(&Memfs->Lock);
@ -618,11 +620,9 @@ NTSTATUS MemfsCreate(ULONG Flags, ULONG FileInfoTimeout,
InitializeCriticalSection(&Memfs->Lock);
if (Flags & MemfsThreadPool)
FspFileSystemSetDispatcher(Memfs->FileSystem,
FspFileSystemPoolDispatcher,
MemfsEnterOperation,
MemfsLeaveOperation);
FspFileSystemSetOperationGuard(Memfs->FileSystem,
MemfsEnterOperation,
MemfsLeaveOperation);
/*
* Create root directory.
@ -661,6 +661,16 @@ VOID MemfsDelete(MEMFS *Memfs)
free(Memfs);
}
NTSTATUS MemfsStart(MEMFS *Memfs)
{
return FspFileSystemStartDispatcher(Memfs->FileSystem, 0);
}
VOID MemfsStop(MEMFS *Memfs)
{
FspFileSystemStopDispatcher(Memfs->FileSystem);
}
FSP_FILE_SYSTEM *MemfsFileSystem(MEMFS *Memfs)
{
return Memfs->FileSystem;

View File

@ -19,14 +19,14 @@ enum
{
MemfsDisk = 0x00,
MemfsNet = 0x01,
MemfsSingleThread = 0x00,
MemfsThreadPool = 0x02,
};
NTSTATUS MemfsCreate(ULONG Flags, ULONG FileInfoTimeout,
ULONG MaxFileNodes, ULONG MaxFileSize,
MEMFS **PMemfs);
VOID MemfsDelete(MEMFS *Memfs);
NTSTATUS MemfsStart(MEMFS *Memfs);
VOID MemfsStop(MEMFS *Memfs);
FSP_FILE_SYSTEM *MemfsFileSystem(MEMFS *Memfs);
#ifdef __cplusplus