Windows Kernel Internals II System Extensions University of Tokyo – July 2004

Dave Probert, Ph.D. Advanced Operating Systems Group Windows Core Operating Systems Division Microsoft Corporation

© Microsoft Corporation 2004 1 Kernel Extension Mechanisms

I/O Extensions Notifications – Filters – Image Loading – New File Systems – Create/Exit – Device Filter Drivers – Thread Create/Exit – Device Drivers Export Drivers Random bit editing – New object types Registry – Hook most operations

© Microsoft Corporation 2004 2 Kernel Communication

•IOCTLs • Handles on new object types •LPC • Most usermode-to-usermode mechanisms – Shared memory – Kernel synchronization objects – NamedPipes

© Microsoft Corporation 2004 3 Kernel Extensions Two main toolkits for writing extensions: – IFSKit – for file system filters and file systems – DDK – for all others, including device drivers Generically called ‘drivers’ and use driver mechanisms to wire into the system – DriverEntry routine creates a device object for the device – Device object can be named in NT namespace – Access via I/O ops (open/read/write/ioctl/close) loads/unloads drivers as ‘services’

© Microsoft Corporation 2004 4 Published Kernel Interfaces

I/O related – IO object mgmt, security checks – HW access, DMA, interrupts, DPCs, timers, worker threads – IRPs, physical memory (MDLs), cancel support (include CSQs) – Hardware configuration, plug-and-play, power, bus mgmt Multithreading support – Spinlocks, interlocked operations/queues Kernel facilities – Memory pool allocation, threads, synchronization, run-time, object/handle management Zw related (Kernel-mode version of native Nt ) – Files, sections, registry, set/query file/process/thread info

© Microsoft Corporation 2004 5 Subsystems

NT originally mistaken for a microkernel – Kernel was never micro, but … – But OS personalities were defined by servers Servers are called ‘subsystems’ – Primary subsystems OS/2, Windows, Posix, WoW – Each subsystem has three main components: – Subsystem service process (e.g. csrss) – Subsystem API library (e.g. kernel32, et al) – Hooks in the CreateProcess code There are some pseudo-subsystems, e.g. lsass, CLR

© Microsoft Corporation 2004 6 Windows Subsystem

Windows Windows Appli- Appli- cations cations

Win95 GUI

Windows Windows NT sys NT admin, commands command & networking Shell

Win32 winsock APIs

Win32 Subsystem

Windows NT Kernel

Hardware Abstraction Layer

© Microsoft Corporation 2004 7 Posix Subsystem

UNIX Applications

Workshop Motif tools: gcc, g++ U perl, Apache, N Tcl/Tk, bash, etc. X11 I X S UNIX, XPG, UNIX D POSIX.2 shells K commands & utilities telnetd

BSD UNIX /POSIX APIs Sockets

POSIX/UNIX Subsystem

NFS Windows NT Kernel Client Gateway

Hardware Abstraction Layer

© Microsoft Corporation 2004 8 Subsystem Inter-operation

UNIX Windows X11 Windows Applications Appli- R6.3 Appli- cations server cations

Workshop Motif tools: gcc, g++ U perl, Apache, N Win95 Tcl/Tk, bash, etc. X11 I GUI X S UNIX, XPG, Windows UNIX D Windows NT sys NT POSIX.2 shells K admin, commands command commands & networking Shell & utilities telnetd

BSD winsock UNIX /POSIX APIs Sockets Win32 APIs

POSIX/UNIX Subsystem Win32 Subsystem

NFS Windows NT Kernel Client Server Gateway

Hardware Abstraction Layer

© Microsoft Corporation 2004 9 Services vs Kernels Three sites of OS implementation – In app’s container (libraries) – In separate containers (services) – In central, universally shared container (kernel) Shared nature of kernels makes them less flexible – Single sysentry mechanism – Inter-op requires shared abstractions – Access controls limited Services have natural advantages – Filtering and refinement of operations provides finer- grained access control – Easy to provide alternative abstractions

© Microsoft Corporation 2004 10 Example: Refining kernel privilege

Creating permanent objects in OB requires privilege Drive letters are permanent objects (symlinks) in the ¥DosDevices directory Q: So how does the DefineDosDevice API work? A: It uses a privileged services (csrss) to create the symlink csrss is only willing to create symlinks in ¥DosDevices

Subsystems can in general refine privileges for clients and safely share state between clients – just like kernels

© Microsoft Corporation 2004 11 No kernels: Future of OS Design?

Operating systems as a collection of libraries and services? + increased flexibility & extensibility + more robust, better failure isolation/recovery, better security - performance of current CPUs optimized for kernels SPACE, Pebble – Fundamental abstractions: Processors, MMUs, trapvectors vs. Processes, VM, IPC

© Microsoft Corporation 2004 12 Back to the present…

Windows is extended primarily by adding apps and libraries (e.g. COM components) Primary kernel extensions are for new devices and filtering existing operations

Project I explores kernel extensions Project II explores services

© Microsoft Corporation 2004 13 Project I – writing a kernel extension Have the Windows DDK installed for WS03 (aka WNET) Open a new command window set DDK=C:¥WINDDK¥37901218 (for example) Run command: %DDK%¥bin¥setenv %DDK% chk wnet In the TrivialDriver directory type: build Find trivial.sys and trivialapp.exe and copy to test machine Run trivialapp.exe on the test machine You’ll see a few messages (the driver loaded/unloaded) Do the same with TrivialDriver2 This time it waits, so start/stop taskmgr.exe You will see the names of registry values that were set Use regedit.exe to write some new values in HKCU © Microsoft Corporation 2004 14 Project I - 2

Read through Registry Callbacks.doc Compare TrivialDriver and TrivialDriver2 Read in the DDK documentation about the API PsSetCreateProcessNotifyRoutine Have the SDK documentation handy Modify the TrivialDriver2 driver to list the process ids of processes as they are created and exit Then modify the app to use to print out the name of the exe for each process created (see the PSAPI functions) This is a hit-or-miss procedure, what would be required for it to be reliable?

© Microsoft Corporation 2004 15 Anatomy of Trivial.sys Driver

DriverEntry is called when driver is loaded Creates Device object and symlink Initializes a few dispatch entry points TrivialCreateClose is called for create/close IRPs Since driver not stacked, only opened by name Routine does nothing but process IRP correctly TrivialCleanup is also an effective no-op TrivialUnload deletes the symlink, IOMgr deletes devobj TrivialDriver2 adds read and ioctl functions, and then Arranges for registry callbacks Maintains a buffer which can be read out

© Microsoft Corporation 2004 16 Discussion

© Microsoft Corporation 2004 17