NTSTATUS IrpCreate(IN PUNICODE_STRING Name,IN ACCESS_MASK DesiredAccess,IN ULONG FileAttributes,IN ULONG ShareAccess,IN ULONG CreateDisposition,IN ULONG CreateOptions,IN PDEVICE_OBJECT DeviceObject,IN PDEVICE_OBJECT RealDevice,IN PFILE_OBJECT RelatedFileObject,OUT PHANDLE ReturnHandle,PVOID* ReturnObject) Yf!*OGF
{ (rP7Gf;m]
NTSTATUS Status; gm}c oS
KEVENT Event; NQzH8D&?
PIRP pIrp; B2U 39UW'
PFILE_OBJECT FileObject; "vQ )P+
IO_STATUS_BLOCK IoStatusBlock; z f9T1~mE9
PIO_STACK_LOCATION IOStack; VIZ N[!
IO_SECURITY_CONTEXT IoSecurityContext; 8Rujs]Zd
ACCESS_STATE AccessState; [H@lJI
AUX_DATA AuxData; g/7 h=w
PGENERIC_MAPPING pGenericMapping; /*}]i<K
OBJECT_ATTRIBUTES ObjectAttributs; I7|ij=
K?i/0t
KeInitializeEvent(&Event,SynchronizationEvent,FALSE); wWd=!XhS
pIrp = IoAllocateIrp(DeviceObject->StackSize,FALSE); PBgL[7,"
if(pIrp==NULL)return STATUS_INSUFFICIENT_RESOURCES; T;"jjUL(r
InitializeObjectAttributes(&ObjectAttributs,NULL,OBJ_CASE_INSENSITIVE,0,NULL); EEW+5#M+J
Status = ObCreateObject(KernelMode,*IoFileObjectType,&ObjectAttributs,KernelMode,NULL,sizeof(FILE_OBJECT),0,0,(PVOID*)&FileObject); t-,%N3
if(!NT_SUCCESS(Status)) 7c,=C@OE
{ - Uc! j0
IoFreeIrp(pIrp); d3 /qZ9cK
return Status; GWqz,%n
} FUc4bD
memset(FileObject,0,sizeof(FILE_OBJECT)); r|P{z/e
FileObject->Type=5; cK E?9}m|{
FileObject->Size=sizeof(FILE_OBJECT); $*o~]C):O
FileObject->Flags=FO_SYNCHRONOUS_IO; E:Gn]Gkci
FileObject->DeviceObject = RealDevice; x?3UNN,
FileObject->RelatedFileObject = RelatedFileObject; ^BOvF#6
KeInitializeEvent(&FileObject->Lock,SynchronizationEvent,FALSE); kS~#Pg; /
KeInitializeEvent(&FileObject->Event,SynchronizationEvent,FALSE); ULf68(Od
FileObject->FileName.Buffer = (PWSTR)ExAllocatePool(NonPagedPool,Name->MaximumLength); N]*?K%9K
RtlCopyUnicodeString(&FileObject->FileName,Name); ?v ;F
pIrp->UserEvent=&Event; (K!ux+
pIrp->UserIosb=&IoStatusBlock; "U.oqQ?(g
pIrp->Tail.Overlay.Thread = (PETHREAD)KeGetCurrentThread(); 93'_x#hxp
pIrp->Tail.Overlay.OriginalFileObject=FileObject; ,g saJ
pIrp->RequestorMode=KernelMode; TS|y& tq
pIrp->Flags=IRP_CREATE_OPERATION|IRP_SYNCHRONOUS_API; / [Ved
pIrp->PendingReturned=FALSE; (_4Kwwz'
pIrp->Cancel=FALSE; GA~kdt]1
pIrp->MdlAddress=NULL; WL6wOf}(
pIrp->CancelRoutine=NULL; 0U)tJc
pIrp->Tail.Overlay.AuxiliaryBuffer=NULL; }!a>BVK7
IOStack = IoGetNextIrpStackLocation(pIrp); Sh UzTd`L
IOStack->MajorFunction=IRP_MJ_CREATE; Y'oEd0>*{$
IOStack->DeviceObject=DeviceObject; /jBgHE?Q>
IOStack->FileObject=FileObject; n" EdFvOp
pGenericMapping = IoGetFileObjectGenericMapping(); 8Tm&pL'
SeCreateAccessState(&AccessState,&AuxData,DesiredAccess,pGenericMapping); KJCj q`
IoSecurityContext.AccessState = &AccessState; 4tVaX75DUe
IoSecurityContext.DesiredAccess = DesiredAccess; d>t>/f}
IoSecurityContext.SecurityQos=NULL; DU/+:
IoSecurityContext.FullCreateOptions=0; df/diYx"
IOStack->Parameters.Create.SecurityContext=&IoSecurityContext; 4S ,x
IOStack->Parameters.Create.Options=(CreateDisposition<<0x18)|CreateOptions; %8h&}8
IOStack->Parameters.Create.FileAttributes = (USHORT)FileAttributes; 8?6FI+rt.
IOStack->Parameters.Create.ShareAccess = (USHORT)ShareAccess; /)[fp? IFA
IOStack->Parameters.Create.EaLength=0; yLX"m{+b
IOStack->Context=NULL; E)! xq2~
IOStack->Control=SL_INVOKE_ON_CANCEL|SL_INVOKE_ON_SUCCESS|SL_INVOKE_ON_ERROR; T"$TPa
IOStack->CompletionRoutine = IoCompletionRoutine; s%r+@LQ
Status = IoCallDriver(DeviceObject,pIrp); 7Hw+5G
if(Status == STATUS_PENDING) Gz#DTqwB
KeWaitForSingleObject(&Event,Executive,KernelMode,FALSE,NULL); yN-B[%
Status=IoStatusBlock.Status; z87& %Nr
if(NT_SUCCESS(Status)) `dx5{3i
{ gTBG}C
MyReferenceObject(FileObject); 0Ikb 1L
} J^0QdZe_
return Status; G Ly*"
} 3-k7O &F1
w"drK
void MyReferenceObject(PFILE_OBJECT FileObject) w1y%3oqy
{ c_~cRm fV
InterlockedIncrement(&FileObject->DeviceObject->ReferenceCount); ^tA,k/lq
if(FileObject->Vpb) {[Sdk)6)
InterlockedIncrement((volatile LONG*)&FileObject->Vpb->ReferenceCount); `_ Gi5p}
}
相关推荐
文件透明加解密驱动内核原理与实现深度解析
文件透明加解密技术是数据安全领域的核心实践,它通过在操作系统内核层拦截文件I/O请求,实现对数据的实时加解密处理,对用户和应用程序完全透明。其原理基于文件系统过滤驱动,通过挂载到设备栈来捕获IRP请求包,结合策略引擎判断文件保护范围,并利用AES等对称加密算法保障数据机密性。这项技术的核心价值在于为企业数据防泄漏、终端安全防护提供了底层、可靠的解决方案,尤其适用于需要强制加密保护的敏感数据存储场景。本文以Windows平台为例,深入剖析了过滤驱动的架构设计、IRP_MJ_READ/WRITE的拦截处理流程、
自己构造 Create IRP
NTSTATUS IrpCreate(IN PUNICODE_STRING Name,IN ACCESS_MASK DesiredAccess,IN ULONG FileAttributes,IN ULONG ShareAccess,IN ULONG CreateDisposition,IN ULONG CreateOptions,IN PDEVICE_OBJECT DeviceObject,IN
虚拟串口软件底层原理:设备栈与功能驱动详解
深入探讨虚拟串口软件的底层实现机制,重点解析设备栈的构建过程与功能驱动的协同工作方式。通过模拟真实串口行为,虚拟串口软件在系统中注册虚拟设备,实现数据的收发与转发,为串口通信提供了灵活高效的解决方案。
I/O Request Packet
第5章 I/O Request Packet 5.1 数据结构 在处理 I/O 请求上,有两个重要的数据结构:IRP(I/O request packet)和 IO_STACK_LOCATION 5.1.1 IRP 的结构 下面是在 windbg 里得到的 IRP 结构: nt!_IRP +0x000 Type : Int2B +0x002 Size
如何理解反步法设计控制器?
假设以二阶系统为例,被控对象的系统状态方程为: 基于反步控制的具体方法如下: 1.1步骤一 定义期望状态为xd,状态误差e1,为: e1=x1-xd; 则e1的导数为: 1.2步骤二 定义虚拟控制量为: e2定义为: 1.3步骤三 定义Lyapunov能量函数为: 1.4步骤四 定义总Lyapunov能量函数为: 因此设计的控制律为: 设计c>0,则: 满足Lyapunov的稳定性判定条件...
《斯图尔特微积分》实战指南:从理论到解题技巧的跨越
本文深入解析《斯图尔特微积分》教材的独特价值与实用学习策略,重点介绍其理论深度与实际应用的完美平衡。通过概念理解、符号语言转换、解题思维框架等五个关键跨越,帮助读者高效掌握微积分核心技巧。文章还提供分层练习、可视化工具等教学实践方法,是提升微积分学习效率的实战指南。
驱动开发之五 --- TDI之六 【译文】
驱动开发之五 --- TDI之六 【译文】 同样的使用TDI_RECEIVE来完成数据接收。然而我们却没有用它来实现。实际上,如果你注意到,你可以创建回调来通知你数据或者其他事件什么时候到达。这就是我们所做的。我实现了一个API包装函数来创建任意的事件句柄。如下: NTSTATUS TdiFuncs_SetEventHandler(PFILE_OBJECT pfoTdi
期末求生指南:手把手教你用F12开发者工具绕过百一测评的切屏检测(JavaScript/jQuery实战)
本文详细介绍了如何利用F12开发者工具绕过百一测评的切屏检测,通过分析JavaScript/jQuery中的blur()和focus()事件监听机制,提供实战技巧动态修改代码。文章涵盖事件监听定位、代码修改方法及应对高级检测机制的策略,适合需要临时解决线上考试限制的学生参考。
使用IRP进行文件操作
一定要先感谢为技术的进步而付出辛勤汗水的人,感谢他们对技术的共享.一个通用IRP访问文件的十六进制编辑器(开源代码) -- 被诅咒的神(邪恶八进制信息安全团队)Windows平台内核级文件访问 -- baiyuanfan (baiyuanfan@163.com)特别感谢被诅咒的神,他写的里面包含了非常多
用AI免费制作30分钟电影:完整工作流与实操解析
AI视频生成技术正大幅降低影视创作门槛,但真正制作一部完整电影并非一键生成,而是涉及剧本、分镜、画面、配音、剪辑的复杂流水线。理解其基本原理,是将文本转化为连续视觉叙事的关键。对于创作者而言,掌握角色一致性控制、素材批量管理、免费额度合理分配等技术价值,能有效避免生成结果崩坏与资源浪费。该能力可广泛应用于短视频创作、独立电影预演、教学演示等场景。本文以30分钟AI电影制作为例,拆解从工具选择到成片输出的全流程,重点分析免费方案下的时间与积分成本,以及最容易翻车的环节,并给出基于实践验证的排查与优化策略。
汽车IVI中控开发入门及进阶(47):CarPlay开发
车载信息娱乐(IVI)系统已经从仅仅播放音乐的设备发展成为现代车辆的核心部件。除了播放音乐,IVI系统还为驾驶员提供导航、通信、空调、电源配置、油耗性能、剩余行驶里程、节能建议和许多其他功能。驾驶座逐渐变成了你家和工作场所之外的额外生活空间。2014年,苹果推出了Apple CarPlay,这是一款汽车界面,允许驾驶员使用iPhone应用程序和其他IVI功能,如苹果地图、Siri、苹果音乐、iMessage,并拨打电话。
Windows文件过滤驱动开发
http://hi.baidu.com/%B6%AC%D2%E2%BE%D3/blog/item/8e6aa0d1bd1043de562c8413.html 由于项目需要,这十天做了个Windows文件过滤驱动, 感觉windows下的驱动也不是那么的神秘, Mirosoft可以说是把API做到了极致(尽管有时真的是没必要), 他们喜欢把API包装了又包装, 不让你看清楚底层的东西.
Cesium 场景特效之【全球海洋】GL2兼容版
Cesium 场景特效之【全球海洋】GL2兼容版
IRP操作文件之再填坑
啧,大佬飘过……文字较多,可以直接看最后面的 最近在捣腾发送IRP_MJ_CREATE打开文件,同时要能解 reparse point。几顿操作猛如虎之后,终于可以正常解析 reparse point了,然后就像检验一下,这整个流程和IoCreateFile的区别大不大。就在打开的时候,加了个 FILE_DELETE_ON_CLOSE标记,看看FileObject销毁后文件是否...
基于FPGA的数字图像处理-直方图操作【3.3】
对于固定的位宽和图像分辨率来说,这个计算过程是 可定量的,也就是这个归一化系数是已知的。1.直方图累计和 根据数学定义,直方图累加和的定义是小于指定像素的所有像素 的统计值之和。在实际应用中,处理帧缓存是费时费力费资源的一件事情,在许 多情况下,图像的变换比较慢,在这种情况下的一个近似是当建立当 前帧的直方图统计结果时使用从前一帧得到的映射。由测试结果可见,这两幅过曝光和曝光不足的图像,经过均衡化 之后的效果图差别不大,对比度都非常高,设计代码达到了预期的均 衡目的。累加和的计算情况如图6-28所示。
C#串口通信上位机开发实战:轻松实现硬件控制与数据交互
摘要:本文介绍如何使用C#开发串口通信上位机应用,实现与硬件设备(如传感器、PLC等)的数据交互。文章涵盖串口通信原理、开发环境配置、功能实现(串口连接管理、数据收发、实时显示)及UI设计,重点讲解SerialPort类的应用、多线程数据接收处理和错误优化。通过Windows Forms构建直观界面,帮助开发者快速掌握工业控制和自动化系统中的串口通信技术,为物联网和智能设备开发提供实用解决方案。全文约150字。
基础IRP 和I/O Stack location 的关系
对于刚学驱动的人来说,或许对IRP和IO stack location的关系还有点不清楚。这里就说说他们之间的关系。具体IRP 和IO stack location相关知识,会在以后文章中说明。下面先放上IRP和IO stack location结构的定义。可惜的是IRP是半透明的。 typedef struct _IRP { . . PMDL MdlAddres
TMS_WebGMaps_1.9.8.0_Full_Source
TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder
Ring0层发送IRP消息打开文件不释放对象实现文件防删
背景 文件保护技术不论对于病毒木马还是杀软来说,都是至关重要的。要在内核层下实现文件防删除,通常是通过HOOK内核函数来实现,通过判断是否是删除保护文件,从而拒绝操作。本文将介绍一种不需要HOOK操作即可实现的文件保护方法,通过发送IRP信息打开文件并获取文件句柄,而不关闭文件句柄,使文件句柄一直保持打开状态。在文件句柄没有被关闭释放的情况,文件不能被删除,从而实现文件防删除。 实现过程 在前面章节就已经介绍过发送IRP管理操作文件,直接发送 IRP 对文件进行操作,可以避免一些HOOK的干扰。 在发送 I
大中型超市收银系统(可直接运行)
光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开
Probability and Statistics - 4th edition
Probability and Statistics - 4th edition
PassthruEX学习笔记之一(DevOpen和DevOpenAdapter)by ZHJ
PtRegisterDevice的时候指定: DispatchTable[IRP_MJ_CREATE] = DevOpen; 即,由devOpen函数处理major code 为IRP_MJ_CREATE 的 IRP请求; 用户态的CreateFile直接导致I/O Manager产生一个major code 为IRP_MJ_CREATE 的 IRP 送往passthru的驱动。因此,每次
ssm框架搭建
这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载
Window XP驱动开发(十六) 驱动程序调用驱动程序(通过设备指针)
转载请标明是引用于 http://blog.youkuaiyun.com/chenyujing1234 欢迎大家提出意见,一起讨论! 代码及EzDriverInstaller下载地址 : http://www.rayfile.com/zh-cn/files/9840cf8f-c41f-11e1-b25b-0015c55db73d/ (编译环境:VS2008+DDK库(参考:Window XP驱动开
《Windows驱动开发技术详解》之驱动程序调用驱动程序——通过设备指针调用其他驱动程序...
本节介绍“手动”构造各个IRP,然后将IRP传递到相应驱动程序的派遣函数里。 获得设备指针 每个内核中的句柄都会和一个内核对象的指针联系起来。ZwCreateFile内核函数可以通过设备名打开设备句柄,这个设备句柄和一个文件对象的指针关联。IoGetDeviceObjectPointer内核函数可以通过设备名获得文件对象指针,而不是获得设备句柄。当调用IoGetDeviceO...
文件过滤驱动
由于项目需要,这十天做了个Windows文件过滤驱动, 感觉windows下的驱动也不是那么的神秘, Mirosoft可以说是把API做到了极致(尽管有时真的是没必要), 他们喜欢把API包装了又包装, 不让你看清楚底层的东西. 不过另一方面, 调用这些API也是挺方便的(当然了,API多了,有些API会有些Bug也是在所难免的,比如ObQueryNameString). 由于是零基础开始做这
分析几个驱动
文件过滤驱动 一个典型的ifs filter,请参考ifs ddk的例子sfilter。这个例子已经足够了Filemon这是一个nt驱动, 源代码包括exe和sys两部分. exe里面的Instdrv.c负责安装驱动, Filemon.c负责UI显示和与驱动通信sys里面主要文件为Filemon.c, 分发函数为FilemonDispatch和FastIOHook, 前者负责与UI通信Fi...
ImDisk设备线程模型详解:每个虚拟磁盘背后的devthrd工作线程是怎么跑起来的
ImDisk 是一款 Windows 虚拟磁盘驱动,能把镜像文件、内存甚至远端存储变成真实的虚拟磁盘。它最精妙的设计之一,就是**每个虚拟磁盘都配有一个专属的工作线程**——由 [sys/devthrd.cpp] 实现的 `ImDiskDeviceThread` 函数。这个线程独立处理自己磁盘的全部读写请求,互不干扰。本文将完整拆解这套"一盘一线程"模型的运行机制:线程如何创建、请求如何排队、一次
WDM驱动程序设计之设计开发篇
(作者:苏金国 2000年11月09日 13:26)通过安装DDK和相应的开发软件,我们构造好了WDM驱动程序的开发环境。接着,我们就要深入进行设计与开发工作了。 ■WDM 驱动程序的运作流程 WDM本身的PNP管理器被抽象地提升到了ROOT的地位。PNP管理器负责所有的总线驱动程序的加载。总线驱动程序则负责遍历所有位于总线上的设备,并且为每个设备创建相应的设备对象。当PNP管理器发现一个
354



被折叠的 条评论
为什么被折叠?



