195 lines
5.4 KiB
C
195 lines
5.4 KiB
C
|
/*++
|
|||
|
|
|||
|
Copyright (c) 1989, 1990, 1991 Microsoft Corporation
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
event.c
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
This module contains code which performs the following TDI services:
|
|||
|
|
|||
|
o TdiSetEventHandler
|
|||
|
|
|||
|
Author:
|
|||
|
|
|||
|
David Beaver (dbeaver) 1-July-1991
|
|||
|
|
|||
|
Environment:
|
|||
|
|
|||
|
Kernel mode
|
|||
|
|
|||
|
Revision History:
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
#include "precomp.h"
|
|||
|
#pragma hdrstop
|
|||
|
|
|||
|
|
|||
|
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;
|
|||
|
} else {
|
|||
|
addressFile->ReceiveHandler =
|
|||
|
(PTDI_IND_RECEIVE)parameters->EventHandler;
|
|||
|
addressFile->ReceiveHandlerContext = parameters->EventContext;
|
|||
|
addressFile->RegisteredReceiveHandler = TRUE;
|
|||
|
}
|
|||
|
|
|||
|
break;
|
|||
|
|
|||
|
case TDI_EVENT_RECEIVE_EXPEDITED:
|
|||
|
|
|||
|
if (parameters->EventHandler == NULL) {
|
|||
|
addressFile->ExpeditedDataHandler =
|
|||
|
(PTDI_IND_RECEIVE_EXPEDITED)TdiDefaultRcvExpeditedHandler;
|
|||
|
addressFile->ExpeditedDataHandlerContext = NULL;
|
|||
|
addressFile->RegisteredExpeditedDataHandler = FALSE;
|
|||
|
} else {
|
|||
|
addressFile->ExpeditedDataHandler =
|
|||
|
(PTDI_IND_RECEIVE_EXPEDITED)parameters->EventHandler;
|
|||
|
addressFile->ExpeditedDataHandlerContext = parameters->EventContext;
|
|||
|
addressFile->RegisteredExpeditedDataHandler = TRUE;
|
|||
|
}
|
|||
|
|
|||
|
break;
|
|||
|
|
|||
|
case TDI_EVENT_RECEIVE_DATAGRAM:
|
|||
|
|
|||
|
if (parameters->EventHandler == NULL) {
|
|||
|
addressFile->ReceiveDatagramHandler =
|
|||
|
(PTDI_IND_RECEIVE_DATAGRAM)TdiDefaultRcvDatagramHandler;
|
|||
|
addressFile->ReceiveDatagramHandlerContext = NULL;
|
|||
|
addressFile->RegisteredReceiveDatagramHandler = FALSE;
|
|||
|
} else {
|
|||
|
addressFile->ReceiveDatagramHandler =
|
|||
|
(PTDI_IND_RECEIVE_DATAGRAM)parameters->EventHandler;
|
|||
|
addressFile->ReceiveDatagramHandlerContext = parameters->EventContext;
|
|||
|
addressFile->RegisteredReceiveDatagramHandler = TRUE;
|
|||
|
}
|
|||
|
|
|||
|
break;
|
|||
|
|
|||
|
case TDI_EVENT_ERROR:
|
|||
|
|
|||
|
if (parameters->EventHandler == NULL) {
|
|||
|
addressFile->ErrorHandler =
|
|||
|
(PTDI_IND_ERROR)TdiDefaultErrorHandler;
|
|||
|
addressFile->ErrorHandlerContext = NULL;
|
|||
|
addressFile->RegisteredErrorHandler = FALSE;
|
|||
|
} else {
|
|||
|
addressFile->ErrorHandler =
|
|||
|
(PTDI_IND_ERROR)parameters->EventHandler;
|
|||
|
addressFile->ErrorHandlerContext = parameters->EventContext;
|
|||
|
addressFile->RegisteredErrorHandler = TRUE;
|
|||
|
}
|
|||
|
|
|||
|
break;
|
|||
|
|
|||
|
case TDI_EVENT_DISCONNECT:
|
|||
|
|
|||
|
if (parameters->EventHandler == NULL) {
|
|||
|
addressFile->DisconnectHandler =
|
|||
|
(PTDI_IND_DISCONNECT)TdiDefaultDisconnectHandler;
|
|||
|
addressFile->DisconnectHandlerContext = NULL;
|
|||
|
addressFile->RegisteredDisconnectHandler = FALSE;
|
|||
|
} else {
|
|||
|
addressFile->DisconnectHandler =
|
|||
|
(PTDI_IND_DISCONNECT)parameters->EventHandler;
|
|||
|
addressFile->DisconnectHandlerContext = parameters->EventContext;
|
|||
|
addressFile->RegisteredDisconnectHandler = TRUE;
|
|||
|
}
|
|||
|
|
|||
|
break;
|
|||
|
|
|||
|
case TDI_EVENT_CONNECT:
|
|||
|
|
|||
|
if (parameters->EventHandler == NULL) {
|
|||
|
addressFile->ConnectionHandler =
|
|||
|
(PTDI_IND_CONNECT)TdiDefaultConnectHandler;
|
|||
|
addressFile->ConnectionHandlerContext = NULL;
|
|||
|
addressFile->RegisteredConnectionHandler = FALSE;
|
|||
|
} else {
|
|||
|
addressFile->ConnectionHandler =
|
|||
|
(PTDI_IND_CONNECT)parameters->EventHandler;
|
|||
|
addressFile->ConnectionHandlerContext = parameters->EventContext;
|
|||
|
addressFile->RegisteredConnectionHandler = TRUE;
|
|||
|
}
|
|||
|
break;
|
|||
|
|
|||
|
default:
|
|||
|
|
|||
|
rc = STATUS_INVALID_PARAMETER;
|
|||
|
|
|||
|
} /* switch */
|
|||
|
|
|||
|
RELEASE_SPIN_LOCK (&address->SpinLock, oldirql);
|
|||
|
|
|||
|
NbfDereferenceAddress ("Set event handler", address, AREF_VERIFY);
|
|||
|
|
|||
|
return rc;
|
|||
|
} /* TdiSetEventHandler */
|
|||
|
|