- From c9c63d3511086432569557eb5ff3f3ed8ff30d16 Mon Sep 17 00:00:00 2001
- From: Roland Mainz <roland.mainz@nrubsig.org>
- Date: Tue, 21 Oct 2025 16:01:08 +0200
- Subject: [PATCH] sys: Add wrapper functions for memory mapping/page locking
- Add wrapper functions for memory mapping/page locking to simplify code.
- Signed-off-by: Cedric Blancher <cedric.blancher@gmail.com>
- ---
- sys/nfs41sys_dir.c | 54 ++++++++++++---------------
- sys/nfs41sys_fsctl.c | 64 ++++++++++++++------------------
- sys/nfs41sys_openclose.c | 62 +++++++++++++++----------------
- sys/nfs41sys_readwrite.c | 76 ++++++++++++++++----------------------
- sys/nfs41sys_updowncall.c | 12 ++++--
- sys/nfs41sys_util.c | 78 +++++++++++++++++++++++++++++++++++++++
- sys/nfs41sys_util.h | 14 ++++++-
- 7 files changed, 212 insertions(+), 148 deletions(-)
- diff --git a/sys/nfs41sys_dir.c b/sys/nfs41sys_dir.c
- index 75b2820..6cdcbfc 100644
- --- a/sys/nfs41sys_dir.c
- +++ b/sys/nfs41sys_dir.c
- @@ -101,26 +101,20 @@ NTSTATUS marshal_nfs41_dirquery(
- tmp += sizeof(BOOLEAN);
- RtlCopyMemory(tmp, &entry->u.QueryFile.return_single, sizeof(BOOLEAN));
- tmp += sizeof(BOOLEAN);
- - __try {
- - entry->u.QueryFile.mdl_buf =
- - MmMapLockedPagesSpecifyCache(entry->u.QueryFile.mdl,
- - UserMode, MmCached, NULL, FALSE,
- - NormalPagePriority|MdlMappingNoExecute);
- - if (entry->u.QueryFile.mdl_buf == NULL) {
- - print_error("marshal_nfs41_dirquery: "
- - "MmMapLockedPagesSpecifyCache() failed to map pages\n");
- - status = STATUS_INSUFFICIENT_RESOURCES;
- - goto out;
- - }
- - } __except(EXCEPTION_EXECUTE_HANDLER) {
- - NTSTATUS code;
- - code = GetExceptionCode();
- - print_error("marshal_nfs41_dirquery: Call to "
- - "MmMapLockedPagesSpecifyCache() failed "
- - "due to exception 0x%lx\n", (long)code);
- - status = STATUS_ACCESS_VIOLATION;
- +
- + status = nfs41_MapLockedPagesInNfsDaemonAddressSpace(
- + &entry->u.QueryFile.mdl_buf,
- + entry->u.QueryFile.mdl,
- + MmCached,
- + NormalPagePriority|MdlMappingNoExecute);
- + if (status != STATUS_SUCCESS) {
- + print_error("marshal_nfs41_dirquery: "
- + "nfs41_MapLockedPagesInNfsDaemonAddressSpace() failed, "
- + "status=0x%lx\n",
- + (long)status);
- goto out;
- }
- +
- RtlCopyMemory(tmp, &entry->u.QueryFile.mdl_buf, sizeof(HANDLE));
- *len = header_len;
- @@ -147,16 +141,9 @@ NTSTATUS unmarshal_nfs41_dirquery(
- DbgP("unmarshal_nfs41_dirquery: reply size %d\n", buf_len);
- #endif
- *buf += sizeof(ULONG);
- - __try {
- - MmUnmapLockedPages(cur->u.QueryFile.mdl_buf, cur->u.QueryFile.mdl);
- - cur->u.QueryFile.mdl_buf = NULL;
- - } __except(EXCEPTION_EXECUTE_HANDLER) {
- - NTSTATUS code;
- - code = GetExceptionCode();
- - print_error("MmUnmapLockedPages thrown exception=0x%lx\n",
- - (long)code);
- - status = STATUS_ACCESS_VIOLATION;
- - }
- + (void)nfs41_UnmapLockedKernelPagesInNfsDaemonAddressSpace(
- + cur->u.QueryFile.mdl_buf,
- + cur->u.QueryFile.mdl);
- if (buf_len > cur->buf_len)
- cur->status = STATUS_BUFFER_TOO_SMALL;
- cur->buf_len = buf_len;
- @@ -283,7 +270,14 @@ NTSTATUS nfs41_QueryDirectory(
- entry->u.QueryFile.mdl->MdlFlags |= MDL_MAPPING_CAN_FAIL;
- #pragma warning( pop )
- - MmProbeAndLockPages(entry->u.QueryFile.mdl, KernelMode, IoModifyAccess);
- + status = nfs41_ProbeAndLockKernelPages(entry->u.QueryFile.mdl,
- + IoModifyAccess);
- + if (status) {
- + DbgP("nfs41_QueryDirectory: "
- + "nfs41_ProbeAndLockKernelPages() failed, status=0x%lx\n",
- + (long)status);
- + goto out;
- + }
- entry->u.QueryFile.filter = Filter;
- entry->u.QueryFile.initial_query = RxContext->QueryDirectory.InitialQuery;
- @@ -292,7 +286,7 @@ NTSTATUS nfs41_QueryDirectory(
- status = nfs41_UpcallWaitForReply(entry, pVNetRootContext->timeout);
- - MmUnlockPages(entry->u.QueryFile.mdl);
- + (void)nfs41_UnlockKernelPages(entry->u.QueryFile.mdl);
- if (status) {
- /* Timeout - |nfs41_downcall()| will free |entry|+contents */
- diff --git a/sys/nfs41sys_fsctl.c b/sys/nfs41sys_fsctl.c
- index 0e1ba89..de9eb2d 100644
- --- a/sys/nfs41sys_fsctl.c
- +++ b/sys/nfs41sys_fsctl.c
- @@ -186,9 +186,15 @@ NTSTATUS nfs41_QueryAllocatedRanges(
- entry->u.QueryAllocatedRanges.BufferMdl->MdlFlags |=
- MDL_MAPPING_CAN_FAIL;
- #pragma warning( pop )
- - MmProbeAndLockPages(entry->u.QueryAllocatedRanges.BufferMdl,
- - KernelMode,
- + status = nfs41_ProbeAndLockKernelPages(
- + entry->u.QueryAllocatedRanges.BufferMdl,
- IoModifyAccess);
- + if (status) {
- + DbgP("nfs41_QueryAllocatedRanges: "
- + "nfs41_ProbeAndLockKernelPages() failed, status=0x%lx\n",
- + (long)status);
- + goto out;
- + }
- status = nfs41_UpcallWaitForReply(entry, pVNetRootContext->timeout);
- if (status) {
- @@ -229,7 +235,8 @@ NTSTATUS nfs41_QueryAllocatedRanges(
- out:
- if (entry) {
- if (entry->u.QueryAllocatedRanges.BufferMdl) {
- - MmUnlockPages(entry->u.QueryAllocatedRanges.BufferMdl);
- + (void)nfs41_UnlockKernelPages(
- + entry->u.QueryAllocatedRanges.BufferMdl);
- IoFreeMdl(entry->u.QueryAllocatedRanges.BufferMdl);
- entry->u.QueryAllocatedRanges.BufferMdl = NULL;
- }
- @@ -270,27 +277,19 @@ NTSTATUS marshal_nfs41_queryallocatedranges(
- sizeof(entry->u.QueryAllocatedRanges.BufferSize));
- tmp += sizeof(entry->u.QueryAllocatedRanges.BufferSize);
- - __try {
- - if (entry->u.QueryAllocatedRanges.BufferMdl) {
- - entry->u.QueryAllocatedRanges.Buffer =
- - MmMapLockedPagesSpecifyCache(
- - entry->u.QueryAllocatedRanges.BufferMdl,
- - UserMode, MmCached, NULL, FALSE,
- - NormalPagePriority|MdlMappingNoExecute);
- - if (entry->u.QueryAllocatedRanges.Buffer == NULL) {
- - print_error("marshal_nfs41_queryallocatedranges: "
- - "MmMapLockedPagesSpecifyCache() failed to "
- - "map pages\n");
- - status = STATUS_INSUFFICIENT_RESOURCES;
- - goto out;
- - }
- + if (entry->u.QueryAllocatedRanges.BufferMdl) {
- + status = nfs41_MapLockedPagesInNfsDaemonAddressSpace(
- + &entry->u.QueryAllocatedRanges.Buffer,
- + entry->u.QueryAllocatedRanges.BufferMdl,
- + MmCached,
- + NormalPagePriority|MdlMappingNoExecute);
- + if (status != STATUS_SUCCESS) {
- + print_error("marshal_nfs41_queryallocatedranges: "
- + "nfs41_MapLockedPagesInNfsDaemonAddressSpace() failed, "
- + "status=0x%lx\n",
- + (long)status);
- + goto out;
- }
- - } __except(EXCEPTION_EXECUTE_HANDLER) {
- - print_error("marshal_nfs41_queryallocatedranges: Call to "
- - "MmMapLockedPagesSpecifyCache() failed "
- - "due to exception 0x%lx\n", (long)GetExceptionCode());
- - status = STATUS_ACCESS_VIOLATION;
- - goto out;
- }
- RtlCopyMemory(tmp, &entry->u.QueryAllocatedRanges.Buffer,
- sizeof(HANDLE));
- @@ -311,19 +310,11 @@ NTSTATUS unmarshal_nfs41_queryallocatedranges(
- {
- NTSTATUS status = STATUS_SUCCESS;
- - __try {
- - if (cur->u.QueryAllocatedRanges.Buffer) {
- - MmUnmapLockedPages(
- - cur->u.QueryAllocatedRanges.Buffer,
- - cur->u.QueryAllocatedRanges.BufferMdl);
- - cur->u.QueryAllocatedRanges.Buffer = NULL;
- - }
- - } __except(EXCEPTION_EXECUTE_HANDLER) {
- - print_error("unmarshal_nfs41_queryallocatedranges: "
- - "MmUnmapLockedPages thrown exception=0x%lx\n",
- - (long)GetExceptionCode());
- - status = cur->status = STATUS_ACCESS_VIOLATION;
- - goto out;
- + if (cur->u.QueryAllocatedRanges.Buffer) {
- + (void)nfs41_UnmapLockedKernelPagesInNfsDaemonAddressSpace(
- + cur->u.QueryAllocatedRanges.Buffer,
- + cur->u.QueryAllocatedRanges.BufferMdl);
- + cur->u.QueryAllocatedRanges.Buffer = NULL;
- }
- RtlCopyMemory(&cur->u.QueryAllocatedRanges.buffer_overflow,
- @@ -338,7 +329,6 @@ NTSTATUS unmarshal_nfs41_queryallocatedranges(
- (int)cur->u.QueryAllocatedRanges.buffer_overflow,
- cur->u.QueryAllocatedRanges.returned_size);
- -out:
- return status;
- }
- diff --git a/sys/nfs41sys_openclose.c b/sys/nfs41sys_openclose.c
- index a7dbcc2..4f71146 100644
- --- a/sys/nfs41sys_openclose.c
- +++ b/sys/nfs41sys_openclose.c
- @@ -158,26 +158,22 @@ NTSTATUS marshal_nfs41_open(
- status = marshall_unicode_as_utf8(&tmp, &entry->u.Open.symlink);
- if (status) goto out;
- - __try {
- - if (entry->u.Open.EaMdl) {
- - entry->u.Open.EaBuffer =
- - MmMapLockedPagesSpecifyCache(entry->u.Open.EaMdl,
- - UserMode, MmCached, NULL, FALSE,
- - NormalPagePriority|MdlMappingNoExecute);
- - if (entry->u.Open.EaBuffer == NULL) {
- - print_error("marshal_nfs41_open: "
- - "MmMapLockedPagesSpecifyCache() failed to "
- - "map pages\n");
- - status = STATUS_INSUFFICIENT_RESOURCES;
- - goto out;
- - }
- + if (entry->u.Open.EaMdl) {
- + status = nfs41_MapLockedPagesInNfsDaemonAddressSpace(
- + &entry->u.Open.EaBuffer,
- + entry->u.Open.EaMdl,
- + MmCached,
- + NormalPagePriority|MdlMappingNoExecute);
- + if (status != STATUS_SUCCESS) {
- + print_error("marshal_nfs41_open: "
- + "nfs41_MapLockedPagesInNfsDaemonAddressSpace() failed, "
- + "status=0x%lx\n",
- + (long)status);
- + goto out;
- }
- - } __except(EXCEPTION_EXECUTE_HANDLER) {
- - print_error("marshal_nfs41_open: Call to "
- - "MmMapLockedPagesSpecifyCache() failed "
- - "due to exception 0x%lx\n", (long)GetExceptionCode());
- - status = STATUS_ACCESS_VIOLATION;
- - goto out;
- + }
- + else {
- + entry->u.Open.EaBuffer = NULL;
- }
- RtlCopyMemory(tmp, &entry->u.Open.EaBuffer, sizeof(HANDLE));
- *len = header_len;
- @@ -244,16 +240,10 @@ NTSTATUS unmarshal_nfs41_open(
- {
- NTSTATUS status = STATUS_SUCCESS;
- - __try {
- - if (cur->u.Open.EaBuffer) {
- - MmUnmapLockedPages(cur->u.Open.EaBuffer, cur->u.Open.EaMdl);
- - cur->u.Open.EaBuffer = NULL;
- - }
- - } __except(EXCEPTION_EXECUTE_HANDLER) {
- - print_error("MmUnmapLockedPages thrown exception=0x%lx\n",
- - (long)GetExceptionCode());
- - status = cur->status = STATUS_ACCESS_VIOLATION;
- - goto out;
- + if (cur->u.Open.EaBuffer) {
- + (void)nfs41_UnmapLockedKernelPagesInNfsDaemonAddressSpace(
- + cur->u.Open.EaBuffer, cur->u.Open.EaMdl);
- + cur->u.Open.EaBuffer = NULL;
- }
- RtlCopyMemory(&cur->u.Open.binfo, *buf, sizeof(FILE_BASIC_INFORMATION));
- @@ -741,13 +731,23 @@ retry_on_link:
- #pragma warning (disable : 28145)
- entry->u.Open.EaMdl->MdlFlags |= MDL_MAPPING_CAN_FAIL;
- #pragma warning( pop )
- - MmProbeAndLockPages(entry->u.Open.EaMdl, KernelMode, IoModifyAccess);
- + status = nfs41_ProbeAndLockKernelPages(entry->u.Open.EaMdl,
- + IoModifyAccess);
- + if (status) {
- + DbgP("nfs41_Create: "
- + "nfs41_ProbeAndLockKernelPages() failed, status=0x%lx\n",
- + (long)status);
- + goto out;
- + }
- + }
- + else {
- + entry->u.Open.EaMdl = NULL;
- }
- status = nfs41_UpcallWaitForReply(entry, pVNetRootContext->timeout);
- if (entry->u.Open.EaMdl) {
- - MmUnlockPages(entry->u.Open.EaMdl);
- + (void)nfs41_UnlockKernelPages(entry->u.Open.EaMdl);
- IoFreeMdl(entry->u.Open.EaMdl);
- entry->u.Open.EaMdl = NULL;
- }
- diff --git a/sys/nfs41sys_readwrite.c b/sys/nfs41sys_readwrite.c
- index f1eface..f0c8beb 100644
- --- a/sys/nfs41sys_readwrite.c
- +++ b/sys/nfs41sys_readwrite.c
- @@ -109,43 +109,37 @@ NTSTATUS marshal_nfs41_rw(
- RtlCopyMemory(tmp, &entry->u.ReadWrite.offset,
- sizeof(entry->u.ReadWrite.offset));
- tmp += sizeof(entry->u.ReadWrite.offset);
- - __try {
- +
- #pragma warning( push )
- /*
- * C28145: "The opaque MDL structure should not be modified by a
- * driver.", |MDL_MAPPING_CAN_FAIL| is the exception
- */
- #pragma warning (disable : 28145)
- - entry->u.ReadWrite.MdlAddress->MdlFlags |= MDL_MAPPING_CAN_FAIL;
- + entry->u.ReadWrite.MdlAddress->MdlFlags |= MDL_MAPPING_CAN_FAIL;
- #pragma warning( pop )
- - ULONG prio_writeflags = 0;
- -
- - /*
- - * The userland daemon will only read from this memory for
- - * "write" requests, so make it read-only
- - */
- - if (entry->opcode == NFS41_SYSOP_WRITE)
- - prio_writeflags |= MdlMappingNoWrite;
- -
- - entry->buf =
- - MmMapLockedPagesSpecifyCache(entry->u.ReadWrite.MdlAddress,
- - UserMode, MmCached, NULL, FALSE,
- - (NormalPagePriority|prio_writeflags));
- - if (entry->buf == NULL) {
- - print_error("marshal_nfs41_rw: "
- - "MmMapLockedPagesSpecifyCache() failed to map pages\n");
- - status = STATUS_INSUFFICIENT_RESOURCES;
- - goto out;
- - }
- - } __except(EXCEPTION_EXECUTE_HANDLER) {
- - NTSTATUS code;
- - code = GetExceptionCode();
- - print_error("marshal_nfs41_rw: Call to "
- - "MmMapLockedPagesSpecifyCache() failed due to "
- - "exception 0x%lx\n", (long)code);
- - status = STATUS_ACCESS_VIOLATION;
- + ULONG prio_writeflags = 0;
- +
- + /*
- + * The userland daemon will only read from this memory for
- + * "write" requests, so make it read-only
- + */
- + if (entry->opcode == NFS41_SYSOP_WRITE)
- + prio_writeflags |= MdlMappingNoWrite;
- +
- + status = nfs41_MapLockedPagesInNfsDaemonAddressSpace(
- + &entry->buf,
- + entry->u.ReadWrite.MdlAddress,
- + MmCached,
- + (NormalPagePriority|prio_writeflags));
- + if (status != STATUS_SUCCESS) {
- + print_error("marshal_nfs41_rw: "
- + "nfs41_MapLockedPagesInNfsDaemonAddressSpace() failed, "
- + "status=0x%lx\n",
- + (long)status);
- goto out;
- }
- +
- RtlCopyMemory(tmp, &entry->buf, sizeof(HANDLE));
- *len = header_len;
- @@ -174,23 +168,15 @@ NTSTATUS unmarshal_nfs41_rw(
- cur->buf_len, cur->ChangeTime);
- #endif
- #if 1
- - /* 08/27/2010: it looks like we really don't need to call
- - * MmUnmapLockedPages() eventhough we called
- - * MmMapLockedPagesSpecifyCache() as the MDL passed to us
- - * is already locked.
- - */
- - __try {
- - if (cur->buf) {
- - MmUnmapLockedPages(cur->buf, cur->u.ReadWrite.MdlAddress);
- - cur->buf = NULL;
- - }
- - } __except(EXCEPTION_EXECUTE_HANDLER) {
- - NTSTATUS code;
- - code = GetExceptionCode();
- - print_error("unmarshal_nfs41_rw: Call to MmUnmapLockedPages() "
- - "failed due to exception 0x%0x\n", (long)code);
- - status = STATUS_ACCESS_VIOLATION;
- - }
- + /*
- + * 08/27/2010: it looks like we really don't need to call
- + * MmUnmapLockedPages() eventhough we called
- + * MmMapLockedPagesSpecifyCache() as the MDL passed to us
- + * is already locked.
- + */
- + (void)nfs41_UnmapLockedKernelPagesInNfsDaemonAddressSpace(cur->buf,
- + cur->u.ReadWrite.MdlAddress);
- + cur->buf = NULL;
- #endif
- return status;
- }
- diff --git a/sys/nfs41sys_updowncall.c b/sys/nfs41sys_updowncall.c
- index 30a5793..aba635b 100644
- --- a/sys/nfs41sys_updowncall.c
- +++ b/sys/nfs41sys_updowncall.c
- @@ -681,13 +681,16 @@ NTSTATUS nfs41_downcall(
- case NFS41_SYSOP_WRITE:
- case NFS41_SYSOP_READ:
- if (cur->buf) {
- - MmUnmapLockedPages(cur->buf, cur->u.ReadWrite.MdlAddress);
- + (void)nfs41_UnmapLockedKernelPagesInNfsDaemonAddressSpace(
- + cur->buf,
- + cur->u.ReadWrite.MdlAddress);
- cur->buf = NULL;
- }
- break;
- case NFS41_SYSOP_DIR_QUERY:
- if (cur->u.QueryFile.mdl) {
- - MmUnmapLockedPages(cur->u.QueryFile.mdl_buf,
- + (void)nfs41_UnmapLockedKernelPagesInNfsDaemonAddressSpace(
- + cur->u.QueryFile.mdl_buf,
- cur->u.QueryFile.mdl);
- IoFreeMdl(cur->u.QueryFile.mdl);
- cur->u.QueryFile.mdl_buf = NULL;
- @@ -696,7 +699,8 @@ NTSTATUS nfs41_downcall(
- break;
- case NFS41_SYSOP_OPEN:
- if (cur->u.Open.EaMdl) {
- - MmUnmapLockedPages(cur->u.Open.EaBuffer,
- + (void)nfs41_UnmapLockedKernelPagesInNfsDaemonAddressSpace(
- + cur->u.Open.EaBuffer,
- cur->u.Open.EaMdl);
- IoFreeMdl(cur->u.Open.EaMdl);
- cur->u.Open.EaBuffer = NULL;
- @@ -705,7 +709,7 @@ NTSTATUS nfs41_downcall(
- break;
- case NFS41_SYSOP_FSCTL_QUERYALLOCATEDRANGES:
- if (cur->u.QueryAllocatedRanges.BufferMdl) {
- - MmUnmapLockedPages(
- + (void)nfs41_UnmapLockedKernelPagesInNfsDaemonAddressSpace(
- cur->u.QueryAllocatedRanges.Buffer,
- cur->u.QueryAllocatedRanges.BufferMdl);
- IoFreeMdl(cur->u.QueryAllocatedRanges.BufferMdl);
- diff --git a/sys/nfs41sys_util.c b/sys/nfs41sys_util.c
- index e6876b4..65c1990 100644
- --- a/sys/nfs41sys_util.c
- +++ b/sys/nfs41sys_util.c
- @@ -116,3 +116,81 @@ BOOLEAN is_root_directory(
- return RxContext->CurrentIrpSp->FileObject->FileName.Length <= RootPathLen;
- }
- +
- +NTSTATUS nfs41_ProbeAndLockKernelPages(
- + __inout PMDL MemoryDescriptorList,
- + __in LOCK_OPERATION Operation)
- +{
- + NTSTATUS status = STATUS_SUCCESS;
- +
- + __try {
- + MmProbeAndLockPages(MemoryDescriptorList, KernelMode, Operation);
- + } __except(EXCEPTION_EXECUTE_HANDLER) {
- + NTSTATUS code;
- + code = GetExceptionCode();
- + print_error("marshal_nfs41_dirquery: Call to "
- + "MmMapLockedPagesSpecifyCache() failed "
- + "due to exception 0x%lx\n", (long)code);
- + status = STATUS_ACCESS_VIOLATION;
- + }
- +
- + return status;
- +}
- +
- +NTSTATUS nfs41_UnlockKernelPages(
- + __inout PMDL MemoryDescriptorList)
- +{
- + NTSTATUS status = STATUS_SUCCESS;
- + MmUnlockPages(MemoryDescriptorList);
- + return status;
- +}
- +
- +NTSTATUS nfs41_MapLockedPagesInNfsDaemonAddressSpace(
- + __inout PVOID *outbuf,
- + __in PMDL MemoryDescriptorList,
- + __in MEMORY_CACHING_TYPE CacheType,
- + __in ULONG Priority)
- +{
- + NTSTATUS status = STATUS_SUCCESS;
- +
- + *outbuf = NULL;
- +
- + __try {
- + *outbuf =
- + MmMapLockedPagesSpecifyCache(MemoryDescriptorList,
- + UserMode, CacheType, NULL, FALSE, Priority);
- + if (*outbuf == NULL)
- + status = STATUS_INSUFFICIENT_RESOURCES;
- + } __except(EXCEPTION_EXECUTE_HANDLER) {
- + NTSTATUS code;
- + code = GetExceptionCode();
- + print_error("nfs41_MapLockedPagesInNfsDaemonAddressSpace: "
- + "Call to MmMapLockedPagesSpecifyCache() failed "
- + "due to exception 0x%lx\n", (long)code);
- + status = STATUS_ACCESS_VIOLATION;
- + goto out;
- + }
- +
- +out:
- + return status;
- +}
- +
- +NTSTATUS nfs41_UnmapLockedKernelPagesInNfsDaemonAddressSpace(
- + __in PVOID BaseAddress,
- + __in PMDL MemoryDescriptorList)
- +{
- + NTSTATUS status = STATUS_SUCCESS;
- +
- + __try {
- + MmUnmapLockedPages(BaseAddress, MemoryDescriptorList);
- + } __except(EXCEPTION_EXECUTE_HANDLER) {
- + NTSTATUS code;
- + code = GetExceptionCode();
- + print_error("nfs41_UnmapLockedKernelPages: "
- + "MmUnmapLockedPages thrown exception=0x%lx\n",
- + (long)code);
- + status = STATUS_ACCESS_VIOLATION;
- + }
- +
- + return status;
- +}
- diff --git a/sys/nfs41sys_util.h b/sys/nfs41sys_util.h
- index c1ade4c..6157195 100644
- --- a/sys/nfs41sys_util.h
- +++ b/sys/nfs41sys_util.h
- @@ -52,5 +52,17 @@ BOOLEAN isStream(
- PUNICODE_STRING name);
- BOOLEAN is_root_directory(
- PRX_CONTEXT RxContext);
- -
- +NTSTATUS nfs41_ProbeAndLockKernelPages(
- + __inout PMDL MemoryDescriptorList,
- + __in LOCK_OPERATION Operation);
- +NTSTATUS nfs41_UnlockKernelPages(
- + __inout PMDL MemoryDescriptorList);
- +NTSTATUS nfs41_MapLockedPagesInNfsDaemonAddressSpace(
- + __inout PVOID *outbuf,
- + __in PMDL MemoryDescriptorList,
- + __in MEMORY_CACHING_TYPE CacheType,
- + __in ULONG Priority);
- +NTSTATUS nfs41_UnmapLockedKernelPagesInNfsDaemonAddressSpace(
- + __in PVOID BaseAddress,
- + __in PMDL MemoryDescriptorList);
- #endif /* !_NFS41SYS_UTIL_H_ */
- --
- 2.51.0
msnfs41client: Patch to add wrapper functions for memory mapping+page locking, 2025-10-21
Posted by Anonymous on Tue 21st Oct 2025 15:32
raw | new post
Submit a correction or amendment below (click here to make a fresh posting)
After submitting an amendment, you'll be able to view the differences between the old and new posts easily.