Annotation of ntddk/src/network/packet/driver/packet.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: UINT ProtocolSupportedOids[] = {
        !            40:     OID_GEN_SUPPORTED_LIST,                  // 0
        !            41:     OID_GEN_HARDWARE_STATUS,                 // 1
        !            42:     OID_GEN_MEDIA_SUPPORTED,                 // 2
        !            43:     OID_GEN_MEDIA_IN_USE,                    // 3
        !            44:     OID_GEN_MAXIMUM_LOOKAHEAD,               // 4
        !            45:     OID_GEN_MAXIMUM_FRAME_SIZE,              // 5
        !            46:     OID_GEN_MAXIMUM_TOTAL_SIZE,              // 6
        !            47:     OID_GEN_LINK_SPEED,                      // 7
        !            48:     OID_GEN_TRANSMIT_BUFFER_SPACE,           // 8
        !            49:     OID_GEN_RECEIVE_BUFFER_SPACE,            // 9
        !            50:     OID_GEN_TRANSMIT_BLOCK_SIZE,             //10
        !            51:     OID_GEN_RECEIVE_BLOCK_SIZE,              //11
        !            52:     OID_GEN_VENDOR_ID,                       // 2
        !            53:     OID_GEN_DRIVER_VERSION,                  // 3
        !            54:     OID_GEN_CURRENT_PACKET_FILTER,           // 4
        !            55:     OID_GEN_CURRENT_LOOKAHEAD,               // 5
        !            56:     OID_802_3_PERMANENT_ADDRESS,             // 6
        !            57:     OID_802_3_CURRENT_ADDRESS,               // 7
        !            58:     OID_802_3_MULTICAST_LIST,                // 8
        !            59:     OID_802_3_MAXIMUM_LIST_SIZE              // 9
        !            60:     };
        !            61: 
        !            62: 
        !            63: 
        !            64: 
        !            65: 
        !            66: NTSTATUS
        !            67: DriverEntry(
        !            68:     IN PDRIVER_OBJECT DriverObject,
        !            69:     IN PUNICODE_STRING RegistryPath
        !            70:     );
        !            71: 
        !            72: 
        !            73: 
        !            74: NTSTATUS
        !            75: PacketReadRegistry(
        !            76:     IN  PUNICODE_STRING     MacDriverName,
        !            77:     IN  PUNICODE_STRING     PacketDriverName,
        !            78:     IN  PUNICODE_STRING     RegistryPath
        !            79:     );
        !            80: 
        !            81: 
        !            82: NTSTATUS
        !            83: PacketCreateSymbolicLink(
        !            84:     IN  PUNICODE_STRING  DeviceName,
        !            85:     IN  BOOLEAN          Create
        !            86:     );
        !            87: 
        !            88: 
        !            89: 
        !            90: #if DBG
        !            91: //
        !            92: // Declare the global debug flag for this driver.
        !            93: //
        !            94: 
        !            95: ULONG PacketDebugFlag = PACKET_DEBUG_LOUD;
        !            96: 
        !            97: #endif
        !            98: 
        !            99: PDEVICE_EXTENSION GlobalDeviceExtension;
        !           100: 
        !           101: 
        !           102: 
        !           103: NTSTATUS
        !           104: DriverEntry(
        !           105:     IN PDRIVER_OBJECT DriverObject,
        !           106:     IN PUNICODE_STRING RegistryPath
        !           107:     )
        !           108: 
        !           109: /*++
        !           110: 
        !           111: Routine Description:
        !           112: 
        !           113:     This routine initializes the Packet (i8250) mouse port driver.
        !           114: 
        !           115: Arguments:
        !           116: 
        !           117:     DriverObject - Pointer to driver object created by system.
        !           118: 
        !           119:     RegistryPath - Pointer to the Unicode name of the registry path
        !           120:         for this driver.
        !           121: 
        !           122: Return Value:
        !           123: 
        !           124:     The function value is the final status from the initialization operation.
        !           125: 
        !           126: --*/
        !           127: 
        !           128: {
        !           129: 
        !           130:     NDIS_PROTOCOL_CHARACTERISTICS  ProtocolChar;
        !           131: 
        !           132:     UNICODE_STRING MacDriverName;
        !           133:     UNICODE_STRING UnicodeDeviceName;
        !           134: 
        !           135:     PDEVICE_OBJECT DeviceObject = NULL;
        !           136:     PDEVICE_EXTENSION DeviceExtension = NULL;
        !           137: 
        !           138:     NTSTATUS Status = STATUS_SUCCESS;
        !           139:     NTSTATUS ErrorCode = STATUS_SUCCESS;
        !           140:     NTSTATUS FailStatus;
        !           141:     ULONG i;
        !           142:     NDIS_STRING ProtoName = NDIS_STRING_CONST("PacketDriver");
        !           143: 
        !           144:     PNDIS_PACKET   pPacket;
        !           145: 
        !           146:     IF_LOUD(DbgPrint("\n\nPacket: DriverEntry\n");)
        !           147: 
        !           148:     //
        !           149:     //  Allocate Memory for the unicode used to jold the Macdriver name
        !           150:     //
        !           151: 
        !           152:     MacDriverName.MaximumLength    = 128*sizeof(WCHAR);
        !           153:     MacDriverName.Length           = 0;
        !           154:     MacDriverName.Buffer           = ExAllocatePool(NonPagedPool,128*sizeof(WCHAR));
        !           155: 
        !           156:     if (MacDriverName.Buffer == NULL) {
        !           157:         return STATUS_INSUFFICIENT_RESOURCES;
        !           158:     }
        !           159: 
        !           160:     //
        !           161:     //  Allocate memory for the packet driver device object name
        !           162:     //
        !           163: 
        !           164:     UnicodeDeviceName.MaximumLength = 128*sizeof(WCHAR);
        !           165:     UnicodeDeviceName.Length        = 0;
        !           166:     UnicodeDeviceName.Buffer        = ExAllocatePool(NonPagedPool,128*sizeof(WCHAR));
        !           167: 
        !           168:     if (UnicodeDeviceName.Buffer == NULL) {
        !           169: 
        !           170:         Status= STATUS_INSUFFICIENT_RESOURCES;
        !           171:         goto Fail010;
        !           172:     }
        !           173: 
        !           174:     //
        !           175:     //  Get the name of the Packet driver and the name of the MAC driver
        !           176:     //  to bind to from the registry
        !           177:     //
        !           178: 
        !           179:     Status=PacketReadRegistry(
        !           180:                &MacDriverName,
        !           181:                &UnicodeDeviceName,
        !           182:                RegistryPath
        !           183:                );
        !           184: 
        !           185:     if (Status != STATUS_SUCCESS) {
        !           186: 
        !           187:         goto   Fail020;
        !           188:     }
        !           189: 
        !           190: 
        !           191:     IF_LOUD(DbgPrint("Packet: DeviceName=%ws  MacName=%ws\n",UnicodeDeviceName.Buffer,MacDriverName.Buffer);)
        !           192: 
        !           193: 
        !           194:     //
        !           195:     // Set up the device driver entry points.
        !           196:     //
        !           197: 
        !           198:     DriverObject->MajorFunction[IRP_MJ_CREATE] = PacketOpen;
        !           199:     DriverObject->MajorFunction[IRP_MJ_CLOSE]  = PacketClose;
        !           200:     DriverObject->MajorFunction[IRP_MJ_READ]   = PacketRead;
        !           201:     DriverObject->MajorFunction[IRP_MJ_WRITE]  = PacketWrite;
        !           202:     DriverObject->MajorFunction[IRP_MJ_CLEANUP]  = PacketCleanup;
        !           203:     DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL]  = PacketIoControl;
        !           204:     DriverObject->MajorFunction[IRP_MJ_SHUTDOWN]  = PacketShutdown;
        !           205: 
        !           206:     DriverObject->DriverUnload = PacketUnload;
        !           207: 
        !           208: 
        !           209:     //
        !           210:     //  Create the device object
        !           211:     //
        !           212: 
        !           213:     Status = IoCreateDevice(
        !           214:                 DriverObject,
        !           215:                 sizeof(DEVICE_EXTENSION),
        !           216:                 &UnicodeDeviceName,
        !           217:                 FILE_DEVICE_PROTOCOL,
        !           218:                 0,
        !           219:                 TRUE,
        !           220:                 &DeviceObject
        !           221:                 );
        !           222: 
        !           223:     if (Status != STATUS_SUCCESS) {
        !           224: 
        !           225:         goto Fail020;
        !           226:     }
        !           227: 
        !           228:     DeviceObject->Flags |= DO_DIRECT_IO | DO_EXCLUSIVE;
        !           229:     DeviceExtension  =  (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
        !           230:     DeviceExtension->DeviceObject = DeviceObject;
        !           231: 
        !           232:     IoRegisterShutdownNotification(DeviceObject);
        !           233: 
        !           234:     //
        !           235:     //  Create a symbolic link for the device object so that the
        !           236:     //  WIN32 app can open the device
        !           237:     //
        !           238: 
        !           239:     Status=PacketCreateSymbolicLink(&UnicodeDeviceName,TRUE);
        !           240: 
        !           241:     if (Status != STATUS_SUCCESS) {
        !           242:         IF_LOUD(DbgPrint("Packet: Failed to create dos device name\n");)
        !           243:         goto Fail030;
        !           244:     }
        !           245: 
        !           246:     //
        !           247:     //  Save the the name of the MAC driver to open in the Device Extension
        !           248:     //
        !           249: 
        !           250:     DeviceExtension->DeviceName=UnicodeDeviceName;
        !           251:     DeviceExtension->AdapterName=MacDriverName;
        !           252: 
        !           253:     ProtocolChar.MajorNdisVersion            = 3;
        !           254:     ProtocolChar.MinorNdisVersion            = 0;
        !           255:     ProtocolChar.Reserved                    = 0;
        !           256:     ProtocolChar.OpenAdapterCompleteHandler  = PacketOpenAdapterComplete;
        !           257:     ProtocolChar.CloseAdapterCompleteHandler = PacketCloseAdapterComplete;
        !           258:     ProtocolChar.SendCompleteHandler         = PacketSendComplete;
        !           259:     ProtocolChar.TransferDataCompleteHandler = PacketTransferDataComplete;
        !           260:     ProtocolChar.ResetCompleteHandler        = PacketResetComplete;
        !           261:     ProtocolChar.RequestCompleteHandler      = PacketRequestComplete;
        !           262:     ProtocolChar.ReceiveHandler              = PacketReceiveIndicate;
        !           263:     ProtocolChar.ReceiveCompleteHandler      = PacketReceiveComplete;
        !           264:     ProtocolChar.StatusHandler               = PacketStatus;
        !           265:     ProtocolChar.StatusCompleteHandler       = PacketStatusComplete;
        !           266:     ProtocolChar.Name                        = ProtoName;
        !           267: 
        !           268:     NdisRegisterProtocol(
        !           269:         &Status,
        !           270:         &DeviceExtension->NdisProtocolHandle,
        !           271:         &ProtocolChar,
        !           272:         sizeof(NDIS_PROTOCOL_CHARACTERISTICS));
        !           273: 
        !           274:     if (Status != NDIS_STATUS_SUCCESS) {
        !           275:         IF_LOUD(DbgPrint("Packet: Failed to register protocol with NDIS\n");)
        !           276:         goto Fail040;
        !           277:     }
        !           278: 
        !           279: 
        !           280: 
        !           281:     //
        !           282:     //  General Purpose Spinlock
        !           283:     //
        !           284:     KeInitializeSpinLock(&DeviceExtension->DeviceSpinLock);
        !           285: 
        !           286:     InitializeListHead(&DeviceExtension->ResetIrpList);
        !           287: 
        !           288:     //
        !           289:     //  Initialize free packet list, Used for send packets and
        !           290:     //  transfer data packets
        !           291:     //
        !           292:     KeInitializeSpinLock(&DeviceExtension->FreePacketListSpinLock);
        !           293:     InitializeListHead(&DeviceExtension->FreePacketList);
        !           294: 
        !           295:     //
        !           296:     //  Initialize list for holding pending read requests
        !           297:     //
        !           298:     KeInitializeSpinLock(&DeviceExtension->RcvQSpinLock);
        !           299:     InitializeListHead(&DeviceExtension->RcvList);
        !           300: 
        !           301:     KeInitializeSpinLock(&DeviceExtension->RequestSpinLock);
        !           302:     InitializeListHead(&DeviceExtension->RequestList);
        !           303: 
        !           304: 
        !           305: 
        !           306:     for (i=0;i<MAX_REQUESTS;i++) {
        !           307:         ExInterlockedInsertTailList(
        !           308:             &DeviceExtension->RequestList,
        !           309:             &DeviceExtension->Requests[i].ListElement,
        !           310:             &DeviceExtension->RequestSpinLock);
        !           311: 
        !           312:     }
        !           313: 
        !           314:     NdisAllocatePacketPool(
        !           315:         &Status,
        !           316:         &DeviceExtension->PacketPool,
        !           317:         TRANSMIT_PACKETS,
        !           318:         sizeof(PACKET_RESERVED));
        !           319: 
        !           320:     if (Status != NDIS_STATUS_SUCCESS) {
        !           321:         IF_LOUD(DbgPrint("Packet: Failed to allocate packet pool\n");)
        !           322:         goto Fail050;
        !           323:     }
        !           324: 
        !           325:     for (i=0;i<TRANSMIT_PACKETS;i++) {
        !           326: 
        !           327:         NdisAllocatePacket(
        !           328:             &Status,
        !           329:             &pPacket,
        !           330:             DeviceExtension->PacketPool);
        !           331: 
        !           332:         ExInterlockedInsertTailList(
        !           333:             &DeviceExtension->FreePacketList,
        !           334:             &RESERVED(pPacket)->ListElement,
        !           335:             &DeviceExtension->FreePacketListSpinLock);
        !           336: 
        !           337:     }
        !           338: 
        !           339: 
        !           340: 
        !           341: 
        !           342:     return STATUS_SUCCESS;
        !           343: 
        !           344: 
        !           345: 
        !           346: 
        !           347: Fail050:
        !           348:     NdisDeregisterProtocol(
        !           349:         &FailStatus,
        !           350:         DeviceExtension->NdisProtocolHandle
        !           351:         );
        !           352: 
        !           353: 
        !           354: Fail040:
        !           355: 
        !           356:     PacketCreateSymbolicLink(&DeviceExtension->AdapterName,FALSE);
        !           357: 
        !           358: Fail030:
        !           359:     IoUnregisterShutdownNotification(DeviceObject);
        !           360:     IoDeleteDevice(DeviceObject);
        !           361: 
        !           362: Fail020:
        !           363:     ExFreePool(UnicodeDeviceName.Buffer);
        !           364: 
        !           365: Fail010:
        !           366:     ExFreePool(MacDriverName.Buffer);
        !           367: 
        !           368:     return(Status);
        !           369: 
        !           370: }
        !           371: 
        !           372: 
        !           373: 
        !           374: VOID
        !           375: PacketUnload(
        !           376:     IN PDRIVER_OBJECT DriverObject
        !           377:     )
        !           378: 
        !           379: {
        !           380: 
        !           381:     PDEVICE_OBJECT     DeviceObject;
        !           382:     PDEVICE_EXTENSION  DeviceExtension;
        !           383: 
        !           384: 
        !           385:     IF_LOUD(DbgPrint("Packet: Unload\n");)
        !           386: 
        !           387:     DeviceObject    = DriverObject->DeviceObject;
        !           388: 
        !           389:     DeviceExtension = DeviceObject->DeviceExtension;
        !           390: 
        !           391:     PacketCreateSymbolicLink(&DeviceExtension->DeviceName,FALSE);
        !           392: 
        !           393:     ExFreePool(DeviceExtension->AdapterName.Buffer);
        !           394: 
        !           395:     ExFreePool(DeviceExtension->DeviceName.Buffer);
        !           396: 
        !           397:     IoUnregisterShutdownNotification(DeviceObject);
        !           398: 
        !           399: 
        !           400:     IoDeleteDevice(DeviceObject);
        !           401: 
        !           402: 
        !           403: }
        !           404: 
        !           405: 
        !           406: 
        !           407: 
        !           408: NTSTATUS
        !           409: PacketIoControl(
        !           410:     IN PDEVICE_OBJECT DeviceObject,
        !           411:     IN PIRP Irp
        !           412:     )
        !           413: 
        !           414: /*++
        !           415: 
        !           416: Routine Description:
        !           417: 
        !           418:     This is the dispatch routine for create/open and close requests.
        !           419:     These requests complete successfully.
        !           420: 
        !           421: Arguments:
        !           422: 
        !           423:     DeviceObject - Pointer to the device object.
        !           424: 
        !           425:     Irp - Pointer to the request packet.
        !           426: 
        !           427: Return Value:
        !           428: 
        !           429:     Status is returned.
        !           430: 
        !           431: --*/
        !           432: 
        !           433: {
        !           434: 
        !           435:     PIO_STACK_LOCATION  IrpSp;
        !           436:     PDEVICE_EXTENSION   DeviceExtension;
        !           437:     PLIST_ENTRY         RequestListEntry;
        !           438:     PINTERNAL_REQUEST   pRequest;
        !           439:     UINT                FunctionCode;
        !           440: 
        !           441:     NDIS_STATUS     Status;
        !           442: 
        !           443:     IF_LOUD(DbgPrint("Packet: IoControl\n");)
        !           444: 
        !           445:     DeviceExtension = DeviceObject->DeviceExtension;
        !           446: 
        !           447: 
        !           448:     RequestListEntry=ExInterlockedRemoveHeadList(&DeviceExtension->RequestList,
        !           449:                                                 &DeviceExtension->RequestSpinLock);
        !           450: 
        !           451:     if (RequestListEntry == NULL) {
        !           452:         Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
        !           453:         return STATUS_UNSUCCESSFUL;
        !           454:     }
        !           455: 
        !           456: 
        !           457:     pRequest=CONTAINING_RECORD(RequestListEntry,INTERNAL_REQUEST,ListElement);
        !           458:     pRequest->Irp=Irp;
        !           459: 
        !           460: 
        !           461:     IoMarkIrpPending(Irp);
        !           462:     Irp->IoStatus.Status = STATUS_PENDING;
        !           463:     IrpSp = IoGetCurrentIrpStackLocation(Irp);
        !           464: 
        !           465:     FunctionCode=(IrpSp->Parameters.DeviceIoControl.IoControlCode >> 2) & 0x00ff;
        !           466: 
        !           467:     IF_LOUD(DbgPrint("Packet: Function code is %02x  buff size=%08lx\n",FunctionCode,IrpSp->Parameters.DeviceIoControl.InputBufferLength);)
        !           468: 
        !           469:     if (FunctionCode == PACKET_RESET) {
        !           470: 
        !           471:         IF_LOUD(DbgPrint("Packet: IoControl - Reset request\n");)
        !           472: 
        !           473:         ExInterlockedInsertTailList(
        !           474:                 &DeviceExtension->ResetIrpList,
        !           475:                 &Irp->Tail.Overlay.ListEntry,
        !           476:                 &DeviceExtension->DeviceSpinLock);
        !           477: 
        !           478: 
        !           479:         NdisReset(
        !           480:             &Status,
        !           481:             DeviceExtension->AdapterHandle
        !           482:             );
        !           483: 
        !           484: 
        !           485:         if (Status != NDIS_STATUS_PENDING) {
        !           486: 
        !           487:             IF_LOUD(DbgPrint("Packet: IoControl - ResetComplte being called\n");)
        !           488: 
        !           489:             PacketResetComplete(
        !           490:                 DeviceExtension,
        !           491:                 Status
        !           492:                 );
        !           493: 
        !           494: 
        !           495:         }
        !           496: 
        !           497:     } else {
        !           498: 
        !           499: 
        !           500:         if (FunctionCode & 0x40) {
        !           501: 
        !           502:             pRequest->Request.RequestType=NdisRequestSetInformation;
        !           503:             pRequest->Request.DATA.SET_INFORMATION.Oid=ProtocolSupportedOids[FunctionCode & 0x3f];
        !           504: 
        !           505:             pRequest->Request.DATA.SET_INFORMATION.InformationBuffer=Irp->AssociatedIrp.SystemBuffer;
        !           506:             pRequest->Request.DATA.SET_INFORMATION.InformationBufferLength=IrpSp->Parameters.DeviceIoControl.InputBufferLength;
        !           507: 
        !           508: 
        !           509:         } else {
        !           510: 
        !           511:             pRequest->Request.RequestType=NdisRequestQueryInformation;
        !           512:             pRequest->Request.DATA.QUERY_INFORMATION.Oid=ProtocolSupportedOids[FunctionCode & 0x3f];
        !           513: 
        !           514:             pRequest->Request.DATA.QUERY_INFORMATION.InformationBuffer=Irp->AssociatedIrp.SystemBuffer;
        !           515:             pRequest->Request.DATA.QUERY_INFORMATION.InformationBufferLength=IrpSp->Parameters.DeviceIoControl.InputBufferLength;
        !           516: 
        !           517:         }
        !           518: 
        !           519: 
        !           520: 
        !           521:         NdisRequest(
        !           522:             &Status,
        !           523:             DeviceExtension->AdapterHandle,
        !           524:             &pRequest->Request);
        !           525: 
        !           526:         if (Status != NDIS_STATUS_PENDING) {
        !           527: 
        !           528:             IF_LOUD(DbgPrint("Packet: Calling RequestCompleteHandler\n");)
        !           529: 
        !           530:             PacketRequestComplete(
        !           531:                 DeviceExtension,
        !           532:                 &pRequest->Request,
        !           533:                 Status
        !           534:                 );
        !           535: 
        !           536: 
        !           537:         }
        !           538: 
        !           539:     }
        !           540: 
        !           541:     return(STATUS_PENDING);
        !           542: 
        !           543: }
        !           544: 
        !           545: 
        !           546: 
        !           547: 
        !           548: 
        !           549: VOID
        !           550: PacketRequestComplete(
        !           551:     IN NDIS_HANDLE   ProtocolBindingContext,
        !           552:     IN PNDIS_REQUEST NdisRequest,
        !           553:     IN NDIS_STATUS   Status
        !           554:     )
        !           555: 
        !           556: {
        !           557:     PIO_STACK_LOCATION  IrpSp;
        !           558:     PDEVICE_EXTENSION   DeviceExtension;
        !           559:     PIRP                Irp;
        !           560:     PINTERNAL_REQUEST   pRequest;
        !           561:     UINT                FunctionCode;
        !           562: 
        !           563:     IF_LOUD(DbgPrint("Packet: RequestComplete\n");)
        !           564: 
        !           565:     DeviceExtension= (PDEVICE_EXTENSION)ProtocolBindingContext;
        !           566: 
        !           567:     pRequest=CONTAINING_RECORD(NdisRequest,INTERNAL_REQUEST,Request);
        !           568:     Irp=pRequest->Irp;
        !           569: 
        !           570:     IrpSp = IoGetCurrentIrpStackLocation(Irp);
        !           571: 
        !           572:     FunctionCode=(IrpSp->Parameters.DeviceIoControl.IoControlCode >> 2) & 0x00ff;
        !           573: 
        !           574: 
        !           575:     if (FunctionCode & 0x40) {
        !           576: 
        !           577:         Irp->IoStatus.Information=pRequest->Request.DATA.SET_INFORMATION.BytesRead;
        !           578: 
        !           579:     } else {
        !           580: 
        !           581:         Irp->IoStatus.Information=pRequest->Request.DATA.QUERY_INFORMATION.BytesWritten;
        !           582:     }
        !           583: 
        !           584: 
        !           585:     ExInterlockedInsertTailList(
        !           586:         &DeviceExtension->RequestList,
        !           587:         &pRequest->ListElement,
        !           588:         &DeviceExtension->RequestSpinLock);
        !           589: 
        !           590: 
        !           591:     Irp->IoStatus.Status = Status;
        !           592:     IoCompleteRequest(Irp, IO_NO_INCREMENT);
        !           593: 
        !           594:     return;
        !           595: 
        !           596: 
        !           597: }
        !           598: 
        !           599: 
        !           600: 
        !           601: 
        !           602: 
        !           603: 
        !           604: 
        !           605: 
        !           606: VOID
        !           607: PacketStatus(
        !           608:     IN NDIS_HANDLE   ProtocolBindingContext,
        !           609:     IN NDIS_STATUS   Status,
        !           610:     IN PVOID         StatusBuffer,
        !           611:     IN UINT          StatusBufferSize
        !           612:     )
        !           613: 
        !           614: {
        !           615: 
        !           616:     IF_LOUD(DbgPrint("Packet: Status Indication\n");)
        !           617: 
        !           618:     return;
        !           619: 
        !           620: }
        !           621: 
        !           622: 
        !           623: 
        !           624: VOID
        !           625: PacketStatusComplete(
        !           626:     IN NDIS_HANDLE  ProtocolBindingContext
        !           627:     )
        !           628: 
        !           629: {
        !           630: 
        !           631:     IF_LOUD(DbgPrint("Packet: StatusIndicationComplete\n");)
        !           632: 
        !           633:     return;
        !           634: 
        !           635: }
        !           636: 
        !           637: 
        !           638: 
        !           639: 
        !           640: 
        !           641: NTSTATUS
        !           642: PacketReadRegistry(
        !           643:     IN  PUNICODE_STRING     MacDriverName,
        !           644:     IN  PUNICODE_STRING     PacketDriverName,
        !           645:     IN  PUNICODE_STRING     RegistryPath
        !           646:     )
        !           647: 
        !           648: {
        !           649: 
        !           650:     NTSTATUS   Status;
        !           651: 
        !           652:     RTL_QUERY_REGISTRY_TABLE ParamTable[4];
        !           653: 
        !           654:     PWSTR      Bind       = L"Bind";
        !           655:     PWSTR      Export     = L"Export";
        !           656:     PWSTR      Parameters = L"Parameters";
        !           657: 
        !           658:     PWCHAR     Path;
        !           659: 
        !           660: 
        !           661:     Path=ExAllocatePool(
        !           662:              PagedPool,
        !           663:              RegistryPath->Length+sizeof(WCHAR)
        !           664:              );
        !           665: 
        !           666:     if (Path == NULL) {
        !           667:         return STATUS_INSUFFICIENT_RESOURCES;
        !           668:     }
        !           669: 
        !           670:     RtlZeroMemory(
        !           671:         Path,
        !           672:         RegistryPath->Length+sizeof(WCHAR)
        !           673:         );
        !           674: 
        !           675:     RtlMoveMemory(
        !           676:         Path,
        !           677:         RegistryPath->Buffer,
        !           678:         RegistryPath->Length
        !           679:         );
        !           680: 
        !           681:     IF_LOUD(DbgPrint("Packet: Reg path is %ws\n",RegistryPath->Buffer);)
        !           682: 
        !           683:     RtlZeroMemory(
        !           684:         ParamTable,
        !           685:         sizeof(ParamTable)
        !           686:         );
        !           687: 
        !           688: 
        !           689: 
        !           690:     //
        !           691:     //  change to the parmeters key
        !           692:     //
        !           693: 
        !           694:     ParamTable[0].QueryRoutine = NULL;
        !           695:     ParamTable[0].Flags = RTL_QUERY_REGISTRY_SUBKEY;
        !           696:     ParamTable[0].Name = Parameters;
        !           697: 
        !           698: 
        !           699: 
        !           700:     //
        !           701:     //  Get the name of the mac driver we should bind to
        !           702:     //
        !           703: 
        !           704:     ParamTable[1].QueryRoutine = NULL;
        !           705:     ParamTable[1].Flags = RTL_QUERY_REGISTRY_REQUIRED |
        !           706:                           RTL_QUERY_REGISTRY_NOEXPAND |
        !           707:                           RTL_QUERY_REGISTRY_DIRECT;
        !           708: 
        !           709:     ParamTable[1].Name = Bind;
        !           710:     ParamTable[1].EntryContext = (PVOID)MacDriverName;
        !           711:     ParamTable[1].DefaultType = REG_SZ;
        !           712: 
        !           713:     //
        !           714:     //  Get the name that we should use for the driver object
        !           715:     //
        !           716: 
        !           717:     ParamTable[2].QueryRoutine = NULL;
        !           718:     ParamTable[2].Flags = RTL_QUERY_REGISTRY_REQUIRED |
        !           719:                           RTL_QUERY_REGISTRY_NOEXPAND |
        !           720:                           RTL_QUERY_REGISTRY_DIRECT;
        !           721: 
        !           722:     ParamTable[2].Name = Export;
        !           723:     ParamTable[2].EntryContext = (PVOID)PacketDriverName;
        !           724:     ParamTable[2].DefaultType = REG_SZ;
        !           725: 
        !           726: 
        !           727:     Status=RtlQueryRegistryValues(
        !           728:                RTL_REGISTRY_ABSOLUTE,
        !           729:                Path,
        !           730:                ParamTable,
        !           731:                NULL,
        !           732:                NULL
        !           733:                );
        !           734: 
        !           735: 
        !           736:     ExFreePool(Path);
        !           737: 
        !           738:     return Status;
        !           739: 
        !           740: 
        !           741: 
        !           742: 
        !           743: }
        !           744: 
        !           745: 
        !           746: NTSTATUS
        !           747: PacketCreateSymbolicLink(
        !           748:     IN  PUNICODE_STRING  DeviceName,
        !           749:     IN  BOOLEAN          Create
        !           750:     )
        !           751: 
        !           752: {
        !           753: 
        !           754: 
        !           755:     UNICODE_STRING UnicodeDosDeviceName;
        !           756:     NTSTATUS       Status;
        !           757: 
        !           758:     if (DeviceName->Length < sizeof(L"\\Device\\")) {
        !           759: 
        !           760:         return STATUS_UNSUCCESSFUL;
        !           761:     }
        !           762: 
        !           763:     RtlInitUnicodeString(&UnicodeDosDeviceName,NULL);
        !           764: 
        !           765:     UnicodeDosDeviceName.MaximumLength=DeviceName->Length+sizeof(L"\\DosDevices")+sizeof(UNICODE_NULL);
        !           766: 
        !           767:     UnicodeDosDeviceName.Buffer=ExAllocatePool(
        !           768:                                     NonPagedPool,
        !           769:                                     UnicodeDosDeviceName.MaximumLength
        !           770:                                     );
        !           771: 
        !           772:     if (UnicodeDosDeviceName.Buffer != NULL) {
        !           773: 
        !           774:         RtlZeroMemory(
        !           775:             UnicodeDosDeviceName.Buffer,
        !           776:             UnicodeDosDeviceName.MaximumLength
        !           777:             );
        !           778: 
        !           779:         RtlAppendUnicodeToString(
        !           780:             &UnicodeDosDeviceName,
        !           781:             L"\\DosDevices\\"
        !           782:             );
        !           783: 
        !           784:         RtlAppendUnicodeToString(
        !           785:             &UnicodeDosDeviceName,
        !           786:             (DeviceName->Buffer+(sizeof("\\Device")))
        !           787:             );
        !           788: 
        !           789:         IF_LOUD(DbgPrint("Packet: DosDeviceName is %ws\n",UnicodeDosDeviceName.Buffer);)
        !           790: 
        !           791:         if (Create) {
        !           792: 
        !           793:             Status=IoCreateSymbolicLink(&UnicodeDosDeviceName,DeviceName);
        !           794: 
        !           795:         } else {
        !           796: 
        !           797:             Status=IoDeleteSymbolicLink(&UnicodeDosDeviceName);
        !           798:         }
        !           799: 
        !           800:         ExFreePool(UnicodeDosDeviceName.Buffer);
        !           801: 
        !           802:     }
        !           803: 
        !           804: 
        !           805:     return Status;
        !           806: 
        !           807: }

unix.superglobalmegacorp.com

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