參考資訊:
https://wasm.in/
http://four-f.narod.ru/
https://github.com/steward-fu/ddk
main.asm
.386p
.model flat, stdcall
option casemap : none
include c:\masm32\Macros\Strings.mac
include c:\masm32\include\w2k\ntdef.inc
include c:\masm32\include\w2k\ntstatus.inc
include c:\masm32\include\w2k\ntddk.inc
include c:\masm32\include\w2k\ntoskrnl.inc
include c:\masm32\include\w2k\ntddkbd.inc
include c:\masm32\include\wxp\wdm.inc
include c:\masm32\include\wdf\umdf\1.9\wudfddi_types.inc
include c:\masm32\include\wdf\kmdf\1.9\wdf.inc
include c:\masm32\include\wdf\kmdf\1.9\wdftypes.inc
include c:\masm32\include\wdf\kmdf\1.9\wdfglobals.inc
include c:\masm32\include\wdf\kmdf\1.9\wdffuncenum.inc
include c:\masm32\include\wdf\kmdf\1.9\wdfobject.inc
include c:\masm32\include\wdf\kmdf\1.9\wdfdevice.inc
include c:\masm32\include\wdf\kmdf\1.9\wdfdriver.inc
include c:\masm32\include\wdf\kmdf\1.9\wdfrequest.inc
include c:\masm32\include\wdf\kmdf\1.9\wdfio.inc
include c:\masm32\include\wdf\kmdf\1.9\wdfmemory.inc
includelib c:\masm32\lib\wxp\i386\BufferOverflowK.lib
includelib c:\masm32\lib\wxp\i386\ntoskrnl.lib
includelib c:\masm32\lib\wxp\i386\hal.lib
includelib c:\masm32\lib\wxp\i386\wmilib.lib
includelib c:\masm32\lib\wxp\i386\sehupd.lib
includelib c:\masm32\lib\wdf\kmdf\i386\1.9\wdfldr.lib
includelib c:\masm32\lib\wdf\kmdf\i386\1.9\wdfdriverentry.lib
public DriverEntry
.data
szBuffer byte 255 dup(0)
.code
IrpFileCreate proc myDevice : WDFDEVICE, myRequest : WDFREQUEST, myFileObject : WDFFILEOBJECT
invoke DbgPrint, $CTA0("IRP_MJ_CREATE")
invoke WdfRequestComplete, myRequest, STATUS_SUCCESS
ret
IrpFileCreate endp
IrpFileClose proc myFileObject : WDFFILEOBJECT
invoke DbgPrint, $CTA0("IRP_MJ_CLOSE")
ret
IrpFileClose endp
IrpRead proc myQueue : WDFQUEUE, myRequest : WDFREQUEST, myLen : DWORD
local len : dword
local buf : dword
local mem : WDFMEMORY
invoke DbgPrint, $CTA0("IRP_MJ_READ")
invoke WdfRequestRetrieveUnsafeUserOutputBuffer, myRequest, myLen, addr buf, addr len
invoke WdfRequestProbeAndLockUserBufferForWrite, myRequest, buf, len, addr mem
invoke strlen, offset szBuffer
mov len, eax
invoke WdfMemoryGetBuffer, mem, NULL
invoke memcpy, eax, offset szBuffer, len
invoke WdfRequestCompleteWithInformation, myRequest, STATUS_SUCCESS, len
ret
IrpRead endp
IrpWrite proc myQueue : WDFQUEUE, myRequest : WDFREQUEST, myLen : DWORD
local len : dword
local buf : dword
local mem : WDFMEMORY
invoke DbgPrint, $CTA0("IRP_MJ_WRITE")
invoke WdfRequestRetrieveUnsafeUserInputBuffer, myRequest, myLen, addr buf, addr len
invoke WdfRequestProbeAndLockUserBufferForRead, myRequest, buf, len, addr mem
invoke WdfMemoryGetBuffer, mem, NULL
invoke memcpy, offset szBuffer, eax, myLen
invoke DbgPrint, $CTA0("Buffer: %s, Length:%d"), offset szBuffer, myLen
invoke WdfRequestCompleteWithInformation, myRequest, STATUS_SUCCESS, myLen
ret
IrpWrite endp
AddDevice proc myDriver : WDFDRIVER, pMyDeviceInit : PWDFDEVICE_INIT
local device : WDFDEVICE
local io_cfg : WDF_IO_QUEUE_CONFIG
local file_cfg : WDF_FILEOBJECT_CONFIG
local szDevName : UNICODE_STRING
local szSymName : UNICODE_STRING
invoke RtlInitUnicodeString, addr szDevName, $CTW0("\\Device\\MyDriver")
invoke RtlInitUnicodeString, addr szSymName, $CTW0("\\DosDevices\\MyDriver")
invoke WdfDeviceInitAssignName, pMyDeviceInit, addr szDevName
invoke WdfDeviceInitSetIoType, pMyDeviceInit, WdfDeviceIoNeither
invoke WDF_FILEOBJECT_CONFIG_INIT, addr file_cfg, offset IrpFileCreate, offset IrpFileClose, NULL
invoke WdfDeviceInitSetFileObjectConfig, pMyDeviceInit, addr file_cfg, WDF_NO_OBJECT_ATTRIBUTES
invoke WdfDeviceCreate, addr pMyDeviceInit, WDF_NO_OBJECT_ATTRIBUTES, addr device
invoke WdfDeviceCreateSymbolicLink, device, addr szSymName
invoke WDF_IO_QUEUE_CONFIG_INIT_DEFAULT_QUEUE, addr io_cfg, WdfIoQueueDispatchSequential
lea eax, io_cfg
mov (WDF_IO_QUEUE_CONFIG ptr [eax]).EvtIoRead, offset IrpRead
mov (WDF_IO_QUEUE_CONFIG ptr [eax]).EvtIoWrite, offset IrpWrite
invoke WdfIoQueueCreate, device, addr io_cfg, WDF_NO_OBJECT_ATTRIBUTES, WDF_NO_HANDLE
ret
AddDevice endp
DriverEntry proc pMyDriver : PDRIVER_OBJECT, pMyRegistry : PUNICODE_STRING
local config : WDF_DRIVER_CONFIG
invoke WDF_DRIVER_CONFIG_INIT, addr config, AddDevice
invoke WdfDriverCreate, pMyDriver, pMyRegistry, WDF_NO_OBJECT_ATTRIBUTES, addr config, WDF_NO_HANDLE
ret
DriverEntry endp
end DriverEntry
.end
完成
