Christian Costa : ntoskrnl.exe: Implement IoAllocateMdl.

Alexandre Julliard julliard at winehq.org
Tue Oct 2 14:09:39 CDT 2012


Module: wine
Branch: master
Commit: 5c65471681cad45c21fd80b8bb243590dc032470
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=5c65471681cad45c21fd80b8bb243590dc032470

Author: Christian Costa <titan.costa at gmail.com>
Date:   Tue Oct  2 00:09:51 2012 +0200

ntoskrnl.exe: Implement IoAllocateMdl.

---

 dlls/ntoskrnl.exe/ntoskrnl.c |   25 +++++++++++++++++++++++--
 1 files changed, 23 insertions(+), 2 deletions(-)

diff --git a/dlls/ntoskrnl.exe/ntoskrnl.c b/dlls/ntoskrnl.exe/ntoskrnl.c
index 2cf7983..ba2034d 100644
--- a/dlls/ntoskrnl.exe/ntoskrnl.c
+++ b/dlls/ntoskrnl.exe/ntoskrnl.c
@@ -415,13 +415,34 @@ PVOID WINAPI IoAllocateErrorLogEntry( PVOID IoObject, UCHAR EntrySize )
 PMDL WINAPI IoAllocateMdl( PVOID VirtualAddress, ULONG Length, BOOLEAN SecondaryBuffer, BOOLEAN ChargeQuota, PIRP Irp )
 {
     PMDL mdl;
+    ULONG_PTR address = (ULONG_PTR)VirtualAddress;
+    ULONG_PTR page_address;
+    SIZE_T nb_pages, mdl_size;
 
-    FIXME("partial stub: %p, %u, %i, %i, %p\n", VirtualAddress, Length, SecondaryBuffer, ChargeQuota, Irp);
+    TRACE("(%p, %u, %i, %i, %p)\n", VirtualAddress, Length, SecondaryBuffer, ChargeQuota, Irp);
 
-    mdl = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(MDL));
+    if (Irp)
+        FIXME("Attaching the MDL to an IRP is not yet supported\n");
+
+    if (ChargeQuota)
+        FIXME("Charge quota is not yet supported\n");
+
+    /* FIXME: We suppose that page size is 4096 */
+    page_address = address & ~(4096 - 1);
+    nb_pages = (((address + Length - 1) & ~(4096 - 1)) - page_address) / 4096 + 1;
+
+    mdl_size = sizeof(MDL) + nb_pages * sizeof(PVOID);
+
+    mdl = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, mdl_size);
     if (!mdl)
         return NULL;
 
+    mdl->Size = mdl_size;
+    mdl->Process = IoGetCurrentProcess();
+    mdl->StartVa = (PVOID)page_address;
+    mdl->ByteCount = Length;
+    mdl->ByteOffset = address - page_address;
+
     return mdl;
 }
 




More information about the wine-cvs mailing list