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

View File

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

View File

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

View File

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

View File

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

View File

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