Annotation of ntddk/src/network/packet/driver/packet.c, revision 1.1.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.