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