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.
|
|
/*++
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 */
|