This commit is contained in:
Bill Zissimopoulos 2015-11-27 10:29:29 -08:00
parent 8572bea55f
commit f9d300c738
8 changed files with 58 additions and 33 deletions

View File

@ -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" />

View File

@ -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">

View File

@ -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

View File

@ -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;

View File

@ -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);

View File

@ -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
View 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)
{
}

View File

@ -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();