/* * -------------------------------------------------------------------------- * Un-init/Unload function for the OVS intermediate Driver. * -------------------------------------------------------------------------- */ VOID OvsExtUnload(struct _DRIVER_OBJECT *driverObject) { UNREFERENCED_PARAMETER(driverObject); OvsDeleteDeviceObject(); NdisFDeregisterFilterDriver(gOvsExtDriverHandle); }
VOID DriverUnload ( PDRIVER_OBJECT DriverObject ) { DPF(("%s!%s DriverObject=%p\n", __MODULE__, __FUNCTION__, DriverObject )); // Deregister the filter driver (NdisFDeregisterFilterDriver()) NdisFDeregisterFilterDriver(GlobalNDISLWF.FilterDriverHandle); DPF(("***** DRIVER UNLOADED *****\n")); }
// // Unload Routine // http://msdn.microsoft.com/en-us/library/ff564886(v=VS.85).aspx // _Use_decl_annotations_ VOID SxNdisUnload( PDRIVER_OBJECT DriverObject ) { UNREFERENCED_PARAMETER(DriverObject); SxExtUninitialize(); NdisFDeregisterFilterDriver(SxDriverHandle); NdisFreeSpinLock(&SxExtensionListLock); }
/* * -------------------------------------------------------------------------- * Init/Load function for the OVSEXT filter Driver. * -------------------------------------------------------------------------- */ NTSTATUS DriverEntry(PDRIVER_OBJECT driverObject, PUNICODE_STRING registryPath) { NDIS_STATUS status; NDIS_FILTER_DRIVER_CHARACTERISTICS driverChars; UNREFERENCED_PARAMETER(registryPath); gOvsExtDriverObject = driverObject; RtlZeroMemory(&driverChars, sizeof driverChars); driverChars.Header.Type = NDIS_OBJECT_TYPE_FILTER_DRIVER_CHARACTERISTICS; driverChars.Header.Size = sizeof driverChars; driverChars.Header.Revision = NDIS_FILTER_CHARACTERISTICS_REVISION_2; driverChars.MajorNdisVersion = NDIS_FILTER_MAJOR_VERSION; driverChars.MinorNdisVersion = NDIS_FILTER_MINOR_VERSION; driverChars.MajorDriverVersion = 1; driverChars.MinorDriverVersion = 0; driverChars.Flags = 0; RtlInitUnicodeString(&driverChars.ServiceName, ovsExtServiceName); RtlInitUnicodeString(&ovsExtFriendlyNameUC, ovsExtFriendlyName); RtlInitUnicodeString(&ovsExtGuidUC, ovsExtGuidStr); driverChars.FriendlyName = ovsExtFriendlyNameUC; driverChars.UniqueName = ovsExtGuidUC; driverChars.AttachHandler = OvsExtAttach; driverChars.DetachHandler = OvsExtDetach; driverChars.RestartHandler = OvsExtRestart; driverChars.PauseHandler = OvsExtPause; driverChars.SendNetBufferListsHandler = OvsExtSendNBL; driverChars.SendNetBufferListsCompleteHandler = OvsExtSendNBLComplete; driverChars.CancelSendNetBufferListsHandler = OvsExtCancelSendNBL; driverChars.ReceiveNetBufferListsHandler = NULL; driverChars.ReturnNetBufferListsHandler = NULL; driverChars.OidRequestHandler = OvsExtOidRequest; driverChars.OidRequestCompleteHandler = OvsExtOidRequestComplete; driverChars.CancelOidRequestHandler = OvsExtCancelOidRequest; driverChars.DevicePnPEventNotifyHandler = NULL; driverChars.NetPnPEventHandler = OvsExtNetPnPEvent; driverChars.StatusHandler = NULL; driverObject->DriverUnload = OvsExtUnload; status = NdisFRegisterFilterDriver(driverObject, (NDIS_HANDLE) gOvsExtDriverObject, &driverChars, &gOvsExtDriverHandle); if (status != NDIS_STATUS_SUCCESS) { return status; } /* Create the communication channel for usersapce. */ status = OvsCreateDeviceObject(gOvsExtDriverHandle); if (status != NDIS_STATUS_SUCCESS) { NdisFDeregisterFilterDriver(gOvsExtDriverHandle); gOvsExtDriverHandle = NULL; } return status; }
// // DriverEntry // http://msdn.microsoft.com/en-us/library/ff544113(v=VS.85).aspx // _Use_decl_annotations_ NTSTATUS DriverEntry( PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath ) { NDIS_STATUS status; NDIS_FILTER_DRIVER_CHARACTERISTICS fChars; NDIS_STRING serviceName; UNREFERENCED_PARAMETER(RegistryPath); // // Initialize extension specific data. // status = SxExtInitialize(); if (status != NDIS_STATUS_SUCCESS) { goto Cleanup; } RtlInitUnicodeString(&serviceName, SxExtServiceName); RtlInitUnicodeString(&SxExtensionFriendlyName, SxExtFriendlyName); RtlInitUnicodeString(&SxExtensionGuid, SxExtUniqueName); SxDriverObject = DriverObject; NdisZeroMemory(&fChars, sizeof(NDIS_FILTER_DRIVER_CHARACTERISTICS)); fChars.Header.Type = NDIS_OBJECT_TYPE_FILTER_DRIVER_CHARACTERISTICS; fChars.Header.Size = sizeof(NDIS_FILTER_DRIVER_CHARACTERISTICS); fChars.Header.Revision = NDIS_FILTER_CHARACTERISTICS_REVISION_2; fChars.MajorNdisVersion = SxExtMajorNdisVersion; fChars.MinorNdisVersion = SxExtMinorNdisVersion; fChars.MajorDriverVersion = 1; fChars.MinorDriverVersion = 0; fChars.Flags = 0; fChars.FriendlyName = SxExtensionFriendlyName; fChars.UniqueName = SxExtensionGuid; fChars.ServiceName = serviceName; fChars.SetOptionsHandler = SxNdisSetOptions; fChars.SetFilterModuleOptionsHandler = SxNdisSetFilterModuleOptions; fChars.AttachHandler = SxNdisAttach; fChars.DetachHandler = SxNdisDetach; fChars.PauseHandler = SxNdisPause; fChars.RestartHandler = SxNdisRestart; fChars.SendNetBufferListsHandler = SxNdisSendNetBufferLists; fChars.SendNetBufferListsCompleteHandler = SxNdisSendNetBufferListsComplete; fChars.CancelSendNetBufferListsHandler = SxNdisCancelSendNetBufferLists; fChars.ReceiveNetBufferListsHandler = SxNdisReceiveNetBufferLists; fChars.ReturnNetBufferListsHandler = SxNdisReturnNetBufferLists; fChars.OidRequestHandler = SxNdisOidRequest; fChars.OidRequestCompleteHandler = SxNdisOidRequestComplete; fChars.CancelOidRequestHandler = SxNdisCancelOidRequest; fChars.NetPnPEventHandler = SxNdisNetPnPEvent; fChars.StatusHandler = SxNdisStatus; NdisAllocateSpinLock(&SxExtensionListLock); InitializeListHead(&SxExtensionList); DriverObject->DriverUnload = SxNdisUnload; status = NdisFRegisterFilterDriver(DriverObject, (NDIS_HANDLE)SxDriverObject, &fChars, &SxDriverHandle); Cleanup: if (status != NDIS_STATUS_SUCCESS) { if (SxDriverHandle != NULL) { NdisFDeregisterFilterDriver(SxDriverHandle); SxDriverHandle = NULL; } NdisFreeSpinLock(&SxExtensionListLock); SxExtUninitialize(); } return status; }