From f5d80751eec1d15c66c392744fc10ef30ce1edd1 Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Wed, 25 Nov 2015 16:16:20 -0800 Subject: [PATCH] dll: WIP --- inc/winfsp/fsctl.h | 8 ++++---- src/dll/fsctl.c | 36 ++++++++++++++++++++++++------------ 2 files changed, 28 insertions(+), 16 deletions(-) diff --git a/inc/winfsp/fsctl.h b/inc/winfsp/fsctl.h index fb6acf0a..9df65857 100644 --- a/inc/winfsp/fsctl.h +++ b/inc/winfsp/fsctl.h @@ -61,11 +61,11 @@ typedef struct #if !defined(WINFSP_SYS_DRIVER_H_INTERNAL) NTSTATUS FspFsctlCreateVolume(PWSTR DevicePath, PSECURITY_DESCRIPTOR SecurityDescriptor, - PHANDLE *PHandle); + PHANDLE *PVolumeHandle); NTSTATUS FspFsctlOpenVolume(PWSTR VolumePath, - PHANDLE *PHandle); -NTSTATUS FspFsctlDeleteVolume(HANDLE Handle); -NTSTATUS FspFsctlTransact(HANDLE Handle, + PHANDLE *PVolumeHandle); +NTSTATUS FspFsctlDeleteVolume(HANDLE VolumeHandle); +NTSTATUS FspFsctlTransact(HANDLE VolumeHandle, const FSP_TRANSACT_RSP *Responses, size_t NumResponses, const FSP_TRANSACT_REQ *Requests, size_t *NumRequests); #endif diff --git a/src/dll/fsctl.c b/src/dll/fsctl.c index 75291b01..6b895017 100644 --- a/src/dll/fsctl.c +++ b/src/dll/fsctl.c @@ -11,7 +11,7 @@ #define GLOBALROOT L"\\\\?\\GLOBALROOT" NTSTATUS FspFsctlCreateVolume(PWSTR DevicePath, PSECURITY_DESCRIPTOR SecurityDescriptor, - PHANDLE *PHandle) + PHANDLE *PVolumeHandle) { NTSTATUS Result = STATUS_SUCCESS; WCHAR DevicePathBuf[(sizeof GLOBALROOT + FSP_FSCTL_CREATE_BUFFER_SIZE) / sizeof(WCHAR)]; @@ -20,7 +20,7 @@ NTSTATUS FspFsctlCreateVolume(PWSTR DevicePath, PSECURITY_DESCRIPTOR SecurityDes DWORD SecurityDescriptorLen, Bytes; HANDLE DeviceHandle = INVALID_HANDLE_VALUE; - *PHandle = 0; + *PVolumeHandle = 0; DevicePathBuf[0] = L'\0'; StringCbPrintf(DevicePathBuf, sizeof DevicePathBuf, GLOBALROOT "%S", DevicePath); @@ -56,7 +56,7 @@ NTSTATUS FspFsctlCreateVolume(PWSTR DevicePath, PSECURITY_DESCRIPTOR SecurityDes goto exit; } - Result = FspFsctlOpenVolume(VolumePathBuf, PHandle); + Result = FspFsctlOpenVolume(VolumePathBuf, PVolumeHandle); exit: if (INVALID_HANDLE_VALUE != DeviceHandle) @@ -66,37 +66,49 @@ exit: } NTSTATUS FspFsctlOpenVolume(PWSTR VolumePath, - PHANDLE *PHandle) + PHANDLE *PVolumeHandle) { NTSTATUS Result = STATUS_SUCCESS; WCHAR DevicePathBuf[(sizeof GLOBALROOT + FSP_FSCTL_CREATE_BUFFER_SIZE) / sizeof(WCHAR)]; - HANDLE DeviceHandle; + HANDLE VolumeHandle; - *PHandle = 0; + *PVolumeHandle = 0; DevicePathBuf[0] = L'\0'; StringCbPrintf(DevicePathBuf, sizeof DevicePathBuf, GLOBALROOT "%S", VolumePath); - DeviceHandle = CreateFileW(DevicePathBuf, + VolumeHandle = CreateFileW(DevicePathBuf, 0, FILE_SHARE_WRITE | FILE_SHARE_WRITE | FILE_SHARE_DELETE, 0, OPEN_EXISTING, 0, 0); - if (INVALID_HANDLE_VALUE == DeviceHandle) + if (INVALID_HANDLE_VALUE == VolumeHandle) { Result = FspNtStatusFromWin32(GetLastError()); goto exit; } - *PHandle = DeviceHandle; + *PVolumeHandle = VolumeHandle; exit: return Result; } -NTSTATUS FspFsctlDeleteVolume(HANDLE Handle) +NTSTATUS FspFsctlDeleteVolume(HANDLE VolumeHandle) { - return STATUS_NOT_IMPLEMENTED; + NTSTATUS Result = STATUS_SUCCESS; + DWORD Bytes; + + if (!DeviceIoControl(VolumeHandle, FSP_FSCTL_DELETE, + 0, 0, 0, 0, + &Bytes, 0)) + { + Result = FspNtStatusFromWin32(GetLastError()); + goto exit; + } + +exit: + return Result; } -NTSTATUS FspFsctlTransact(HANDLE Handle, +NTSTATUS FspFsctlTransact(HANDLE VolumeHandle, const FSP_TRANSACT_RSP *Responses, size_t NumResponses, const FSP_TRANSACT_REQ *Requests, size_t *NumRequests) {