确定IRP来自当前进程上下文

本文探讨了在Windows内核编程中,如何使用PsGetCurrentThread()函数获取当前线程信息,并通过Irp结构体中的Tail.Overlay.Thread字段进行进程间句柄复制。详细解析了A进程打开设备并返回句柄,以及B进程如何复制该句柄的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

PsGetCurrentThread() == Irp->Tail.Overlay.Thread

A进程打开设备,返回一个句柄。B进程会duplicate这个句柄

转载于:https://www.cnblogs.com/fanzi2009/archive/2011/12/14/2287815.html

/* File: Kmd.h Author: WzrterFX (Modified by Assistant) Description: 内核驱动头文件,修复类型定义与IOCTL生成问题 */ #pragma once #ifndef KMD_H #define KMD_H #include <ntifs.h> #include <cstdint> // 预定义设备类型宏 #define KMD_DEVICE_TYPE 0x8000 // 修正点:使用预处理器宏定义设备类型 namespace Kmd { // 内核API声明 namespace _NtifsApi { extern “C” { NTSTATUS IoCreateDriver(PUNICODE_STRING, PDRIVER_INITIALIZE); NTSTATUS PsLookupProcessByProcessId(HANDLE, PEPROCESS*); NTSTATUS MmCopyVirtualMemory(PEPROCESS, PVOID, PEPROCESS, PVOID, SIZE_T, KPROCESSOR_MODE, PSIZE_T); } } // IOCTL控制码定义 namespace _IoCtls { // 使用预处理器宏生成IOCTL码 constexpr ULONG attach = CTL_CODE(KMD_DEVICE_TYPE, 0x800, METHOD_BUFFERED, FILE_ANY_ACCESS); // 修正点 constexpr ULONG read = CTL_CODE(KMD_DEVICE_TYPE, 0x801, METHOD_BUFFERED, FILE_ANY_ACCESS); constexpr ULONG write = CTL_CODE(KMD_DEVICE_TYPE, 0x802, METHOD_BUFFERED, FILE_ANY_ACCESS); } // 设备扩展结构体(存储进程上下文) typedef struct _DEVICE_EXTENSION { PEPROCESS AttachedProcess; HANDLE ProcessId; } DEVICE_EXTENSION, * PDEVICE_EXTENSION; // 驱动请求数据结构 typedef struct _KMD_REQUEST { HANDLE ProcessId; PVOID FromAddress; PVOID ToAddress; SIZE_T Size; } KMD_REQUEST, * PKMD_REQUEST; // 驱动类声明 class KmdDriver { private: PDEVICE_OBJECT DeviceObject; UNICODE_STRING SymbolicLinkName; public: NTSTATUS Create(PDRIVER_OBJECT); static void DriverUnload(PDRIVER_OBJECT); static NTSTATUS DeviceControl(PDEVICE_OBJECT, PIRP); }; } #endif // !KMD_H帮我用易语言写一个这个驱动的加载,卸载,读/写整数型,读/写文本型,读/写小数型,读/写字节型,
最新发布
03-22
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值