summaryrefslogtreecommitdiffstats
path: root/private/ntos/tdi/isn/ipx/event.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--private/ntos/tdi/isn/ipx/event.c143
1 files changed, 143 insertions, 0 deletions
diff --git a/private/ntos/tdi/isn/ipx/event.c b/private/ntos/tdi/isn/ipx/event.c
new file mode 100644
index 000000000..a64f85d34
--- /dev/null
+++ b/private/ntos/tdi/isn/ipx/event.c
@@ -0,0 +1,143 @@
+/*++
+
+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 */
+