驱动开发之二:尝试挂接file system

FPGA板级支持包BSP开发实战:从架构到高速外设调试 在嵌入式系统开发中,板级支持包(BSP)一直是连接硬件与上层应用的关键桥梁。它通过封装硬件初始化、设备驱动与运行时服务,让开发者无需直面底层寄存器操作,即可快速调用UART、DMA、中断等外设能力。这种分层设计不仅大幅缩短了系统适配周期,也成为SoC平台(如Zynq、Versal)上软硬件协同开发的基石。在FPGA领域,随着JESD204B、PCIe、DDR等高速接口的普及,BSP的价值愈发凸显——它将这些复杂外设的训练、校准与链路管理抽象为标准化API,显著降低了高速数据采集、信号处理等场景的落地门槛。同 阅读详情
 

hookfilesystem.c

代码
//尝试挂接file system

 


#include "Hookfilesystem.h"


HANDLE        hFileHandle;
OBJECT_ATTRIBUTES        ObjectAttrib;
PDEVICE_OBJECT        pFileDeviceObject;


struct _DRIVER_OBJECT *pDeviceObject;


PDRIVER_DISPATCH RealCreateDispatch;


NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject ,IN PUNICODE_STRING RegistryPath)
{
        UNICODE_STRING        uninameString,unilinkString;
        NTSTATUS        ntStatus;
        PDEVICE_OBJECT        pDeviceObject;
       
        RtlInitUnicodeString(&uninameString,L"//Device//Shadow3");
       
        ntStatus = IoCreateDevice(DriverObject,
        0,
        &uninameString,
        FILE_DEVICE_UNKNOWN,
        0,
        TRUE,
        &pDeviceObject
        );
                                                                                                               
        if(!NT_SUCCESS(ntStatus))        //如果创建设备失败,则直接退出
                return ntStatus;
               
        //创建Win32可见的符号连接
        RtlInitUnicodeString( &unilinkString, L"//DosDevices//shadow3" );
       
        ntStatus = IoCreateSymbolicLink(&unilinkString ,&uninameString);
        if(!NT_SUCCESS(ntStatus))
        {
                return ntStatus;       
        }
       
        //设置Dispatch
        DriverObject->MajorFunction[IRP_MJ_CREATE] = DriverDispatch;
        DriverObject->MajorFunction[IRP_MJ_CLOSE] = DriverDispatch;
        //设置Unload
        DriverObject->DriverUnload = DriverUnload;
        //Hook File System
        HookFileSystem();
       
        return 0;       
}


NTSTATUS
DriverDispatch(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP           Irp
    )
{
               
    Irp->IoStatus.Status = STATUS_SUCCESS;
    IoCompleteRequest (Irp,IO_NO_INCREMENT);
    return Irp->IoStatus.Status;
}


void DriverUnload(IN PDRIVER_OBJECT pDriverObject)
{
                UNICODE_STRING uniNameString;
               
                RtlInitUnicodeString(&uniNameString, L"//DosDevices//shadow3");
                IoDeleteSymbolicLink(&uniNameString);        //删除win32可见
                IoDeleteDevice(pDriverObject->DeviceObject);        //删除设备
               
                return ;
}


