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\flush.c" />
|
||||
<ClCompile Include="..\..\src\sys\fsctl.c" />
|
||||
<ClCompile Include="..\..\src\sys\iocompl.c" />
|
||||
<ClCompile Include="..\..\src\sys\ioq.c" />
|
||||
<ClCompile Include="..\..\src\sys\lockctl.c" />
|
||||
<ClCompile Include="..\..\src\sys\misc.c" />
|
||||
|
@ -77,6 +77,9 @@
|
||||
<ClCompile Include="..\..\src\sys\ioq.c">
|
||||
<Filter>Source</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\src\sys\iocompl.c">
|
||||
<Filter>Source</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<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_TRANSACT_BUFFER_SIZE (16 * 1024)
|
||||
#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 \
|
||||
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 */
|
||||
#pragma warning(push)
|
||||
@ -52,7 +52,7 @@ typedef struct
|
||||
{
|
||||
UINT8 Placeholder; // !!!: REMOVE
|
||||
} Req;
|
||||
} FSP_TRANSACT_REQ;
|
||||
} FSP_FSCTL_TRANSACT_REQ;
|
||||
typedef struct
|
||||
{
|
||||
UINT64 Hint;
|
||||
@ -67,34 +67,34 @@ typedef struct
|
||||
{
|
||||
UINT8 Placeholder; // !!!: REMOVE
|
||||
} Req;
|
||||
} FSP_TRANSACT_RSP;
|
||||
} FSP_FSCTL_TRANSACT_RSP;
|
||||
#pragma warning(pop)
|
||||
static inline FSP_TRANSACT_REQ *FspFsctlTransactProduceRequest(
|
||||
FSP_TRANSACT_REQ *Request, SIZE_T RequestSize, PVOID RequestBufEnd)
|
||||
static inline FSP_FSCTL_TRANSACT_REQ *FspFsctlTransactProduceRequest(
|
||||
FSP_FSCTL_TRANSACT_REQ *Request, SIZE_T RequestSize, PVOID RequestBufEnd)
|
||||
{
|
||||
PVOID NextRequest = (PUINT8)Request + FSP_FSCTL_ALIGN_UP(RequestSize, FSP_FSCTL_DEFAULT_ALIGNMENT);
|
||||
return NextRequest <= RequestBufEnd ? NextRequest : 0;
|
||||
}
|
||||
static inline const FSP_TRANSACT_REQ *FspFsctlTransactConsumeRequest(
|
||||
const FSP_TRANSACT_REQ *Request, PVOID RequestBufEnd)
|
||||
static inline const FSP_FSCTL_TRANSACT_REQ *FspFsctlTransactConsumeRequest(
|
||||
const FSP_FSCTL_TRANSACT_REQ *Request, PVOID RequestBufEnd)
|
||||
{
|
||||
if ((PUINT8)Request + sizeof(Request->Size) > (PUINT8)RequestBufEnd ||
|
||||
sizeof(FSP_TRANSACT_REQ) > Request->Size)
|
||||
sizeof(FSP_FSCTL_TRANSACT_REQ) > Request->Size)
|
||||
return 0;
|
||||
PVOID NextRequest = (PUINT8)Request + FSP_FSCTL_ALIGN_UP(Request->Size, FSP_FSCTL_DEFAULT_ALIGNMENT);
|
||||
return NextRequest <= RequestBufEnd ? NextRequest : 0;
|
||||
}
|
||||
static inline FSP_TRANSACT_RSP *FspFsctlTransactProduceResponse(
|
||||
FSP_TRANSACT_RSP *Response, SIZE_T ResponseSize, PVOID ResponseBufEnd)
|
||||
static inline FSP_FSCTL_TRANSACT_RSP *FspFsctlTransactProduceResponse(
|
||||
FSP_FSCTL_TRANSACT_RSP *Response, SIZE_T ResponseSize, PVOID ResponseBufEnd)
|
||||
{
|
||||
PVOID NextResponse = (PUINT8)Response + FSP_FSCTL_ALIGN_UP(ResponseSize, FSP_FSCTL_DEFAULT_ALIGNMENT);
|
||||
return NextResponse <= ResponseBufEnd ? NextResponse : 0;
|
||||
}
|
||||
static inline const FSP_TRANSACT_RSP *FspFsctlTransactConsumeResponse(
|
||||
const FSP_TRANSACT_RSP *Response, PVOID ResponseBufEnd)
|
||||
static inline const FSP_FSCTL_TRANSACT_RSP *FspFsctlTransactConsumeResponse(
|
||||
const FSP_FSCTL_TRANSACT_RSP *Response, PVOID ResponseBufEnd)
|
||||
{
|
||||
if ((PUINT8)Response + sizeof(Response->Size) > (PUINT8)ResponseBufEnd ||
|
||||
sizeof(FSP_TRANSACT_RSP) > Response->Size)
|
||||
sizeof(FSP_FSCTL_TRANSACT_RSP) > Response->Size)
|
||||
return 0;
|
||||
PVOID NextResponse = (PUINT8)Response + FSP_FSCTL_ALIGN_UP(Response->Size, FSP_FSCTL_DEFAULT_ALIGNMENT);
|
||||
return NextResponse <= ResponseBufEnd ? NextResponse : 0;
|
||||
@ -107,8 +107,8 @@ FSP_API NTSTATUS FspFsctlOpenVolume(PWSTR VolumePath,
|
||||
PHANDLE *PVolumeHandle);
|
||||
FSP_API NTSTATUS FspFsctlDeleteVolume(HANDLE VolumeHandle);
|
||||
FSP_API NTSTATUS FspFsctlTransact(HANDLE VolumeHandle,
|
||||
FSP_TRANSACT_RSP *ResponseBuf, SIZE_T ResponseBufSize,
|
||||
FSP_TRANSACT_REQ *RequestBuf, SIZE_T *PRequestBufSize);
|
||||
FSP_FSCTL_TRANSACT_RSP *ResponseBuf, SIZE_T ResponseBufSize,
|
||||
FSP_FSCTL_TRANSACT_REQ *RequestBuf, SIZE_T *PRequestBufSize);
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
@ -113,8 +113,8 @@ exit:
|
||||
}
|
||||
|
||||
FSP_API NTSTATUS FspFsctlTransact(HANDLE VolumeHandle,
|
||||
FSP_TRANSACT_RSP *ResponseBuf, SIZE_T ResponseBufSize,
|
||||
FSP_TRANSACT_REQ *RequestBuf, SIZE_T *PRequestBufSize)
|
||||
FSP_FSCTL_TRANSACT_RSP *ResponseBuf, SIZE_T ResponseBufSize,
|
||||
FSP_FSCTL_TRANSACT_REQ *RequestBuf, SIZE_T *PRequestBufSize)
|
||||
{
|
||||
NTSTATUS Result = STATUS_SUCCESS;
|
||||
DWORD Bytes;
|
||||
|
@ -220,6 +220,10 @@ FSP_FSVOL_DEVICE_EXTENSION *FspFsvolDeviceExtension(PDEVICE_OBJECT DeviceObject)
|
||||
return DeviceObject->DeviceExtension;
|
||||
}
|
||||
|
||||
/* I/O completion */
|
||||
VOID FspCompleteRequest(PIRP Irp, NTSTATUS Result);
|
||||
VOID FspDispatchProcessedIrp(PIRP Irp, FSP_FSCTL_TRANSACT_RSP *Response);
|
||||
|
||||
/* misc */
|
||||
VOID FspCompleteRequest(PIRP Irp, NTSTATUS Result);
|
||||
NTSTATUS FspCreateGuid(GUID *Guid);
|
||||
|
@ -113,7 +113,7 @@ static NTSTATUS FspFsvrtTransact(
|
||||
ULONG InputBufferLength = IrpSp->Parameters.FileSystemControl.InputBufferLength;
|
||||
ULONG OutputBufferLength = IrpSp->Parameters.FileSystemControl.OutputBufferLength;
|
||||
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;
|
||||
if (FSP_FSCTL_TRANSACT_BUFFER_SIZE > OutputBufferLength)
|
||||
return STATUS_BUFFER_TOO_SMALL;
|
||||
@ -121,8 +121,8 @@ static NTSTATUS FspFsvrtTransact(
|
||||
NTSTATUS Result;
|
||||
FSP_FSVRT_DEVICE_EXTENSION *FsvrtDeviceExtension = FspFsvrtDeviceExtension(DeviceObject);
|
||||
PUINT8 SystemBufferEnd;
|
||||
const FSP_TRANSACT_RSP *Response, *NextResponse;
|
||||
FSP_TRANSACT_REQ *Request, *NextRequest, *PendingIrpRequest;
|
||||
const FSP_FSCTL_TRANSACT_RSP *Response, *NextResponse;
|
||||
FSP_FSCTL_TRANSACT_REQ *Request, *NextRequest, *PendingIrpRequest;
|
||||
PIRP ProcessIrp, PendingIrp;
|
||||
|
||||
/* 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)
|
||||
#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)
|
||||
{
|
||||
PAGED_CODE();
|
||||
|
Loading…
x
Reference in New Issue
Block a user