- Implement NdisMRegisterUnloadHandler, NdisMRegisterDevice, and NdisMDeregisterDevice

svn path=/trunk/; revision=40614
This commit is contained in:
Cameron Gutman 2009-04-20 20:59:40 +00:00
parent 7a499db296
commit cc5eedd8a0
3 changed files with 125 additions and 64 deletions

View file

@ -34,6 +34,12 @@ typedef struct _NDIS_M_DRIVER_BLOCK {
} NDIS_M_DRIVER_BLOCK, *PNDIS_M_DRIVER_BLOCK; } NDIS_M_DRIVER_BLOCK, *PNDIS_M_DRIVER_BLOCK;
#endif #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 */ /* resources allocated on behalf on the miniport */
#define MINIPORT_RESOURCE_TYPE_MEMORY 0 #define MINIPORT_RESOURCE_TYPE_MEMORY 0
typedef struct _MINIPORT_RESOURCE { typedef struct _MINIPORT_RESOURCE {

View file

@ -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 * @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 * @unimplemented
*/ */

View file

@ -2664,5 +2664,124 @@ NdisMGetDeviceProperty(
*AllocatedResourcesTranslated = Adapter->NdisMiniportBlock.AllocatedResourcesTranslated; *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 */ /* EOF */