mirror of
https://github.com/winfsp/winfsp.git
synced 2025-04-22 16:33:02 -05:00
sys: WIP
This commit is contained in:
parent
8572bea55f
commit
f9d300c738
@ -146,6 +146,7 @@
|
|||||||
<ClCompile Include="..\..\src\sys\fileinfo.c" />
|
<ClCompile Include="..\..\src\sys\fileinfo.c" />
|
||||||
<ClCompile Include="..\..\src\sys\flush.c" />
|
<ClCompile Include="..\..\src\sys\flush.c" />
|
||||||
<ClCompile Include="..\..\src\sys\fsctl.c" />
|
<ClCompile Include="..\..\src\sys\fsctl.c" />
|
||||||
|
<ClCompile Include="..\..\src\sys\iocompl.c" />
|
||||||
<ClCompile Include="..\..\src\sys\ioq.c" />
|
<ClCompile Include="..\..\src\sys\ioq.c" />
|
||||||
<ClCompile Include="..\..\src\sys\lockctl.c" />
|
<ClCompile Include="..\..\src\sys\lockctl.c" />
|
||||||
<ClCompile Include="..\..\src\sys\misc.c" />
|
<ClCompile Include="..\..\src\sys\misc.c" />
|
||||||
|
@ -77,6 +77,9 @@
|
|||||||
<ClCompile Include="..\..\src\sys\ioq.c">
|
<ClCompile Include="..\..\src\sys\ioq.c">
|
||||||
<Filter>Source</Filter>
|
<Filter>Source</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\src\sys\iocompl.c">
|
||||||
|
<Filter>Source</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="..\..\src\sys\driver.h">
|
<ClInclude Include="..\..\src\sys\driver.h">
|
||||||
|
@ -36,9 +36,9 @@ extern const __declspec(selectany) GUID FspFsvrtDeviceClassGuid =
|
|||||||
#define FSP_FSCTL_CREATE_BUFFER_SIZE 128
|
#define FSP_FSCTL_CREATE_BUFFER_SIZE 128
|
||||||
#define FSP_FSCTL_TRANSACT_BUFFER_SIZE (16 * 1024)
|
#define FSP_FSCTL_TRANSACT_BUFFER_SIZE (16 * 1024)
|
||||||
#define FSP_FSCTL_TRANSACT_REQ_SIZEMAX \
|
#define FSP_FSCTL_TRANSACT_REQ_SIZEMAX \
|
||||||
FSP_FSCTL_ALIGN_UP(sizeof(FSP_TRANSACT_REQ) + 1024 * sizeof(WCHAR), FSP_FSCTL_DEFAULT_ALIGNMENT)
|
FSP_FSCTL_ALIGN_UP(sizeof(FSP_FSCTL_TRANSACT_REQ) + 1024 * sizeof(WCHAR), FSP_FSCTL_DEFAULT_ALIGNMENT)
|
||||||
#define FSP_FSCTL_TRANSACT_RSP_SIZEMAX \
|
#define FSP_FSCTL_TRANSACT_RSP_SIZEMAX \
|
||||||
FSP_FSCTL_ALIGN_UP(sizeof(FSP_TRANSACT_RSP) + 1024 * sizeof(WCHAR), FSP_FSCTL_DEFAULT_ALIGNMENT)
|
FSP_FSCTL_ALIGN_UP(sizeof(FSP_FSCTL_TRANSACT_RSP) + 1024 * sizeof(WCHAR), FSP_FSCTL_DEFAULT_ALIGNMENT)
|
||||||
|
|
||||||
/* marshalling */
|
/* marshalling */
|
||||||
#pragma warning(push)
|
#pragma warning(push)
|
||||||
@ -52,7 +52,7 @@ typedef struct
|
|||||||
{
|
{
|
||||||
UINT8 Placeholder; // !!!: REMOVE
|
UINT8 Placeholder; // !!!: REMOVE
|
||||||
} Req;
|
} Req;
|
||||||
} FSP_TRANSACT_REQ;
|
} FSP_FSCTL_TRANSACT_REQ;
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
UINT64 Hint;
|
UINT64 Hint;
|
||||||
@ -67,34 +67,34 @@ typedef struct
|
|||||||
{
|
{
|
||||||
UINT8 Placeholder; // !!!: REMOVE
|
UINT8 Placeholder; // !!!: REMOVE
|
||||||
} Req;
|
} Req;
|
||||||
} FSP_TRANSACT_RSP;
|
} FSP_FSCTL_TRANSACT_RSP;
|
||||||
#pragma warning(pop)
|
#pragma warning(pop)
|
||||||
static inline FSP_TRANSACT_REQ *FspFsctlTransactProduceRequest(
|
static inline FSP_FSCTL_TRANSACT_REQ *FspFsctlTransactProduceRequest(
|
||||||
FSP_TRANSACT_REQ *Request, SIZE_T RequestSize, PVOID RequestBufEnd)
|
FSP_FSCTL_TRANSACT_REQ *Request, SIZE_T RequestSize, PVOID RequestBufEnd)
|
||||||
{
|
{
|
||||||
PVOID NextRequest = (PUINT8)Request + FSP_FSCTL_ALIGN_UP(RequestSize, FSP_FSCTL_DEFAULT_ALIGNMENT);
|
PVOID NextRequest = (PUINT8)Request + FSP_FSCTL_ALIGN_UP(RequestSize, FSP_FSCTL_DEFAULT_ALIGNMENT);
|
||||||
return NextRequest <= RequestBufEnd ? NextRequest : 0;
|
return NextRequest <= RequestBufEnd ? NextRequest : 0;
|
||||||
}
|
}
|
||||||
static inline const FSP_TRANSACT_REQ *FspFsctlTransactConsumeRequest(
|
static inline const FSP_FSCTL_TRANSACT_REQ *FspFsctlTransactConsumeRequest(
|
||||||
const FSP_TRANSACT_REQ *Request, PVOID RequestBufEnd)
|
const FSP_FSCTL_TRANSACT_REQ *Request, PVOID RequestBufEnd)
|
||||||
{
|
{
|
||||||
if ((PUINT8)Request + sizeof(Request->Size) > (PUINT8)RequestBufEnd ||
|
if ((PUINT8)Request + sizeof(Request->Size) > (PUINT8)RequestBufEnd ||
|
||||||
sizeof(FSP_TRANSACT_REQ) > Request->Size)
|
sizeof(FSP_FSCTL_TRANSACT_REQ) > Request->Size)
|
||||||
return 0;
|
return 0;
|
||||||
PVOID NextRequest = (PUINT8)Request + FSP_FSCTL_ALIGN_UP(Request->Size, FSP_FSCTL_DEFAULT_ALIGNMENT);
|
PVOID NextRequest = (PUINT8)Request + FSP_FSCTL_ALIGN_UP(Request->Size, FSP_FSCTL_DEFAULT_ALIGNMENT);
|
||||||
return NextRequest <= RequestBufEnd ? NextRequest : 0;
|
return NextRequest <= RequestBufEnd ? NextRequest : 0;
|
||||||
}
|
}
|
||||||
static inline FSP_TRANSACT_RSP *FspFsctlTransactProduceResponse(
|
static inline FSP_FSCTL_TRANSACT_RSP *FspFsctlTransactProduceResponse(
|
||||||
FSP_TRANSACT_RSP *Response, SIZE_T ResponseSize, PVOID ResponseBufEnd)
|
FSP_FSCTL_TRANSACT_RSP *Response, SIZE_T ResponseSize, PVOID ResponseBufEnd)
|
||||||
{
|
{
|
||||||
PVOID NextResponse = (PUINT8)Response + FSP_FSCTL_ALIGN_UP(ResponseSize, FSP_FSCTL_DEFAULT_ALIGNMENT);
|
PVOID NextResponse = (PUINT8)Response + FSP_FSCTL_ALIGN_UP(ResponseSize, FSP_FSCTL_DEFAULT_ALIGNMENT);
|
||||||
return NextResponse <= ResponseBufEnd ? NextResponse : 0;
|
return NextResponse <= ResponseBufEnd ? NextResponse : 0;
|
||||||
}
|
}
|
||||||
static inline const FSP_TRANSACT_RSP *FspFsctlTransactConsumeResponse(
|
static inline const FSP_FSCTL_TRANSACT_RSP *FspFsctlTransactConsumeResponse(
|
||||||
const FSP_TRANSACT_RSP *Response, PVOID ResponseBufEnd)
|
const FSP_FSCTL_TRANSACT_RSP *Response, PVOID ResponseBufEnd)
|
||||||
{
|
{
|
||||||
if ((PUINT8)Response + sizeof(Response->Size) > (PUINT8)ResponseBufEnd ||
|
if ((PUINT8)Response + sizeof(Response->Size) > (PUINT8)ResponseBufEnd ||
|
||||||
sizeof(FSP_TRANSACT_RSP) > Response->Size)
|
sizeof(FSP_FSCTL_TRANSACT_RSP) > Response->Size)
|
||||||
return 0;
|
return 0;
|
||||||
PVOID NextResponse = (PUINT8)Response + FSP_FSCTL_ALIGN_UP(Response->Size, FSP_FSCTL_DEFAULT_ALIGNMENT);
|
PVOID NextResponse = (PUINT8)Response + FSP_FSCTL_ALIGN_UP(Response->Size, FSP_FSCTL_DEFAULT_ALIGNMENT);
|
||||||
return NextResponse <= ResponseBufEnd ? NextResponse : 0;
|
return NextResponse <= ResponseBufEnd ? NextResponse : 0;
|
||||||
@ -107,8 +107,8 @@ FSP_API NTSTATUS FspFsctlOpenVolume(PWSTR VolumePath,
|
|||||||
PHANDLE *PVolumeHandle);
|
PHANDLE *PVolumeHandle);
|
||||||
FSP_API NTSTATUS FspFsctlDeleteVolume(HANDLE VolumeHandle);
|
FSP_API NTSTATUS FspFsctlDeleteVolume(HANDLE VolumeHandle);
|
||||||
FSP_API NTSTATUS FspFsctlTransact(HANDLE VolumeHandle,
|
FSP_API NTSTATUS FspFsctlTransact(HANDLE VolumeHandle,
|
||||||
FSP_TRANSACT_RSP *ResponseBuf, SIZE_T ResponseBufSize,
|
FSP_FSCTL_TRANSACT_RSP *ResponseBuf, SIZE_T ResponseBufSize,
|
||||||
FSP_TRANSACT_REQ *RequestBuf, SIZE_T *PRequestBufSize);
|
FSP_FSCTL_TRANSACT_REQ *RequestBuf, SIZE_T *PRequestBufSize);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -113,8 +113,8 @@ exit:
|
|||||||
}
|
}
|
||||||
|
|
||||||
FSP_API NTSTATUS FspFsctlTransact(HANDLE VolumeHandle,
|
FSP_API NTSTATUS FspFsctlTransact(HANDLE VolumeHandle,
|
||||||
FSP_TRANSACT_RSP *ResponseBuf, SIZE_T ResponseBufSize,
|
FSP_FSCTL_TRANSACT_RSP *ResponseBuf, SIZE_T ResponseBufSize,
|
||||||
FSP_TRANSACT_REQ *RequestBuf, SIZE_T *PRequestBufSize)
|
FSP_FSCTL_TRANSACT_REQ *RequestBuf, SIZE_T *PRequestBufSize)
|
||||||
{
|
{
|
||||||
NTSTATUS Result = STATUS_SUCCESS;
|
NTSTATUS Result = STATUS_SUCCESS;
|
||||||
DWORD Bytes;
|
DWORD Bytes;
|
||||||
|
@ -220,6 +220,10 @@ FSP_FSVOL_DEVICE_EXTENSION *FspFsvolDeviceExtension(PDEVICE_OBJECT DeviceObject)
|
|||||||
return DeviceObject->DeviceExtension;
|
return DeviceObject->DeviceExtension;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* I/O completion */
|
||||||
|
VOID FspCompleteRequest(PIRP Irp, NTSTATUS Result);
|
||||||
|
VOID FspDispatchProcessedIrp(PIRP Irp, FSP_FSCTL_TRANSACT_RSP *Response);
|
||||||
|
|
||||||
/* misc */
|
/* misc */
|
||||||
VOID FspCompleteRequest(PIRP Irp, NTSTATUS Result);
|
VOID FspCompleteRequest(PIRP Irp, NTSTATUS Result);
|
||||||
NTSTATUS FspCreateGuid(GUID *Guid);
|
NTSTATUS FspCreateGuid(GUID *Guid);
|
||||||
|
@ -113,7 +113,7 @@ static NTSTATUS FspFsvrtTransact(
|
|||||||
ULONG InputBufferLength = IrpSp->Parameters.FileSystemControl.InputBufferLength;
|
ULONG InputBufferLength = IrpSp->Parameters.FileSystemControl.InputBufferLength;
|
||||||
ULONG OutputBufferLength = IrpSp->Parameters.FileSystemControl.OutputBufferLength;
|
ULONG OutputBufferLength = IrpSp->Parameters.FileSystemControl.OutputBufferLength;
|
||||||
PVOID SystemBuffer = Irp->AssociatedIrp.SystemBuffer;
|
PVOID SystemBuffer = Irp->AssociatedIrp.SystemBuffer;
|
||||||
if (sizeof(FSP_TRANSACT_RSP) > InputBufferLength || 0 == SystemBuffer)
|
if (sizeof(FSP_FSCTL_TRANSACT_RSP) > InputBufferLength || 0 == SystemBuffer)
|
||||||
return STATUS_INVALID_PARAMETER;
|
return STATUS_INVALID_PARAMETER;
|
||||||
if (FSP_FSCTL_TRANSACT_BUFFER_SIZE > OutputBufferLength)
|
if (FSP_FSCTL_TRANSACT_BUFFER_SIZE > OutputBufferLength)
|
||||||
return STATUS_BUFFER_TOO_SMALL;
|
return STATUS_BUFFER_TOO_SMALL;
|
||||||
@ -121,8 +121,8 @@ static NTSTATUS FspFsvrtTransact(
|
|||||||
NTSTATUS Result;
|
NTSTATUS Result;
|
||||||
FSP_FSVRT_DEVICE_EXTENSION *FsvrtDeviceExtension = FspFsvrtDeviceExtension(DeviceObject);
|
FSP_FSVRT_DEVICE_EXTENSION *FsvrtDeviceExtension = FspFsvrtDeviceExtension(DeviceObject);
|
||||||
PUINT8 SystemBufferEnd;
|
PUINT8 SystemBufferEnd;
|
||||||
const FSP_TRANSACT_RSP *Response, *NextResponse;
|
const FSP_FSCTL_TRANSACT_RSP *Response, *NextResponse;
|
||||||
FSP_TRANSACT_REQ *Request, *NextRequest, *PendingIrpRequest;
|
FSP_FSCTL_TRANSACT_REQ *Request, *NextRequest, *PendingIrpRequest;
|
||||||
PIRP ProcessIrp, PendingIrp;
|
PIRP ProcessIrp, PendingIrp;
|
||||||
|
|
||||||
/* access check */
|
/* access check */
|
||||||
|
29
src/sys/iocompl.c
Normal file
29
src/sys/iocompl.c
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
/**
|
||||||
|
* @file sys/iocompl.c
|
||||||
|
*
|
||||||
|
* @copyright 2015 Bill Zissimopoulos
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/driver.h>
|
||||||
|
|
||||||
|
#ifdef ALLOC_PRAGMA
|
||||||
|
#endif
|
||||||
|
|
||||||
|
VOID FspCompleteRequest(PIRP Irp, NTSTATUS Result)
|
||||||
|
{
|
||||||
|
// !PAGED_CODE();
|
||||||
|
|
||||||
|
ASSERT(STATUS_PENDING != Result);
|
||||||
|
|
||||||
|
if (0 != Irp->Tail.Overlay.DriverContext[0])
|
||||||
|
ExFreePoolWithTag(Irp->Tail.Overlay.DriverContext[0], FSP_TAG);
|
||||||
|
|
||||||
|
if (!NT_SUCCESS(Result))
|
||||||
|
Irp->IoStatus.Information = 0;
|
||||||
|
Irp->IoStatus.Status = Result;
|
||||||
|
IoCompleteRequest(Irp, FSP_IO_INCREMENT);
|
||||||
|
}
|
||||||
|
|
||||||
|
VOID FspDispatchProcessedIrp(PIRP Irp, FSP_FSCTL_TRANSACT_RSP *Response)
|
||||||
|
{
|
||||||
|
}
|
@ -15,18 +15,6 @@ NTSTATUS FspSecuritySubjectContextAccessCheck(
|
|||||||
#pragma alloc_text(PAGE, FspSecuritySubjectContextAccessCheck)
|
#pragma alloc_text(PAGE, FspSecuritySubjectContextAccessCheck)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
VOID FspCompleteRequest(PIRP Irp, NTSTATUS Result)
|
|
||||||
{
|
|
||||||
// !PAGED_CODE();
|
|
||||||
|
|
||||||
ASSERT(STATUS_PENDING != Result);
|
|
||||||
|
|
||||||
if (!NT_SUCCESS(Result))
|
|
||||||
Irp->IoStatus.Information = 0;
|
|
||||||
Irp->IoStatus.Status = Result;
|
|
||||||
IoCompleteRequest(Irp, FSP_IO_INCREMENT);
|
|
||||||
}
|
|
||||||
|
|
||||||
NTSTATUS FspCreateGuid(GUID *Guid)
|
NTSTATUS FspCreateGuid(GUID *Guid)
|
||||||
{
|
{
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user