mirror of
https://github.com/reactos/reactos.git
synced 2024-09-30 22:47:28 +00:00
[NDIS]
- Fix driver object dispatch table corruption in NdisMRegisterDevice See issue #7191 for more details. svn path=/trunk/; revision=57032
This commit is contained in:
parent
8d32e73b9f
commit
592e0968b0
|
@ -37,6 +37,7 @@ typedef struct _NDIS_M_DRIVER_BLOCK {
|
||||||
typedef struct _NDIS_M_DEVICE_BLOCK {
|
typedef struct _NDIS_M_DEVICE_BLOCK {
|
||||||
PDEVICE_OBJECT DeviceObject;
|
PDEVICE_OBJECT DeviceObject;
|
||||||
PNDIS_STRING SymbolicName;
|
PNDIS_STRING SymbolicName;
|
||||||
|
PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION+1];
|
||||||
} NDIS_M_DEVICE_BLOCK, *PNDIS_M_DEVICE_BLOCK;
|
} NDIS_M_DEVICE_BLOCK, *PNDIS_M_DEVICE_BLOCK;
|
||||||
|
|
||||||
/* resources allocated on behalf on the miniport */
|
/* resources allocated on behalf on the miniport */
|
||||||
|
|
|
@ -2503,7 +2503,59 @@ NdisIAddDevice(
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
|
NdisGenericIrpHandler(
|
||||||
|
IN PDEVICE_OBJECT DeviceObject,
|
||||||
|
IN PIRP Irp)
|
||||||
|
{
|
||||||
|
PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp);
|
||||||
|
|
||||||
|
/* Use the characteristics to classify the device */
|
||||||
|
if (DeviceObject->DeviceType == FILE_DEVICE_PHYSICAL_NETCARD)
|
||||||
|
{
|
||||||
|
if ((IrpSp->MajorFunction == IRP_MJ_CREATE) ||
|
||||||
|
(IrpSp->MajorFunction == IRP_MJ_CLOSE))
|
||||||
|
{
|
||||||
|
return NdisICreateClose(DeviceObject, Irp);
|
||||||
|
}
|
||||||
|
else if (IrpSp->MajorFunction == IRP_MJ_PNP)
|
||||||
|
{
|
||||||
|
return NdisIDispatchPnp(DeviceObject, Irp);
|
||||||
|
}
|
||||||
|
else if (IrpSp->MajorFunction == IRP_MJ_SHUTDOWN)
|
||||||
|
{
|
||||||
|
return NdisIShutdown(DeviceObject, Irp);
|
||||||
|
}
|
||||||
|
else if (IrpSp->MajorFunction == IRP_MJ_DEVICE_CONTROL)
|
||||||
|
{
|
||||||
|
return NdisIDeviceIoControl(DeviceObject, Irp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (DeviceObject->DeviceType == FILE_DEVICE_NETWORK)
|
||||||
|
{
|
||||||
|
PNDIS_M_DEVICE_BLOCK DeviceBlock = DeviceObject->DeviceExtension;
|
||||||
|
|
||||||
|
ASSERT(DeviceBlock->DeviceObject == DeviceObject);
|
||||||
|
|
||||||
|
if (DeviceBlock->MajorFunction[IrpSp->MajorFunction] != NULL)
|
||||||
|
{
|
||||||
|
return DeviceBlock->MajorFunction[IrpSp->MajorFunction](DeviceObject, Irp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ASSERT(FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
Irp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST;
|
||||||
|
Irp->IoStatus.Information = 0;
|
||||||
|
|
||||||
|
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
||||||
|
|
||||||
|
return STATUS_INVALID_DEVICE_REQUEST;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @implemented
|
* @implemented
|
||||||
*/
|
*/
|
||||||
|
@ -2527,6 +2579,7 @@ NdisMRegisterMiniport(
|
||||||
PNDIS_M_DRIVER_BLOCK Miniport = GET_MINIPORT_DRIVER(NdisWrapperHandle);
|
PNDIS_M_DRIVER_BLOCK Miniport = GET_MINIPORT_DRIVER(NdisWrapperHandle);
|
||||||
PNDIS_M_DRIVER_BLOCK *MiniportPtr;
|
PNDIS_M_DRIVER_BLOCK *MiniportPtr;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
|
ULONG i;
|
||||||
|
|
||||||
NDIS_DbgPrint(MAX_TRACE, ("Called.\n"));
|
NDIS_DbgPrint(MAX_TRACE, ("Called.\n"));
|
||||||
|
|
||||||
|
@ -2649,11 +2702,12 @@ NdisMRegisterMiniport(
|
||||||
|
|
||||||
*MiniportPtr = Miniport;
|
*MiniportPtr = Miniport;
|
||||||
|
|
||||||
Miniport->DriverObject->MajorFunction[IRP_MJ_CREATE] = NdisICreateClose;
|
/* We have to register for all of these so handler registered in NdisMRegisterDevice work */
|
||||||
Miniport->DriverObject->MajorFunction[IRP_MJ_CLOSE] = NdisICreateClose;
|
for (i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++)
|
||||||
Miniport->DriverObject->MajorFunction[IRP_MJ_PNP] = NdisIDispatchPnp;
|
{
|
||||||
Miniport->DriverObject->MajorFunction[IRP_MJ_SHUTDOWN] = NdisIShutdown;
|
Miniport->DriverObject->MajorFunction[i] = NdisGenericIrpHandler;
|
||||||
Miniport->DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = NdisIDeviceIoControl;
|
}
|
||||||
|
|
||||||
Miniport->DriverObject->DriverExtension->AddDevice = NdisIAddDevice;
|
Miniport->DriverObject->DriverExtension->AddDevice = NdisIAddDevice;
|
||||||
|
|
||||||
return NDIS_STATUS_SUCCESS;
|
return NDIS_STATUS_SUCCESS;
|
||||||
|
@ -3076,7 +3130,7 @@ NdisMRegisterDevice(
|
||||||
NDIS_DbgPrint(MAX_TRACE, ("Called\n"));
|
NDIS_DbgPrint(MAX_TRACE, ("Called\n"));
|
||||||
|
|
||||||
Status = IoCreateDevice(DriverBlock->DriverObject,
|
Status = IoCreateDevice(DriverBlock->DriverObject,
|
||||||
0, /* This space is reserved for us. Should we use it? */
|
sizeof(NDIS_M_DEVICE_BLOCK),
|
||||||
DeviceName,
|
DeviceName,
|
||||||
FILE_DEVICE_NETWORK,
|
FILE_DEVICE_NETWORK,
|
||||||
0,
|
0,
|
||||||
|
@ -3098,7 +3152,7 @@ NdisMRegisterDevice(
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
DeviceBlock = ExAllocatePool(NonPagedPool, sizeof(NDIS_M_DEVICE_BLOCK));
|
DeviceBlock = DeviceObject->DeviceExtension;
|
||||||
|
|
||||||
if (!DeviceBlock)
|
if (!DeviceBlock)
|
||||||
{
|
{
|
||||||
|
@ -3109,15 +3163,7 @@ NdisMRegisterDevice(
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++)
|
for (i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++)
|
||||||
DriverBlock->DriverObject->MajorFunction[i] = MajorFunctions[i];
|
DeviceBlock->MajorFunction[i] = MajorFunctions[i];
|
||||||
|
|
||||||
DriverBlock->DriverObject->MajorFunction[IRP_MJ_PNP] = NdisIDispatchPnp;
|
|
||||||
|
|
||||||
if (!DriverBlock->DriverObject->MajorFunction[IRP_MJ_CREATE])
|
|
||||||
DriverBlock->DriverObject->MajorFunction[IRP_MJ_CREATE] = NdisICreateClose;
|
|
||||||
|
|
||||||
if (!DriverBlock->DriverObject->MajorFunction[IRP_MJ_CLOSE])
|
|
||||||
DriverBlock->DriverObject->MajorFunction[IRP_MJ_CLOSE] = NdisICreateClose;
|
|
||||||
|
|
||||||
DeviceBlock->DeviceObject = DeviceObject;
|
DeviceBlock->DeviceObject = DeviceObject;
|
||||||
DeviceBlock->SymbolicName = SymbolicName;
|
DeviceBlock->SymbolicName = SymbolicName;
|
||||||
|
@ -3148,8 +3194,6 @@ NdisMDeregisterDevice(
|
||||||
|
|
||||||
IoDeleteSymbolicLink(DeviceBlock->SymbolicName);
|
IoDeleteSymbolicLink(DeviceBlock->SymbolicName);
|
||||||
|
|
||||||
ExFreePool(DeviceBlock);
|
|
||||||
|
|
||||||
return NDIS_STATUS_SUCCESS;
|
return NDIS_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue