diff --git a/src/sys/driver.h b/src/sys/driver.h index 7c2b11f2..c5941ffc 100644 --- a/src/sys/driver.h +++ b/src/sys/driver.h @@ -655,13 +655,14 @@ enum #define FspIopPostWorkRequestBestEffort(D, R)\ FspIopPostWorkRequestFunnel(D, R, TRUE) #define FspIopCompleteIrp(I, R) FspIopCompleteIrpEx(I, R, TRUE) +#define REQ_ALIGN_SIZE 16 typedef VOID FSP_IOP_REQUEST_FINI(FSP_FSCTL_TRANSACT_REQ *Request, PVOID Context[4]); typedef struct { FSP_IOP_REQUEST_FINI *RequestFini; PVOID Context[4]; FSP_FSCTL_TRANSACT_RSP *Response; - __declspec(align(MEMORY_ALLOCATION_ALIGNMENT)) UINT8 RequestBuf[]; + __declspec(align(REQ_ALIGN_SIZE)) UINT8 RequestBuf[]; } FSP_FSCTL_TRANSACT_REQ_HEADER; static inline PVOID *FspIopRequestContextAddress(FSP_FSCTL_TRANSACT_REQ *Request, ULONG I) diff --git a/src/sys/iop.c b/src/sys/iop.c index 4060ebac..cdc1f68f 100644 --- a/src/sys/iop.c +++ b/src/sys/iop.c @@ -48,10 +48,12 @@ NTSTATUS FspIopDispatchComplete(PIRP Irp, const FSP_FSCTL_TRANSACT_RSP *Response #endif /* Requests (and RequestHeaders) must be 16-byte aligned, because we use the low 4 bits for flags */ -#if 16 != MEMORY_ALLOCATION_ALIGNMENT -#define REQ_HEADER_ALIGNMASK 15 +#if REQ_ALIGN_SIZE <= MEMORY_ALLOCATION_ALIGNMENT +#define REQ_HEADER_ALIGN_MASK 0 +#define REQ_HEADER_ALIGN_OVERHEAD 0 #else -#define REQ_HEADER_ALIGNMASK 0 +#define REQ_HEADER_ALIGN_MASK (REQ_ALIGN_SIZE - 1) +#define REQ_HEADER_ALIGN_OVERHEAD (sizeof(PVOID) + REQ_HEADER_ALIGN_MASK) #endif NTSTATUS FspIopCreateRequestFunnel( @@ -74,20 +76,23 @@ NTSTATUS FspIopCreateRequestFunnel( if (FlagOn(Flags, FspIopRequestMustSucceed)) RequestHeader = FspAllocatePoolMustSucceed( FlagOn(Flags, FspIopRequestNonPaged) ? NonPagedPool : PagedPool, - sizeof *RequestHeader + sizeof *Request + ExtraSize + REQ_HEADER_ALIGNMASK, + sizeof *RequestHeader + sizeof *Request + ExtraSize + REQ_HEADER_ALIGN_OVERHEAD, FSP_ALLOC_INTERNAL_TAG); else { RequestHeader = ExAllocatePoolWithTag( FlagOn(Flags, FspIopRequestNonPaged) ? NonPagedPool : PagedPool, - sizeof *RequestHeader + sizeof *Request + ExtraSize + REQ_HEADER_ALIGNMASK, + sizeof *RequestHeader + sizeof *Request + ExtraSize + REQ_HEADER_ALIGN_OVERHEAD, FSP_ALLOC_INTERNAL_TAG); if (0 == RequestHeader) return STATUS_INSUFFICIENT_RESOURCES; } -#if 0 != REQ_HEADER_ALIGNMASK - RequestHeader = (PVOID)(((UINT_PTR)RequestHeader + REQ_HEADER_ALIGNMASK) & REQ_HEADER_ALIGNMASK); +#if 0 != REQ_HEADER_ALIGN_MASK + PVOID Allocation = RequestHeader; + RequestHeader = (PVOID)(((UINT_PTR)RequestHeader + REQ_HEADER_ALIGN_OVERHEAD) & + ~REQ_HEADER_ALIGN_MASK); + ((PVOID *)RequestHeader)[-1] = Allocation; #endif RtlZeroMemory(RequestHeader, sizeof *RequestHeader + sizeof *Request + ExtraSize); @@ -127,6 +132,10 @@ VOID FspIopDeleteRequest(FSP_FSCTL_TRANSACT_REQ *Request) if (0 != RequestHeader->Response) FspFree(RequestHeader->Response); +#if 0 != REQ_HEADER_ALIGN_MASK + RequestHeader = ((PVOID *)RequestHeader)[-1]; +#endif + FspFree(RequestHeader); }