144 lines
3.7 KiB
C
144 lines
3.7 KiB
C
/*++
|
||
|
||
Copyright (c) 1989-1993 Microsoft Corporation
|
||
|
||
Module Name:
|
||
|
||
event.c
|
||
|
||
Abstract:
|
||
|
||
This module contains code which performs the following TDI services:
|
||
|
||
o TdiSetEventHandler
|
||
|
||
Environment:
|
||
|
||
Kernel mode
|
||
|
||
Revision History:
|
||
|
||
Sanjay Anand (SanjayAn) 3-Oct-1995
|
||
Changes to support transfer of buffer ownership to transports
|
||
|
||
1. Added a new event type - TDI_EVENT_CHAINED_RECEIVE_DATAGRAM
|
||
--*/
|
||
|
||
#include "precomp.h"
|
||
#pragma hdrstop
|
||
|
||
|
||
NTSTATUS
|
||
IpxTdiSetEventHandler(
|
||
IN PREQUEST Request
|
||
)
|
||
|
||
/*++
|
||
|
||
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:
|
||
|
||
Request - Pointer to the request
|
||
|
||
Return Value:
|
||
|
||
NTSTATUS - status of operation.
|
||
|
||
--*/
|
||
|
||
{
|
||
NTSTATUS Status;
|
||
CTELockHandle LockHandle;
|
||
PTDI_REQUEST_KERNEL_SET_EVENT Parameters;
|
||
PADDRESS_FILE AddressFile;
|
||
|
||
//
|
||
// Get the Address this is associated with; if there is none, get out.
|
||
//
|
||
|
||
AddressFile = REQUEST_OPEN_CONTEXT(Request);
|
||
Status = IpxVerifyAddressFile (AddressFile);
|
||
|
||
if (!NT_SUCCESS (Status)) {
|
||
return Status;
|
||
}
|
||
|
||
CTEGetLock (&AddressFile->Address->Lock, &LockHandle);
|
||
|
||
Parameters = (PTDI_REQUEST_KERNEL_SET_EVENT)REQUEST_PARAMETERS(Request);
|
||
|
||
switch (Parameters->EventType) {
|
||
|
||
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;
|
||
//
|
||
// [SA] New event handler to receive chained buffers
|
||
//
|
||
case TDI_EVENT_CHAINED_RECEIVE_DATAGRAM:
|
||
|
||
if (Parameters->EventHandler == NULL) {
|
||
AddressFile->ChainedReceiveDatagramHandler =
|
||
(PTDI_IND_CHAINED_RECEIVE_DATAGRAM)TdiDefaultChainedRcvDatagramHandler;
|
||
AddressFile->ChainedReceiveDatagramHandlerContext = NULL;
|
||
AddressFile->RegisteredChainedReceiveDatagramHandler = FALSE;
|
||
} else {
|
||
AddressFile->ChainedReceiveDatagramHandler =
|
||
(PTDI_IND_CHAINED_RECEIVE_DATAGRAM)Parameters->EventHandler;
|
||
AddressFile->ChainedReceiveDatagramHandlerContext = Parameters->EventContext;
|
||
AddressFile->RegisteredChainedReceiveDatagramHandler = 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;
|
||
|
||
default:
|
||
|
||
Status = STATUS_INVALID_PARAMETER;
|
||
|
||
} /* switch */
|
||
|
||
CTEFreeLock (&AddressFile->Address->Lock, LockHandle);
|
||
|
||
IpxDereferenceAddressFile (AddressFile, AFREF_VERIFY);
|
||
|
||
REQUEST_INFORMATION(Request) = 0;
|
||
|
||
return Status;
|
||
|
||
} /* IpxTdiSetEventHandler */
|
||
|
||
|