Index: trunk/src/VBox/HostDrivers/VBoxNetFlt/darwin/VBoxNetFlt-darwin.cpp
===================================================================
--- trunk/src/VBox/HostDrivers/VBoxNetFlt/darwin/VBoxNetFlt-darwin.cpp	(revision 28069)
+++ trunk/src/VBox/HostDrivers/VBoxNetFlt/darwin/VBoxNetFlt-darwin.cpp	(revision 28070)
@@ -386,24 +386,25 @@
         {
             mbuf_setlen(pCur, pSG->cbTotal);
-            memcpy(mbuf_data(pCur), pSG->aSegs[0].pv, pSG->cbTotal);
+            INTNETSgRead(pSG, mbuf_data(pCur));
         }
         else
         {
             /* Multi buffer copying. */
-            size_t         cbSrc = pSG->cbTotal;
-            uint8_t const *pbSrc = (uint8_t const *)pSG->aSegs[0].pv;
-            while (cbSrc > 0 && pCur)
+            size_t  cbLeft = pSG->cbTotal;
+            size_t  offSrc = 0;
+            while (cbLeft > 0 && pCur)
             {
                 size_t cb = mbuf_maxlen(pCur);
-                if (cbSrc < cb)
-                    cb = cbSrc;
+                if (cb > cbLeft)
+                    cb = cbLeft;
                 mbuf_setlen(pCur, cb);
-                memcpy(mbuf_data(pCur), pbSrc, cb);
+                INTNETSgReadEx(pSG, off, cb, mbuf_data(pCur));
 
                 /* advance */
-                pbSrc += cb;
-                cbSrc -= cb;
+                offSrc += cb;
+                cbLeft -= cb;
                 pCur = mbuf_next(pCur);
             }
+            Assert(cbSrc == 0);
         }
         if (!err)
Index: trunk/src/VBox/HostDrivers/VBoxNetFlt/freebsd/VBoxNetFlt-freebsd.c
===================================================================
--- trunk/src/VBox/HostDrivers/VBoxNetFlt/freebsd/VBoxNetFlt-freebsd.c	(revision 28069)
+++ trunk/src/VBox/HostDrivers/VBoxNetFlt/freebsd/VBoxNetFlt-freebsd.c	(revision 28070)
@@ -225,5 +225,5 @@
     unsigned int i;
 
-    if (pSG->cbTotal == 0 || pSG->aSegs[0].cb == 0)
+    if (pSG->cbTotal == 0)
         return (NULL);
 
Index: trunk/src/VBox/HostDrivers/VBoxNetFlt/linux/VBoxNetFlt-linux.c
===================================================================
--- trunk/src/VBox/HostDrivers/VBoxNetFlt/linux/VBoxNetFlt-linux.c	(revision 28069)
+++ trunk/src/VBox/HostDrivers/VBoxNetFlt/linux/VBoxNetFlt-linux.c	(revision 28070)
@@ -317,16 +317,5 @@
     /* Copy the segments. */
     skb_put(pPkt, pSG->cbTotal);
-    memcpy(pPkt->data, pSG->aSegs[0].pv, pSG->aSegs[0].cb);
-    if (pSG->cSegsUsed > 1)
-    {
-        uint8_t *pbDst = (uint8_t *)pPkt->data + pSG->aSegs[0].cb;
-        size_t   iSeg  = 0;
-        while (++iSeg < pSG->cSegsUsed)
-        {
-            memcpy(pbDst, pSG->aSegs[iSeg].pv, pSG->aSegs[iSeg].cb);
-            pbDst += pSG->aSegs[iSeg].cb;
-            Assert((uintptr_t)pbDst - (uintptr_t)pPkt->data <= pSG->cbTotal);
-        }
-    }
+    INTNETSgRead(pSG, pPkt->data);
 
     /* Set protocol and packet_type fields. */
