diff --git a/inc/winfsp/winfsp.h b/inc/winfsp/winfsp.h index 6d65f5f8..61b84482 100644 --- a/inc/winfsp/winfsp.h +++ b/inc/winfsp/winfsp.h @@ -30,8 +30,9 @@ typedef struct _FSP_FILE_SYSTEM WCHAR VolumePath[FSP_FSCTL_VOLUME_NAME_SIZEMAX / sizeof(WCHAR)]; HANDLE VolumeHandle; PVOID UserContext; - FSP_FILE_SYSTEM_DISPATCHER *Dispatcher; NTSTATUS DispatcherResult; + FSP_FILE_SYSTEM_DISPATCHER *Dispatcher; + FSP_FILE_SYSTEM_DISPATCHER *EnterOperation, *LeaveOperation; FSP_FILE_SYSTEM_OPERATION *Operations[FspFsctlTransactKindCount]; } FSP_FILE_SYSTEM; @@ -61,6 +62,19 @@ static VOID FspFileSystemSetDispatcherResult(FSP_FILE_SYSTEM *FileSystem, InterlockedCompareExchange(&FileSystem->DispatcherResult, DispatcherResult, 0); } +static VOID FspFileSystemEnterOperation(FSP_FILE_SYSTEM *FileSystem, + FSP_FSCTL_TRANSACT_REQ *Request) +{ + if (0 != FileSystem->EnterOperation) + FileSystem->EnterOperation(FileSystem, Request); +} +static VOID FspFileSystemLeaveOperation(FSP_FILE_SYSTEM *FileSystem, + FSP_FSCTL_TRANSACT_REQ *Request) +{ + if (0 != FileSystem->LeaveOperation) + FileSystem->LeaveOperation(FileSystem, Request); +} + FSP_API NTSTATUS FspSendResponse(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_RSP *Response); FSP_API NTSTATUS FspSendResponseWithStatus(FSP_FILE_SYSTEM *FileSystem, diff --git a/src/dll/loop.c b/src/dll/loop.c index b5f81b44..2318c6be 100644 --- a/src/dll/loop.c +++ b/src/dll/loop.c @@ -99,7 +99,11 @@ FSP_API VOID FspFileSystemDirectDispatcher(FSP_FILE_SYSTEM *FileSystem, if (FspFsctlTransactKindCount <= Request->Kind || 0 == FileSystem->Operations[Request->Kind]) DispatcherResult = FspSendResponseWithStatus(FileSystem, Request, STATUS_INVALID_DEVICE_REQUEST); else + { + FspFileSystemEnterOperation(FileSystem, Request); DispatcherResult = FileSystem->Operations[Request->Kind](FileSystem, Request); + FspFileSystemLeaveOperation(FileSystem, Request); + } FspFileSystemSetDispatcherResult(FileSystem, DispatcherResult); } @@ -108,12 +112,15 @@ static DWORD WINAPI FspFileSystemPoolDispatcherWorker(PVOID Param) { NTSTATUS DispatcherResult; FSP_DISPATCHER_WORK_ITEM *WorkItem = Param; + FSP_FILE_SYSTEM *FileSystem = WorkItem->FileSystem; FSP_FSCTL_TRANSACT_REQ *Request = (PVOID)WorkItem->RequestBuf; - DispatcherResult = WorkItem->FileSystem->Operations[Request->Kind](WorkItem->FileSystem, Request); - MemFree(WorkItem); + FspFileSystemEnterOperation(FileSystem, Request); + DispatcherResult = FileSystem->Operations[Request->Kind](FileSystem, Request); + FspFileSystemLeaveOperation(FileSystem, Request); + FspFileSystemSetDispatcherResult(FileSystem, DispatcherResult); - FspFileSystemSetDispatcherResult(WorkItem->FileSystem, DispatcherResult); + MemFree(WorkItem); return 0; }