Annotation of ntddk/src/network/packet/driver/write.c, revision 1.1

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: 
        !            42: NTSTATUS
        !            43: PacketWrite(
        !            44:     IN PDEVICE_OBJECT DeviceObject,
        !            45:     IN PIRP Irp
        !            46:     )
        !            47: 
        !            48: /*++
        !            49: 
        !            50: Routine Description:
        !            51: 
        !            52:     This is the dispatch routine for create/open and close requests.
        !            53:     These requests complete successfully.
        !            54: 
        !            55: Arguments:
        !            56: 
        !            57:     DeviceObject - Pointer to the device object.
        !            58: 
        !            59:     Irp - Pointer to the request packet.
        !            60: 
        !            61: Return Value:
        !            62: 
        !            63:     Status is returned.
        !            64: 
        !            65: --*/
        !            66: 
        !            67: {
        !            68: 
        !            69: //    PIO_STACK_LOCATION IrpSp;
        !            70:     PDEVICE_EXTENSION  DeviceExtension;
        !            71:     PLIST_ENTRY         PacketListEntry;
        !            72:     PNDIS_PACKET       pPacket;
        !            73: 
        !            74:     NDIS_STATUS     Status;
        !            75: 
        !            76:     IF_LOUD(DbgPrint("Packet: SendAdapter\n");)
        !            77: 
        !            78:     DeviceExtension = DeviceObject->DeviceExtension;
        !            79: 
        !            80:     //
        !            81:     //  Get a free packet from our list
        !            82:     //
        !            83:     PacketListEntry=ExInterlockedRemoveHeadList(&DeviceExtension->FreePacketList,
        !            84:                                                 &DeviceExtension->FreePacketListSpinLock);
        !            85: 
        !            86:     if (PacketListEntry == NULL) {
        !            87:         //
        !            88:         //  No free packets
        !            89:         //
        !            90:         Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
        !            91:         return STATUS_UNSUCCESSFUL;
        !            92:     }
        !            93: 
        !            94: 
        !            95: 
        !            96:     pPacket=CONTAINING_RECORD(PacketListEntry,NDIS_PACKET,ProtocolReserved);
        !            97:     RESERVED(pPacket)->Irp=Irp;
        !            98: 
        !            99:     //
        !           100:     //  Attach the writes buffer to the packet
        !           101:     //
        !           102:     NdisChainBufferAtFront(pPacket,Irp->MdlAddress);
        !           103: 
        !           104:     IoMarkIrpPending(Irp);
        !           105:     Irp->IoStatus.Status = STATUS_PENDING;
        !           106: 
        !           107:     //
        !           108:     //  Call the MAC
        !           109:     //
        !           110:     NdisSend(
        !           111:         &Status,
        !           112:         DeviceExtension->AdapterHandle,
        !           113:         pPacket);
        !           114: 
        !           115: 
        !           116:     if (Status != NDIS_STATUS_PENDING) {
        !           117:         //
        !           118:         //  The send didn't pend so call the completion handler now
        !           119:         //
        !           120:         PacketSendComplete(
        !           121:             DeviceExtension,
        !           122:             pPacket,
        !           123:             Status
        !           124:             );
        !           125: 
        !           126: 
        !           127:     }
        !           128: 
        !           129: 
        !           130: 
        !           131:     return(STATUS_PENDING);
        !           132: 
        !           133: }
        !           134: 
        !           135: 
        !           136: 
        !           137: VOID
        !           138: PacketSendComplete(
        !           139:     IN NDIS_HANDLE   ProtocolBindingContext,
        !           140:     IN PNDIS_PACKET  pPacket,
        !           141:     IN NDIS_STATUS   Status
        !           142:     )
        !           143: 
        !           144: {
        !           145:     PDEVICE_EXTENSION DeviceExtension;
        !           146:     PIRP              Irp;
        !           147: 
        !           148:     IF_LOUD(DbgPrint("Packet: SendComplete\n");)
        !           149: 
        !           150:     DeviceExtension= (PDEVICE_EXTENSION)ProtocolBindingContext;
        !           151:     Irp=RESERVED(pPacket)->Irp;
        !           152: 
        !           153:     //
        !           154:     //  recyle the packet
        !           155:     //
        !           156:     NdisReinitializePacket(pPacket);
        !           157: 
        !           158:     //
        !           159:     //  Put the packet back on the free list
        !           160:     //
        !           161:     ExInterlockedInsertTailList(
        !           162:         &DeviceExtension->FreePacketList,
        !           163:         &RESERVED(pPacket)->ListElement,
        !           164:         &DeviceExtension->FreePacketListSpinLock);
        !           165: 
        !           166: 
        !           167:     Irp->IoStatus.Status = Status;
        !           168:     Irp->IoStatus.Information = 0;
        !           169:     IoCompleteRequest(Irp, IO_NO_INCREMENT);
        !           170: 
        !           171:     return;
        !           172: 
        !           173: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.