From cc5eedd8a0b5a2f5116312bc910b2d1fa22296db Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Mon, 20 Apr 2009 20:59:40 +0000 Subject: [PATCH] - Implement NdisMRegisterUnloadHandler, NdisMRegisterDevice, and NdisMDeregisterDevice svn path=/trunk/; revision=40614 --- .../drivers/network/ndis/include/miniport.h | 6 + reactos/drivers/network/ndis/ndis/50stubs.c | 64 ---------- reactos/drivers/network/ndis/ndis/miniport.c | 119 ++++++++++++++++++ 3 files changed, 125 insertions(+), 64 deletions(-) diff --git a/reactos/drivers/network/ndis/include/miniport.h b/reactos/drivers/network/ndis/include/miniport.h index c41751b52b7..9834f212cc9 100644 --- a/reactos/drivers/network/ndis/include/miniport.h +++ b/reactos/drivers/network/ndis/include/miniport.h @@ -34,6 +34,12 @@ typedef struct _NDIS_M_DRIVER_BLOCK { } NDIS_M_DRIVER_BLOCK, *PNDIS_M_DRIVER_BLOCK; #endif +/* There must be some defined struct to do this... */ +typedef struct _NDIS_M_DEVICE_BLOCK { + PDEVICE_OBJECT DeviceObject; + PNDIS_STRING SymbolicName; +} NDIS_M_DEVICE_BLOCK, *PNDIS_M_DEVICE_BLOCK; + /* resources allocated on behalf on the miniport */ #define MINIPORT_RESOURCE_TYPE_MEMORY 0 typedef struct _MINIPORT_RESOURCE { diff --git a/reactos/drivers/network/ndis/ndis/50stubs.c b/reactos/drivers/network/ndis/ndis/50stubs.c index 79df7134958..0a735245f8c 100644 --- a/reactos/drivers/network/ndis/ndis/50stubs.c +++ b/reactos/drivers/network/ndis/ndis/50stubs.c @@ -226,26 +226,6 @@ NdisGetReceivedPacket( } -/* - * @unimplemented - */ -NDIS_STATUS -EXPORT -NdisMDeregisterDevice( - IN NDIS_HANDLE NdisDeviceHandle) -/* - * FUNCTION: - * ARGUMENTS: - * NOTES: - * NDIS 5.0 - */ -{ - UNIMPLEMENTED - - return NDIS_STATUS_FAILURE; -} - - /* * @unimplemented */ @@ -266,50 +246,6 @@ NdisMPromoteMiniport( } -/* - * @unimplemented - */ -NDIS_STATUS -EXPORT -NdisMRegisterDevice( - IN NDIS_HANDLE NdisWrapperHandle, - IN PNDIS_STRING DeviceName, - IN PNDIS_STRING SymbolicName, - IN PDRIVER_DISPATCH MajorFunctions[], - OUT PDEVICE_OBJECT *pDeviceObject, - OUT NDIS_HANDLE *NdisDeviceHandle) -/* - * FUNCTION: - * ARGUMENTS: - * NOTES: - * NDIS 5.0 - */ -{ - UNIMPLEMENTED - - return NDIS_STATUS_FAILURE; -} - - -/* - * @unimplemented - */ -VOID -EXPORT -NdisMRegisterUnloadHandler( - IN NDIS_HANDLE NdisWrapperHandle, - IN PDRIVER_UNLOAD UnloadHandler) -/* - * FUNCTION: - * ARGUMENTS: - * NOTES: - * NDIS 5.0 - */ -{ - UNIMPLEMENTED -} - - /* * @unimplemented */ diff --git a/reactos/drivers/network/ndis/ndis/miniport.c b/reactos/drivers/network/ndis/ndis/miniport.c index f4f82cce96a..7e2186743a3 100644 --- a/reactos/drivers/network/ndis/ndis/miniport.c +++ b/reactos/drivers/network/ndis/ndis/miniport.c @@ -2664,5 +2664,124 @@ NdisMGetDeviceProperty( *AllocatedResourcesTranslated = Adapter->NdisMiniportBlock.AllocatedResourcesTranslated; } +/* + * @implemented + */ +VOID +EXPORT +NdisMRegisterUnloadHandler( + IN NDIS_HANDLE NdisWrapperHandle, + IN PDRIVER_UNLOAD UnloadHandler) +/* + * FUNCTION: + * ARGUMENTS: + * NOTES: + * NDIS 5.0 + */ +{ + PNDIS_M_DRIVER_BLOCK DriverBlock = NdisWrapperHandle; + + NDIS_DbgPrint(MAX_TRACE, ("Miniport registered unload handler\n")); + + DriverBlock->DriverObject->DriverUnload = UnloadHandler; +} + +/* + * @implemented + */ +NDIS_STATUS +EXPORT +NdisMRegisterDevice( + IN NDIS_HANDLE NdisWrapperHandle, + IN PNDIS_STRING DeviceName, + IN PNDIS_STRING SymbolicName, + IN PDRIVER_DISPATCH MajorFunctions[], + OUT PDEVICE_OBJECT *pDeviceObject, + OUT NDIS_HANDLE *NdisDeviceHandle) +/* + * FUNCTION: + * ARGUMENTS: + * NOTES: + * NDIS 5.0 + */ +{ + PNDIS_M_DRIVER_BLOCK DriverBlock = NdisWrapperHandle; + PNDIS_M_DEVICE_BLOCK DeviceBlock; + PDEVICE_OBJECT DeviceObject; + NDIS_STATUS Status; + UINT i; + + NDIS_DbgPrint(MAX_TRACE, ("Called\n")); + + Status = IoCreateDevice(DriverBlock->DriverObject, + 0, /* This space is reserved for us. Should we use it? */ + DeviceName, + FILE_DEVICE_NETWORK, + 0, + FALSE, + &DeviceObject); + + if (!NT_SUCCESS(Status)) + { + return Status; + } + + Status = IoCreateSymbolicLink(SymbolicName, DeviceName); + + if (!NT_SUCCESS(Status)) + { + IoDeleteDevice(DeviceObject); + return Status; + } + + DeviceBlock = ExAllocatePool(NonPagedPool, sizeof(NDIS_M_DEVICE_BLOCK)); + + if (!DeviceBlock) + { + IoDeleteDevice(DeviceObject); + IoDeleteSymbolicLink(SymbolicName); + return NDIS_STATUS_RESOURCES; + } + + for (i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++) + DriverBlock->DriverObject->MajorFunction[i] = MajorFunctions[i]; + + DriverBlock->DriverObject->MajorFunction[IRP_MJ_PNP] = NdisIDispatchPnp; + DriverBlock->DriverObject->MajorFunction[IRP_MJ_SHUTDOWN] = NdisIShutdown; + + DeviceBlock->DeviceObject = DeviceObject; + DeviceBlock->SymbolicName = SymbolicName; + + *pDeviceObject = DeviceObject; + *NdisDeviceHandle = DeviceBlock; + + return NDIS_STATUS_SUCCESS; +} + +/* + * @implemented + */ +NDIS_STATUS +EXPORT +NdisMDeregisterDevice( + IN NDIS_HANDLE NdisDeviceHandle) +/* + * FUNCTION: + * ARGUMENTS: + * NOTES: + * NDIS 5.0 + */ +{ + PNDIS_M_DEVICE_BLOCK DeviceBlock = NdisDeviceHandle; + + IoDeleteDevice(DeviceBlock->DeviceObject); + + IoDeleteSymbolicLink(DeviceBlock->SymbolicName); + + ExFreePool(DeviceBlock); + + return NDIS_STATUS_SUCCESS; +} + /* EOF */