基于umdf2的驱动程序

news2024/11/26 12:39:00

源码下载:https://download.csdn.net/download/mao0514/88915667 

win10 64位系统+vs2019+wdk

inf安装:

 



VOID
UMDF2Driver1EvtIoDeviceControl(
    _In_ WDFQUEUE Queue,
    _In_ WDFREQUEST Request,
    _In_ size_t OutputBufferLength,
    _In_ size_t InputBufferLength,
    _In_ ULONG IoControlCode
    )
/*++

Routine Description:

    This event is invoked when the framework receives IRP_MJ_DEVICE_CONTROL request.

Arguments:

    Queue -  Handle to the framework queue object that is associated with the
             I/O request.

    Request - Handle to a framework request object.

    OutputBufferLength - Size of the output buffer in bytes

    InputBufferLength - Size of the input buffer in bytes

    IoControlCode - I/O control code.

Return Value:

    VOID

--*/
{
    TraceEvents(TRACE_LEVEL_INFORMATION, 
                TRACE_QUEUE, 
                "%!FUNC! Queue 0x%p, Request 0x%p OutputBufferLength %d InputBufferLength %d IoControlCode %d", 
                Queue, Request, (int) OutputBufferLength, (int) InputBufferLength, IoControlCode);
    CHAR		n, c[] = "壹贰叁肆伍陆柒捌玖零";
    PVOID buffer, outbuf;
    NTSTATUS  status = 0;

    switch (IoControlCode) 
    {

        case CHAR_IOCTL_800:
            if (InputBufferLength == 0 || OutputBufferLength == 0)
            {
                WdfRequestComplete(Request, STATUS_INVALID_PARAMETER);
                break;
            }
            else
            {
                status = WdfRequestRetrieveInputBuffer(Request, 1, &buffer, NULL);
                if (!NT_SUCCESS(status))
                {
                    WdfRequestComplete(Request, STATUS_UNSUCCESSFUL);
                    break;
                }

                status = WdfRequestRetrieveOutputBuffer(Request, 2, &outbuf/*outbuf指针的指针*/, NULL);
                if (!NT_SUCCESS(status))
                {
                    WdfRequestComplete(Request, STATUS_UNSUCCESSFUL);
                    break;
                }
                n = *(unsigned char*)buffer;
                KdPrint(("read base0 %x %x", 0, *(unsigned int*)buffer));
                memcpy((unsigned char*)outbuf, (unsigned char*)(c+2*n),2);
                WdfRequestCompleteWithInformation(Request, STATUS_SUCCESS, 2);

            }
       
            break;
      default:

        status = STATUS_INVALID_DEVICE_REQUEST;
        WdfRequestCompleteWithInformation(Request, status, 0);
        break;
    }
   // WdfRequestComplete(Request, STATUS_SUCCESS);

    return;
}

应用端:


//pub.h
#include <initguid.h>

DEFINE_GUID(GUID_DEVINTERFACE_UMDF2Driver1,
    0xd63d7565, 0xb448, 0x45cb, 0xa2, 0x4b, 0xe7, 0x32, 0x65, 0x1d, 0x45, 0x29);
// {d63d7565-b448-45cb-a24b-e732651d4529}


#define CHAR_IOCTL_800 CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_BUFFERED, FILE_ANY_ACCESS)

//api
#include <windows.h>
#include <setupapi.h>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <winioctl.h>
//

