Steward
分享是一種喜悅、更是一種幸福
驅動程式 - Kernel Mode Driver Framework (KMDF) - 使用範例 - Assembly (MASM32) - PNP - Use Thread
參考資訊:
https://wasm.in/
http://four-f.narod.ru/
https://github.com/steward-fu/ddk
main.asm
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 | .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 IOCTL_START equ CTL_CODE ( FILE_DEVICE_UNKNOWN , 800h, METHOD_BUFFERED , FILE_ANY_ACCESS ) IOCTL_STOP equ CTL_CODE ( FILE_DEVICE_UNKNOWN , 801h, METHOD_BUFFERED , FILE_ANY_ACCESS ) .const MSG_START byte " IOCTL_START ",0 MSG_STOP byte " IOCTL_STOP ",0 .data bExitThread DWORD ? pThread PVOID ? .code MyThread proc pParam : DWORD local stTime : LARGE_INTEGER or stTime.HighPart, -1 mov stTime.LowPart, -10000000 mov eax , bExitThread . while ( eax != TRUE ) invoke KeDelayExecutionThread , KernelMode , FALSE , addr stTime invoke DbgPrint , $ CTA0 (" Sleep 1s") mov eax , bExitThread . endw invoke DbgPrint , $ CTA0 (" Exit MyThread ") invoke PsTerminateSystemThread , STATUS_SUCCESS ret MyThread endp 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 IrpIOCTL proc myQueue : WDFQUEUE , myRequest : WDFREQUEST , myOutLen : DWORD , myInLen : DWORD , myCode : DWORD local hThread : DWORD . if myCode == IOCTL_START invoke DbgPrint , offset MSG_START mov bExitThread, FALSE ;// NtCurrentProcess equ -1 ;// NtCurrentProcess will run on user thread area ;// Null wiil run on system area invoke PsCreateSystemThread , addr hThread, THREAD_ALL_ACCESS , NULL , -1, NULL , offset MyThread , NULL . if eax == STATUS_SUCCESS invoke ObReferenceObjectByHandle , hThread, THREAD_ALL_ACCESS , NULL , KernelMode , offset pThread, NULL invoke ZwClose , hThread . endif . elseif myCode == IOCTL_STOP invoke DbgPrint , offset MSG_STOP mov bExitThread, TRUE mov eax , pThread . if eax != NULL invoke KeWaitForSingleObject , pThread, Executive , KernelMode , FALSE , NULL invoke ObDereferenceObject , pThread . endif . endif invoke WdfRequestComplete , myRequest, STATUS_SUCCESS ret IrpIOCTL 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, WdfDeviceIoBuffered 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 ]).EvtIoDeviceControl, offset IrpIOCTL 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 |
app.asm
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | .386p .model flat, stdcall option casemap : none include c:\masm32\include\windows.inc include c:\masm32\include\masm32.inc include c:\masm32\include\user32.inc include c:\masm32\include\msvcrt.inc include c:\masm32\include\kernel32.inc include c:\masm32\include\w2k\ntddkbd.inc include c:\masm32\Macros\Strings.mac includelib c:\masm32\lib\user32.lib includelib c:\masm32\lib\masm32.lib includelib c:\masm32\lib\msvcrt.lib includelib c:\masm32\lib\kernel32.lib IOCTL_START equ CTL_CODE ( FILE_DEVICE_UNKNOWN , 800h, METHOD_BUFFERED , FILE_ANY_ACCESS ) IOCTL_STOP equ CTL_CODE ( FILE_DEVICE_UNKNOWN , 801h, METHOD_BUFFERED , FILE_ANY_ACCESS ) .const DEV_NAME db "\\.\ MyDriver ",0 .data? hFile dd ? dwRet dd ? .code start : invoke CreateFile , offset DEV_NAME , GENERIC_READ or GENERIC_WRITE , FILE_SHARE_READ , 0, OPEN_EXISTING , FILE_ATTRIBUTE_NORMAL , 0 mov hFile, eax invoke DeviceIoControl , hFile, IOCTL_START , NULL , 0, NULL , 0, offset dwRet, NULL invoke Sleep , 3000 invoke DeviceIoControl , hFile, IOCTL_STOP , NULL , 0, NULL , 0, offset dwRet, NULL invoke CloseHandle , hFile invoke ExitProcess , 0 end start |
完成