Steward
分享是一種喜悅、更是一種幸福
驅動程式 - 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