#pragma comment(lib,"setupapi.lib")
PCHAR
GetDevicePath(
    IN  LPGUID InterfaceGuid
)
{
    HDEVINFO HardwareDeviceInfo;
    SP_DEVICE_INTERFACE_DATA DeviceInterfaceData;
    PSP_DEVICE_INTERFACE_DETAIL_DATA DeviceInterfaceDetailData = NULL;
    ULONG Length, RequiredLength = 0;
    BOOL bResult;

    HardwareDeviceInfo = SetupDiGetClassDevs(
        InterfaceGuid,
        NULL,
        NULL,
        (DIGCF_PRESENT | DIGCF_DEVICEINTERFACE));

    if (HardwareDeviceInfo == INVALID_HANDLE_VALUE) {
        printf("SetupDiGetClassDevs failed!\n");
        exit(1);
    }

    DeviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);

    bResult = SetupDiEnumDeviceInterfaces(HardwareDeviceInfo,
        0,
        InterfaceGuid,
        0,
        &DeviceInterfaceData);

    if (bResult == FALSE) {
        /*
                LPVOID lpMsgBuf;

                if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
                                  FORMAT_MESSAGE_FROM_SYSTEM |
                                  FORMAT_MESSAGE_IGNORE_INSERTS,
                                  NULL,
                                  GetLastError(),
                                  MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
                                  (LPSTR) &lpMsgBuf,
                                  0,
                                  NULL
                                  )) {

                    printf("Error: %s", (LPSTR)lpMsgBuf);
                    LocalFree(lpMsgBuf);
                }
        */
        printf("SetupDiEnumDeviceInterfaces failed.\n");

        SetupDiDestroyDeviceInfoList(HardwareDeviceInfo);
        exit(1);
    }

    SetupDiGetDeviceInterfaceDetail(
        HardwareDeviceInfo,
        &DeviceInterfaceData,
        NULL,
        0,
        &RequiredLength,
        NULL
    );

    DeviceInterfaceDetailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)LocalAlloc(LMEM_FIXED, RequiredLength);

    if (DeviceInterfaceDetailData == NULL) {
        SetupDiDestroyDeviceInfoList(HardwareDeviceInfo);
        printf("Failed to allocate memory.\n");
        exit(1);
    }

    DeviceInterfaceDetailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);

    Length = RequiredLength;

    bResult = SetupDiGetDeviceInterfaceDetail(
        HardwareDeviceInfo,
        &DeviceInterfaceData,
        DeviceInterfaceDetailData,
        Length,
        &RequiredLength,
        NULL);

    if (bResult == FALSE) {
        /*
                LPVOID lpMsgBuf;

                if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
                              FORMAT_MESSAGE_FROM_SYSTEM |
                              FORMAT_MESSAGE_IGNORE_INSERTS,
                              NULL,
                              GetLastError(),
                              MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
                              (LPSTR) &lpMsgBuf,
                              0,
                              NULL
                              )) {

                    MessageBox(NULL, (LPCTSTR) lpMsgBuf, "Error", MB_OK);
                    LocalFree(lpMsgBuf);
                }
        */
        printf("Error in SetupDiGetDeviceInterfaceDetail\n");

        SetupDiDestroyDeviceInfoList(HardwareDeviceInfo);
        LocalFree(DeviceInterfaceDetailData);
        exit(1);
    }

    return DeviceInterfaceDetailData->DevicePath;

}


HANDLE hDevice = INVALID_HANDLE_VALUE;

void CMFCApplication1Dlg::OnBnClickedButton1()
{
	// TODO: 在此添加控件通知处理程序代码
    PCHAR  DevicePath;

    DevicePath = GetDevicePath((LPGUID)&GUID_DEVINTERFACE_UMDF2Driver1);

    hDevice = CreateFile(DevicePath,
        GENERIC_READ | GENERIC_WRITE,
        FILE_SHARE_READ | FILE_SHARE_WRITE,
        NULL,
        OPEN_EXISTING,
        0,
        NULL);
    if (hDevice == INVALID_HANDLE_VALUE) {
        MessageBox("err.\n");
        return;
    }

    MessageBox("OK.\n");
}


