ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/cebix/BasiliskII/src/Windows/b2ether/nt5/b2ether_write.c
Revision: 1.1
Committed: 2012-04-22T03:13:32Z (12 years, 6 months ago) by asvitkine
Content type: text/plain
Branch: MAIN
CVS Tags: HEAD
Error occurred while calculating annotation data.
Log Message:
Import nt5 version of the ethernet driver from 2001 sources.

File Contents

# Content
1 /*
2 * b2ether driver -- derived from DDK packet driver sample
3 *
4 * Basilisk II (C) 1997-1999 Christian Bauer
5 *
6 * Windows platform specific code copyright (C) Lauri Pesonen
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 */
22
23 #include "ntddk.h"
24 #include "ndis.h"
25 #include "b2ether.h"
26
27
28 NTSTATUS PacketWrite( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp )
29 {
30 POPEN_INSTANCE open;
31 PNDIS_PACKET pPacket;
32 NDIS_STATUS Status;
33
34 // DebugPrint(("SendAdapter\n"));
35
36 open = DeviceObject->DeviceExtension;
37
38 IoIncrement(open);
39
40 if(!open->Bound) {
41 Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
42 IoCompleteRequest (Irp, IO_NO_INCREMENT);
43 IoDecrement(open);
44 return STATUS_UNSUCCESSFUL;
45 }
46
47 NdisAllocatePacket( &Status, &pPacket, open->PacketPool );
48
49 if (Status != NDIS_STATUS_SUCCESS) {
50 Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES;
51 IoCompleteRequest (Irp, IO_NO_INCREMENT);
52 IoDecrement(open);
53 return STATUS_INSUFFICIENT_RESOURCES;
54 }
55
56 RESERVED(pPacket)->Irp=Irp;
57
58 NdisChainBufferAtFront(pPacket,Irp->MdlAddress);
59
60 // Important: Since we have marked the IRP pending, we must return
61 // STATUS_PENDING even we happen to complete the IRP synchronously.
62
63 IoMarkIrpPending(Irp);
64
65 NdisSend( &Status, open->AdapterHandle, pPacket );
66
67 if (Status != NDIS_STATUS_PENDING) {
68 PacketSendComplete( open, pPacket, Status );
69 }
70
71 return STATUS_PENDING;
72 }
73
74 VOID
75 PacketSendComplete(
76 IN NDIS_HANDLE ProtocolBindingContext,
77 IN PNDIS_PACKET pPacket,
78 IN NDIS_STATUS Status
79 )
80 {
81 PIRP irp;
82 PIO_STACK_LOCATION irpSp;
83
84 // DebugPrint(("Packet: SendComplete :%x\n", Status));
85
86 irp = RESERVED(pPacket)->Irp;
87 irpSp = IoGetCurrentIrpStackLocation(irp);
88
89 NdisFreePacket(pPacket);
90
91 if(Status == NDIS_STATUS_SUCCESS) {
92 irp->IoStatus.Information = irpSp->Parameters.Write.Length;
93 irp->IoStatus.Status = STATUS_SUCCESS;
94 } else {
95 irp->IoStatus.Information = 0;
96 irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
97 }
98
99 IoCompleteRequest(irp, IO_NO_INCREMENT);
100 IoDecrement((POPEN_INSTANCE)ProtocolBindingContext);
101 }