Links

Windows Kernel Drivers 101

Work In Progress This living document captures some of the Kernel Driver and OS related concepts that I encounter as I study Windows kernel driver development.

Driver Types

There are many different types of drivers, but I am mostly interested in Sofware Drivers.

Software Driver

  • Not associated with any device
  • Useful for running code in the kernel mode
  • Can also be a user mode driver
  • Drivers can be developed with Kernel-Mode Driver Framework (KMDF) and Windows Driver Model (WDM)

KMDF vs WDM

  • WDM is very closely tied to the OS and interacts with the it calling system service routines directly
  • KMDF is a framework that abstracts a lot of driver development and allows the developer to focus on his/her driver rather than focusing on OS programming intricacies
  • KMDF is recommended and a preferred driver development model over WDM in most cases

I/O Manager

  • Is an interface enabling communication between userland applications and kernel drivers
  • Creates a driver object (DRIVER_OBJECT) for each installed and loaded driver
  • Defines a set of standard mandatory driver routines that drivers must support such as DriverEntry
  • Calls driver's DriverEntry routine, which supplies the driver's DRIVER_OBJECT address
  • Accepts I/O requests, which usually originate from user-mode applications
  • Creates IRPs to represent the I/O requests
  • Transfers IRPs to the appropriate drivers

Uncategorized Notes

  • All drivers contain DriverEntry routine - similary to main routine of an executable and DllMain of a DLL. This routine gets called once the driver is loaded and started by the OS.
  • Memory allocated in paged pool can be paged out to a disk, whereas memory allocated from a nonpaged pool cannot
  • Requests sent to drivers are encapsulated in I/O Request Packets (IRP)
  • DRIVER_OBJECT represents the image of a loaded kernel-mode driver:
    • typedef struct _DRIVER_OBJECT {
      CSHORT Type;
      CSHORT Size;
      PDEVICE_OBJECT DeviceObject;
      ULONG Flags;
      PVOID DriverStart;
      ULONG DriverSize;
      PVOID DriverSection;
      PDRIVER_EXTENSION DriverExtension;
      UNICODE_STRING DriverName;
      PUNICODE_STRING HardwareDatabase;
      PFAST_IO_DISPATCH FastIoDispatch;
      PDRIVER_INITIALIZE DriverInit;
      PDRIVER_STARTIO DriverStartIo;
      PDRIVER_UNLOAD DriverUnload;
      PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1];
      } DRIVER_OBJECT, *PDRIVER_OBJECT;
  • DRIVER_OBJECT contains references to entry points of driver's standard routines (i.e Unload)
  • Driver standard routines receive IRPs as input as well as a pointer to the target device object
  • Drivers must create at least one device object (DEVICE_OBJECT) for each device
  • Device objects serve as a target of operations performed on a the device
  • Software only drivers that only handle I/O requests and do not pass them to hardware, still must create a device object to represent the target of its operations

References