|
|
1.1 root 1: /*++
2:
3: Copyright (c) 1990 Microsoft Corporation
4:
5: Module Name:
6:
7: packet.c
8:
9: Abstract:
10:
11:
12: Author:
13:
14:
15: Environment:
16:
17: Kernel mode only.
18:
19: Notes:
20:
21:
22: Future:
23:
24:
25:
26: Revision History:
27:
28: --*/
29:
30: #include "stdarg.h"
31: #include "ntddk.h"
32: #include "ntiologc.h"
33: #include "ndis.h"
34:
35: #include "debug.h"
36: #include "packet.h"
37:
38:
39:
40:
41: NTSTATUS
42: PacketOpen(
43: IN PDEVICE_OBJECT DeviceObject,
44: IN PIRP Irp
45: )
46:
47: /*++
48:
49: Routine Description:
50:
51: This is the dispatch routine for create/open and close requests.
52: These requests complete successfully.
53:
54: Arguments:
55:
56: DeviceObject - Pointer to the device object.
57:
58: Irp - Pointer to the request packet.
59:
60: Return Value:
61:
62: Status is returned.
63:
64: --*/
65:
66: {
67:
68: PDEVICE_EXTENSION DeviceExtension;
69:
70: NDIS_STATUS Status;
71: NDIS_STATUS ErrorStatus;
72: UINT Medium;
73: NDIS_MEDIUM MediumArray=NdisMedium802_3;
74:
75: IF_LOUD(DbgPrint("Packet: OpenAdapter\n");)
76:
77: DeviceExtension = DeviceObject->DeviceExtension;
78:
79: //
80: // Save the Irp here. This should be ok as I have opened this
81: // device as exclusive
82: //
83: DeviceExtension->OpenCloseIrp=Irp;
84:
85: IoMarkIrpPending(Irp);
86: Irp->IoStatus.Status = STATUS_PENDING;
87:
88: //
89: // Try to open the MAC
90: //
91: NdisOpenAdapter(
92: &Status,
93: &ErrorStatus,
94: &DeviceExtension->AdapterHandle,
95: &Medium,
96: &MediumArray,
97: 1,
98: DeviceExtension->NdisProtocolHandle,
99: DeviceExtension,
100: &DeviceExtension->AdapterName,
101: 0,
102: NULL);
103:
104:
105: if (Status != NDIS_STATUS_PENDING) {
106:
107: PacketOpenAdapterComplete(
108: DeviceExtension,
109: Status,
110: NDIS_STATUS_SUCCESS
111: );
112:
113:
114: }
115:
116:
117:
118: return(STATUS_PENDING);
119:
120: }
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131: VOID
132: PacketOpenAdapterComplete(
133: IN NDIS_HANDLE ProtocolBindingContext,
134: IN NDIS_STATUS Status,
135: IN NDIS_STATUS OpenErrorStatus
136: )
137:
138: {
139:
140: PDEVICE_EXTENSION DeviceExtension;
141: PIRP Irp;
142:
143: IF_LOUD(DbgPrint("Packet: OpenAdapterComplete\n");)
144:
145: DeviceExtension= (PDEVICE_EXTENSION)ProtocolBindingContext;
146: Irp=DeviceExtension->OpenCloseIrp;
147:
148: Irp->IoStatus.Status = Status;
149: IoCompleteRequest(Irp, IO_NO_INCREMENT);
150:
151: return;
152:
153: }
154:
155:
156:
157:
158: NTSTATUS
159: PacketClose(
160: IN PDEVICE_OBJECT DeviceObject,
161: IN PIRP Irp
162: )
163:
164: /*++
165:
166: Routine Description:
167:
168: This is the dispatch routine for create/open and close requests.
169: These requests complete successfully.
170:
171: Arguments:
172:
173: DeviceObject - Pointer to the device object.
174:
175: Irp - Pointer to the request packet.
176:
177: Return Value:
178:
179: Status is returned.
180:
181: --*/
182:
183: {
184:
185: PDEVICE_EXTENSION DeviceExtension;
186:
187: NDIS_STATUS Status;
188:
189: IF_LOUD(DbgPrint("Packet: CloseAdapter\n");)
190:
191: DeviceExtension = DeviceObject->DeviceExtension;
192:
193: //
194: // Save the IRP
195: //
196: DeviceExtension->OpenCloseIrp=Irp;
197:
198: IoMarkIrpPending(Irp);
199: Irp->IoStatus.Status = STATUS_PENDING;
200:
201: NdisCloseAdapter(
202: &Status,
203: DeviceExtension->AdapterHandle
204: );
205:
206:
207: if (Status != NDIS_STATUS_PENDING) {
208:
209: PacketCloseAdapterComplete(
210: DeviceExtension,
211: Status
212: );
213:
214:
215: }
216:
217:
218:
219: return(STATUS_PENDING);
220:
221: }
222:
223:
224:
225:
226:
227: VOID
228: PacketCloseAdapterComplete(
229: IN NDIS_HANDLE ProtocolBindingContext,
230: IN NDIS_STATUS Status
231: )
232:
233: {
234: PDEVICE_EXTENSION DeviceExtension;
235: PIRP Irp;
236:
237: IF_LOUD(DbgPrint("Packet: CloseAdapterComplete\n");)
238:
239: DeviceExtension= (PDEVICE_EXTENSION)ProtocolBindingContext;
240:
241: Irp=DeviceExtension->OpenCloseIrp;
242:
243: Irp->IoStatus.Status = STATUS_SUCCESS;
244: IoCompleteRequest(Irp, IO_NO_INCREMENT);
245:
246: return;
247:
248: }
249:
250:
251:
252:
253:
254:
255:
256:
257:
258:
259:
260: NTSTATUS
261: PacketCleanup(
262: IN PDEVICE_OBJECT DeviceObject,
263: IN PIRP FlushIrp
264: )
265:
266: /*++
267:
268: Routine Description:
269:
270: This is the dispatch routine for create/open and close requests.
271: These requests complete successfully.
272:
273: Arguments:
274:
275: DeviceObject - Pointer to the device object.
276:
277: Irp - Pointer to the request packet.
278:
279: Return Value:
280:
281: Status is returned.
282:
283: --*/
284:
285: {
286:
287: PDEVICE_EXTENSION DeviceExtension;
288: PLIST_ENTRY PacketListEntry;
289: PNDIS_PACKET pPacket;
290: NDIS_STATUS Status;
291:
292: IF_LOUD(DbgPrint("Packet: Cleanup\n");)
293:
294: DeviceExtension = DeviceObject->DeviceExtension;
295:
296: //
297: // The open instance of the device is about to close
298: // We need to complete all pending Irp's
299: // First we complete any pending read requests
300: //
301: while ((PacketListEntry=ExInterlockedRemoveHeadList(
302: &DeviceExtension->RcvList,
303: &DeviceExtension->RcvQSpinLock
304: )) != NULL) {
305:
306: IF_LOUD(DbgPrint("Packet: CleanUp - Completeing read\n");)
307:
308: pPacket=CONTAINING_RECORD(PacketListEntry,NDIS_PACKET,ProtocolReserved);
309:
310: //
311: // complete normally
312: //
313: PacketTransferDataComplete(
314: DeviceExtension,
315: pPacket,
316: NDIS_STATUS_SUCCESS,
317: 0
318: );
319:
320:
321: }
322:
323: IoMarkIrpPending(FlushIrp);
324: FlushIrp->IoStatus.Status = STATUS_PENDING;
325:
326: //
327: // We now place the Irp on the Reset list
328: //
329: ExInterlockedInsertTailList(
330: &DeviceExtension->ResetIrpList,
331: &FlushIrp->Tail.Overlay.ListEntry,
332: &DeviceExtension->DeviceSpinLock);
333:
334:
335: //
336: // Now reset the adapter, the mac driver will complete any
337: // pending requests we have made to it.
338: //
339: NdisReset(
340: &Status,
341: DeviceExtension->AdapterHandle
342: );
343:
344:
345: if (Status != NDIS_STATUS_PENDING) {
346:
347: IF_LOUD(DbgPrint("Packet: Cleanup - ResetComplte being called\n");)
348:
349: PacketResetComplete(
350: DeviceExtension,
351: Status
352: );
353:
354:
355: }
356:
357:
358:
359: return(STATUS_PENDING);
360:
361:
362: }
363:
364:
365:
366: VOID
367: PacketResetComplete(
368: IN NDIS_HANDLE ProtocolBindingContext,
369: IN NDIS_STATUS Status
370: )
371:
372: {
373: PDEVICE_EXTENSION DeviceExtension;
374: PIRP Irp;
375:
376: PLIST_ENTRY ResetListEntry;
377:
378: IF_LOUD(DbgPrint("Packet: PacketResetComplte\n");)
379:
380: DeviceExtension= (PDEVICE_EXTENSION)ProtocolBindingContext;
381:
382: //
383: // remove the reset IRP from the list
384: //
385: ResetListEntry=ExInterlockedRemoveHeadList(&DeviceExtension->ResetIrpList,
386: &DeviceExtension->DeviceSpinLock);
387:
388: #if DBG
389: if (ResetListEntry == NULL) {
390: DbgBreakPoint();
391: return;
392: }
393: #endif
394:
395: Irp=CONTAINING_RECORD(ResetListEntry,IRP,Tail.Overlay.ListEntry);
396:
397: Irp->IoStatus.Status = STATUS_SUCCESS;
398: IoCompleteRequest(Irp, IO_NO_INCREMENT);
399:
400: IF_LOUD(DbgPrint("Packet: PacketResetComplte exit\n");)
401:
402: return;
403:
404: }
405:
406:
407:
408:
409: NTSTATUS
410: PacketShutdown(
411: IN PDEVICE_OBJECT DeviceObject,
412: IN PIRP Irp
413: )
414:
415: /*++
416:
417: Routine Description:
418:
419: This is the dispatch routine for create/open and close requests.
420: These requests complete successfully.
421:
422: Arguments:
423:
424: DeviceObject - Pointer to the device object.
425:
426: Irp - Pointer to the request packet.
427:
428: Return Value:
429:
430: Status is returned.
431:
432: --*/
433:
434: {
435:
436: PDEVICE_EXTENSION DeviceExtension;
437:
438: IF_LOUD(DbgPrint("Packet: Shutdown\n");)
439:
440: DeviceExtension = DeviceObject->DeviceExtension;
441:
442: Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
443: return STATUS_UNSUCCESSFUL;
444:
445:
446: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.