第一个不支持即插即用的nt式helloworld驱动

左飞123 左飞123     2022-08-02     608

关键词:

1.安装好驱动包

2.编写源代码 Sources文件和makefile文件

##源代码

/********************************

*文件名称:Driver.h
*作者:左飞
*完成日期:2016-9-4
*********************************/

#pragma once //保证头文件只被编译一次

#ifdef __cplusplus
extern "C" //兼容C代码
{
#endif
#include <NTDDK.h>
#ifdef __cplusplus
}
#endif

#define PAGEDCODE code_seg("PAGE")
#define LOCKEDCODE code_seg()
#define INITCODE code_seg("INIT")

#define PAGEDDATA data_seg("PAGE")
#define LOCKEDDATA data_seg()
#define INITDATA data_seg("INIT")

#define arraysize(p) (sizeof(p)/sizeof((p)[0]))

typedef struct _DEVICE_EXTENSION {
PDEVICE_OBJECT pDevice;
UNICODE_STRING ustrDeviceName; //设备名称
UNICODE_STRING ustrSymLinkName; //符号链接名
} DEVICE_EXTENSION, *PDEVICE_EXTENSION;


//函数声明
NTSTATUS CreateDevice(IN PDRIVER_OBJECT pDriverObject);
VOID HelloDDKUnload(IN PDRIVER_OBJECT pDriverObject);
NTSTATUS HelloDDKDispatchRoutine(IN PDEVICE_OBJECT pDevObj,IN PIRP pIrp);

 

/*******************************
*文件名称:Driver.cpp
*作者:左飞
*完成日期:2016-9-5
********************************/


#include "Driver.h"


#pragma INITCODE //将driverEntry设在分页内存中,当驱动加载成功,此函数在内存中移除

extern "C" NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject,
IN PUNICODE_STRING pRegistryPath)
{
NTSTATUS status;
KdPrint(("Enter DriverEntry "));
//注册其他驱动调用函数入口
pDriverObject->DriverUnload = HelloDDKUnload;
pDriverObject->MajorFunction[IRP_MJ_CREATE] = HelloDDKDispatchRoutine;
pDriverObject->MajorFunction[IRP_MJ_CLOSE] = HelloDDKDispatchRoutine;
pDriverObject->MajorFunction[IRP_MJ_WRITE] = HelloDDKDispatchRoutine;
pDriverObject->MajorFunction[IRP_MJ_READ] = HelloDDKDispatchRoutine;

//创建驱动设备对象
status = CreateDevice(pDriverObject);

KdPrint(("DriverEntry end"));
return status;
}

#pragma INITCODE
NTSTATUS CreateDevice(IN PDRIVER_OBJECT pDriverObject)
{
NTSTATUS status;
PDEVICE_OBJECT pDevObj;
PDEVICE_EXTENSION pDevExt;

//创建设备名称
UNICODE_STRING devName;
RtlInitUnicodeString(&devName,L"\Device\MyDDKDevice");
//创建设备
status = IoCreateDevice(pDriverObject,sizeof(DEVICE_EXTENSION),&(UNICODE_STRING)devName,FILE_DEVICE_UNKNOWN,0,TRUE,&pDevObj); //FILE_DEVICE_UNKNOWN此设备只能被一个应用程序所使用
if(!NT_SUCCESS(status))
return status;

pDevObj->Flags |= DO_BUFFERED_IO;
pDevExt = (PDEVICE_EXTENSION)pDevObj->DeviceExtension;
pDevExt->pDevice = pDevObj;
pDevExt->ustrDeviceName = devName;

//创建符号链接
UNICODE_STRING symLinkName;
RtlInitUnicodeString(&symLinkName,L"\??\HelloDDK");
pDevExt->ustrSymLinkName = symLinkName;
status = IoCreateSymbolicLink(&symLinkName,&devName);
if(!NT_SUCCESS(status))
{
IoDeleteDevice(pDevObj);
return status;
}
return STATUS_SUCCESS;
}

#pragma PAGEDCODE
VOID HelloDDKUnload(IN PDRIVER_OBJECT pDriverObject)
{
PDEVICE_OBJECT pNextObj;
KdPrint(("Enter DriverUnload "));
pNextObj = pDriverObject->DeviceObject;
while(pNextObj != NULL)
{
PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)pNextObj->DeviceExtension;
//删除符号链接
UNICODE_STRING pLinkName = pDevExt->ustrSymLinkName;
IoDeleteSymbolicLink(&pLinkName);
pNextObj = pNextObj->NextDevice;
IoDeleteDevice(pDevExt->pDevice);
}
}

#pragma PAGEDCODE
NTSTATUS HelloDDKDispatchRoutine(IN PDEVICE_OBJECT pDevObj,IN PIRP pIrp)
{
KdPrint(("Enter HelloDDKDispatchRoutine "));
NTSTATUS status = STATUS_SUCCESS;
//完成IRP
pIrp->IoStatus.Status = status;
pIrp->IoStatus.Information = 0;
IoCompleteRequest(pIrp,IO_NO_INCREMENT);
KdPrint(("Leave HelloDDKDispatchRoutine "));
return status;
}

##sources文件

TARGETNAME=HelloDDK
TARGETTYPE=DRIVER
TARGETPATH=OBJ

INCLUDES=$(BASEDIR)inc;
&(BASEDIR)incddk;

SOURCES=Driver.cpp

 

##makefile文件

#
# DO NOT EDIT THIS FILE!!! Edit .sources. if you want to add a new source
# file to this component. This file merely indirects to the real make file
# that is shared by all the driver components of the Windows NT DDK
#

!INCLUDE $(NTMAKEENV)makefile.def

 

3.进入驱动编译环境

4.进入源码目录输入build命令

5.生成驱动程序

如何让即插即用的 WPF 应用程序创建 SQL 数据库? [关闭]

...:15【问题描述】:我目前正在学习WPF,目的是为朋友制作一个简单的应用程序。此应用程序将使用数据库,并且运行它的PC不会连接到互联网。我知道如何使用服务器管理工​​作室创建一个简单的数据库,以及如何在我的代码... 查看详情

如何为高度解耦、即插即用的复杂组件构建 Redux?

】如何为高度解耦、即插即用的复杂组件构建Redux?【英文标题】:HowtostructureReduxforahighlyde-coupled,plug-n-playcomplexcomponent?【发布时间】:2018-04-1012:49:16【问题描述】:我对Redux很陌生,想在我的应用程序中使用它,但我在Redux部分... 查看详情

打包基于 JavaScript 的即插即用应用程序

...布时间】:2017-04-1223:09:36【问题描述】:我正在尝试构建一个即插即用的基于Web的应用程序,我应该能够与多个其他Web应用程序(使用AngalurJS\\ExtJS\\ReactJS等开发)集成。单击按钮,我应该能够启动slidingmenu。在这个菜单上,我想... 查看详情

w驱开技详.过滤驱动测试

...有即插即用。 而个人理解:NT驱动和WDM驱动没有鸿沟,一个NT驱动在它添加了AddDevice(...)+绑定了底层驱动+处理了IRP_MJ_PNP 之后,它也就变成了一个WDM驱动了2、3、4、5、  查看详情

type-c领夹式麦克风方案,即插即用,外围简单兼容性优秀

TYPE-C领夹式麦克风方案,即插即用,外围简单兼容性优秀的芯片-LDR6028结构示意图单接手机(由手机往外输出电压给板子工作)1、概述LDR6028SOP8是乐得瑞科技针对USBType-C标准中的Bridge设备而开发的USB-CDRP接口USBPD通... 查看详情

即插即用开源在线客服系统——ppmessage

PPMessage是一个开源的在线客服平台。PPMessage能够帮助你在第一时间与你的客户建立联系,开发人员可以非常容易的将PPMessage集成到你的网站或者iOS、Android的应用中。PPMessage的前端后端都是开源的,后端全部基于Python,简洁高效... 查看详情

linuxtogo:制作随身携带、即插即用的linux系统

...把/mnt内容全部复制到/media/backupcp-a/mnt/*/media/backup/GRUB提供一个安装程序grub-install用以安装GRUB到磁盘,下面是grub-install的一些常用参数及 查看详情

深度学习中的即插即用模块pdf下载

《卷积神经网络中的即插即用模块》是首发于GiantPandaCV公众号的电子书教程,欢迎关注其微信公众号:链接:https://pan.baidu.com/s/1Tzrcs-6XmObawb19Q68iOw提取码:os3g部分目录:  查看详情

如何在没有 Windows 窗体的情况下接收即插即用设备通知

...布时间】:2011-01-0421:26:00【问题描述】:我正在尝试编写一个可以捕获Windows消息的类库,以便在设备已连接或移除时通知我。通常,在Windows窗体应用程序中,我只会覆盖WndProc方法,但在这种情况下没有WndP 查看详情

将即插即用设备映射到 PCI 插槽 ID,C#

...要为每个持续存在且在重新启动之间保持一致的事物获取一个UID。请注意,Things没有我可以访问的内置UID。我解决这个 查看详情

cbam——即插即用的注意力模块(附代码)(代码片段)

论文:CBAM:ConvolutionalBlockAttentionModule代码: code目录前言1.什么是CBAM?(1)Channelattentionmodule(CAM)(2)Spatialattentionmodule(SAM)(3)CAM和SAM组合形式2.消融实验(1)Channela... 查看详情

智能家居通用管理平台-即插即用机制的设计

...DD来与冰箱交互了,并且是使用TCPIP协议通信。但还有一个环节没有解决,TCP通信需要知道通信端口。每个SHM都是使用不同的端口与设备通信, 查看详情

macos读写ntfs即插即用.

1.安装osxfusehttps://osxfuse.github.io/2.安装brewhttps://brew.sh/index_zh-cn.html3.安装ntfs-3gbrewinstallntfs-3g4.替换本地的mount_ntfs文件sudomv/sbin/mount_ntfs/sbin/mount_ntfs.oldsudoln-s/usr/local/sbin/mount_ntf 查看详情

常用的即插即用的注意力机制模块(secbam)(代码片段)

...      (2)excitation:给每个特征通道生成一个权重值,论文中通过两个全连接层构建通道间的相关性,输出的权重值数目和输入特征图的通 查看详情

总结(代码片段)

...。   2) Spring用JakartaCommonsFileUpload技术实现了一个 MultipartResolver 实现类:CommonsMultipartResolver  & 查看详情

即插即用安全验证模块-使用pam模块(代码片段)

可插入式验证模块(PAM)。可插入式验证木块。应用程序调用libpam函数来验证和授权用户。libpam基于应用程序的PAM配置文件做检测。可以通过libc在NSS中检查。共享的,动态可配置代码。文档:/usr/share/doc/pam-<version>/#man-kpam_... 查看详情

yolov8-gradcam热力图可视化即插即用不需要对源码做任何修改!(代码片段)

...给大家带来yolov8-gradcam热力图可视化,这个可视化是即插即用,不需要对源码做任何修改喔!给您剩下的不少麻烦!代码链接:yolo-gradcam里面还有yolov5和v7的热力图可视化代码,也是即插即用,不需要对... 查看详情

kalilinux没有无线网卡?玩个锤纸~

一.USB无限网卡使用Kalilinux,先准备好一个适合Kali系统的USB外置无限网卡,注意内置网卡并不适合渗透测试。Linux系统的指令相对于一般人来说比较晦涩难懂,最好选择免驱动类型,省去各种配置的繁琐步骤。二.常用芯片类型用... 查看详情