mirror of
https://github.com/winfsp/winfsp.git
synced 2025-04-23 08:53:01 -05:00
dll: WIP
This commit is contained in:
parent
1ad43de1a1
commit
f5d80751ee
@ -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
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
exit:
|
||||||
|
return Result;
|
||||||
}
|
}
|
||||||
|
|
||||||
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)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user