void HookFileSystem(void)
{
        UNICODE_STRING uniDeviceName;
        NTSTATUS        Ntstatus;
        IO_STATUS_BLOCK IoStatusBlock;
        PVOID pFileObject;
       
        RtlInitUnicodeString(&uniDeviceName ,L"//DosDevices//C://");
       
        InitializeObjectAttributes(&ObjectAttrib ,&uniDeviceName ,OBJ_CASE_INSENSITIVE, NULL, NULL);
        //打开一个设备
        Ntstatus = ZwCreateFile(
                                &hFileHandle,
                                SYNCHRONIZE|FILE_ANY_ACCESS,
                                &ObjectAttrib,
                                &IoStatusBlock,
                                0,
                                0,
                                FILE_SHARE_READ|FILE_SHARE_WRITE,
                                FILE_OPEN,
                                FILE_SYNCHRONOUS_IO_NONALERT|FILE_DIRECTORY_FILE,
                                0,
                                0
                                );
                                                       
        if(!NT_SUCCESS(Ntstatus))
        {
                DbgPrint("ZwCreateFile Failed,ntstatus:%ld/n",Ntstatus);       
                return;
        }
       
        //通过文件句柄得到与之向对应的文件对象
        Ntstatus = ObReferenceObjectByHandle(hFileHandle,FILE_READ_DATA,0,0,&pFileObject,NULL);
        if(!NT_SUCCESS(Ntstatus))
        {
                ZwClose(hFileHandle);
                DbgPrint("ObReferenceObjectByHandle Failed,ntstatus:%ld/n",Ntstatus);       
                return;
        }
       
        //在通过该文件对象查找相对应的文件设备
        pFileDeviceObject = IoGetRelatedDeviceObject(pFileObject);
        //文件对象引用计数器减一
        ObDereferenceObject(pFileObject);
        ZwClose(hFileHandle);
       
        if(pFileDeviceObject==NULL)
        {
                DbgPrint("Get File Object Failed/n");               
                return ;
        }
       
        pDeviceObject = pFileDeviceObject->DriverObject;
       
        if(pDeviceObject->MajorFunction[IRP_MJ_CREATE] == HookCreateDispatch)
        {
                DbgPrint("already hook IRP_MJ_CREATE/n");       
                return ;
        }
       
        //保存IRP_MJ_CREATE处理的地址
        RealCreateDispatch = pDeviceObject->MajorFunction[IRP_MJ_CREATE];
       
        //Hook Create DisPatch
        pDeviceObject->MajorFunction[IRP_MJ_CREATE] = HookCreateDispatch;
       
        return;       
}


NTSTATUS
HookCreateDispatch(   
                IN PDEVICE_OBJECT DeviceObject,
    IN PIRP           Irp
    )
{
        // DbgPrint("hook success/r/n");
        PIO_STACK_LOCATION        pIocurrentstack;
        PFILE_OBJECT pFileObject;
       
        DbgPrint("DeviceName:%S/r/n",DeviceObject->DriverObject->DriverName.Buffer);
       
       
        pIocurrentstack = IoGetCurrentIrpStackLocation(Irp);
       
        pFileObject = pIocurrentstack->FileObject;
       
        DbgPrint("FileName:%S/r/n",pFileObject->FileName.Buffer);
       
        _asm
        {
                push Irp
                push DeviceObject
                call RealCreateDispatch       
        }
       
        return 0;       
}

 

hookfilesystem.h

 

代码
#ifndef _INCLUDE_
#define _INCLUDE_

 


#include <ntddk.h>


NTSTATUS
DriverDispatch(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP           Irp
    );
   
void DriverUnload(IN PDRIVER_OBJECT DriverObject);


void HookFileSystem(void);


NTSTATUS
HookCreateDispatch(   
                IN PDEVICE_OBJECT DeviceObject,
    IN PIRP           Irp
    );


#endif

