VOID ActivateReceive( PTP_CONNECTION Connection ) /*++ Routine Description: This routine activates the next TdiReceive request on the specified connection object if there is no active request on that connection already. This allows the request to accept data on the connection. NOTE: THIS FUNCTION MUST BE CALLED AT DPC LEVEL. Arguments: Connection - Pointer to a TP_CONNECTION object. Return Value: none. --*/ { PIRP Irp; ASSERT (KeGetCurrentIrql() == DISPATCH_LEVEL); IF_NBFDBG (NBF_DEBUG_RCVENG) { NbfPrint0 (" ActivateReceive: Entered.\n"); } // // The ACTIVE_RECEIVE bitflag will be set on the connection if // the receive-fields in the CONNECTION object are valid. If // this flag is cleared, then we try to make the next TdiReceive // request in the ReceiveQueue the active request. // ACQUIRE_DPC_SPIN_LOCK (Connection->LinkSpinLock); if (!(Connection->Flags & CONNECTION_FLAGS_ACTIVE_RECEIVE)) { if (!IsListEmpty (&Connection->ReceiveQueue)) { // // Found a receive, so make it the active one. // Connection->Flags |= CONNECTION_FLAGS_ACTIVE_RECEIVE; Irp = CONTAINING_RECORD( Connection->ReceiveQueue.Flink, IRP, Tail.Overlay.ListEntry); Connection->MessageBytesReceived = 0; Connection->MessageBytesAcked = 0; Connection->MessageInitAccepted = 0; Connection->CurrentReceiveIrp = Irp; Connection->CurrentReceiveSynchronous = Connection->Provider->MacInfo.SingleReceive; Connection->CurrentReceiveMdl = Irp->MdlAddress; Connection->ReceiveLength = IRP_RECEIVE_LENGTH(IoGetCurrentIrpStackLocation(Irp)); Connection->ReceiveByteOffset = 0; } } RELEASE_DPC_SPIN_LOCK (Connection->LinkSpinLock); IF_NBFDBG (NBF_DEBUG_RCVENG) { NbfPrint0 (" ActivateReceive: Exiting.\n"); } } /* ActivateReceive */
NTSTATUS NbfTdiSetEventHandler( IN PIRP Irp ) /*++ Routine Description: This routine performs the TdiSetEventHandler request for the transport provider. The caller (request dispatcher) verifies that this routine will not be executed on behalf of a user-mode client, as this request enables direct callouts at DISPATCH_LEVEL. Arguments: Irp - Pointer to the IRP for this request Return Value: NTSTATUS - status of operation. --*/ { NTSTATUS rc=STATUS_SUCCESS; KIRQL oldirql; PTDI_REQUEST_KERNEL_SET_EVENT parameters; PIO_STACK_LOCATION irpSp; PTP_ADDRESS address; PTP_ADDRESS_FILE addressFile; NTSTATUS status; // // Get the Address this is associated with; if there is none, get out. // irpSp = IoGetCurrentIrpStackLocation (Irp); if (irpSp->FileObject->FsContext2 != (PVOID) TDI_TRANSPORT_ADDRESS_FILE) { return STATUS_INVALID_ADDRESS; } addressFile = irpSp->FileObject->FsContext; status = NbfVerifyAddressObject (addressFile); if (!NT_SUCCESS (status)) { return status; } address = addressFile->Address; ACQUIRE_SPIN_LOCK (&address->SpinLock, &oldirql); parameters = (PTDI_REQUEST_KERNEL_SET_EVENT)&irpSp->Parameters; switch (parameters->EventType) { case TDI_EVENT_RECEIVE: if (parameters->EventHandler == NULL) { addressFile->ReceiveHandler = (PTDI_IND_RECEIVE)TdiDefaultReceiveHandler; addressFile->ReceiveHandlerContext = NULL; addressFile->RegisteredReceiveHandler = FALSE; IF_NBFDBG (NBF_DEBUG_DISPATCH) { NbfPrint0 ("NbfTdiSetEventHandler: set STREAM DefaultReceiveHandler.\n"); } } else {