void CMFCApplication1Dlg::OnBnClickedButton2()
{
    // TODO: 在此添加控件通知处理程序代码
    CHAR	bufInput[1];	// Input to device
    CHAR	bufOutput[2];	// Output from device
    ULONG	nOutput;	// Count written to bufOutput


    bufInput[0] = 2;
    if (!DeviceIoControl(hDevice,
        CHAR_IOCTL_800,
        bufInput,
        1,
        bufOutput,
        2,
        &nOutput,
        NULL)
        )
    {
        MessageBox("err.\n");
        return;
    }
    MessageBox(bufOutput);
    CloseHandle(hDevice);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1493032.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Docker基础系列之DockerFile

Docker基础系列之Dockerfile 文章目录 Docker基础系列之Dockerfile1. Dockerfile是什么&#xff1f;1.1 Dockerfile概述1.2 构建三步骤 2. Dockerfile构建过程解析2.1 Dockerfile内容基础知识2.2 执行Dockerfile的大致流程 3. DockerFile体系结构(保留字指令)4. 案例4.1 首先创…

BUUCTF-MISC-[GUET-CTF2019]soul sipse1

题目链接&#xff1a;BUUCTF在线评测 (buuoj.cn) 下载附件是一个音频文件&#xff0c;使用au打开没有什么发现 试试kali中的steghide steghide extract -sf /root/桌面/out.wav 无密码分离出download.txt 打开txt文件发现是个网址&#xff0c;访问看看 下载后使用binwalk查看照…

同态加密+区块链,在大健康数据隐私保护中的应用

PrimiHub一款由密码学专家团队打造的开源隐私计算平台&#xff0c;专注于分享数据安全、密码学、联邦学习、同态加密等隐私计算领域的技术和内容。 近几年&#xff0c;越来越多的隐私计算技术被用于解决临床和研究数据共享中的隐私和安全问题。 当然&#xff0c;对这些技术的法…

Android 14后台服务永久保活的技术方法

Android 14后台服务永久保活的技术方法 在本篇博客中&#xff0c;我们将探讨如何创建一个在Android系统中不会被杀死的后台服务。 第一步&#xff1a;创建一个后台服务。 在这一步中&#xff0c;我们需要创建一个后台服务的代码。 第二步&#xff1a;在AndroidManifest.xml中…

HDFS简介与部署以及故障排错(超简单)

文章目录 一、HDFS介绍1、简介2、结构模型3、文件写入过程4、文件读取过程5、文件块的存放6、存储空间管理机制6.1 文件删除和恢复删除6.2 复制因子配置6.3 文件命名空间6.4 数据复制机制 二、环境搭建&#xff08;单机版&#xff09;1、修改主机名2、配置ssh免密登录3、Hadoop…

串的匹配算法——KMP算法

目录 一.特点 二.算法思想 三.公式证明 四.next数组及其练习 五.找规律计算next[k] 六.代码实现 一.特点 BF算法的特点是i回退&#xff0c;KMP算法的最大特点是i不回退&#xff0c;由于i不回退&#xff0c;所以KMP算法的时间复杂度是O(nm)。 二.算法思想 在匹配主串和子…

Ubuntu 22.04修改静态ip

1. 备份原网络配置文件 # 配置文件名称因机器设置有异 cd /etc/netplan cp 01-network-config.yaml 01-network-config.yaml.bak# 文件内容如下 network:version: 2renderer: NetworkManager2. 修改配置文件 使用 ipconfig 命令查看网络信息&#xff0c;ip addr 命令也可 我这…

day52(vueJS)json-server模拟数据

json-server介绍&#xff1a;&#xff1a;&#xff1a;JSON Server 是一个用于快速搭建 REST API 的工具&#xff0c;它可以帮助我们在开发过程中快速模拟 一个后端 API 服务器&#xff0c;方便前端开发人员进行接口调试和开发。使用 JSON Server&#xff0c;你可以通过创建一个…

【Vue】VueX仓库

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;Vue ⛺️稳中求进&#xff0c;晒太阳 目录 Vue概述 是什么 场景&#xff1a; 优势 构建多组件共享环境 创建一个空仓库 核心概念 - state 状态 1. 提供数据 2.使用数据 ​编辑 …

在虚拟机vm下的Linux系统下 安装redis 超详细

打开Linux后 右键打开终端 1.输入:su root 登录root 密码是123456 2.然后输入:yum -y install gcc-c 安装gcc基础依赖包 3.yum -y install centos-release-scl 4.yum -y install devtoolset-9-gcc devtoolset-9-gcc-c devtoolset-9-binutils //为了编译最新版本的Redis源码 用…

纯手工搭建一个springboot maven项目

前言&#xff1a;idea社区版无法自动搭建项目&#xff0c;手动搭建的经验分析如下&#xff1a; 1 包结构 参考下图&#xff1a; 2 项目结构 3 maven依赖 具体的项目如图&#xff1a; 依据这个结构配置一个springboot 的 pom依赖&#xff1a; <?xml version"1.0…

SanctuaryAI推出Phoenix: 专为工作而设计的人形通用机器人

文章目录 1. Company2. Main2.1 关于凤凰™ (Phoenix)2.2 关于碳™(Carbon)2.3 商业化部署2.4 关于 Sanctuary Corporation 3. My thoughtsReference彩蛋&#xff1a;将手机变为桌面小机器人 唯一入选《时代》杂志 2023 年最佳发明的通用机器人。 称机器人自主做家务的速度和灵…

js SheetJS 合并表格导出到同一个excel中

最近有个需求,我在一个页面显示了4个表格, 然后合并导出到excel文件中 四个表,四个sheet,一个excel文件 最后导出时这样: 实现: 1,页面有个导出的checkbox,勾选则导出,不勾选不处理 2,在一个函数中,集中处理四个表数据获取,并将结果返回出来 //获取数据后返回为…

【C++】递归 1241 - 角谷猜想 1108 - 正整数N转换成一个二进制数

文章目录 一、问题&#xff1a;1241 - 角谷猜想二、问题&#xff1a;1108 - 正整数N转换成一个二进制数三、总结四、感谢 一、问题&#xff1a;1241 - 角谷猜想 类型&#xff1a;有规律的循环、递归。 题目描述&#xff1a; 日本一位中学生发现一个奇妙的定理&#xff0c;请角…

如何判断可编程电子负载是否合格?

可编程电子负载是一种可以模拟实际负载的电子设备&#xff0c;广泛应用于电源、电池、充电器等产品的测试和研发。判断可编程电子负载是否合格&#xff0c;需要从以下几个方面进行考量&#xff1a; 精度是衡量电子负载性能的重要指标&#xff0c;包括电流精度、电压精度、功率精…

ImportError: Could not import docarray python package解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

Qt 使用QListView实现简约美观的聊天窗口

今天和大家分享一个使用QListView来展现聊天窗口的历史记录的例子, 因为聊天记录可能会有很多, 所以使用试图-模型的方式更加合理 这是最终效果: ChatHistoryModel继承自QAbstractListModel , ChatHistoryViewDelegate继承自QStyledItemDelegate, 这个例子最关键的就是在QSty…

Keil MDK安装armcc V5编译器

不知道从什么时候开始&#xff0c;Keil MDK默认不支持V5的编译器了&#xff0c;里面默认只有V6的编译器&#xff0c;设置界面跟V5有很大的差异不太熟悉。最可怕的是&#xff0c;之前使用V5编译的工程&#xff0c;换成V6编译器后居然报错...虽然修改一下应该也可以正常编译&…

几种常用的查看Ros话题的命令

1、查看 rqt_tf_tree rosrun rqt_tf_tree rqt_tf_tree 2、查看ros node 关系 rqt_graph 3、列出所有话题 rostopic list 4、查看某一话题的类型 以 /scan 为例 rostopic type /scan 5、查看某个数据类型包含哪些数据 rosmsg show sensor_msgs/LaserScan sensor_…

Gitlab修改仓库权限为public、Internal、Private

Public&#xff08;公开&#xff09;&#xff1a;所有人都可以访问该仓库&#xff1b; Internal&#xff08;内部&#xff09;&#xff1a;同一个GitLab群组或实例内的所有用户都可以访问该仓库&#xff1b; Private&#xff08;私人&#xff09;&#xff1a;仅包括指定成员的用…