You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
330 lines
8.6 KiB
330 lines
8.6 KiB
/*--Copyright (c) 1991 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
pnp.c
|
|
|
|
Abstract:
|
|
|
|
PnP specific code for TCP.
|
|
|
|
Author:
|
|
|
|
Munil Shah (munils) Mar 7, 1997
|
|
|
|
Revision History:
|
|
|
|
Notes:
|
|
|
|
--*/
|
|
|
|
#include "precomp.h"
|
|
#include "addr.h"
|
|
#include "tcp.h"
|
|
#include "raw.h"
|
|
#include "udp.h"
|
|
#include "tcb.h"
|
|
#include "tcpconn.h"
|
|
|
|
NTSTATUS
|
|
TCPQueryConnDeviceRelations(
|
|
IN PIRP Irp,
|
|
IN PIO_STACK_LOCATION IrpSp
|
|
);
|
|
|
|
NTSTATUS
|
|
TCPQueryAddrDeviceRelations(
|
|
IN PIRP Irp,
|
|
IN PIO_STACK_LOCATION IrpSp
|
|
);
|
|
|
|
NTSTATUS
|
|
TCPPnPReconfigRequest(
|
|
IN void *ipContext,
|
|
IN IPAddr ipAddr,
|
|
IN NDIS_HANDLE handle,
|
|
IN PIP_PNP_RECONFIG_REQUEST reconfigBuffer
|
|
);
|
|
|
|
NTSTATUS
|
|
UDPPnPReconfigRequest(
|
|
IN void *ipContext,
|
|
IN IPAddr ipAddr,
|
|
IN NDIS_HANDLE handle,
|
|
IN PIP_PNP_RECONFIG_REQUEST reconfigBuffer
|
|
);
|
|
NTSTATUS
|
|
RawPnPReconfigRequest(
|
|
IN void *ipContext,
|
|
IN IPAddr ipAddr,
|
|
IN NDIS_HANDLE handle,
|
|
IN PIP_PNP_RECONFIG_REQUEST reconfigBuffer
|
|
);
|
|
|
|
extern TDI_STATUS
|
|
IPGetDeviceRelation(RouteCacheEntry * rce, PVOID * pnpDeviceContext);
|
|
|
|
extern void
|
|
DeleteProtocolSecurityFilter(IPAddr InterfaceAddress, ulong Protocol);
|
|
|
|
extern void
|
|
ControlSecurityFiltering(uint IsEnabled);
|
|
|
|
extern void
|
|
AddProtocolSecurityFilter(IPAddr InterfaceAddress, ulong Protocol,
|
|
NDIS_HANDLE ConfigHandle);
|
|
|
|
NTSTATUS
|
|
TCPPnPPowerRequest(void *ipContext, IPAddr ipAddr, NDIS_HANDLE handle, PNET_PNP_EVENT netPnPEvent)
|
|
{
|
|
switch (netPnPEvent->NetEvent) {
|
|
case NetEventReconfigure:{
|
|
|
|
PIP_PNP_RECONFIG_REQUEST reconfigBuffer = (PIP_PNP_RECONFIG_REQUEST) netPnPEvent->Buffer;
|
|
return TCPPnPReconfigRequest(
|
|
ipContext,
|
|
ipAddr,
|
|
handle,
|
|
reconfigBuffer
|
|
);
|
|
}
|
|
default:
|
|
break;
|
|
}
|
|
return STATUS_SUCCESS;
|
|
}
|
|
|
|
NTSTATUS
|
|
UDPPnPPowerRequest(void *ipContext, IPAddr ipAddr, NDIS_HANDLE handle, PNET_PNP_EVENT netPnPEvent)
|
|
{
|
|
|
|
switch (netPnPEvent->NetEvent) {
|
|
case NetEventReconfigure:{
|
|
|
|
PIP_PNP_RECONFIG_REQUEST reconfigBuffer = (PIP_PNP_RECONFIG_REQUEST) netPnPEvent->Buffer;
|
|
return UDPPnPReconfigRequest(
|
|
ipContext,
|
|
ipAddr,
|
|
handle,
|
|
reconfigBuffer
|
|
);
|
|
}
|
|
default:
|
|
break;
|
|
}
|
|
|
|
return STATUS_SUCCESS;
|
|
}
|
|
|
|
NTSTATUS
|
|
RawPnPPowerRequest(void *ipContext, IPAddr ipAddr, NDIS_HANDLE handle, PNET_PNP_EVENT netPnPEvent)
|
|
{
|
|
switch (netPnPEvent->NetEvent) {
|
|
case NetEventReconfigure:{
|
|
|
|
PIP_PNP_RECONFIG_REQUEST reconfigBuffer = (PIP_PNP_RECONFIG_REQUEST) netPnPEvent->Buffer;
|
|
return RawPnPReconfigRequest(
|
|
ipContext,
|
|
ipAddr,
|
|
handle,
|
|
reconfigBuffer
|
|
);
|
|
}
|
|
default:
|
|
break;
|
|
}
|
|
|
|
return STATUS_SUCCESS;
|
|
}
|
|
|
|
NTSTATUS
|
|
TCPPnPReconfigRequest(void *ipContext, IPAddr ipAddr, NDIS_HANDLE handle, PIP_PNP_RECONFIG_REQUEST reconfigBuffer)
|
|
{
|
|
return STATUS_SUCCESS;
|
|
}
|
|
|
|
NTSTATUS
|
|
UDPPnPReconfigRequest(void *ipContext, IPAddr ipAddr, NDIS_HANDLE handle, PIP_PNP_RECONFIG_REQUEST reconfigBuffer)
|
|
{
|
|
return STATUS_SUCCESS;
|
|
}
|
|
|
|
NTSTATUS
|
|
RawPnPReconfigRequest(void *ipContext, IPAddr ipAddr, NDIS_HANDLE handle, PIP_PNP_RECONFIG_REQUEST reconfigBuffer)
|
|
{
|
|
return STATUS_SUCCESS;
|
|
}
|
|
|
|
NTSTATUS
|
|
TCPDispatchPnPPower(
|
|
IN PIRP irp,
|
|
IN PIO_STACK_LOCATION irpSp
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Processes pnp power irps.
|
|
|
|
Arguments:
|
|
|
|
Irp - Pointer to I/O request packet
|
|
IrpSp - Pointer to the current stack location in the Irp.
|
|
|
|
Return Value:
|
|
|
|
NTSTATUS -- Indicates whether the request was successful.
|
|
|
|
Notes:
|
|
|
|
--*/
|
|
|
|
{
|
|
NTSTATUS status;
|
|
|
|
status = STATUS_INVALID_DEVICE_REQUEST;
|
|
|
|
switch (irpSp->MinorFunction) {
|
|
case IRP_MN_QUERY_DEVICE_RELATIONS:
|
|
if (irpSp->Parameters.QueryDeviceRelations.Type == TargetDeviceRelation) {
|
|
if (PtrToUlong(irpSp->FileObject->FsContext2) == TDI_CONNECTION_FILE) {
|
|
|
|
return TCPQueryConnDeviceRelations(irp, irpSp);
|
|
} else if (PtrToUlong(irpSp->FileObject->FsContext2) == TDI_TRANSPORT_ADDRESS_FILE) {
|
|
|
|
return TCPQueryAddrDeviceRelations(irp, irpSp);
|
|
}
|
|
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
return status;
|
|
}
|
|
|
|
NTSTATUS
|
|
TCPQueryConnDeviceRelations(
|
|
IN PIRP Irp,
|
|
IN PIO_STACK_LOCATION IrpSp
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Processes pnp power irps.
|
|
|
|
Arguments:
|
|
|
|
Irp - Pointer to I/O request packet
|
|
IrpSp - Pointer to the current stack location in the Irp.
|
|
|
|
Return Value:
|
|
|
|
NTSTATUS -- Indicates whether the request was successful.
|
|
|
|
Notes:
|
|
|
|
--*/
|
|
|
|
{
|
|
PTCP_CONTEXT tcpContext;
|
|
CONNECTION_CONTEXT ConnectionContext;
|
|
TCB *TCB;
|
|
TCPConn *Conn;
|
|
PVOID pnpDeviceContext;
|
|
TDI_STATUS status;
|
|
PDEVICE_RELATIONS deviceRelations = NULL;
|
|
CTELockHandle ConnHandle;
|
|
|
|
tcpContext = (PTCP_CONTEXT) IrpSp->FileObject->FsContext;
|
|
ConnectionContext = tcpContext->Handle.ConnectionContext;
|
|
|
|
// find connection.
|
|
Conn = GetConnFromConnID(PtrToUlong(ConnectionContext), &ConnHandle);
|
|
|
|
if (Conn != NULL) {
|
|
// get the tcb for this connection.
|
|
TCB = Conn->tc_tcb;
|
|
if (TCB) {
|
|
CTEGetLockAtDPC(&TCB->tcb_lock);
|
|
if (TCB->tcb_state == TCB_CLOSED || CLOSING(TCB)) {
|
|
CTEFreeLockFromDPC(&TCB->tcb_lock);
|
|
status = TDI_INVALID_STATE;
|
|
} else {
|
|
REFERENCE_TCB(TCB);
|
|
CTEFreeLockFromDPC(&TCB->tcb_lock);
|
|
|
|
// get device relations from IP.
|
|
status = IPGetDeviceRelation(TCB->tcb_rce, &pnpDeviceContext);
|
|
|
|
CTEGetLockAtDPC(&TCB->tcb_lock);
|
|
DerefTCB(TCB, DISPATCH_LEVEL);
|
|
|
|
if (status == TDI_SUCCESS) {
|
|
deviceRelations = CTEAllocMem(sizeof(DEVICE_RELATIONS));
|
|
if (deviceRelations) {
|
|
//
|
|
// TargetDeviceRelation allows exactly one PDO.
|
|
// fill it up.
|
|
//
|
|
// N.B. This allocation is freed by the I/O manager
|
|
// or by whichever driver issued the request.
|
|
//
|
|
deviceRelations->Count = 1;
|
|
deviceRelations->Objects[0] = pnpDeviceContext;
|
|
ObReferenceObject(pnpDeviceContext);
|
|
|
|
} else {
|
|
status = TDI_NO_RESOURCES;
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
status = TDI_INVALID_STATE;
|
|
}
|
|
|
|
CTEFreeLock(&(Conn->tc_ConnBlock->cb_lock), ConnHandle);
|
|
|
|
} else {
|
|
status = TDI_INVALID_CONNECTION;
|
|
}
|
|
|
|
//
|
|
// invoker of this irp will free the information buffer.
|
|
//
|
|
Irp->IoStatus.Status = status;
|
|
Irp->IoStatus.Information = (ULONG_PTR) deviceRelations;
|
|
|
|
return status;
|
|
}
|
|
|
|
NTSTATUS
|
|
TCPQueryAddrDeviceRelations(
|
|
IN PIRP Irp,
|
|
IN PIO_STACK_LOCATION IrpSp
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Processes pnp power irps.
|
|
|
|
Arguments:
|
|
|
|
Irp - Pointer to I/O request packet
|
|
IrpSp - Pointer to the current stack location in the Irp.
|
|
|
|
Return Value:
|
|
|
|
NTSTATUS -- Indicates whether the request was successful.
|
|
|
|
Notes:
|
|
|
|
--*/
|
|
|
|
{
|
|
return STATUS_UNSUCCESSFUL;
|
|
}
|
|
|