Windows 2000
Windows 2000 copies the INF file and renames it to the next available OEM filename in the Windows INF directory. For example, WDM1.INF might be copied and renamed as C:WINNTINF OEM1.INF.
Windows 2000 also remembers install locations in the registry.
The device interface for Wdm1 devices has a registry key at HKLMSystemCurrentControlSet ControlDeviceClasses{C0CF0640-5F6E-11d2-B677-00C0DFE4C1F3) along with a series of subkeys for each device and their associated symbolic link(s). This key includes the WDM1_GUID {C0CF0640…}.
Windows 98
The HKLMEnumRootUnknown 000 key is the entry for the Wdm1 device. The digits 0000 will increment for each Unknown device. The HKLMSystemCurrentControlSetServicesClass Unknown 000 key is the entry for the Wdm1 driver. This key is passed to DriverEntry in the RegistryPath string.
These entries are removed if you remove the Wdm1 device.
The
Windows 2000
The HKLMSystemCurrentControlSetControlClass{4D36E97E…} 000 key is the entry for the Wdm1 device. {4D36E97E…} is the GUID for 'Unknown' type devices.
The driver service entry key is HKLMSystemCurrentControlSetServicesWdm1. This key is passed to DriverEntry in the RegistryPath string. The Enum subkey has values named 0 onwards such as RootUNKNOWN 000 for each device instance.
The
The driver has an entry driverwdm1.
There is a symbolic link object ??Root#UNKNOWN#0000#{C0CF0640…}. If you double-click this, you will see that this links to one of the listed devices (e.g., to device 04059). Symbolic links are covered in the next chapter.
Managing Devices and Drivers
Having installed Wdm1, there are various device and driver management jobs that you can perform.
You can open another device with the same driver using the Add New Hardware wizard again. Windows made a copy of the INF file so you can select the device from the list without having to specify your driver location. Additional entries are made in the registry for the second Wdm1 device and the device interface to it.
In the Device Manager, select the device you want to remove. Click Uninstall or Remove.
Most of the device and driver registry entries are removed if the Wdm1 device is removed. However, the registry entry for the device interface and the Windows 2000 Services entry persist after a device is removed.
When you remove a device, the INF file is not removed from the Windows INF directory structure. Similarly, the Wdm1.sys driver file remains in place in the System32Drivers directory. This makes it easy to reinstall a Wdm1 device.
If all the driver's devices have been removed, the driver is unloaded from memory. At this stage, if you update the driver in the Windows System32drivers directory and reinstall the device, the new driver is used.
The simplest way to update a driver is to use the Update/Change driver option in the Device Manager properties for a device. The book software projects always make a copy of the latest build of a driver in the Windows System32Drivers directory so you can reinstall a new driver without having to select the Have disk option. W2000 uses the files in this directory while W98 requires you to specify the location of the new files.
Alternatively, remove all devices and invoke the Add New Hardware wizard again.
NT style (non-Plug and Play) drivers must use a special installation process, as described in Chapter 11.
Updating an NT style driver happens in a different way, as well. First, you must get your driver into the Windows System32drivers directory.
In NT 3.51 and NT 4, run the Control Panel Devices applet. Find your driver, stop it, and start it again. In Windows 2000 you must opt to show hidden devices in the Device Manager before you can start or stop NT style drivers. Alternatively, you can run the book software
Conclusion
This chapter has shown how to set up a development computer for device driver development. A very basic WDM driver has been written and installed in Windows 98 and Windows 2000.
The following chapters explain how to access this driver from a user program and enhance this driver to implement the correct Plug and Play and Power Management handling.
Listing 4.7 Wdm1.h
///////////////////////////////////////////////////////////////////////
//Copyright © 1998 Chris Cant, PHD Computer Consultants Ltd
//WDM Book for R&D Books, Miller Freeman Inc
//
//Wdm1 example
///////////////////////////////////////////////////////////////////////
//wdm1.hCommon header
///////////////////////////////////////////////////////////////////////
//Version history
//27-Apr-991.0.0CCcreation
///////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////
//Include WDM standard header with C linkage
#ifdef __cplusplus
extern 'C' {
#endif
#include 'wdm.h'
#ifdef __cplusplus
}
#endif
///////////////////////////////////////////////////////////////////////
//DebugPrint and Guid headers
#include 'DebugPrint.h'
#include 'GUIDs.h'
///////////////////////////////////////////////////////////////////////
//Spin lock to protect access to shared memory buffer
extern KSPIN_LOCK BufferLock;
extern PUCHAR Buffer;
///////////////////////////////////////////////////////////////////////
//Our device extension
typedef struct _WDM1_DEVICE_EXTENSION
{
PDEVICE_OBJECT fdo;
PDEVICE_OBJECT NextStackDevice;
UNICODE_STRIN GifSymLinkName;
} WDM1_DEVICE_EXTENSION, *PWDM1_DEVICE_EXTENSION;