LPC435x双核MCU开发指南:从架构解析到多核协同实战 在嵌入式系统设计中,微控制器(MCU)的选型与架构理解是项目成功的基石。其核心原理在于通过处理器内核、存储器和外设的协同工作,实现对物理世界的精确控制与信息处理。采用双核或异构多核架构的MCU,如ARM Cortex-M系列,能够有效分离高性能计算与硬实时任务,从而显著提升系统并行处理能力和响应确定性,这一技术价值在需要复杂算法与实时控制并存的场景中尤为突出。此类技术广泛应用于工业自动化、物联网网关、电机驱动等对算力与实时性均有严苛要求的领域。本文以NXP LPC435x系列双核MCU(集成Cortex-M 阅读详情

相关推荐

Operaton 2.0原生集成JUnit 6:Java测试现代化实战指南

在Java测试领域,单元测试和集成测试是保障软件质量的核心实践,其原理在于通过自动化验证代码逻辑,确保功能正确性与稳定性。JUnit作为Java生态中最主流的测试框架,其编程模型和生命周期管理是构建可靠测试套件的技术基础。随着JUnit 6的发布,其增强的**参数化测试**和更灵活的扩展机制为测试代码的模块化与可维护性带来了显著价值,广泛应用于微服务、API及数据库交互等复杂场景的验证。Operaton测试框架通过深度集成JUnit 6,实现了从“适配”到“原生”的架构演进,消除了兼容层开销,并优化了**依

weixin_34072458的博客 364

centos7初学者报错笔记

netstat 6379报错 netstat -tunlp -bash: netstat: command not found 解决方法: yum install net-tools

ok996的博客 886

Wireshark实战解析PCIe协议:从TLP到DLLP的可视化抓包指南

在计算机体系结构中,总线协议是实现高速设备间通信的核心基础。PCIe(Peripheral Component Interconnect Express)作为现代计算机的主流高速串行总线标准,其协议栈采用分层设计,事务层(Transaction Layer)负责封装和路由数据请求,而数据链路层(Data Link Layer)则通过序列号、CRC校验和基于信用的流量控制机制,确保数据传输的可靠性与有序性。理解这两层的交互原理,对于进行硬件驱动开发、系统性能调优以及底层通信机制研究具有重要价值。通过Wires

weixin_33719619的博客 457

centos启动问题的解决

由于配置Hadoop开发环境的需要,配置了两天虚拟机器,系统为centos6.3, 虚拟机配置过程中发现,系统正常运行 但是重启后,选择系统,显示centosos6.3,  一个进度条,进度条进行到100%后,无反应直接卡死。 重装后 问题依旧. 再重装   take snapshot,   再重启  问题依旧。 恢复快照。 几经度娘,   修订/boot/grub/grub.conf 找

bdjc的专栏 1669

Arm设备JTAG接口实现:从协议原理到硬件调试实战

JTAG(联合测试行动组)是一种广泛应用于芯片测试和嵌入式调试的工业标准接口协议,其核心原理基于IEEE 1149.1标准定义的状态机和TAP控制器,通过TCK、TMS、TDI、TDO等少数几根信号线实现芯片内部寄存器的访问与控制。这项技术的核心价值在于为开发者提供了对芯片内部状态的可控性与可观测性,极大提升了硬件调试、固件烧录及生产测试的效率。在嵌入式系统开发中,JTAG常用于连接调试器与目标处理器,进行实时调试、边界扫描测试以及系统初始化。特别是在Arm架构设备上,JTAG与Arm CoreSight调

cuyi7076的博客 433

CAN总线核心技术解析:从差分信号、仲裁机制到DBC文件实战应用

在嵌入式系统和汽车电子领域,控制器局域网(CAN)总线是实现可靠、实时多节点通信的核心技术。其原理基于差分信号传输,通过CAN_H和CAN_L两根双绞线实现强抗干扰能力。核心技术价值在于其非破坏性的仲裁机制,允许总线上多个节点平等竞争,高优先级报文可无损胜出,确保了通信的确定性和实时性。这一机制广泛应用于汽车电子控制单元(ECU)间的通信、工业自动化及医疗设备等场景。为了高效开发与调试,工程师需掌握DBC文件的使用,它能将原始的ID和数据字节映射为有意义的物理信号,极大提升开发效率。本文结合Python脚本

weixin_33937499的博客 441

Linux基础-----Linux系统的文件系统与日志文件

目录 一.inode与block概述 二.indoe的内容 三.inode的号码 四.inode的大小 五.inode的特殊作用 六.恢复误删除的xfs文件 七.日志文件的分类与位置 八.内核及系统日志 九.用户日志 十.程序日志 十一.日志管理策略 一.inode与block概述 Linux系统文件中有三个部分:文件名,元信息,数据。 通常元信息存放在inode(索引...

qq_42761527的博客 761

基于STM32与DS18B20的智能输液温度控制系统设计与仿真

温度控制是嵌入式系统与物联网应用中的核心基础技术,其原理在于通过传感器实时采集环境参数,经由微控制器处理,并驱动执行机构实现精准调节。这项技术的价值在于将物理世界的模拟量转化为可控的数字信号,从而实现自动化与智能化。在医疗、工业、农业等诸多需要恒温或温度监控的场景中,嵌入式温度控制系统发挥着关键作用。本文聚焦于医疗输液这一具体应用,针对传统方式温度控制不精准、安全性差的问题,详细介绍了如何利用STM32F103C8T6单片机和DS18B20数字温度传感器构建一个闭环控制系统。内容涵盖从系统设计、外设驱动开发

weixin_30785593的博客 438

【51码儿】【Linux学习笔记】第1章 安装、登录CentOS7

本笔记由51码儿(www.51mar.com)提供 1.1学习之初预习和复习的重要性(预习:大致看看命令等,有印象。复习:随时浏览)当日事当日毕(只能做到当周事当周毕,保证给自己的理由,不能越堆越多)记笔记(清晰)利用好资源(VIP群,一起学习,借鉴别人分享的解决问题的方法,QQ找老师,视频下方区域可提交问题,圈子里有工作介绍)3年有效期(有更新可继续学习) 1.2约定系统CentOS 7.3...

weixin_34138255的博客 2475

软件设计师(中级)概要笔记:基于软件设计师教程(第5版)

软件设计师(中级)笔记:基于软件设计师教程(第5版)

星空的日常博客,希望日常能给你帮助 4005

Python 音频: sounddevice 使用 左声道/右声道/立体声 --- 播放,录音

# coding: utf8 """ Python 音频: 使用 sounddevice 操作声卡的 左声道, 右声道, 立体声 仅限 MME, Windows DirectSound, Windows WASAPI, Windows WDM-KS 等支持双声道的驱动类型 """ import os import sounddevice as sd import soundfile mapping_left_ch = 1 # 左声道为 1 mapping_right_ch

weixin_42019925的博客 4927

挂接file system

//尝试挂接file system   #include "Hookfilesystem.h" HANDLE        hFileHandle;OBJECT_ATTRIBUTES        ObjectAttrib;PDEVICE_OBJECT     

1184

从PWM到精准电流:双光耦与LM317构建的4-20mA隔离输出方案

本文详细介绍了基于双光耦与LM317的4-20mA隔离输出方案,适用于工业自动化中的PWM信号转换。该方案通过电气隔离和精准电流调节,显著提升抗干扰能力和信号传输精度,同时降低成本60%。文章还分享了电路设计、参数计算及调试经验,为工程师提供实用参考。

weixin_32006655的博客 284

JUOS AI电视系统:开发者如何备战AI原生应用开发

AI Agent与智能体应用正从云端走向终端,操作系统也随之进入AI原生时代。传统电视系统仅解决内容分发,而新一代AI操作系统以模型能力为核心组件,从交互层到服务层全面重构。开发者需要掌握模型接入、上下文管理、工具调用、状态记忆等关键技术,才能构建真正具备行动力的智能体应用。本文从大模型应用开发的基础原理出发,结合开源项目实战,演示角色智能体与场景化管理的落地方式,并探讨JUOS等AI电视系统带来的开发范式转变:从编写界面与接口,转向定义意图与场景。无论是智能家居、虚拟陪伴还是教育应用,理解这些通用技术栈将

weixin_34387468的博客 456

ChatGPT Plus完整开通指南:从账号注册到稳定使用全流程

自然语言处理(NLP)技术通过深度学习模型实现对人类语言的理解与生成,其核心原理是基于Transformer架构的大规模预训练。GPT-4作为当前最先进的生成式AI模型,在代码编写、文档分析等场景展现出显著的技术价值。在实际应用中,稳定的网络环境和合规的支付方式是确保AI助手持续服务的关键因素。针对ChatGPT Plus的开通,需要系统性地解决账号验证、虚拟信用卡支付等工程实践问题,才能实现工作流的高效整合。

weixin_34239592的博客 431

C# typeof() 和 GetType()区别

总得来说他们都是为了获取某个实例具体引用的数据类型System.Type。 1、GetType()方法继承自Object,所以C#中任何对象都具有GetType()方法,x.GetType(),其中x为变量名,由x实例返回得到一个类型 2、typeof(x)中的x,必须是具体的类名、类型名称等,不可以是变量名称,返回一个类型 3、System.Type.GetType(),有两个重载方法 比如有这样一个变量i: Int32 i = new Int32(); 使用GetType(),i...

Peter的博客 1956

C++26模块与UE5整合实战:编译优化与工程实践指南

C++模块是C++20及后续标准引入的核心特性,旨在替代传统的头文件包含机制。其原理是通过显式声明接口与实现分离,生成二进制模块接口文件,实现编译期隔离与依赖管理。这一机制的技术价值在于显著提升大型项目的编译效率,减少因头文件修改引发的级联编译,同时增强代码的封装性与接口清晰度。在游戏开发、高性能计算等对编译时长敏感的应用场景中,模块化构建能有效优化迭代流程。本文聚焦于将C++26模块整合到Unreal Engine 5这一复杂工程环境中,通过解析构建工具链配置、处理UHT反射系统兼容性等具体挑战,为面临编

weixin_30550081的博客 392

Flocking for Multi-Agent Dynamic Systems: Algorithms and Theory的理论简述和python仿真实现(附源码)

经典论文Flocking for Multi-Agent Dynamic Systems: Algorithms and Theory的学习与编程仿真,提供源码

m0_59701926的博客 1239

CAN总线从零搭建:硬件连接、软件配置与DBC解析实战指南

控制器局域网(CAN)是一种广泛应用于汽车电子和工业控制领域的串行通信协议,其核心原理是基于优先级仲裁的多主广播机制,通过差分信号在双绞线上传输数据。这项技术的核心价值在于以高可靠性和实时性替代复杂的点对点布线,大幅简化系统架构。在工程实践中,构建一个稳定的CAN通信测试环境是开发与调试的基础,这涉及硬件链路搭建、软件驱动配置以及网络数据分析等关键环节。其中,正确连接终端电阻和配置一致的波特率是保障物理层通信稳定的前提,而DBC文件的应用则是将原始报文数据转化为可理解工程信号的关键。本文聚焦于CAN总线测试

weixin_33884611的博客 502

国科大作业考试资料《人工智能原理与算法》2024新编-第二次作业整理

1、对于下列活动,分别给出任务环境的PEAS描述, 并按2.3.2节列出的性质进行分析: 3、为图2.2中描述的吸尘器世界实现一个可以进行性能度量的环境模拟器。你的实现是必须是模块化的,以使传感器、执行器和环境特征(大小、形状、灰尘放置等)便于修改。 4、实现上述题目真空吸尘器环境中的简单反射Agent。用所有可能的初始灰尘分布和Agent位置,运行环境模拟器和Agent。记录Agent在每种情况下的性能评分和总体平均评分。

MatsumotoChrikk 1187

全面指南:PyTorch与ROCm版本兼容性及多版本环境管理

本文详细介绍了在AMD GPU上配置PyTorch开发环境的完整流程,重点解决版本兼容性和多版本ROCm环境管理问题。主要内容包括:1) PyTorch与ROCm版本对应关系查询;2) 四种查看ROCm版本的方法;3) 使用update-alternatives管理多版本ROCm;4) 环境变量配置与冲突解决方案;5) 完整的验证流程和性能测试方法。文章提供了最佳实践建议和故障排除清单,帮助开发者快速搭建稳定高效的深度学习开发环境,充分发挥AMD GPU硬件性能。通过系统化的验证流程确保各组件协同工作,解决

