Value | Type | Contents |
---|---|---|
Type | DWORD | 1 |
Start | DWORD | 2 as per Table 11.4 |
DisplayName | REG_SZ | AbcXyz' driver name |
ErrorControl | DWORD | 1 as per Table 11.5 |
Conclusion
This chapter first looked at how to install WDM device drivers using INF files. It then described the installation process for NT style kernel mode drivers. The device driver management tools were discussed. The
Our tour of the core device driver functionality continues in the next chapter by looking at how to interact with the Windows Management Instrumentation system.
Listing 11.2 NTMnstall.Cpp
// install.Inf – NT driver install program
// Copyright © 1998 Chris Cant, PHD Computer Consultants Ltd
// This is not a complete program
void InstallDriver(CString DriverName, CString DriverFromPath) {
//////////////////////////////////////////////////////////////////
// Get System32 directory
_TCHAR System32Directory[_MAX_PATH];
if (0==GetSystemDirectory(System32Directory,_MAX_PATH)) {
AfxMessageBox('Could not find Windows system directory');
return;
}
///////////////////////////////////////////////////////////////////
// Copy driver.sys file across
CString DriverFullPath = System32Directory+'\Drivers\'+DriverName+'.sys';
if (0==CopyFile( DriverFromPath, DriverFullPath, FALSE)) // Overwrite OK
{
CString Msg;
Msg.Format('Could not copy %s to %s', DriverFullPath, Drivers);
AfxMessageBox(Msg);
return;
}
///////////////////////////////////////////////////////////////////
// Create driver (or stop existing driver)
if (!CreateDriver(DriverName, DriverFullPath)) return;
///////////////////////////////////////////////////////////////////
// Create/Open driver registry key and set its values
//Overwrite registry values written in driver creation
HKEY mru;
DWORD disposition;
if (RegCreateKeyEx(HKEY_LOCAL_MACHINE, 'SYSTEM\CurrentControlSet\Services\'+DriverName,
0, '', 0, KEY_ALL_ACCESS, NULL, &mru, &disposition) != ERROR_SUCCESS) {
AfxMessageBox('Could not create driver registry key');
return;
}
// Delete ImagePath
RegDeleteValue(mru,'ImagePath');
// Delete DisplayName
RegDeleteValue(mru, 'DisplayName');
// ErrorControl
DWORD dwRegValue = SERVICE_ERROR_NORMAL;
if (RegSetValueEx(mru, 'ErrorControl', 0, REG_DWORD, (CONST BYTE*)&dwRegValue, sizeof(DWORD)) != ERROR_SUCCESS) {
AfxMessageBox('Could not create driver registry value ErrorControl');
return;
}
// Start
dwRegValue = SERVICE_AUTO_START;
if (RegSetValueEx(mru, 'Start' , 0, REG_DWORD, (CONST BYTE*)&dwRegValue, sizeof(DWORD)) != ERROR_SUCCESS) {
AfxMessageBox('Could not create driver registry value Start');
return;
}
// Type
dwRegValue = SERVICE_KERNEL_DRIVER;
if (RegSetValueEx(mru, 'Type', 0, REG_DWORD, (CONST BYTE*)&dwRegValue, sizeof(DWORD)) != ERROR_SUCCESS) {
AfxMessageBox('Could not create driver registry value Type');
return;
}
// DependOnGroup