This commit is contained in:
Bill Zissimopoulos 2015-11-25 16:16:20 -08:00
parent 1ad43de1a1
commit f5d80751ee
2 changed files with 28 additions and 16 deletions

View File

@ -61,11 +61,11 @@ typedef struct
#if !defined(WINFSP_SYS_DRIVER_H_INTERNAL) #if !defined(WINFSP_SYS_DRIVER_H_INTERNAL)
NTSTATUS FspFsctlCreateVolume(PWSTR DevicePath, PSECURITY_DESCRIPTOR SecurityDescriptor, NTSTATUS FspFsctlCreateVolume(PWSTR DevicePath, PSECURITY_DESCRIPTOR SecurityDescriptor,
PHANDLE *PHandle); PHANDLE *PVolumeHandle);
NTSTATUS FspFsctlOpenVolume(PWSTR VolumePath, NTSTATUS FspFsctlOpenVolume(PWSTR VolumePath,
PHANDLE *PHandle); PHANDLE *PVolumeHandle);
NTSTATUS FspFsctlDeleteVolume(HANDLE Handle); NTSTATUS FspFsctlDeleteVolume(HANDLE VolumeHandle);
NTSTATUS FspFsctlTransact(HANDLE Handle, NTSTATUS FspFsctlTransact(HANDLE VolumeHandle,
const FSP_TRANSACT_RSP *Responses, size_t NumResponses, const FSP_TRANSACT_RSP *Responses, size_t NumResponses,
const FSP_TRANSACT_REQ *Requests, size_t *NumRequests); const FSP_TRANSACT_REQ *Requests, size_t *NumRequests);
#endif #endif

View File

@ -11,7 +11,7 @@
#define GLOBALROOT L"\\\\?\\GLOBALROOT" #define GLOBALROOT L"\\\\?\\GLOBALROOT"
NTSTATUS FspFsctlCreateVolume(PWSTR DevicePath, PSECURITY_DESCRIPTOR SecurityDescriptor, NTSTATUS FspFsctlCreateVolume(PWSTR DevicePath, PSECURITY_DESCRIPTOR SecurityDescriptor,
PHANDLE *PHandle) PHANDLE *PVolumeHandle)
{ {
NTSTATUS Result = STATUS_SUCCESS; NTSTATUS Result = STATUS_SUCCESS;
WCHAR DevicePathBuf[(sizeof GLOBALROOT + FSP_FSCTL_CREATE_BUFFER_SIZE) / sizeof(WCHAR)]; 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; DWORD SecurityDescriptorLen, Bytes;
HANDLE DeviceHandle = INVALID_HANDLE_VALUE; HANDLE DeviceHandle = INVALID_HANDLE_VALUE;
*PHandle = 0; *PVolumeHandle = 0;
DevicePathBuf[0] = L'\0'; DevicePathBuf[0] = L'\0';
StringCbPrintf(DevicePathBuf, sizeof DevicePathBuf, GLOBALROOT "%S", DevicePath); StringCbPrintf(DevicePathBuf, sizeof DevicePathBuf, GLOBALROOT "%S", DevicePath);
@ -56,7 +56,7 @@ NTSTATUS FspFsctlCreateVolume(PWSTR DevicePath, PSECURITY_DESCRIPTOR SecurityDes
goto exit; goto exit;
} }
Result = FspFsctlOpenVolume(VolumePathBuf, PHandle); Result = FspFsctlOpenVolume(VolumePathBuf, PVolumeHandle);
exit: exit:
if (INVALID_HANDLE_VALUE != DeviceHandle) if (INVALID_HANDLE_VALUE != DeviceHandle)
@ -66,37 +66,49 @@ exit:
} }
NTSTATUS FspFsctlOpenVolume(PWSTR VolumePath, NTSTATUS FspFsctlOpenVolume(PWSTR VolumePath,
PHANDLE *PHandle) PHANDLE *PVolumeHandle)
{ {
NTSTATUS Result = STATUS_SUCCESS; NTSTATUS Result = STATUS_SUCCESS;
WCHAR DevicePathBuf[(sizeof GLOBALROOT + FSP_FSCTL_CREATE_BUFFER_SIZE) / sizeof(WCHAR)]; WCHAR DevicePathBuf[(sizeof GLOBALROOT + FSP_FSCTL_CREATE_BUFFER_SIZE) / sizeof(WCHAR)];
HANDLE DeviceHandle; HANDLE VolumeHandle;
*PHandle = 0; *PVolumeHandle = 0;
DevicePathBuf[0] = L'\0'; DevicePathBuf[0] = L'\0';
StringCbPrintf(DevicePathBuf, sizeof DevicePathBuf, GLOBALROOT "%S", VolumePath); 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); 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()); Result = FspNtStatusFromWin32(GetLastError());
goto exit; goto exit;
} }
*PHandle = DeviceHandle; *PVolumeHandle = VolumeHandle;
exit: exit:
return Result; 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;
} }
NTSTATUS FspFsctlTransact(HANDLE Handle, exit:
return Result;
}
NTSTATUS FspFsctlTransact(HANDLE VolumeHandle,
const FSP_TRANSACT_RSP *Responses, size_t NumResponses, const FSP_TRANSACT_RSP *Responses, size_t NumResponses,
const FSP_TRANSACT_REQ *Requests, size_t *NumRequests) const FSP_TRANSACT_REQ *Requests, size_t *NumRequests)
{ {