驅動程式 - Windows Driver Model (WDM) - 使用範例 - C/C++ (DriverWorks) - Hello, world!



參考資訊:
https://wasm.in/
http://four-f.narod.ru/
https://github.com/steward-fu/ddk

main.cpp

#define VDW_MAIN
 
#define DRIVER_FUNCTION_PNP
#define DRIVER_FUNCTION_UNLOAD
#define DRIVER_FUNCTION_ADD_DEVICE
 
#include <vdw.h>
 
class MyDevice : public KPnpDevice {
    SAFE_DESTRUCTORS

public:
    MyDevice(PDEVICE_OBJECT pPhyDevice);
     
    DEVMEMBER_DISPATCHERS
    NTSTATUS OnRemoveDevice(KIrp pIrp) const;
    NTSTATUS DefaultPnp(KIrp pIrp);
    NTSTATUS DefaultPower(KIrp pIrp);
     
protected:
    KPnpLowerDevice m_pMyDevice;
};
 
class MyDriver : public KDriver {
    SAFE_DESTRUCTORS

public:
    NTSTATUS DriverEntry(PUNICODE_STRING pMyRegistry);
    NTSTATUS AddDevice(PDEVICE_OBJECT pPhyDevice);
    VOID Unload(void);
};
 
MyDevice::MyDevice(PDEVICE_OBJECT pPhyDevice) : KPnpDevice(pPhyDevice, L"MyDriver", FILE_DEVICE_UNKNOWN) {
    m_pMyDevice.Initialize(this, pPhyDevice);
    SetLowerDevice(&m_pMyDevice);
    SetPnpPolicy();
}
 
NTSTATUS MyDevice::OnRemoveDevice(KIrp pIrp) const {
    return STATUS_SUCCESS;
}
 
NTSTATUS MyDevice::DefaultPnp(KIrp pIrp) {
    pIrp.ForceReuseOfCurrentStackLocationInCalldown();
    return m_pMyDevice.PnpCall(this, pIrp);
}
 
NTSTATUS MyDevice::DefaultPower(KIrp pIrp) {
    return STATUS_SUCCESS;
}
 
KDebugOnlyTrace T("");
 
DECLARE_DRIVER_CLASS(MyDriver, NULL)
 
NTSTATUS MyDriver::DriverEntry(PUNICODE_STRING pMyRegistry) {
    T << "Hello, world!";
    return STATUS_SUCCESS;
}
 
NTSTATUS MyDriver::AddDevice(PDEVICE_OBJECT pPhyDevice) {
    MyDevice *t = new (NonPagedPool) MyDevice(pPhyDevice);
    return STATUS_SUCCESS;
}
 
VOID MyDriver::Unload(void) {
    KDriver::Unload();
}

main.inf

[Version]
Signature="$WINDOWS NT$"
Class=Unknown
Provider=%MFGNAME%
DriverVer=10/01/2026,1.0.0.0

[Manufacturer]
%MFGNAME%=DeviceList
%MFGNAME%=DeviceList,NTamd64

[DeviceList]
%DESCRIPTION%=DriverInstall.NTamd64,*MyDriver

[DeviceList.NTamd64]
%DESCRIPTION%=DriverInstall.NTamd64,*MyDriver

[DestinationDirs]
DriverCopyFiles=12

[SourceDisksNames]
1=%INSTDISK%

[SourceDisksFiles]
main.sys=1

[DriverInstall.NTamd64]
CopyFiles=DriverCopyFiles

[DriverCopyFiles]
main.sys

[DriverInstall.NTamd64.Services]
AddService=FILEIO,0x00000002,DriverService

[DriverService]
DisplayName=%SERVICE_DESC%
ServiceType=1
StartType=3
ErrorControl=1
ServiceBinary=%12%\main.sys

[DriverInstall.NTamd64.HW]
AddReg=DriverHwAddReg

[DriverHwAddReg]
HKR,,SampleInfo,,""

[Strings]
MFGNAME="MyDriver"
INSTDISK="MyDriver Disc"
DESCRIPTION="MyDriver"
SERVICE_DESC="MyDriver Kernel Driver"

autorun.inf

[autorun]
open=run.bat

run.bat

e:\devcon.exe install e:\main.inf *mydriver
e:\devcon.exe remove e:\main.inf *mydriver

fix.py

import os
import sys
import pefile

if len(sys.argv) != 2:
    print('Usage: {} xxx'.format(sys.argv[0]))
    sys.exit()

fname = sys.argv[1]
pe = pefile.PE(fname);
pe.OPTIONAL_HEADER.CheckSum = pe.generate_checksum();
pe.write(fname);

Makefile

all:
	myx86 "c:\\xpddk\\bin\\x86\\cl.exe" -I"c:\\xpddk\\inc\\wxp" -I"c:\\xpddk\\inc\\ddk\\wxp" -I"c:\\xpddk\\inc\\ddk\\wdm\\wxp" -I"c:\\xpddk\\inc\\crt" -I"c:\\numega\\driverworks\\include" -I"c:\\numega\\driverworks\\source" -D_X86_=1 -DNTVERSION=\'WDM\' -DDBG=1 /c /Zel /Gz main.cpp
	lld-link /driver /base:0x10000 /subsystem:native /entry:DriverEntry /safeseh:no /opt/wadk/xpddk/lib/wxp/i386/wdm.lib /opt/wadk/xpddk/lib/wxp/i386/ntoskrnl.lib /opt/wadk/numega/driverworks/lib/i386/checked/vdw_wdm.lib main.obj /out:main.sys
	python3 fix.py main.sys

run:
	genisoimage -R -J -l -follow -o cdrom.iso * /opt/wadk/tools/sleep.exe /opt/wadk/tools/devcon.exe
	myqemu win2k

clean:
	rm -rf cdrom.iso main.obj main.pdb main.sys

編譯

$ make
$ make run

完成


裝置管理員


DeviceObject