mirror of
https://github.com/winfsp/winfsp.git
synced 2025-06-08 13:02:10 -05:00
sys: refactor allocation routines and FspIopCreateRequestFunnel
This commit is contained in:
parent
c00bf8c96a
commit
c30fec9daf
@ -276,6 +276,7 @@ FAST_IO_RELEASE_FOR_CCFLUSH FspReleaseForCcFlush;
|
|||||||
/* memory allocation */
|
/* memory allocation */
|
||||||
#define FspAlloc(Size) ExAllocatePoolWithTag(PagedPool, Size, FSP_ALLOC_INTERNAL_TAG)
|
#define FspAlloc(Size) ExAllocatePoolWithTag(PagedPool, Size, FSP_ALLOC_INTERNAL_TAG)
|
||||||
#define FspAllocNonPaged(Size) ExAllocatePoolWithTag(NonPagedPool, Size, FSP_ALLOC_INTERNAL_TAG)
|
#define FspAllocNonPaged(Size) ExAllocatePoolWithTag(NonPagedPool, Size, FSP_ALLOC_INTERNAL_TAG)
|
||||||
|
#define FspAllocMustSucceed(Size) FspAllocatePoolMustSucceed(PagedPool, Size, FSP_ALLOC_INTERNAL_TAG)
|
||||||
#define FspFree(Pointer) ExFreePoolWithTag(Pointer, FSP_ALLOC_INTERNAL_TAG)
|
#define FspFree(Pointer) ExFreePoolWithTag(Pointer, FSP_ALLOC_INTERNAL_TAG)
|
||||||
#define FspAllocExternal(Size) ExAllocatePoolWithTag(PagedPool, Size, FSP_ALLOC_EXTERNAL_TAG)
|
#define FspAllocExternal(Size) ExAllocatePoolWithTag(PagedPool, Size, FSP_ALLOC_EXTERNAL_TAG)
|
||||||
#define FspAllocNonPagedExternal(Size) ExAllocatePoolWithTag(NonPagedPool, Size, FSP_ALLOC_EXTERNAL_TAG)
|
#define FspAllocNonPagedExternal(Size) ExAllocatePoolWithTag(NonPagedPool, Size, FSP_ALLOC_EXTERNAL_TAG)
|
||||||
@ -316,7 +317,7 @@ ULONG FspHashMixPointer(PVOID Pointer)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* utility */
|
/* utility */
|
||||||
PVOID FspAllocMustSucceed(SIZE_T Size);
|
PVOID FspAllocatePoolMustSucceed(POOL_TYPE PoolType, SIZE_T Size, ULONG Tag);
|
||||||
PVOID FspAllocateIrpMustSucceed(CCHAR StackSize);
|
PVOID FspAllocateIrpMustSucceed(CCHAR StackSize);
|
||||||
BOOLEAN FspUnicodePathIsValid(PUNICODE_STRING Path, BOOLEAN AllowStreams);
|
BOOLEAN FspUnicodePathIsValid(PUNICODE_STRING Path, BOOLEAN AllowStreams);
|
||||||
VOID FspUnicodePathSuffix(PUNICODE_STRING Path, PUNICODE_STRING Remain, PUNICODE_STRING Suffix);
|
VOID FspUnicodePathSuffix(PUNICODE_STRING Path, PUNICODE_STRING Remain, PUNICODE_STRING Suffix);
|
||||||
@ -419,12 +420,17 @@ VOID FspMetaCacheInvalidateItem(FSP_META_CACHE *MetaCache, UINT64 ItemIndex);
|
|||||||
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 FSP_FSCTL_WORK_BEST_EFFORT \
|
#define FSP_FSCTL_WORK_BEST_EFFORT \
|
||||||
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)
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
FspIopRequestMustSucceed = 0x01,
|
||||||
|
FspIopRequestNonPaged = 0x02,
|
||||||
|
};
|
||||||
#define FspIopCreateRequest(I, F, E, P) \
|
#define FspIopCreateRequest(I, F, E, P) \
|
||||||
FspIopCreateRequestFunnel(I, F, E, 0, FALSE, P)
|
FspIopCreateRequestFunnel(I, F, E, 0, 0, P)
|
||||||
#define FspIopCreateRequestMustSucceed(I, F, E, P)\
|
#define FspIopCreateRequestMustSucceed(I, F, E, P)\
|
||||||
FspIopCreateRequestFunnel(I, F, E, 0, TRUE, P)
|
FspIopCreateRequestFunnel(I, F, E, 0, FspIopRequestMustSucceed, P)
|
||||||
#define FspIopCreateRequestEx(I, F, E, RF, P)\
|
#define FspIopCreateRequestEx(I, F, E, RF, P)\
|
||||||
FspIopCreateRequestFunnel(I, F, E, RF, FALSE, P)
|
FspIopCreateRequestFunnel(I, F, E, RF, 0, P)
|
||||||
#define FspIopRequestContext(Request, I)\
|
#define FspIopRequestContext(Request, I)\
|
||||||
(*FspIopRequestContextAddress(Request, I))
|
(*FspIopRequestContextAddress(Request, I))
|
||||||
#define FspIopPostWorkRequest(D, R) FspIopPostWorkRequestFunnel(D, R, FALSE)
|
#define FspIopPostWorkRequest(D, R) FspIopPostWorkRequestFunnel(D, R, FALSE)
|
||||||
@ -434,8 +440,7 @@ VOID FspMetaCacheInvalidateItem(FSP_META_CACHE *MetaCache, UINT64 ItemIndex);
|
|||||||
typedef VOID FSP_IOP_REQUEST_FINI(FSP_FSCTL_TRANSACT_REQ *Request, PVOID Context[4]);
|
typedef VOID FSP_IOP_REQUEST_FINI(FSP_FSCTL_TRANSACT_REQ *Request, PVOID Context[4]);
|
||||||
NTSTATUS FspIopCreateRequestFunnel(
|
NTSTATUS FspIopCreateRequestFunnel(
|
||||||
PIRP Irp, PUNICODE_STRING FileName, ULONG ExtraSize, FSP_IOP_REQUEST_FINI *RequestFini,
|
PIRP Irp, PUNICODE_STRING FileName, ULONG ExtraSize, FSP_IOP_REQUEST_FINI *RequestFini,
|
||||||
BOOLEAN MustSucceed,
|
ULONG Flags, FSP_FSCTL_TRANSACT_REQ **PRequest);
|
||||||
FSP_FSCTL_TRANSACT_REQ **PRequest);
|
|
||||||
VOID FspIopDeleteRequest(FSP_FSCTL_TRANSACT_REQ *Request);
|
VOID FspIopDeleteRequest(FSP_FSCTL_TRANSACT_REQ *Request);
|
||||||
VOID FspIopResetRequest(FSP_FSCTL_TRANSACT_REQ *Request, FSP_IOP_REQUEST_FINI *RequestFini);
|
VOID FspIopResetRequest(FSP_FSCTL_TRANSACT_REQ *Request, FSP_IOP_REQUEST_FINI *RequestFini);
|
||||||
PVOID *FspIopRequestContextAddress(FSP_FSCTL_TRANSACT_REQ *Request, ULONG I);
|
PVOID *FspIopRequestContextAddress(FSP_FSCTL_TRANSACT_REQ *Request, ULONG I);
|
||||||
|
@ -8,8 +8,7 @@
|
|||||||
|
|
||||||
NTSTATUS FspIopCreateRequestFunnel(
|
NTSTATUS FspIopCreateRequestFunnel(
|
||||||
PIRP Irp, PUNICODE_STRING FileName, ULONG ExtraSize, FSP_IOP_REQUEST_FINI *RequestFini,
|
PIRP Irp, PUNICODE_STRING FileName, ULONG ExtraSize, FSP_IOP_REQUEST_FINI *RequestFini,
|
||||||
BOOLEAN MustSucceed,
|
ULONG Flags, FSP_FSCTL_TRANSACT_REQ **PRequest);
|
||||||
FSP_FSCTL_TRANSACT_REQ **PRequest);
|
|
||||||
VOID FspIopDeleteRequest(FSP_FSCTL_TRANSACT_REQ *Request);
|
VOID FspIopDeleteRequest(FSP_FSCTL_TRANSACT_REQ *Request);
|
||||||
VOID FspIopResetRequest(FSP_FSCTL_TRANSACT_REQ *Request, FSP_IOP_REQUEST_FINI *RequestFini);
|
VOID FspIopResetRequest(FSP_FSCTL_TRANSACT_REQ *Request, FSP_IOP_REQUEST_FINI *RequestFini);
|
||||||
PVOID *FspIopRequestContextAddress(FSP_FSCTL_TRANSACT_REQ *Request, ULONG I);
|
PVOID *FspIopRequestContextAddress(FSP_FSCTL_TRANSACT_REQ *Request, ULONG I);
|
||||||
@ -49,8 +48,7 @@ typedef struct
|
|||||||
|
|
||||||
NTSTATUS FspIopCreateRequestFunnel(
|
NTSTATUS FspIopCreateRequestFunnel(
|
||||||
PIRP Irp, PUNICODE_STRING FileName, ULONG ExtraSize, FSP_IOP_REQUEST_FINI *RequestFini,
|
PIRP Irp, PUNICODE_STRING FileName, ULONG ExtraSize, FSP_IOP_REQUEST_FINI *RequestFini,
|
||||||
BOOLEAN MustSucceed,
|
ULONG Flags, FSP_FSCTL_TRANSACT_REQ **PRequest)
|
||||||
FSP_FSCTL_TRANSACT_REQ **PRequest)
|
|
||||||
{
|
{
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
|
|
||||||
@ -65,11 +63,17 @@ NTSTATUS FspIopCreateRequestFunnel(
|
|||||||
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;
|
||||||
|
|
||||||
if (MustSucceed)
|
if (FlagOn(Flags, FspIopRequestMustSucceed))
|
||||||
RequestHeader = FspAllocMustSucceed(sizeof *RequestHeader + sizeof *Request + ExtraSize);
|
RequestHeader = FspAllocatePoolMustSucceed(
|
||||||
|
FlagOn(Flags, FspIopRequestNonPaged) ? NonPagedPool : PagedPool,
|
||||||
|
sizeof *RequestHeader + sizeof *Request + ExtraSize,
|
||||||
|
FSP_ALLOC_INTERNAL_TAG);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
RequestHeader = FspAlloc(sizeof *RequestHeader + sizeof *Request + ExtraSize);
|
RequestHeader = ExAllocatePoolWithTag(
|
||||||
|
FlagOn(Flags, FspIopRequestNonPaged) ? NonPagedPool : PagedPool,
|
||||||
|
sizeof *RequestHeader + sizeof *Request + ExtraSize,
|
||||||
|
FSP_ALLOC_INTERNAL_TAG);
|
||||||
if (0 == RequestHeader)
|
if (0 == RequestHeader)
|
||||||
return STATUS_INSUFFICIENT_RESOURCES;
|
return STATUS_INSUFFICIENT_RESOURCES;
|
||||||
}
|
}
|
||||||
|
@ -45,7 +45,7 @@ static const LONG Delays[] =
|
|||||||
-1000,
|
-1000,
|
||||||
};
|
};
|
||||||
|
|
||||||
PVOID FspAllocMustSucceed(SIZE_T Size)
|
PVOID FspAllocatePoolMustSucceed(POOL_TYPE PoolType, SIZE_T Size, ULONG Tag)
|
||||||
{
|
{
|
||||||
// !PAGED_CODE();
|
// !PAGED_CODE();
|
||||||
|
|
||||||
@ -54,7 +54,7 @@ PVOID FspAllocMustSucceed(SIZE_T Size)
|
|||||||
|
|
||||||
for (ULONG i = 0, n = sizeof(Delays) / sizeof(Delays[0]);; i++)
|
for (ULONG i = 0, n = sizeof(Delays) / sizeof(Delays[0]);; i++)
|
||||||
{
|
{
|
||||||
Result = FspAlloc(Size);
|
Result = ExAllocatePoolWithTag(PoolType, Size, Tag);
|
||||||
if (0 != Result)
|
if (0 != Result)
|
||||||
return Result;
|
return Result;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user