Index: /trunk/src/VBox/Runtime/r0drv/darwin/memobj-r0drv-darwin.cpp
===================================================================
--- /trunk/src/VBox/Runtime/r0drv/darwin/memobj-r0drv-darwin.cpp	(revision 217)
+++ /trunk/src/VBox/Runtime/r0drv/darwin/memobj-r0drv-darwin.cpp	(revision 218)
@@ -61,4 +61,6 @@
     if (pMemDarwin->pMemDesc)
     {
+        if (pMemDarwin->Core.enmType == RTR0MEMOBJTYPE_LOCK)
+            pMemDarwin->pMemDesc->complete();
         pMemDarwin->pMemDesc->release();
         pMemDarwin->pMemDesc = NULL;
@@ -88,6 +90,4 @@
 
         case RTR0MEMOBJTYPE_LOCK:
-            AssertMsgFailed(("RTR0MEMOBJTYPE_LOCK\n"));
-            return VERR_INTERNAL_ERROR;
             break;
 
@@ -332,5 +332,32 @@
 int rtR0MemObjNativeLockUser(PPRTR0MEMOBJINTERNAL ppMem, void *pv, size_t cb)
 {
-    return VERR_NOT_IMPLEMENTED;
+    Assert(current_task() != kernel_task);
+    int rc = VERR_MEMOBJ_INIT_FAILED;
+    IOMemoryDescriptor *pMemDesc = IOMemoryDescriptor::withAddress((vm_address_t)pv, cb, kIODirectionInOut, current_task());
+    if (pMemDesc)
+    {
+        IOReturn IORet = pMemDesc->prepare(kIODirectionInOut);
+        if (IORet == kIOReturnSuccess)
+        {
+            /*
+             * Create the IPRT memory object.
+             */
+            PRTR0MEMOBJDARWIN pMemDarwin = (PRTR0MEMOBJDARWIN)rtR0MemObjNew(sizeof(*pMemDarwin), RTR0MEMOBJTYPE_LOCK, pv, cb);
+            if (pMemDarwin)
+            {
+                pMemDarwin->Core.u.Lock.Process = (RTPROCESS)current_task();
+                pMemDarwin->pMemDesc = pMemDesc;
+                *ppMem = &pMemDarwin->Core;
+                return VINF_SUCCESS;
+            }
+
+            pMemDesc->complete();
+            rc = VERR_NO_MEMORY;
+        }
+        else
+            rc = VERR_LOCK_FAILED;
+        pMemDesc->release();
+    }
+    return rc;
 }
 
@@ -338,5 +365,31 @@
 int rtR0MemObjNativeLockKernel(PPRTR0MEMOBJINTERNAL ppMem, void *pv, size_t cb)
 {
-    return VERR_NOT_IMPLEMENTED;
+    int rc = VERR_MEMOBJ_INIT_FAILED;
+    IOMemoryDescriptor *pMemDesc = IOMemoryDescriptor::withAddress((vm_address_t)pv, cb, kIODirectionInOut, kernel_task);
+    if (pMemDesc)
+    {
+        IOReturn IORet = pMemDesc->prepare(kIODirectionInOut);
+        if (IORet == kIOReturnSuccess)
+        {
+            /*
+             * Create the IPRT memory object.
+             */
+            PRTR0MEMOBJDARWIN pMemDarwin = (PRTR0MEMOBJDARWIN)rtR0MemObjNew(sizeof(*pMemDarwin), RTR0MEMOBJTYPE_LOCK, pv, cb);
+            if (pMemDarwin)
+            {
+                pMemDarwin->Core.u.Lock.Process = NIL_RTPROCESS;
+                pMemDarwin->pMemDesc = pMemDesc;
+                *ppMem = &pMemDarwin->Core;
+                return VINF_SUCCESS;
+            }
+
+            pMemDesc->complete();
+            rc = VERR_NO_MEMORY;
+        }
+        else
+            rc = VERR_LOCK_FAILED;
+        pMemDesc->release();
+    }
+    return rc;
 }
 