Index: trunk/src/VBox/HostDrivers/VBoxNetFlt/win/VBoxNetFlt-win.c
===================================================================
--- trunk/src/VBox/HostDrivers/VBoxNetFlt/win/VBoxNetFlt-win.c	(revision 28069)
+++ trunk/src/VBox/HostDrivers/VBoxNetFlt/win/VBoxNetFlt-win.c	(revision 28070)
@@ -159,5 +159,5 @@
         {
             DBGPRINT(("device not idle"));
-            Assert(0);
+            AssertFailed();
 //            break;
         }
@@ -181,7 +181,7 @@
 
 /* frees memory allocated with vboxNetFltWinMemAlloc */
-DECLHIDDEN(void) vboxNetFltWinMemFree(PVOID pMemBuf)
-{
-    NdisFreeMemory(pMemBuf, 0, 0);
+DECLHIDDEN(void) vboxNetFltWinMemFree(PVOID pvMemBuf)
+{
+    NdisFreeMemory(pvMemBuf, 0, 0);
 }
 
@@ -264,5 +264,5 @@
     else
     {
-        Assert(0);
+        AssertFailed();
     }
 
@@ -290,5 +290,5 @@
         if(pDst->MaximumLength < pSrc->Length)
         {
-            Assert(0);
+            AssertFailed();
             Status = NDIS_STATUS_RESOURCES;
         }
@@ -528,5 +528,5 @@
                      * indicates NDIS_STATUS_RESOURCES, we should never have this when processing
                      * the "from-host" packets */
-                    Assert(0);
+                    AssertFailed();
                     LogFlow(("status is not pending, freeing myPacket (%p)\n", pMyPacket));
                     vboxNetFltWinFreeSGNdisPacket(pMyPacket, false);
@@ -545,5 +545,5 @@
     {
         /*we failed to create our packet */
-        Assert(0);
+        AssertFailed();
         fStatus = NDIS_STATUS_FAILURE;
     }
@@ -1214,5 +1214,5 @@
             if(fStatus != NDIS_STATUS_SUCCESS)
             {
-                Assert(0);
+                AssertFailed();
                 break;
             }
@@ -1222,5 +1222,5 @@
             if(!pInfo)
             {
-                Assert(0);
+                AssertFailed();
                 /* TODO: what status to set? */
                 fStatus = NDIS_STATUS_FAILURE;
@@ -1238,5 +1238,5 @@
             if(fStatus != NDIS_STATUS_SUCCESS)
             {
-                Assert(0);
+                AssertFailed();
                 vboxNetFltWinPpFreePacketInfo(pInfo);
                 vboxNetFltWinMemFree(pSG);
@@ -1252,5 +1252,5 @@
             if(!pInfo)
             {
-                Assert(0);
+                AssertFailed();
                 /* TODO: what status to set? */
                 fStatus = NDIS_STATUS_FAILURE;
@@ -1434,5 +1434,5 @@
     {
         /* TODO */
-        Assert(0);
+        AssertFailed();
     }
 
@@ -1459,5 +1459,5 @@
         {
             LogRel(("OID_GEN_PHYSICAL_MEDIUM failed: Status (0x%x)", Status));
-            Assert(0);
+            AssertFailed();
         }
     }
@@ -1482,5 +1482,5 @@
     {
         /* TODO */
-        Assert(0);
+        AssertFailed();
         return false;
     }
@@ -1506,5 +1506,5 @@
         {
             /* TODO: */
-            Assert(0);
+            AssertFailed();
             return fStatus;
         }
@@ -1539,5 +1539,5 @@
             {
                 /* TODO */
-                Assert(0);
+                AssertFailed();
                 return fStatus;
             }
@@ -1661,8 +1661,10 @@
     PNDIS_PACKET pPacket;
 
-    Assert(pSG->cSegsUsed == 1);
-    Assert(pSG->cbTotal == pSG->aSegs[0].cb);
     Assert(pSG->aSegs[0].pv);
     Assert(pSG->cbTotal >= sizeof(ETH_HEADER_SIZE));
+
+/** @todo Hrmpf, how can we fix this assumption?  I fear this'll cause data
+ *        corruption and maybe even BSODs ... */
+    AssertReturn(pSG->cSegsUsed == 1 || bCopyMemory, NULL);
 
 #ifdef VBOX_NETFLT_ONDEMAND_BIND
@@ -1676,5 +1678,5 @@
     {
         PNDIS_BUFFER pBuffer;
-        PVOID pMemBuf;
+        PVOID pvMemBuf;
 
         /* @todo: generally we do not always need to zero-initialize the complete OOB data here, reinitialize only when/what we need,
@@ -1685,12 +1687,12 @@
         if(bCopyMemory)
         {
-            fStatus = vboxNetFltWinMemAlloc(&pMemBuf, pSG->cbTotal);
+            fStatus = vboxNetFltWinMemAlloc(&pvMemBuf, pSG->cbTotal);
             if(fStatus == NDIS_STATUS_SUCCESS)
             {
-                NdisMoveMemory(pMemBuf, pSG->aSegs[0].pv, pSG->cbTotal);
+                INTNETSgRead(pSG, pvMemBuf);
             }
             else
             {
-                Assert(0);
+                AssertFailed();
                 NdisFreePacket(pPacket);
                 pPacket = NULL;
@@ -1699,5 +1701,5 @@
         else
         {
-            pMemBuf = pSG->aSegs[0].pv;
+            pvMemBuf = pSG->aSegs[0].pv;
         }
         if(fStatus == NDIS_STATUS_SUCCESS)
@@ -1706,15 +1708,15 @@
             NdisAllocateBuffer(&fStatus, &pBuffer,
                     pAdapt->hSendBufferPoolHandle,
-                    pMemBuf,
+                    pvMemBuf,
                     pSG->cbTotal);
 #elif defined(VBOXNETADP)
             NdisAllocateBuffer(&fStatus, &pBuffer,
                     pAdapt->hRecvBufferPoolHandle,
-                    pMemBuf,
+                    pvMemBuf,
                     pSG->cbTotal);
 #else
             NdisAllocateBuffer(&fStatus, &pBuffer,
                     bToWire ? pAdapt->hSendBufferPoolHandle : pAdapt->hRecvBufferPoolHandle,
-                    pMemBuf,
+                    pvMemBuf,
                     pSG->cbTotal);
 #endif
@@ -1758,8 +1760,8 @@
             else
             {
-                Assert(0);
+                AssertFailed();
                 if(bCopyMemory)
                 {
-                    vboxNetFltWinMemFree(pMemBuf);
+                    vboxNetFltWinMemFree(pvMemBuf);
                 }
                 NdisFreePacket(pPacket);
@@ -1769,5 +1771,5 @@
         else
         {
-            Assert(0);
+            AssertFailed();
             NdisFreePacket(pPacket);
             pPacket = NULL;
@@ -1803,12 +1805,12 @@
         if(pBuffer != NULL)
         {
-            PVOID pMemBuf;
+            PVOID pvMemBuf;
             UINT cbLength;
 
-            NdisQueryBufferSafe(pBuffer, &pMemBuf, &cbLength, NormalPagePriority);
+            NdisQueryBufferSafe(pBuffer, &pvMemBuf, &cbLength, NormalPagePriority);
             NdisFreeBuffer(pBuffer);
             if(bFreeMem)
             {
-                vboxNetFltWinMemFree(pMemBuf);
+                vboxNetFltWinMemFree(pvMemBuf);
             }
         }
@@ -1881,5 +1883,5 @@
     {
         /* TODO: we can not prevent driver unload here */
-        Assert(0);
+        AssertFailed();
 
         Log(("vboxNetFltWinTryFiniIdc - failed, busy.\n"));
@@ -2150,5 +2152,5 @@
         if(RT_FAILURE(rc))
         {
-            Assert(0);
+            AssertFailed();
             Status = Context.Status != NDIS_STATUS_SUCCESS ? Context.Status : NDIS_STATUS_FAILURE;
             break;
@@ -2167,5 +2169,5 @@
             if(RT_FAILURE(rc))
             {
-                Assert(0);
+                AssertFailed();
                 Status = Context.Status != NDIS_STATUS_SUCCESS ? Context.Status : NDIS_STATUS_FAILURE;
                 /* release netflt */
@@ -2233,5 +2235,5 @@
         if(Status != NDIS_STATUS_SUCCESS)
         {
-            Assert(0);
+            AssertFailed();
             /* TODO: should we break ? */
             /* break; */
@@ -2355,5 +2357,5 @@
         if(Status != NDIS_STATUS_SUCCESS)
         {
-            Assert(0);
+            AssertFailed();
             pAdapt->DeviceName.Buffer = NULL;
             break;
@@ -2364,5 +2366,5 @@
         if(Status != NDIS_STATUS_SUCCESS)
         {
-            Assert(0);
+            AssertFailed();
             break;
         }
@@ -2408,5 +2410,5 @@
             if(RT_FAILURE(rc))
             {
-                Assert(0);
+                AssertFailed();
                 Status = NDIS_STATUS_FAILURE;
                 break;
@@ -2654,5 +2656,5 @@
     if(uTotalPacketLength1 != uTotalPacketLength2)
     {
-        Assert(0);
+        AssertFailed();
         bMatch = false;
     }
@@ -2707,5 +2709,5 @@
             {
                 bMatch = false;
-                Assert(0);
+                AssertFailed();
                 break;
             }
@@ -2754,5 +2756,5 @@
     if(uTotalPacketLength1 != uTotalPacketLength2)
     {
-        Assert(0);
+        AssertFailed();
         bMatch = false;
     }
@@ -2796,5 +2798,5 @@
             {
                 bMatch = false;
-                Assert(0);
+                AssertFailed();
                 break;
             }
@@ -2907,5 +2909,5 @@
         {
 #ifdef VBOX_NETFLT_ONDEMAND_BIND
-            Assert(0);
+            AssertFailed();
 #endif
             rc = VINF_ALREADY_INITIALIZED;
@@ -2987,5 +2989,5 @@
         if(RT_FAILURE(rc))
         {
-            Assert(0);
+            AssertFailed();
             break;
         }
@@ -3000,5 +3002,5 @@
         if (RT_FAILURE(rc))
         {
-            Assert(0);
+            AssertFailed();
             vboxNetFltWinFiniNetFltBase();
             break;
@@ -3038,5 +3040,5 @@
     if(Status != NDIS_STATUS_SUCCESS)
     {
-        Assert(0);
+        AssertFailed();
         /* pDetachInfo->Status = VERR_GENERAL_FAILURE; */
     }
@@ -3119,5 +3121,5 @@
             if(Status != NDIS_STATUS_SUCCESS)
             {
-                Assert(0);
+                AssertFailed();
                 /* pDetachInfo->Status = VERR_GENERAL_FAILURE; */
             }
@@ -3418,5 +3420,5 @@
         else
         {
-            Assert(0);
+            AssertFailed();
             rc = VERR_NO_MEMORY;
         }
@@ -3442,5 +3444,5 @@
         else
         {
-            Assert(0);
+            AssertFailed();
 #ifdef VBOXNETADP
             STATISTIC_INCREASE(pAdapt->cRxError);
@@ -3572,5 +3574,5 @@
         {
             DBGPRINT(("vboxNetFltWinSetPromiscuous failed, Status (0x%x), fActive (%d)\n", Status, fActive));
-            Assert(0);
+            AssertFailed();
             LogRel(("vboxNetFltWinSetPromiscuous failed, Status (0x%x), fActive (%d)\n", Status, fActive));
         }
