VirtualBox

Ignore:
Timestamp:
Nov 11, 2008 4:56:41 PM (16 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
39167
Message:

win/NetFlt: switched to using VBOXNETFLT_STATIC_CONFIG

Location:
trunk/src/VBox/HostDrivers/VBoxNetFlt
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/HostDrivers/VBoxNetFlt/Makefile.kmk

    r14078 r14097  
    3636 VBoxNetFlt_DEFS.win += VBOX_NETFLT_ONDEMAND_BIND
    3737else
     38 VBoxNetFlt_DEFS.win += VBOXNETFLT_STATIC_CONFIG
    3839 VBoxNetFlt_SOURCES.win += win/VBoxNetFltMp-win.c
    3940endif
  • trunk/src/VBox/HostDrivers/VBoxNetFlt/VBoxNetFlt.c

    r13979 r14097  
    220220#include <iprt/uuid.h>
    221221
    222 #ifdef VBOXNETFLT_STATIC_CONFIG
    223 # error "The static setup needs a full check up wrt assumptions and incomplete code."
    224 #endif
    225 
    226 
    227222/*******************************************************************************
    228223*   Defined Constants And Macros                                               *
     
    593588    vboxNetFltOsDisconnectIt(pThis);
    594589    pThis->pSwitchPort = NULL;
     590
     591#ifdef VBOXNETFLT_STATIC_CONFIG
     592    RTSpinlockAcquire(pThis->hSpinlock, &Tmp);
     593    vboxNetFltSetState(pThis, kVBoxNetFltInsState_Unconnected);
     594    RTSpinlockRelease(pThis->hSpinlock, &Tmp);
     595#endif
    595596
    596597    vboxNetFltRelease(pThis, false /* fBusy */);
     
    801802    rc = vboxNetFltOsConnectIt(pThis);
    802803    if (RT_SUCCESS(rc))
     804    {
    803805        vboxNetFltSetState(pThis, kVBoxNetFltInsState_Connected);
     806#ifdef VBOXNETFLT_STATIC_CONFIG
     807        *ppIfPort = &pThis->MyPort;
     808#endif
     809    }
    804810    else
    805811        pThis->pSwitchPort = NULL;
     
    824830 * @param   ppIfPort            Where to store the pointer to our port interface (dynamic only).
    825831 */
    826 static int vboxNetFltNewInstance(PVBOXNETFLTGLOBALS pGlobals, const char *pszName, PINTNETTRUNKSWPORT pSwitchPort, PINTNETTRUNKIFPORT *ppIfPort)
     832static int vboxNetFltNewInstance(PVBOXNETFLTGLOBALS pGlobals, const char *pszName, PINTNETTRUNKSWPORT pSwitchPort, PINTNETTRUNKIFPORT *ppIfPort
     833#ifdef VBOXNETFLT_STATIC_CONFIG
     834        , void * pContext
     835#endif
     836        )
    827837{
    828838    /*
     
    884894                         * Call the OS specific initialization code.
    885895                         */
    886                         rc = vboxNetFltOsInitInstance(pNew);
     896                        rc = vboxNetFltOsInitInstance(pNew
     897#ifdef VBOXNETFLT_STATIC_CONFIG
     898                                , pContext
     899#endif
     900                                );
    887901                        RTSemFastMutexRequest(pGlobals->hFastMtx);
    888902                        if (RT_SUCCESS(rc))
    889903                        {
    890904#ifdef VBOXNETFLT_STATIC_CONFIG
    891                             pNew->enmState = kVBoxNetFltInsState_Inactive;
    892                             Assert(!pSwitchPort); Assert(!ppIfPort);
     905                            pNew->enmState = kVBoxNetFltInsState_Unconnected;
     906                            Assert(!pSwitchPort);
     907                            *ppIfPort = &pNew->MyPort;
    893908                            RTSemFastMutexRelease(pGlobals->hFastMtx);
    894909                            return rc;
     
    927942}
    928943
     944#ifdef VBOXNETFLT_STATIC_CONFIG
     945
     946/**
     947 * searches for the NetFlt instance by its name and creates the new one if not found
     948 *
     949 * @return VINF_SUCCESS if new instance was created, VINF_ALREADY_INITIALIZED if an instanmce already exists,
     950 * VERR_xxx in case of a failure
     951 */
     952DECLHIDDEN(int) vboxNetFltSearchCreateInstance(PVBOXNETFLTGLOBALS pGlobals, const char *pszName, PVBOXNETFLTINS *ppInstance, void * pContext)
     953{
     954    int rc;
     955
     956    rc = RTSemFastMutexRequest(pGlobals->hFastMtx);
     957    AssertRCReturn(rc, rc);
     958
     959    *ppInstance = vboxNetFltFindInstanceLocked(pGlobals, pszName);
     960    if(!(*ppInstance))
     961    {
     962        PINTNETTRUNKIFPORT pIfPort;
     963
     964        RTSemFastMutexRelease(pGlobals->hFastMtx);
     965
     966        rc = vboxNetFltNewInstance(pGlobals, pszName, NULL, &pIfPort, pContext);
     967        if(RT_SUCCESS(rc))
     968            *ppInstance =  IFPORT_2_VBOXNETFLTINS(pIfPort);
     969        else
     970            *ppInstance = NULL;
     971    }
     972    else
     973    {
     974        RTSemFastMutexRelease(pGlobals->hFastMtx);
     975        rc = VINF_ALREADY_INITIALIZED;
     976    }
     977
     978
     979
     980    return rc;
     981}
     982
     983#endif
    929984
    930985/**
     
    9511006    if (pCur)
    9521007    {
    953         rc = VERR_INTNET_FLT_IF_BUSY;
    9541008#ifdef VBOXNETFLT_STATIC_CONFIG
    955         if (vboxNetFltGetState(pCur) == kVBoxNetFltInsState_Unconnected)
     1009        switch(vboxNetFltGetState(pCur))
     1010        {
     1011        case kVBoxNetFltInsState_Unconnected:
     1012            /* instance can be destroyed when it is neither used by the IntNet nor by the ndis filter driver mechanism
     1013             * (i.e. the driver is not bound to the specified adapter)*/
     1014            vboxNetFltRetain(pCur, false /* fBusy */);
    9561015            rc = vboxNetFltConnectIt(pCur, pSwitchPort, ppIfPort);
     1016            break;
     1017        case kVBoxNetFltInsState_Connected:
     1018            rc = VINF_SUCCESS;
     1019            break;
     1020        case kVBoxNetFltInsState_Disconnecting:
     1021            Assert(0);
     1022            rc = VERR_INTNET_FLT_IF_BUSY;
     1023            break;
     1024        default:
     1025            /** @todo: */
     1026            rc = VERR_INTNET_FLT_IF_BUSY;
     1027        }
    9571028#endif
    9581029        RTSemFastMutexRelease(pGlobals->hFastMtx);
     
    10481119}
    10491120
    1050 
    1051 /**
    1052  * Called by the native part when the OS wants the driver to unload.
    1053  *
    1054  * @returns VINF_SUCCESS on succes, VERR_WRONG_ORDER if we're busy.
    1055  *
    1056  * @param   pGlobals        Pointer to the globals.
    1057  */
    1058 DECLHIDDEN(int) vboxNetFltTryDeleteGlobals(PVBOXNETFLTGLOBALS pGlobals)
     1121DECLHIDDEN(int) vboxNetFltTryDeleteIdc(PVBOXNETFLTGLOBALS pGlobals)
    10591122{
    10601123    int rc;
     1124
    10611125    Assert(pGlobals->hFastMtx != NIL_RTSEMFASTMUTEX);
    10621126
     
    10821146    SUPR0IdcClose(&pGlobals->SupDrvIDC);
    10831147
     1148    return rc;
     1149}
     1150
     1151DECLHIDDEN(void) vboxNetFltDeleteGlobalsBase(PVBOXNETFLTGLOBALS pGlobals)
     1152{
    10841153    /*
    10851154     * Release resources.
     
    10871156    RTSemFastMutexDestroy(pGlobals->hFastMtx);
    10881157    pGlobals->hFastMtx = NIL_RTSEMFASTMUTEX;
    1089 
    1090     return VINF_SUCCESS;
    1091 }
    1092 
     1158}
     1159
     1160/**
     1161 * Called by the native part when the OS wants the driver to unload.
     1162 *
     1163 * @returns VINF_SUCCESS on succes, VERR_WRONG_ORDER if we're busy.
     1164 *
     1165 * @param   pGlobals        Pointer to the globals.
     1166 */
     1167DECLHIDDEN(int) vboxNetFltTryDeleteGlobals(PVBOXNETFLTGLOBALS pGlobals)
     1168{
     1169    int rc = vboxNetFltTryDeleteIdc(pGlobals);
     1170    if(RT_SUCCESS(rc))
     1171    {
     1172        vboxNetFltDeleteGlobalsBase(pGlobals);
     1173    }
     1174    return rc;
     1175}
     1176
     1177/**
     1178 * performs the "base" globals initialization
     1179 * we separate the globals initialization to globals "base" initialization which is actually
     1180 * "general" globals initialization except for Idc not being initialized, and idc initialization.
     1181 * This is needed for windows filter driver, which gets loaded prior to VBoxDrv,
     1182 * thus it's not possible to make idc initialization from the driver startup routine for it.
     1183 *
     1184 * @returns VBox status code.
     1185 * @param   pGlobals    Pointer to the globals. */
     1186DECLHIDDEN(int) vboxNetFltInitGlobalsBase(PVBOXNETFLTGLOBALS pGlobals)
     1187{
     1188    /*
     1189     * Initialize the common portions of the structure.
     1190     */
     1191    int rc = RTSemFastMutexCreate(&pGlobals->hFastMtx);
     1192    if (RT_SUCCESS(rc))
     1193    {
     1194        pGlobals->pInstanceHead = NULL;
     1195
     1196        pGlobals->TrunkFactory.pfnRelease = vboxNetFltFactoryRelease;
     1197        pGlobals->TrunkFactory.pfnCreateAndConnect = vboxNetFltFactoryCreateAndConnect;
     1198
     1199        strcpy(pGlobals->SupDrvFactory.szName, "VBoxNetFlt");
     1200        pGlobals->SupDrvFactory.pfnQueryFactoryInterface = vboxNetFltQueryFactoryInterface;
     1201    }
     1202
     1203    return rc;
     1204}
     1205
     1206/**
     1207 * performs the Idc initialization
     1208 * we separate the globals initialization to globals "base" initialization which is actually
     1209 * "general" globals initialization except for Idc not being initialized, and idc initialization.
     1210 * This is needed for windows filter driver, which gets loaded prior to VBoxDrv,
     1211 * thus it's not possible to make idc initialization from the driver startup routine for it.
     1212 *
     1213 * @returns VBox status code.
     1214 * @param   pGlobals    Pointer to the globals. */
     1215DECLHIDDEN(int) vboxNetFltInitIdc(PVBOXNETFLTGLOBALS pGlobals)
     1216{
     1217    int rc;
     1218    /*
     1219     * Establish a connection to SUPDRV and register our component factory.
     1220     */
     1221    rc = SUPR0IdcOpen(&pGlobals->SupDrvIDC, 0 /* iReqVersion = default */, 0 /* iMinVersion = default */, NULL, NULL, NULL);
     1222    if (RT_SUCCESS(rc))
     1223    {
     1224        rc = SUPR0IdcComponentRegisterFactory(&pGlobals->SupDrvIDC, &pGlobals->SupDrvFactory);
     1225        if (RT_SUCCESS(rc))
     1226        {
     1227            Log(("VBoxNetFlt: pSession=%p\n", SUPR0IdcGetSession(&pGlobals->SupDrvIDC)));
     1228            return rc;
     1229        }
     1230
     1231        /* bail out. */
     1232        LogRel(("VBoxNetFlt: Failed to register component factory, rc=%Rrc\n", rc));
     1233        SUPR0IdcClose(&pGlobals->SupDrvIDC);
     1234    }
     1235
     1236    return rc;
     1237}
    10931238
    10941239/**
     
    11061251     * Initialize the common portions of the structure.
    11071252     */
    1108     int rc = RTSemFastMutexCreate(&pGlobals->hFastMtx);
     1253    int rc = vboxNetFltInitGlobalsBase(pGlobals);
    11091254    if (RT_SUCCESS(rc))
    11101255    {
    1111         pGlobals->pInstanceHead = NULL;
    1112 
    1113         pGlobals->TrunkFactory.pfnRelease = vboxNetFltFactoryRelease;
    1114         pGlobals->TrunkFactory.pfnCreateAndConnect = vboxNetFltFactoryCreateAndConnect;
    1115 
    1116         strcpy(pGlobals->SupDrvFactory.szName, "VBoxNetFlt");
    1117         pGlobals->SupDrvFactory.pfnQueryFactoryInterface = vboxNetFltQueryFactoryInterface;
    1118 
    1119         /*
    1120          * Establish a connection to SUPDRV and register our component factory.
    1121          */
    1122         rc = SUPR0IdcOpen(&pGlobals->SupDrvIDC, 0 /* iReqVersion = default */, 0 /* iMinVersion = default */, NULL, NULL, NULL);
     1256        rc = vboxNetFltInitIdc(pGlobals);
    11231257        if (RT_SUCCESS(rc))
    11241258        {
    1125             rc = SUPR0IdcComponentRegisterFactory(&pGlobals->SupDrvIDC, &pGlobals->SupDrvFactory);
    1126             if (RT_SUCCESS(rc))
    1127             {
    1128                 Log(("VBoxNetFlt: pSession=%p\n", SUPR0IdcGetSession(&pGlobals->SupDrvIDC)));
    1129                 return rc;
    1130             }
    1131 
    1132             /* bail out. */
    1133             LogRel(("VBoxNetFlt: Failed to register component factory, rc=%Rrc\n", rc));
    1134             SUPR0IdcClose(&pGlobals->SupDrvIDC);
     1259            return rc;
    11351260        }
    1136         RTSemFastMutexDestroy(pGlobals->hFastMtx);
    1137         pGlobals->hFastMtx = NIL_RTSEMFASTMUTEX;
     1261
     1262        /* bail out. */
     1263        vboxNetFltDeleteGlobalsBase(pGlobals);
    11381264    }
    11391265
  • trunk/src/VBox/HostDrivers/VBoxNetFlt/VBoxNetFltInternal.h

    r13976 r14097  
    182182            /** @name Windows instance data.
    183183             * @{ */
    184 #  ifdef VBOX_NETFLT_ONDEMAND_BIND
     184//#  ifdef VBOX_NETFLT_ONDEMAND_BIND
    185185            /** Filter driver device context. */
    186186            ADAPT IfAdaptor;
    187 #  else
    188             /** Pointer to the filter driver device context. */
    189             PADAPT volatile pIfAdaptor;
    190 #  endif
     187//#  else
     188//            /** Pointer to the filter driver device context. */
     189//            PADAPT volatile pIfAdaptor;
     190//#  endif
    191191            /** The MAC address of the interface. Caching MAC for performance reasons. */
    192192            RTMAC Mac;
     
    198198#endif
    199199        /** Padding. */
    200 #if defined(RT_OS_WINDOWS) && defined(VBOX_NETFLT_ONDEMAND_BIND)
     200#if defined(RT_OS_WINDOWS)
     201# if defined(VBOX_NETFLT_ONDEMAND_BIND)
    201202        uint8_t abPadding[192];
     203# else
     204        uint8_t abPadding[512];
     205# endif
    202206#elif defined(RT_OS_LINUX)
    203207        uint8_t abPadding[128];
     
    252256DECLHIDDEN(void) vboxNetFltRelease(PVBOXNETFLTINS pThis, bool fBusy);
    253257
     258#ifdef VBOXNETFLT_STATIC_CONFIG
     259DECLHIDDEN(int) vboxNetFltSearchCreateInstance(PVBOXNETFLTGLOBALS pGlobals, const char *pszName, PVBOXNETFLTINS *ppInstance, void * pContext);
     260DECLHIDDEN(int) vboxNetFltInitGlobalsBase(PVBOXNETFLTGLOBALS pGlobals);
     261DECLHIDDEN(int) vboxNetFltInitIdc(PVBOXNETFLTGLOBALS pGlobals);
     262DECLHIDDEN(void) vboxNetFltDeleteGlobalsBase(PVBOXNETFLTGLOBALS pGlobals);
     263DECLHIDDEN(int) vboxNetFltTryDeleteIdc(PVBOXNETFLTGLOBALS pGlobals);
     264#endif
     265
    254266
    255267/** @name The OS specific interface.
     
    375387 * @remarks Owns no locks.
    376388 */
    377 DECLHIDDEN(int) vboxNetFltOsInitInstance(PVBOXNETFLTINS pThis);
     389DECLHIDDEN(int) vboxNetFltOsInitInstance(PVBOXNETFLTINS pThis
     390#ifdef VBOXNETFLT_STATIC_CONFIG
     391        , void * pContext
     392#endif
     393        );
    378394
    379395/**
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette