|
|
1.1 root 1: /*++
2:
3: Copyright (c) 1989-1993 Microsoft Corporation
4:
5: Module Name:
6:
7: event.c
8:
9: Abstract:
10:
11: This module contains code which performs the following TDI services:
12:
13: o TdiSetEventHandler
14:
15: Environment:
16:
17: Kernel mode
18:
19: Revision History:
20:
21: --*/
22:
23: #include "st.h"
24:
25:
26: NTSTATUS
27: StTdiSetEventHandler(
28: IN PIRP Irp
29: )
30:
31: /*++
32:
33: Routine Description:
34:
35: This routine performs the TdiSetEventHandler request for the
36: transport provider. The caller (request dispatcher) verifies
37: that this routine will not be executed on behalf of a user-mode
38: client, as this request enables direct callouts at DISPATCH_LEVEL.
39:
40: Arguments:
41:
42: Irp - Pointer to the IRP for this request
43:
44: Return Value:
45:
46: NTSTATUS - status of operation.
47:
48: --*/
49:
50: {
51: NTSTATUS rc=STATUS_SUCCESS;
52: KIRQL oldirql;
53: PTDI_REQUEST_KERNEL_SET_EVENT parameters;
54: PIO_STACK_LOCATION irpSp;
55: PTP_ADDRESS address;
56: PTP_ADDRESS_FILE addressFile;
57: NTSTATUS status;
58:
59: //
60: // Get the Address this is associated with; if there is none, get out.
61: //
62:
63: irpSp = IoGetCurrentIrpStackLocation (Irp);
64:
65: addressFile = irpSp->FileObject->FsContext;
66: status = StVerifyAddressObject (addressFile);
67: if (!NT_SUCCESS (status)) {
68: return status;
69: }
70:
71: address = addressFile->Address;
72:
73: ACQUIRE_SPIN_LOCK (&address->SpinLock, &oldirql);
74:
75: parameters = (PTDI_REQUEST_KERNEL_SET_EVENT)&irpSp->Parameters;
76:
77: switch (parameters->EventType) {
78:
79: case TDI_EVENT_RECEIVE:
80:
81: if (parameters->EventHandler == NULL) {
82: addressFile->ReceiveHandler =
83: (PTDI_IND_RECEIVE)TdiDefaultReceiveHandler;
84: addressFile->ReceiveHandlerContext = NULL;
85: addressFile->RegisteredReceiveHandler = FALSE;
86: } else {
87: addressFile->ReceiveHandler =
88: (PTDI_IND_RECEIVE)parameters->EventHandler;
89: addressFile->ReceiveHandlerContext = parameters->EventContext;
90: addressFile->RegisteredReceiveHandler = TRUE;
91: }
92:
93: break;
94:
95: case TDI_EVENT_RECEIVE_EXPEDITED:
96:
97: if (parameters->EventHandler == NULL) {
98: addressFile->ExpeditedDataHandler =
99: (PTDI_IND_RECEIVE_EXPEDITED)TdiDefaultRcvExpeditedHandler;
100: addressFile->ExpeditedDataHandlerContext = NULL;
101: addressFile->RegisteredExpeditedDataHandler = FALSE;
102: } else {
103: addressFile->ExpeditedDataHandler =
104: (PTDI_IND_RECEIVE_EXPEDITED)parameters->EventHandler;
105: addressFile->ExpeditedDataHandlerContext = parameters->EventContext;
106: addressFile->RegisteredExpeditedDataHandler = TRUE;
107: }
108:
109: break;
110:
111: case TDI_EVENT_RECEIVE_DATAGRAM:
112:
113: if (parameters->EventHandler == NULL) {
114: addressFile->ReceiveDatagramHandler =
115: (PTDI_IND_RECEIVE_DATAGRAM)TdiDefaultRcvDatagramHandler;
116: addressFile->ReceiveDatagramHandlerContext = NULL;
117: addressFile->RegisteredReceiveDatagramHandler = FALSE;
118: } else {
119: addressFile->ReceiveDatagramHandler =
120: (PTDI_IND_RECEIVE_DATAGRAM)parameters->EventHandler;
121: addressFile->ReceiveDatagramHandlerContext = parameters->EventContext;
122: addressFile->RegisteredReceiveDatagramHandler = TRUE;
123: }
124:
125: break;
126:
127: case TDI_EVENT_ERROR:
128:
129: if (parameters->EventHandler == NULL) {
130: addressFile->ErrorHandler =
131: (PTDI_IND_ERROR)TdiDefaultErrorHandler;
132: addressFile->ErrorHandlerContext = NULL;
133: addressFile->RegisteredErrorHandler = FALSE;
134: } else {
135: addressFile->ErrorHandler =
136: (PTDI_IND_ERROR)parameters->EventHandler;
137: addressFile->ErrorHandlerContext = parameters->EventContext;
138: addressFile->RegisteredErrorHandler = TRUE;
139: }
140:
141: break;
142:
143: case TDI_EVENT_DISCONNECT:
144:
145: if (parameters->EventHandler == NULL) {
146: addressFile->DisconnectHandler =
147: (PTDI_IND_DISCONNECT)TdiDefaultDisconnectHandler;
148: addressFile->DisconnectHandlerContext = NULL;
149: addressFile->RegisteredDisconnectHandler = FALSE;
150: } else {
151: addressFile->DisconnectHandler =
152: (PTDI_IND_DISCONNECT)parameters->EventHandler;
153: addressFile->DisconnectHandlerContext = parameters->EventContext;
154: addressFile->RegisteredDisconnectHandler = TRUE;
155: }
156:
157: break;
158:
159: case TDI_EVENT_CONNECT:
160:
161: if (parameters->EventHandler == NULL) {
162: addressFile->ConnectionHandler =
163: (PTDI_IND_CONNECT)TdiDefaultConnectHandler;
164: addressFile->ConnectionHandlerContext = NULL;
165: addressFile->RegisteredConnectionHandler = FALSE;
166: } else {
167: addressFile->ConnectionHandler =
168: (PTDI_IND_CONNECT)parameters->EventHandler;
169: addressFile->ConnectionHandlerContext = parameters->EventContext;
170: addressFile->RegisteredConnectionHandler = TRUE;
171: }
172: break;
173:
174: default:
175:
176: rc = STATUS_INVALID_PARAMETER;
177:
178: } /* switch */
179:
180: RELEASE_SPIN_LOCK (&address->SpinLock, oldirql);
181:
182: StDereferenceAddress ("Set event handler", address);
183:
184: return rc;
185: } /* TdiSetEventHandler */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.