mirror of
https://github.com/winfsp/winfsp.git
synced 2025-04-23 17:03:12 -05:00
sys: iop: FSP_FSCTL_TRANSACT_REQ_HEADER
This commit is contained in:
parent
c3c690c46b
commit
d21180cba0
@ -36,11 +36,11 @@ extern const __declspec(selectany) GUID FspFsvrtDeviceClassGuid =
|
|||||||
CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 0x800 + 'T', METHOD_BUFFERED, FILE_ANY_ACCESS)
|
CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 0x800 + 'T', METHOD_BUFFERED, FILE_ANY_ACCESS)
|
||||||
|
|
||||||
#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 16384
|
||||||
|
|
||||||
#define FSP_FSCTL_VOLUME_PARAMS_SIZE FSP_FSCTL_DEFAULT_ALIGN_UP(sizeof(FSP_FSCTL_VOLUME_PARAMS))
|
#define FSP_FSCTL_VOLUME_PARAMS_SIZE FSP_FSCTL_DEFAULT_ALIGN_UP(sizeof(FSP_FSCTL_VOLUME_PARAMS))
|
||||||
#define FSP_FSCTL_TRANSACT_REQ_SIZEMAX (4 * 1024)
|
#define FSP_FSCTL_TRANSACT_REQ_SIZEMAX (4096 - 64) /* 64: size for internal request header */
|
||||||
#define FSP_FSCTL_TRANSACT_RSP_SIZEMAX (4 * 1024)
|
#define FSP_FSCTL_TRANSACT_RSP_SIZEMAX (4096 - 64) /* symmetry! */
|
||||||
|
|
||||||
/* marshalling */
|
/* marshalling */
|
||||||
#pragma warning(push)
|
#pragma warning(push)
|
||||||
|
@ -263,12 +263,18 @@ PIRP FspIoqEndProcessingIrp(FSP_IOQ *Ioq, UINT_PTR IrpHint);
|
|||||||
/* I/O processing */
|
/* I/O processing */
|
||||||
#define FSP_FSCTL_WORK \
|
#define FSP_FSCTL_WORK \
|
||||||
CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 0x800 + 'W', METHOD_NEITHER, FILE_ANY_ACCESS)
|
CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 0x800 + 'W', METHOD_NEITHER, FILE_ANY_ACCESS)
|
||||||
#define FspIrpContextRequest(Irp) \
|
#define FspIopRequest(Irp) \
|
||||||
(*(FSP_FSCTL_TRANSACT_REQ **)&(Irp)->Tail.Overlay.DriverContext[0])
|
(*(FSP_FSCTL_TRANSACT_REQ **)&(Irp)->Tail.Overlay.DriverContext[0])
|
||||||
|
#define FspIopRequestContext(Request, I)\
|
||||||
|
(*FspIopRequestContextAddress(Request, I))
|
||||||
#define FspIrpContextHandle(Irp) \
|
#define FspIrpContextHandle(Irp) \
|
||||||
(*(HANDLE *)&(Irp)->Tail.Overlay.DriverContext[1])
|
(*(HANDLE *)&(Irp)->Tail.Overlay.DriverContext[1])
|
||||||
NTSTATUS FspIopCreateRequest(
|
#define FspIopCreateRequest(I, F, E, P) FspIopCreateRequestEx(I, F, E, 0, P)
|
||||||
PIRP Irp, PUNICODE_STRING FileName, ULONG ExtraSize, FSP_FSCTL_TRANSACT_REQ **PRequest);
|
typedef VOID FSP_IOP_REQUEST_FINI(PVOID Context[3]);
|
||||||
|
NTSTATUS FspIopCreateRequestEx(
|
||||||
|
PIRP Irp, PUNICODE_STRING FileName, ULONG ExtraSize, FSP_IOP_REQUEST_FINI *RequestFini,
|
||||||
|
FSP_FSCTL_TRANSACT_REQ **PRequest);
|
||||||
|
PVOID *FspIopRequestContextAddress(FSP_FSCTL_TRANSACT_REQ *Request, ULONG I);
|
||||||
NTSTATUS FspIopPostWorkRequest(PDEVICE_OBJECT DeviceObject, FSP_FSCTL_TRANSACT_REQ *Request);
|
NTSTATUS FspIopPostWorkRequest(PDEVICE_OBJECT DeviceObject, FSP_FSCTL_TRANSACT_REQ *Request);
|
||||||
VOID FspIopCompleteIrpEx(PIRP Irp, NTSTATUS Result, BOOLEAN DeviceRelease);
|
VOID FspIopCompleteIrpEx(PIRP Irp, NTSTATUS Result, BOOLEAN DeviceRelease);
|
||||||
static inline
|
static inline
|
||||||
|
@ -391,7 +391,7 @@ retry:
|
|||||||
ASSERT((PUINT8)Request + FSP_FSCTL_TRANSACT_REQ_SIZEMAX <= SystemBufferEnd);
|
ASSERT((PUINT8)Request + FSP_FSCTL_TRANSACT_REQ_SIZEMAX <= SystemBufferEnd);
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
PendingIrpRequest = FspIrpContextRequest(PendingIrp);
|
PendingIrpRequest = FspIopRequest(PendingIrp);
|
||||||
|
|
||||||
Result = FspIopDispatchPrepare(PendingIrp, PendingIrpRequest);
|
Result = FspIopDispatchPrepare(PendingIrp, PendingIrpRequest);
|
||||||
if (!NT_SUCCESS(Result))
|
if (!NT_SUCCESS(Result))
|
||||||
|
@ -42,7 +42,7 @@ static NTSTATUS FspFsvolInternalDeviceControl(
|
|||||||
|
|
||||||
/* associate the passed Request with our Irp; acquire ownership of the Request */
|
/* associate the passed Request with our Irp; acquire ownership of the Request */
|
||||||
Request->Hint = (UINT_PTR)Irp;
|
Request->Hint = (UINT_PTR)Irp;
|
||||||
FspIrpContextRequest(Irp) = Request;
|
FspIopRequest(Irp) = Request;
|
||||||
|
|
||||||
if (!FspIoqPostIrp(&FsvrtDeviceExtension->Ioq, Irp))
|
if (!FspIoqPostIrp(&FsvrtDeviceExtension->Ioq, Irp))
|
||||||
{
|
{
|
||||||
@ -51,7 +51,7 @@ static NTSTATUS FspFsvolInternalDeviceControl(
|
|||||||
|
|
||||||
/* disocciate the Request from our Irp; release ownership back to caller */
|
/* disocciate the Request from our Irp; release ownership back to caller */
|
||||||
Request->Hint = 0;
|
Request->Hint = 0;
|
||||||
FspIrpContextRequest(Irp) = 0;
|
FspIopRequest(Irp) = 0;
|
||||||
|
|
||||||
Result = STATUS_CANCELLED;
|
Result = STATUS_CANCELLED;
|
||||||
goto exit;
|
goto exit;
|
||||||
|
@ -6,25 +6,41 @@
|
|||||||
|
|
||||||
#include <sys/driver.h>
|
#include <sys/driver.h>
|
||||||
|
|
||||||
NTSTATUS FspIopCreateRequest(
|
NTSTATUS FspIopCreateRequestEx(
|
||||||
PIRP Irp, PUNICODE_STRING FileName, ULONG ExtraSize, FSP_FSCTL_TRANSACT_REQ **PRequest);
|
PIRP Irp, PUNICODE_STRING FileName, ULONG ExtraSize, FSP_IOP_REQUEST_FINI *RequestFini,
|
||||||
|
FSP_FSCTL_TRANSACT_REQ **PRequest);
|
||||||
|
static VOID FspIopDeleteRequest(FSP_FSCTL_TRANSACT_REQ *Request);
|
||||||
|
PVOID *FspIopRequestContextAddress(FSP_FSCTL_TRANSACT_REQ *Request, ULONG I);
|
||||||
NTSTATUS FspIopPostWorkRequest(PDEVICE_OBJECT DeviceObject, FSP_FSCTL_TRANSACT_REQ *Request);
|
NTSTATUS FspIopPostWorkRequest(PDEVICE_OBJECT DeviceObject, FSP_FSCTL_TRANSACT_REQ *Request);
|
||||||
static IO_COMPLETION_ROUTINE FspIopPostWorkRequestCompletion;
|
static IO_COMPLETION_ROUTINE FspIopPostWorkRequestCompletion;
|
||||||
|
VOID FspIopCompleteIrpEx(PIRP Irp, NTSTATUS Result, BOOLEAN DeviceRelease);
|
||||||
NTSTATUS FspIopDispatchPrepare(PIRP Irp, FSP_FSCTL_TRANSACT_REQ *Request);
|
NTSTATUS FspIopDispatchPrepare(PIRP Irp, FSP_FSCTL_TRANSACT_REQ *Request);
|
||||||
VOID FspIopDispatchComplete(PIRP Irp, const FSP_FSCTL_TRANSACT_RSP *Response);
|
VOID FspIopDispatchComplete(PIRP Irp, const FSP_FSCTL_TRANSACT_RSP *Response);
|
||||||
|
|
||||||
#ifdef ALLOC_PRAGMA
|
#ifdef ALLOC_PRAGMA
|
||||||
#pragma alloc_text(PAGE, FspIopCreateRequest)
|
#pragma alloc_text(PAGE, FspIopCreateRequestEx)
|
||||||
|
#pragma alloc_text(PAGE, FspIopDeleteRequest)
|
||||||
|
#pragma alloc_text(PAGE, FspIopRequestContextAddress)
|
||||||
#pragma alloc_text(PAGE, FspIopPostWorkRequest)
|
#pragma alloc_text(PAGE, FspIopPostWorkRequest)
|
||||||
|
#pragma alloc_text(PAGE, FspIopCompleteIrpEx)
|
||||||
#pragma alloc_text(PAGE, FspIopDispatchPrepare)
|
#pragma alloc_text(PAGE, FspIopDispatchPrepare)
|
||||||
#pragma alloc_text(PAGE, FspIopDispatchComplete)
|
#pragma alloc_text(PAGE, FspIopDispatchComplete)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
NTSTATUS FspIopCreateRequest(
|
typedef struct
|
||||||
PIRP Irp, PUNICODE_STRING FileName, ULONG ExtraSize, FSP_FSCTL_TRANSACT_REQ **PRequest)
|
{
|
||||||
|
FSP_IOP_REQUEST_FINI *RequestFini;
|
||||||
|
PVOID Context[3];
|
||||||
|
__declspec(align(MEMORY_ALLOCATION_ALIGNMENT)) UINT8 RequestBuf[];
|
||||||
|
} FSP_FSCTL_TRANSACT_REQ_HEADER;
|
||||||
|
|
||||||
|
NTSTATUS FspIopCreateRequestEx(
|
||||||
|
PIRP Irp, PUNICODE_STRING FileName, ULONG ExtraSize, FSP_IOP_REQUEST_FINI *RequestFini,
|
||||||
|
FSP_FSCTL_TRANSACT_REQ **PRequest)
|
||||||
{
|
{
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
|
|
||||||
|
FSP_FSCTL_TRANSACT_REQ_HEADER *RequestHeader;
|
||||||
FSP_FSCTL_TRANSACT_REQ *Request;
|
FSP_FSCTL_TRANSACT_REQ *Request;
|
||||||
|
|
||||||
*PRequest = 0;
|
*PRequest = 0;
|
||||||
@ -35,39 +51,52 @@ NTSTATUS FspIopCreateRequest(
|
|||||||
if (FSP_FSCTL_TRANSACT_REQ_SIZEMAX < sizeof *Request + ExtraSize)
|
if (FSP_FSCTL_TRANSACT_REQ_SIZEMAX < sizeof *Request + ExtraSize)
|
||||||
return STATUS_INVALID_PARAMETER;
|
return STATUS_INVALID_PARAMETER;
|
||||||
|
|
||||||
Request = ExAllocatePoolWithTag(PagedPool,
|
RequestHeader = ExAllocatePoolWithTag(PagedPool,
|
||||||
sizeof *Request + ExtraSize, FSP_TAG);
|
sizeof *RequestHeader + sizeof *Request + ExtraSize, FSP_TAG);
|
||||||
if (0 == Request)
|
if (0 == RequestHeader)
|
||||||
return STATUS_INSUFFICIENT_RESOURCES;
|
return STATUS_INSUFFICIENT_RESOURCES;
|
||||||
|
|
||||||
RtlZeroMemory(Request, sizeof *Request + ExtraSize);
|
RtlZeroMemory(RequestHeader, sizeof *RequestHeader + sizeof *Request + ExtraSize);
|
||||||
|
RequestHeader->RequestFini = RequestFini;
|
||||||
|
|
||||||
|
Request = (PVOID)RequestHeader->RequestBuf;
|
||||||
Request->Size = (UINT16)(sizeof *Request + ExtraSize);
|
Request->Size = (UINT16)(sizeof *Request + ExtraSize);
|
||||||
Request->Hint = (UINT_PTR)Irp;
|
Request->Hint = (UINT_PTR)Irp;
|
||||||
if (0 != FileName)
|
if (0 != FileName)
|
||||||
{
|
{
|
||||||
RtlCopyMemory(Request->Buffer, FileName->Buffer, FileName->Length);
|
RtlCopyMemory(Request->Buffer, FileName->Buffer, FileName->Length);
|
||||||
Request->Buffer[FileName->Length] = '\0';
|
//Request->Buffer[FileName->Length] = '\0';
|
||||||
Request->Buffer[FileName->Length + 1] = '\0';
|
//Request->Buffer[FileName->Length + 1] = '\0';
|
||||||
Request->FileName.Offset = 0;
|
//Request->FileName.Offset = 0;
|
||||||
Request->FileName.Size = FileName->Length + sizeof(WCHAR);
|
Request->FileName.Size = FileName->Length + sizeof(WCHAR);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
Request->FileName.Offset = 0;
|
|
||||||
Request->FileName.Size = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (0 != Irp)
|
if (0 != Irp)
|
||||||
FspIrpContextRequest(Irp) = Request;
|
FspIopRequest(Irp) = Request;
|
||||||
*PRequest = Request;
|
*PRequest = Request;
|
||||||
|
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline
|
static VOID FspIopDeleteRequest(FSP_FSCTL_TRANSACT_REQ *Request)
|
||||||
VOID FspIopDeleteRequest(FSP_FSCTL_TRANSACT_REQ *Request)
|
|
||||||
{
|
{
|
||||||
ExFreePoolWithTag(Request, FSP_TAG);
|
PAGED_CODE();
|
||||||
|
|
||||||
|
FSP_FSCTL_TRANSACT_REQ_HEADER *RequestHeader = (PVOID)((PUINT8)Request - sizeof *RequestHeader);
|
||||||
|
|
||||||
|
if (0 != RequestHeader->RequestFini)
|
||||||
|
RequestHeader->RequestFini(RequestHeader->Context);
|
||||||
|
|
||||||
|
ExFreePoolWithTag(RequestHeader, FSP_TAG);
|
||||||
|
}
|
||||||
|
|
||||||
|
PVOID *FspIopRequestContextAddress(FSP_FSCTL_TRANSACT_REQ *Request, ULONG I)
|
||||||
|
{
|
||||||
|
PAGED_CODE();
|
||||||
|
|
||||||
|
FSP_FSCTL_TRANSACT_REQ_HEADER *RequestHeader = (PVOID)((PUINT8)Request - sizeof *RequestHeader);
|
||||||
|
|
||||||
|
return &RequestHeader->Context[I];
|
||||||
}
|
}
|
||||||
|
|
||||||
NTSTATUS FspIopPostWorkRequest(PDEVICE_OBJECT DeviceObject, FSP_FSCTL_TRANSACT_REQ *Request)
|
NTSTATUS FspIopPostWorkRequest(PDEVICE_OBJECT DeviceObject, FSP_FSCTL_TRANSACT_REQ *Request)
|
||||||
@ -120,15 +149,15 @@ static NTSTATUS FspIopPostWorkRequestCompletion(
|
|||||||
|
|
||||||
VOID FspIopCompleteIrpEx(PIRP Irp, NTSTATUS Result, BOOLEAN DeviceRelease)
|
VOID FspIopCompleteIrpEx(PIRP Irp, NTSTATUS Result, BOOLEAN DeviceRelease)
|
||||||
{
|
{
|
||||||
// !PAGED_CODE();
|
PAGED_CODE();
|
||||||
|
|
||||||
ASSERT(STATUS_PENDING != Result);
|
ASSERT(STATUS_PENDING != Result);
|
||||||
ASSERT(0 == Irp->Tail.Overlay.DriverContext[3]);
|
ASSERT(0 == Irp->Tail.Overlay.DriverContext[3]);
|
||||||
|
|
||||||
if (0 != FspIrpContextRequest(Irp))
|
if (0 != FspIopRequest(Irp))
|
||||||
{
|
{
|
||||||
FspIopDeleteRequest(FspIrpContextRequest(Irp));
|
FspIopDeleteRequest(FspIopRequest(Irp));
|
||||||
FspIrpContextRequest(Irp) = 0;
|
FspIopRequest(Irp) = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (0 != FspIrpContextHandle(Irp))
|
if (0 != FspIrpContextHandle(Irp))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user