Leaked source code of windows server 2003
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

/*--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;
}