Changeset 14097 in vbox for trunk/src/VBox/HostDrivers/VBoxNetFlt
- Timestamp:
- Nov 11, 2008 4:56:41 PM (16 years ago)
- svn:sync-xref-src-repo-rev:
- 39167
- Location:
- trunk/src/VBox/HostDrivers/VBoxNetFlt
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/HostDrivers/VBoxNetFlt/Makefile.kmk
r14078 r14097 36 36 VBoxNetFlt_DEFS.win += VBOX_NETFLT_ONDEMAND_BIND 37 37 else 38 VBoxNetFlt_DEFS.win += VBOXNETFLT_STATIC_CONFIG 38 39 VBoxNetFlt_SOURCES.win += win/VBoxNetFltMp-win.c 39 40 endif -
trunk/src/VBox/HostDrivers/VBoxNetFlt/VBoxNetFlt.c
r13979 r14097 220 220 #include <iprt/uuid.h> 221 221 222 #ifdef VBOXNETFLT_STATIC_CONFIG223 # error "The static setup needs a full check up wrt assumptions and incomplete code."224 #endif225 226 227 222 /******************************************************************************* 228 223 * Defined Constants And Macros * … … 593 588 vboxNetFltOsDisconnectIt(pThis); 594 589 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 595 596 596 597 vboxNetFltRelease(pThis, false /* fBusy */); … … 801 802 rc = vboxNetFltOsConnectIt(pThis); 802 803 if (RT_SUCCESS(rc)) 804 { 803 805 vboxNetFltSetState(pThis, kVBoxNetFltInsState_Connected); 806 #ifdef VBOXNETFLT_STATIC_CONFIG 807 *ppIfPort = &pThis->MyPort; 808 #endif 809 } 804 810 else 805 811 pThis->pSwitchPort = NULL; … … 824 830 * @param ppIfPort Where to store the pointer to our port interface (dynamic only). 825 831 */ 826 static int vboxNetFltNewInstance(PVBOXNETFLTGLOBALS pGlobals, const char *pszName, PINTNETTRUNKSWPORT pSwitchPort, PINTNETTRUNKIFPORT *ppIfPort) 832 static int vboxNetFltNewInstance(PVBOXNETFLTGLOBALS pGlobals, const char *pszName, PINTNETTRUNKSWPORT pSwitchPort, PINTNETTRUNKIFPORT *ppIfPort 833 #ifdef VBOXNETFLT_STATIC_CONFIG 834 , void * pContext 835 #endif 836 ) 827 837 { 828 838 /* … … 884 894 * Call the OS specific initialization code. 885 895 */ 886 rc = vboxNetFltOsInitInstance(pNew); 896 rc = vboxNetFltOsInitInstance(pNew 897 #ifdef VBOXNETFLT_STATIC_CONFIG 898 , pContext 899 #endif 900 ); 887 901 RTSemFastMutexRequest(pGlobals->hFastMtx); 888 902 if (RT_SUCCESS(rc)) 889 903 { 890 904 #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; 893 908 RTSemFastMutexRelease(pGlobals->hFastMtx); 894 909 return rc; … … 927 942 } 928 943 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 */ 952 DECLHIDDEN(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 929 984 930 985 /** … … 951 1006 if (pCur) 952 1007 { 953 rc = VERR_INTNET_FLT_IF_BUSY;954 1008 #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 */); 956 1015 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 } 957 1028 #endif 958 1029 RTSemFastMutexRelease(pGlobals->hFastMtx); … … 1048 1119 } 1049 1120 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) 1121 DECLHIDDEN(int) vboxNetFltTryDeleteIdc(PVBOXNETFLTGLOBALS pGlobals) 1059 1122 { 1060 1123 int rc; 1124 1061 1125 Assert(pGlobals->hFastMtx != NIL_RTSEMFASTMUTEX); 1062 1126 … … 1082 1146 SUPR0IdcClose(&pGlobals->SupDrvIDC); 1083 1147 1148 return rc; 1149 } 1150 1151 DECLHIDDEN(void) vboxNetFltDeleteGlobalsBase(PVBOXNETFLTGLOBALS pGlobals) 1152 { 1084 1153 /* 1085 1154 * Release resources. … … 1087 1156 RTSemFastMutexDestroy(pGlobals->hFastMtx); 1088 1157 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 */ 1167 DECLHIDDEN(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. */ 1186 DECLHIDDEN(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. */ 1215 DECLHIDDEN(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 } 1093 1238 1094 1239 /** … … 1106 1251 * Initialize the common portions of the structure. 1107 1252 */ 1108 int rc = RTSemFastMutexCreate(&pGlobals->hFastMtx);1253 int rc = vboxNetFltInitGlobalsBase(pGlobals); 1109 1254 if (RT_SUCCESS(rc)) 1110 1255 { 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); 1123 1257 if (RT_SUCCESS(rc)) 1124 1258 { 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; 1135 1260 } 1136 RTSemFastMutexDestroy(pGlobals->hFastMtx); 1137 pGlobals->hFastMtx = NIL_RTSEMFASTMUTEX; 1261 1262 /* bail out. */ 1263 vboxNetFltDeleteGlobalsBase(pGlobals); 1138 1264 } 1139 1265 -
trunk/src/VBox/HostDrivers/VBoxNetFlt/VBoxNetFltInternal.h
r13976 r14097 182 182 /** @name Windows instance data. 183 183 * @{ */ 184 # ifdef VBOX_NETFLT_ONDEMAND_BIND184 //# ifdef VBOX_NETFLT_ONDEMAND_BIND 185 185 /** Filter driver device context. */ 186 186 ADAPT IfAdaptor; 187 # else188 /** Pointer to the filter driver device context. */189 PADAPT volatile pIfAdaptor;190 # endif187 //# else 188 // /** Pointer to the filter driver device context. */ 189 // PADAPT volatile pIfAdaptor; 190 //# endif 191 191 /** The MAC address of the interface. Caching MAC for performance reasons. */ 192 192 RTMAC Mac; … … 198 198 #endif 199 199 /** 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) 201 202 uint8_t abPadding[192]; 203 # else 204 uint8_t abPadding[512]; 205 # endif 202 206 #elif defined(RT_OS_LINUX) 203 207 uint8_t abPadding[128]; … … 252 256 DECLHIDDEN(void) vboxNetFltRelease(PVBOXNETFLTINS pThis, bool fBusy); 253 257 258 #ifdef VBOXNETFLT_STATIC_CONFIG 259 DECLHIDDEN(int) vboxNetFltSearchCreateInstance(PVBOXNETFLTGLOBALS pGlobals, const char *pszName, PVBOXNETFLTINS *ppInstance, void * pContext); 260 DECLHIDDEN(int) vboxNetFltInitGlobalsBase(PVBOXNETFLTGLOBALS pGlobals); 261 DECLHIDDEN(int) vboxNetFltInitIdc(PVBOXNETFLTGLOBALS pGlobals); 262 DECLHIDDEN(void) vboxNetFltDeleteGlobalsBase(PVBOXNETFLTGLOBALS pGlobals); 263 DECLHIDDEN(int) vboxNetFltTryDeleteIdc(PVBOXNETFLTGLOBALS pGlobals); 264 #endif 265 254 266 255 267 /** @name The OS specific interface. … … 375 387 * @remarks Owns no locks. 376 388 */ 377 DECLHIDDEN(int) vboxNetFltOsInitInstance(PVBOXNETFLTINS pThis); 389 DECLHIDDEN(int) vboxNetFltOsInitInstance(PVBOXNETFLTINS pThis 390 #ifdef VBOXNETFLT_STATIC_CONFIG 391 , void * pContext 392 #endif 393 ); 378 394 379 395 /**
Note:
See TracChangeset
for help on using the changeset viewer.