数字人生 607

AI Agent保险落地实战:RAG与工具调用构建智能投保系统

大模型驱动的智能体(AI Agent)正从概念走向垂直行业,其背后依赖检索增强生成(RAG)、函数调用(Function Calling)与多智能体协作等核心工程能力。RAG通过先检索后生成,让模型基于私有知识库回答,有效缓解幻觉问题;Function Calling则打通业务系统,使Agent能查询保单、计算保费并执行真实动作。在保险这类知识密集、决策链路清晰的场景中,AI Agent可通过知识库检索、工具调用、合规审查及人工审核闭环,实现从售前咨询到理赔引导的完整链路。本文从技术选型、环境搭建到核心代码

weixin_29053383的博客 277

1篇2章1节:在 Mac 上安装 Python,从环境检查到工具配置的完整指南

Python 是当今最流行的高级编程语言之一,广泛应用于数据分析、人工智能、自动化脚本和 Web 开发。虽然 macOS 曾自带 Python,但从 macOS 12.3 开始,系统不再默认提供可直接使用的版本,因此需要手动安装。本文将详细讲解如何在 Mac 上安装最新版本的 Python,如何验证安装是否成功,以及如何配置 IDLE 和 Python Launcher 等工具,为日常开发和学习打下坚实基础。即便你是完全的新手,也能按步骤完成环境搭建。

MD Code 851

linux去掉日志中的skipping,删除非当前日志组的几点疑问解析

1、检查日志组情况SQL>selectGROUP#,THREAD#,SEQUENCE#,ARCHIVED,STATUSfromv$log;GROUP#THREAD#SEQUENCE#ARCSTATUS-------------------------------------------------1171YESINACTIVE2172YESINACTIVE3173...

weixin_36217058的博客 545

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

上一篇: API Spying Techniques for Windows 9x, NT and 2000
下一篇: Windows NT FileSystem Internals》学习笔记之Complete IRP
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值