mirror of
				https://github.com/winfsp/winfsp.git
				synced 2025-10-30 11:38:39 -05:00 
			
		
		
		
	sys: util: safe MDL bug fix
This commit is contained in:
		| @@ -738,24 +738,11 @@ static VOID FspQueueDelayedWorkItemDPC(PKDPC Dpc, | |||||||
|     ExQueueWorkItem(&DelayedWorkItem->WorkQueueItem, DelayedWorkQueue); |     ExQueueWorkItem(&DelayedWorkItem->WorkQueueItem, DelayedWorkQueue); | ||||||
| } | } | ||||||
|  |  | ||||||
| static inline PVOID FspGetMdlAddress(PMDL Mdl) |  | ||||||
| { |  | ||||||
|     PVOID VirtualAddress = MmGetMdlVirtualAddress(Mdl); |  | ||||||
|  |  | ||||||
|     if (0 == VirtualAddress) |  | ||||||
|         VirtualAddress = MmGetSystemAddressForMdlSafe(Mdl, NormalPagePriority); |  | ||||||
|  |  | ||||||
|     return VirtualAddress; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| BOOLEAN FspSafeMdlCheck(PMDL Mdl) | BOOLEAN FspSafeMdlCheck(PMDL Mdl) | ||||||
| { | { | ||||||
|     PAGED_CODE(); |     PAGED_CODE(); | ||||||
|  |  | ||||||
|     PVOID VirtualAddress = FspGetMdlAddress(Mdl); |     return 0 == MmGetMdlByteOffset(Mdl) && 0 == BYTE_OFFSET(MmGetMdlByteCount(Mdl)); | ||||||
|     ULONG ByteCount = MmGetMdlByteCount(Mdl); |  | ||||||
|  |  | ||||||
|     return 0 == BYTE_OFFSET(VirtualAddress) && 0 == BYTE_OFFSET(ByteCount); |  | ||||||
| } | } | ||||||
|  |  | ||||||
| NTSTATUS FspSafeMdlCreate(PMDL UserMdl, LOCK_OPERATION Operation, FSP_SAFE_MDL **PSafeMdl) | NTSTATUS FspSafeMdlCreate(PMDL UserMdl, LOCK_OPERATION Operation, FSP_SAFE_MDL **PSafeMdl) | ||||||
| @@ -763,7 +750,7 @@ NTSTATUS FspSafeMdlCreate(PMDL UserMdl, LOCK_OPERATION Operation, FSP_SAFE_MDL * | |||||||
|     PAGED_CODE(); |     PAGED_CODE(); | ||||||
|  |  | ||||||
|     NTSTATUS Result; |     NTSTATUS Result; | ||||||
|     PVOID VirtualAddress = FspGetMdlAddress(UserMdl); |     PVOID VirtualAddress = MmGetSystemAddressForMdlSafe(UserMdl, NormalPagePriority); | ||||||
|     ULONG ByteCount = MmGetMdlByteCount(UserMdl); |     ULONG ByteCount = MmGetMdlByteCount(UserMdl); | ||||||
|     ULONG PageCount = ADDRESS_AND_SIZE_TO_SPAN_PAGES(VirtualAddress, ByteCount); |     ULONG PageCount = ADDRESS_AND_SIZE_TO_SPAN_PAGES(VirtualAddress, ByteCount); | ||||||
|     FSP_SAFE_MDL *SafeMdl; |     FSP_SAFE_MDL *SafeMdl; | ||||||
| @@ -906,7 +893,7 @@ VOID FspSafeMdlCopyBack(FSP_SAFE_MDL *SafeMdl) | |||||||
|     if (IoReadAccess == SafeMdl->Operation) |     if (IoReadAccess == SafeMdl->Operation) | ||||||
|         return; |         return; | ||||||
|  |  | ||||||
|     PVOID VirtualAddress = FspGetMdlAddress(SafeMdl->UserMdl); |     PVOID VirtualAddress = MmGetSystemAddressForMdlSafe(SafeMdl->UserMdl, NormalPagePriority); | ||||||
|     ULONG ByteCount = MmGetMdlByteCount(SafeMdl->UserMdl); |     ULONG ByteCount = MmGetMdlByteCount(SafeMdl->UserMdl); | ||||||
|     ULONG PageCount = ADDRESS_AND_SIZE_TO_SPAN_PAGES(VirtualAddress, ByteCount); |     ULONG PageCount = ADDRESS_AND_SIZE_TO_SPAN_PAGES(VirtualAddress, ByteCount); | ||||||
|     ULONG ByteOffsetBgn0, ByteOffsetEnd0, ByteOffsetEnd1; |     ULONG ByteOffsetBgn0, ByteOffsetEnd0, ByteOffsetEnd1; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user