五、应用程序与驱动程序交互(缓冲模式)
生活随笔
收集整理的這篇文章主要介紹了
五、应用程序与驱动程序交互(缓冲模式)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
新建exe控制臺(tái)程序
#include "pch.h" #include <windows.h> #include <iostream> #include <WinIoCtl.h>#include "ctl_code.h"using namespace std; #pragma warning(disable: 4789) int add(HANDLE hDevice, int a, int b) {int port[2] = {0x00};int buffret;ULONG dwWrite;port[0] = a;port[1] = b;::DeviceIoControl(hDevice, add_code, &port, 8, &buffret, 4, &dwWrite, NULL);return buffret; } int main() {HANDLE hDevice = ::CreateFileA("\\\\.\\MySysData",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);if (hDevice == INVALID_HANDLE_VALUE){cout << "獲取驅(qū)動(dòng)句柄失敗" <<GetLastError() <<endl;}int a, b;while (true){cin >> a >> b;int r = add(hDevice, a, b);cout << a << " + " << b << " = " << r << endl;getchar();}std::cout << "Hello World!\n"; }ctl_code.h代碼
#pragma once #include <WinIoCtl.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_BUFFERED,FILE_ANY_ACCESS) #define sub_code CTL_CODE(FILE_DEVICE_UNKNOWN, 0x801, METHOD_BUFFERED,FILE_ANY_ACCESS)新建kmdf空工程,代碼如下
#include <ntddk.h>#include "clt_code.h"#define INITCODE code_seg("INIT"); #define PAGECODE code_seg("PAGE");NTSTATUS CreateMyDevice(IN PDRIVER_OBJECT pDriverObject) {NTSTATUS status;UNICODE_STRING devName; //設(shè)備名稱UNICODE_STRING sysLinkName; //系統(tǒng)符號(hào)鏈接名PDEVICE_OBJECT pDevObject; //用于返回創(chuàng)建設(shè)備RtlInitUnicodeString(&devName, L"\\Device\\MyDevObj");status = IoCreateDevice(pDriverObject, 0, &devName, FILE_DEVICE_UNKNOWN, 0, TRUE, &pDevObject);if (!NT_SUCCESS(status)){if (status == STATUS_INSUFFICIENT_RESOURCES){KdPrint(("資源不足\n"));}if (status == STATUS_OBJECT_NAME_EXISTS){KdPrint(("指定對(duì)象名存在\n"));}if (status == STATUS_OBJECT_NAME_COLLISION){KdPrint(("對(duì)象名有沖突"));}return status;}KdPrint(("設(shè)備創(chuàng)建成功\n"));pDevObject->Flags |= DO_BUFFERED_IO; //緩沖區(qū)方式讀寫RtlInitUnicodeString(&sysLinkName, L"\\??\\MySysData");IoDeleteSymbolicLink(&sysLinkName);status = IoCreateSymbolicLink(&sysLinkName, &devName); //判斷生成符號(hào)鏈接是否成功if (!NT_SUCCESS(status)){KdPrint(("生成符號(hào)鏈接失敗\n"));IoDeleteDevice(pDevObject);return status;}KdPrint(("生成符號(hào)鏈接成功"));return STATUS_SUCCESS; }VOID DriverUnload(PDRIVER_OBJECT pDriverObject) {PDEVICE_OBJECT pDevObject;UNICODE_STRING sysLinkName;pDevObject = pDriverObject->DeviceObject;IoDeleteDevice(pDevObject); //取得設(shè)備并刪除KdPrint(("成功刪除設(shè)備\n"));RtlInitUnicodeString(&sysLinkName, L"\\??\\MySysData");IoDeleteSymbolicLink(&sysLinkName); //取得符號(hào)鏈接并刪除KdPrint(("成功刪除符號(hào)鏈接\n"));KdPrint(("驅(qū)動(dòng)成功卸載\n")); }//NTSTATUS MyDispatchRoutine(IN PDEVICE_OBJECT pDevobj, IN PIRP pIrp) //{ // return STATUS_SUCCESS; //}NTSTATUS MyDispatchRoutine(IN PDEVICE_OBJECT pDevobj, IN PIRP pIrp) {ULONG info;PIO_STACK_LOCATION psl = IoGetCurrentIrpStackLocation(pIrp);switch (psl->MajorFunction){case IRP_MJ_CREATE:break;case IRP_MJ_CLOSE:break;case IRP_MJ_READ:break;case IRP_MJ_WRITE:break;case IRP_MJ_DEVICE_CONTROL:{NTSTATUS status = STATUS_SUCCESS;ULONG cbin = psl->Parameters.DeviceIoControl.InputBufferLength; //獲取輸入緩沖區(qū)大小ULONG cbout = psl->Parameters.DeviceIoControl.OutputBufferLength; //獲取輸出緩沖區(qū)大小ULONG code = psl->Parameters.DeviceIoControl.IoControlCode; //得到IOCTLKdPrint(("Enter IRP_MJ_DEVICE_CONTROL\n"));switch (code){case add_code:{int a, b, r;int * inputBuffer = (int*)pIrp->AssociatedIrp.SystemBuffer;int * outBuffer = (int *)pIrp->AssociatedIrp.SystemBuffer;KdPrint(("Enter add_code\n"));a = *inputBuffer;b = *(inputBuffer + 1);KdPrint(("a=%d, b=%d\n", a, b));r = a + b;*outBuffer = r;KdPrint(("a+b=%d\n", r));info = 4;break;}case sub_code:{break;}}}default:{KdPrint(("其它處理"));break;}}pIrp->IoStatus.Information = info; //設(shè)置操作的字節(jié)數(shù)為0,這里無實(shí)際意義pIrp->IoStatus.Status = STATUS_SUCCESS; //返回成功IoCompleteRequest(pIrp, IO_NO_INCREMENT); //指示完成此IRPKdPrint(("離開派遣函數(shù)\n")); //調(diào)試信息return STATUS_SUCCESS; } #pragma INITCODE NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING reg_path) {KdPrint(("驅(qū)動(dòng)加載成功\n"));pDriverObject->MajorFunction[IRP_MJ_CREATE] = MyDispatchRoutine;pDriverObject->MajorFunction[IRP_MJ_CLOSE] = MyDispatchRoutine;pDriverObject->MajorFunction[IRP_MJ_READ] = MyDispatchRoutine;pDriverObject->MajorFunction[IRP_MJ_WRITE] = MyDispatchRoutine;pDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = MyDispatchRoutine;CreateMyDevice(pDriverObject);pDriverObject->DriverUnload = DriverUnload;return STATUS_SUCCESS; }在測(cè)試機(jī)中用instdrv驅(qū)動(dòng)加載工具加載并啟動(dòng)驅(qū)動(dòng)程序:
在cmd下運(yùn)行exe程序,輸入a b,計(jì)算a+b,運(yùn)行結(jié)果如下:
總結(jié)
以上是生活随笔為你收集整理的五、应用程序与驱动程序交互(缓冲模式)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前端学习(7):web的三大技术
- 下一篇: flutter 透明度动画_Flutte