Steward
分享是一種喜悅、更是一種幸福
驅動程式 - Windows NT Driver (Legacy) - 使用範例 - Pascal (DDDK) - Handle File IRP - Choose DO_DIRECT_IO
參考資訊:
https://wasm.in/
http://four-f.narod.ru/
https://github.com/steward-fu/ddk
http://www.delphibasics.info/home/delphibasicsprojects/delphidriverdevelopmentkit
main.pas
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 | unit main ; interface uses DDDK ; const DEV_NAME = '\Device\MyDriver' ; SYM_NAME = '\DosDevices\MyDriver' ; function _DriverEntry (pMyDriver : PDriverObject ; pMyRegistry : PUnicodeString ) : NTSTATUS ; stdcall ; implementation var szBuf : array [ 0..255 ] of char ; function IrpOpen (pMyDevice : PDeviceObject ; pIrp : PIrp ) : NTSTATUS ; stdcall ; begin DbgPrint ( 'IRP_MJ_CREATE' , []); Result := STATUS_SUCCESS ; pIrp^.IoStatus . Information := 0 ; pIrp^.IoStatus . Status := Result; IoCompleteRequest (pIrp, IO_NO_INCREMENT ); end ; function IrpRead (pMyDevice : PDeviceObject ; pIrp : PIrp ) : NTSTATUS ; stdcall ; var len : ULONG ; dst : PChar ; begin DbgPrint ( 'IRP_MJ_READ' , []); len := strlen (@szBuf[ 0 ]); dst := MmGetSystemAddressForMdlSafe (pIrp^.MdlAddress, LowPagePriority ); memcpy (dst, @szBuf[ 0 ], len); Result := STATUS_SUCCESS ; pIrp^.IoStatus . Information := len; pIrp^.IoStatus . Status := Result; IoCompleteRequest (pIrp, IO_NO_INCREMENT ); end ; function IrpWrite (pMyDevice : PDeviceObject ; pIrp : PIrp ) : NTSTATUS ; stdcall ; var len : ULONG ; src : PChar ; begin DbgPrint ( 'IRP_MJ_WRITE' , []); src := MmGetSystemAddressForMdlSafe (pIrp^.MdlAddress, LowPagePriority ); len := MmGetMdlByteCount (pIrp^.MdlAddress); memcpy (@szBuf[ 0 ], src, len); DbgPrint ( 'Buffer: %s, Length: %d' , [szBuf, len]); Result := STATUS_SUCCESS ; pIrp^.IoStatus . Information := len; pIrp^.IoStatus . Status := Result; IoCompleteRequest (pIrp, IO_NO_INCREMENT ); end ; function IrpClose (pMyDevice : PDeviceObject ; pIrp : PIrp ) : NTSTATUS ; stdcall ; begin DbgPrint ( 'IRP_MJ_CLOSE' , []); Result := STATUS_SUCCESS ; pIrp^.IoStatus . Information := 0 ; pIrp^.IoStatus . Status := Result; IoCompleteRequest (pIrp, IO_NO_INCREMENT ); end ; procedure Unload (pMyDriver : PDriverObject ); stdcall ; var szSymName : TUnicodeString ; begin RtlInitUnicodeString (@szSymName, SYM_NAME ); IoDeleteSymbolicLink (@szSymName); IoDeleteDevice (pMyDriver^.DeviceObject); end ; function _DriverEntry (pMyDriver : PDriverObject ; pMyRegistry : PUnicodeString ) : NTSTATUS ; stdcall ; var szDevName : TUnicodeString ; szSymName : TUnicodeString ; pMyDevice : PDeviceObject ; begin RtlInitUnicodeString (@szDevName, DEV_NAME ); RtlInitUnicodeString (@szSymName, SYM_NAME ); Result := IoCreateDevice (pMyDriver, 0 , @szDevName, FILE_DEVICE_UNKNOWN , 0 , FALSE , pMyDevice); pMyDriver^.MajorFunction[ IRP_MJ_CREATE ] := @ IrpOpen ; pMyDriver^.MajorFunction[ IRP_MJ_READ ] := @ IrpRead ; pMyDriver^.MajorFunction[ IRP_MJ_WRITE ] := @ IrpWrite ; pMyDriver^.MajorFunction[ IRP_MJ_CLOSE ] := @ IrpClose ; pMyDriver^.DriverUnload := @ Unload ; pMyDevice^.Flags := pMyDevice^.Flags or DO_DIRECT_IO ; pMyDevice^.Flags := pMyDevice^.Flags and not DO_DEVICE_INITIALIZING ; Result := IoCreateSymbolicLink (@szSymName, @szDevName); end ; end . |
完成