mirror of
				https://github.com/winfsp/winfsp.git
				synced 2025-10-30 03:28:38 -05:00 
			
		
		
		
	sys: refactor allocation routines and FspIopCreateRequestFunnel
This commit is contained in:
		| @@ -276,6 +276,7 @@ FAST_IO_RELEASE_FOR_CCFLUSH FspReleaseForCcFlush; | ||||
| /* memory allocation */ | ||||
| #define FspAlloc(Size)                  ExAllocatePoolWithTag(PagedPool, 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 FspAllocExternal(Size)          ExAllocatePoolWithTag(PagedPool, Size, FSP_ALLOC_EXTERNAL_TAG) | ||||
| #define FspAllocNonPagedExternal(Size)  ExAllocatePoolWithTag(NonPagedPool, Size, FSP_ALLOC_EXTERNAL_TAG) | ||||
| @@ -316,7 +317,7 @@ ULONG FspHashMixPointer(PVOID Pointer) | ||||
| } | ||||
|  | ||||
| /* utility */ | ||||
| PVOID FspAllocMustSucceed(SIZE_T Size); | ||||
| PVOID FspAllocatePoolMustSucceed(POOL_TYPE PoolType, SIZE_T Size, ULONG Tag); | ||||
| PVOID FspAllocateIrpMustSucceed(CCHAR StackSize); | ||||
| BOOLEAN FspUnicodePathIsValid(PUNICODE_STRING Path, BOOLEAN AllowStreams); | ||||
| 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) | ||||
| #define FSP_FSCTL_WORK_BEST_EFFORT      \ | ||||
|     CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 0x800 + 'w', METHOD_NEITHER, FILE_ANY_ACCESS) | ||||
| enum | ||||
| { | ||||
|     FspIopRequestMustSucceed            = 0x01, | ||||
|     FspIopRequestNonPaged               = 0x02, | ||||
| }; | ||||
| #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)\ | ||||
|     FspIopCreateRequestFunnel(I, F, E, 0, TRUE, P) | ||||
|     FspIopCreateRequestFunnel(I, F, E, 0, FspIopRequestMustSucceed, 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)\ | ||||
|     (*FspIopRequestContextAddress(Request, I)) | ||||
| #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]); | ||||
| NTSTATUS FspIopCreateRequestFunnel( | ||||
|     PIRP Irp, PUNICODE_STRING FileName, ULONG ExtraSize, FSP_IOP_REQUEST_FINI *RequestFini, | ||||
|     BOOLEAN MustSucceed, | ||||
|     FSP_FSCTL_TRANSACT_REQ **PRequest); | ||||
|     ULONG Flags, FSP_FSCTL_TRANSACT_REQ **PRequest); | ||||
| VOID FspIopDeleteRequest(FSP_FSCTL_TRANSACT_REQ *Request); | ||||
| VOID FspIopResetRequest(FSP_FSCTL_TRANSACT_REQ *Request, FSP_IOP_REQUEST_FINI *RequestFini); | ||||
| PVOID *FspIopRequestContextAddress(FSP_FSCTL_TRANSACT_REQ *Request, ULONG I); | ||||
|   | ||||
| @@ -8,8 +8,7 @@ | ||||
|  | ||||
| NTSTATUS FspIopCreateRequestFunnel( | ||||
|     PIRP Irp, PUNICODE_STRING FileName, ULONG ExtraSize, FSP_IOP_REQUEST_FINI *RequestFini, | ||||
|     BOOLEAN MustSucceed, | ||||
|     FSP_FSCTL_TRANSACT_REQ **PRequest); | ||||
|     ULONG Flags, FSP_FSCTL_TRANSACT_REQ **PRequest); | ||||
| VOID FspIopDeleteRequest(FSP_FSCTL_TRANSACT_REQ *Request); | ||||
| VOID FspIopResetRequest(FSP_FSCTL_TRANSACT_REQ *Request, FSP_IOP_REQUEST_FINI *RequestFini); | ||||
| PVOID *FspIopRequestContextAddress(FSP_FSCTL_TRANSACT_REQ *Request, ULONG I); | ||||
| @@ -49,8 +48,7 @@ typedef struct | ||||
|  | ||||
| NTSTATUS FspIopCreateRequestFunnel( | ||||
|     PIRP Irp, PUNICODE_STRING FileName, ULONG ExtraSize, FSP_IOP_REQUEST_FINI *RequestFini, | ||||
|     BOOLEAN MustSucceed, | ||||
|     FSP_FSCTL_TRANSACT_REQ **PRequest) | ||||
|     ULONG Flags, FSP_FSCTL_TRANSACT_REQ **PRequest) | ||||
| { | ||||
|     PAGED_CODE(); | ||||
|  | ||||
| @@ -65,11 +63,17 @@ NTSTATUS FspIopCreateRequestFunnel( | ||||
|     if (FSP_FSCTL_TRANSACT_REQ_SIZEMAX < sizeof *Request + ExtraSize) | ||||
|         return STATUS_INVALID_PARAMETER; | ||||
|  | ||||
|     if (MustSucceed) | ||||
|         RequestHeader = FspAllocMustSucceed(sizeof *RequestHeader + sizeof *Request + ExtraSize); | ||||
|     if (FlagOn(Flags, FspIopRequestMustSucceed)) | ||||
|         RequestHeader = FspAllocatePoolMustSucceed( | ||||
|             FlagOn(Flags, FspIopRequestNonPaged) ? NonPagedPool : PagedPool, | ||||
|             sizeof *RequestHeader + sizeof *Request + ExtraSize, | ||||
|             FSP_ALLOC_INTERNAL_TAG); | ||||
|     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) | ||||
|             return STATUS_INSUFFICIENT_RESOURCES; | ||||
|     } | ||||
|   | ||||
| @@ -45,7 +45,7 @@ static const LONG Delays[] = | ||||
|     -1000, | ||||
| }; | ||||
|  | ||||
| PVOID FspAllocMustSucceed(SIZE_T Size) | ||||
| PVOID FspAllocatePoolMustSucceed(POOL_TYPE PoolType, SIZE_T Size, ULONG Tag) | ||||
| { | ||||
|     // !PAGED_CODE(); | ||||
|  | ||||
| @@ -54,7 +54,7 @@ PVOID FspAllocMustSucceed(SIZE_T Size) | ||||
|  | ||||
|     for (ULONG i = 0, n = sizeof(Delays) / sizeof(Delays[0]);; i++) | ||||
|     { | ||||
|         Result = FspAlloc(Size); | ||||
|         Result = ExAllocatePoolWithTag(PoolType, Size, Tag); | ||||
|         if (0 != Result) | ||||
|             return Result; | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user