Annotation of q_a/samples/ddk/instdrv/simpldrv.c, revision 1.1.1.1

1.1       root        1: /*++
                      2: 
                      3: Copyright (c) 1993  Microsoft Corporation
                      4: 
                      5: Module Name:
                      6: 
                      7:     simpldrv.c
                      8: 
                      9: Abstract:
                     10: 
                     11:     A simple kernel-mode driver sample.
                     12: 
                     13: Environment:
                     14: 
                     15:     kernel mode only
                     16: 
                     17: Notes:
                     18: 
                     19:     See readme.txt
                     20: 
                     21: Revision History:
                     22: 
                     23:     06-25-93 : created
                     24: 
                     25: --*/
                     26: 
                     27: #include "ntddk.h"
                     28: #include "stdarg.h"
                     29: #include "stdio.h"
                     30: #include "simpldrv.h"
                     31: 
                     32: 
                     33: 
                     34: //
                     35: // The following is the debug print macro- when we are building checked
                     36: // drivers "DBG" will be defined (by the \ddk\setenv.cmd script), and we
                     37: // will see debug messages appearing on the KD screen on the host debug
                     38: // machine. When we build free drivers "DBG" is not defined, and calls
                     39: // to SimplDrvKdPrint are removed.
                     40: //
                     41: 
                     42: #ifdef DBG
                     43: #define SimplDrvKdPrint(arg) DbgPrint arg
                     44: #else
                     45: #define SimplDrvKdPrint(arg)
                     46: #endif
                     47: 
                     48: 
                     49: 
                     50: NTSTATUS
                     51: SimplDrvDispatch(
                     52:     IN PDEVICE_OBJECT DeviceObject,
                     53:     IN PIRP Irp
                     54:     );
                     55: 
                     56: VOID
                     57: SimplDrvUnload(
                     58:     IN PDRIVER_OBJECT DriverObject
                     59:     );
                     60: 
                     61: 
                     62: 
                     63: NTSTATUS
                     64: DriverEntry(
                     65:     IN PDRIVER_OBJECT  DriverObject,
                     66:     IN PUNICODE_STRING RegistryPath
                     67:     )
                     68: /*++
                     69: 
                     70: Routine Description:
                     71: 
                     72:     Installable driver initialization entry point.
                     73:     This entry point is called directly by the I/O system.
                     74: 
                     75: Arguments:
                     76: 
                     77:     DriverObject - pointer to the driver object
                     78: 
                     79:     RegistryPath - pointer to a unicode string representing the path
                     80:                    to driver-specific key in the registry
                     81: 
                     82: Return Value:
                     83: 
                     84:     STATUS_SUCCESS if successful,
                     85:     STATUS_UNSUCCESSFUL otherwise
                     86: 
                     87: --*/
                     88: {
                     89: 
                     90:     PDEVICE_OBJECT         deviceObject        = NULL;
                     91:     NTSTATUS               ntStatus;
                     92:     WCHAR                  deviceNameBuffer[]  = L"\\Device\\SimplDrv";
                     93:     UNICODE_STRING         deviceNameUnicodeString;
                     94:     PDEVICE_EXTENSION      deviceExtension;
                     95:     WCHAR                  deviceLinkBuffer[]  = L"\\DosDevices\\SIMPLDRV";
                     96:     UNICODE_STRING         deviceLinkUnicodeString;
                     97: 
                     98: 
                     99:     SimplDrvKdPrint (("SIMPLDRV.SYS: entering DriverEntry\n"));
                    100: 
                    101: 
                    102: 
                    103:     //
                    104:     // A real driver would:
                    105:     //
                    106:     //     1. Report it's resources (IoReportResourceUsage)
                    107:     //
                    108:     //     2. Attempt to locate the device(s) it supports
                    109: 
                    110: 
                    111: 
                    112:     //
                    113:     // OK, we've claimed our resources & found our h/w, so create
                    114:     // a device and initialize stuff...
                    115:     //
                    116: 
                    117:     RtlInitUnicodeString (&deviceNameUnicodeString,
                    118:                           deviceNameBuffer
                    119:                           );
                    120: 
                    121: 
                    122: 
                    123:     //
                    124:     // Create an EXCLUSIVE device, i.e. only 1 thread at a time can send
                    125:     // i/o requests.
                    126:     //
                    127: 
                    128:     ntStatus = IoCreateDevice (DriverObject,
                    129:                                sizeof (DEVICE_EXTENSION),
                    130:                                &deviceNameUnicodeString,
                    131:                                FILE_DEVICE_SIMPLDRV,
                    132:                                0,
                    133:                                TRUE,
                    134:                                &deviceObject
                    135:                                );
                    136: 
                    137:     if (NT_SUCCESS(ntStatus))
                    138:     {
                    139:         deviceExtension = (PDEVICE_EXTENSION) deviceObject->DeviceExtension;
                    140: 
                    141: 
                    142: 
                    143:         //
                    144:         // Set up synchronization objects, state info,, etc.
                    145:         //
                    146: 
                    147: 
                    148: 
                    149:         //
                    150:         // Create a symbolic link that Win32 apps can specify to gain access
                    151:         // to this driver/device
                    152:         //
                    153: 
                    154:         RtlInitUnicodeString (&deviceLinkUnicodeString,
                    155:                               deviceLinkBuffer
                    156:                               );
                    157: 
                    158:         ntStatus = IoCreateSymbolicLink (&deviceLinkUnicodeString,
                    159:                                          &deviceNameUnicodeString
                    160:                                          );
                    161: 
                    162: 
                    163:         if (!NT_SUCCESS(ntStatus))
                    164:         {
                    165:             SimplDrvKdPrint (("SIMPLDRV.SYS: IoCreateSymbolicLink failed\n"));
                    166:         }
                    167: 
                    168: 
                    169: 
                    170:         //
                    171:         // Create dispatch points for device control, create, close.
                    172:         //
                    173: 
                    174:         DriverObject->MajorFunction[IRP_MJ_CREATE]         =
                    175:         DriverObject->MajorFunction[IRP_MJ_CLOSE]          =
                    176:         DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = SimplDrvDispatch;
                    177:         DriverObject->DriverUnload                         = SimplDrvUnload;
                    178:     }
                    179: 
                    180: 
                    181: done_DriverEntry:
                    182: 
                    183:     if (!NT_SUCCESS(ntStatus))
                    184:     {
                    185:         //
                    186:         // Something went wrong, so clean up (free resources, etc.)
                    187:         //
                    188: 
                    189:         if (deviceObject)
                    190: 
                    191:             IoDeleteDevice (deviceObject);
                    192:     }
                    193: 
                    194:     return ntStatus;
                    195: }
                    196: 
                    197: 
                    198: 
                    199: NTSTATUS
                    200: SimplDrvDispatch(
                    201:     IN PDEVICE_OBJECT DeviceObject,
                    202:     IN PIRP           Irp
                    203:     )
                    204: /*++
                    205: 
                    206: Routine Description:
                    207: 
                    208:     Process the IRPs sent to this device.
                    209: 
                    210: Arguments:
                    211: 
                    212:     DeviceObject - pointer to a device object
                    213: 
                    214:     Irp          - pointer to an I/O Request Packet
                    215: 
                    216: Return Value:
                    217: 
                    218: 
                    219: --*/
                    220: {
                    221: 
                    222:     PIO_STACK_LOCATION  irpStack;
                    223:     PDEVICE_EXTENSION   deviceExtension;
                    224:     PVOID               ioBuffer;
                    225:     ULONG               inputBufferLength;
                    226:     ULONG               outputBufferLength;
                    227:     ULONG               ioControlCode;
                    228:     NTSTATUS            ntStatus;
                    229: 
                    230: 
                    231: 
                    232:     Irp->IoStatus.Status      = STATUS_SUCCESS;
                    233:     Irp->IoStatus.Information = 0;
                    234: 
                    235: 
                    236:     //
                    237:     // Get a pointer to the current location in the Irp. This is where
                    238:     //     the function codes and parameters are located.
                    239:     //
                    240: 
                    241:     irpStack = IoGetCurrentIrpStackLocation (Irp);
                    242: 
                    243: 
                    244: 
                    245:     //
                    246:     // Get a pointer to the device extension
                    247:     //
                    248: 
                    249:     deviceExtension = DeviceObject->DeviceExtension;
                    250: 
                    251: 
                    252: 
                    253:     //
                    254:     // Get the pointer to the input/output buffer and it's length
                    255:     //
                    256: 
                    257:     ioBuffer           = Irp->AssociatedIrp.SystemBuffer;
                    258:     inputBufferLength  = irpStack->Parameters.DeviceIoControl.InputBufferLength;
                    259:     outputBufferLength = irpStack->Parameters.DeviceIoControl.OutputBufferLength;
                    260: 
                    261: 
                    262: 
                    263:     switch (irpStack->MajorFunction)
                    264:     {
                    265:     case IRP_MJ_CREATE:
                    266: 
                    267:         SimplDrvKdPrint (("SIMPLDRV.SYS: IRP_MJ_CREATE\n"));
                    268: 
                    269:         break;
                    270: 
                    271:     case IRP_MJ_CLOSE:
                    272: 
                    273:         SimplDrvKdPrint (("SIMPLDRV.SYS: IRP_MJ_CLOSE\n"));
                    274: 
                    275:         break;
                    276: 
                    277:     case IRP_MJ_DEVICE_CONTROL:
                    278: 
                    279:         SimplDrvKdPrint (("SIMPLDRV.SYS: IRP_MJ_DEVICE_CONTROL\n"));
                    280: 
                    281:         ioControlCode = irpStack->Parameters.DeviceIoControl.IoControlCode;
                    282: 
                    283:         switch (ioControlCode)
                    284:         {
                    285: 
                    286:         case IOCTL_SIMPLDRV_HELLO:
                    287:         {
                    288:             //
                    289:             // Some app is saying hello
                    290:             //
                    291: 
                    292:             break;
                    293:         }
                    294: 
                    295:         default:
                    296: 
                    297:             Irp->IoStatus.Status = STATUS_INVALID_PARAMETER;
                    298: 
                    299:             SimplDrvKdPrint (("SIMPLDRV.SYS: unknown IRP_MJ_DEVICE_CONTROL\n"));
                    300: 
                    301:             break;
                    302: 
                    303:         }
                    304: 
                    305:         break;
                    306:     }
                    307: 
                    308: 
                    309:     //
                    310:     // DON'T get cute and try to use the status field of
                    311:     // the irp in the return status.  That IRP IS GONE as
                    312:     // soon as you call IoCompleteRequest.
                    313:     //
                    314: 
                    315:     ntStatus = Irp->IoStatus.Status;
                    316: 
                    317:     IoCompleteRequest (Irp,
                    318:                        IO_NO_INCREMENT
                    319:                        );
                    320: 
                    321: 
                    322:     //
                    323:     // We never have pending operation so always return the status code.
                    324:     //
                    325: 
                    326:     return ntStatus;
                    327: }
                    328: 
                    329: 
                    330: 
                    331: VOID
                    332: SimplDrvUnload(
                    333:     IN PDRIVER_OBJECT DriverObject
                    334:     )
                    335: /*++
                    336: 
                    337: Routine Description:
                    338: 
                    339:     Free all the allocated resources, etc.
                    340: 
                    341: Arguments:
                    342: 
                    343:     DriverObject - pointer to a driver object
                    344: 
                    345: Return Value:
                    346: 
                    347: 
                    348: --*/
                    349: {
                    350:     WCHAR                  deviceLinkBuffer[]  = L"\\DosDevices\\SIMPLDRV";
                    351:     UNICODE_STRING         deviceLinkUnicodeString;
                    352: 
                    353: 
                    354: 
                    355:     //
                    356:     // Free any resources
                    357:     //
                    358: 
                    359: 
                    360: 
                    361:     //
                    362:     // Delete the symbolic link
                    363:     //
                    364: 
                    365:     RtlInitUnicodeString (&deviceLinkUnicodeString,
                    366:                           deviceLinkBuffer
                    367:                           );
                    368: 
                    369:     IoDeleteSymbolicLink (&deviceLinkUnicodeString);
                    370: 
                    371: 
                    372: 
                    373:     //
                    374:     // Delete the device object
                    375:     //
                    376: 
                    377:     IoDeleteDevice (DriverObject->DeviceObject);
                    378: 
                    379:     SimplDrvKdPrint (("SIMPLDRV.SYS: unloading\n"));
                    380: }

unix.superglobalmegacorp.com

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