基本NT式驱动代码结构

#include <ntddk.h>

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

NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegPath)
{
UNICODE_STRING ustrDevName, ustrLinkName;
PDEVICE_OBJECT pDeviceObj = NULL;
NTSTATUS status;
unsigned int i;

KdPrint(("DriverEntry ...\n"));

RtlInitUnicodeString(&ustrDevName, L"\\Device\\demo0");
RtlInitUnicodeString(&ustrLinkName, L"\\DosDevices\\demo0");

for (i=0; i<IRP_MJ_MAXIMUM_FUNCTION; i++)
{
DriverObject->MajorFunction[i] = MyDefaultHandler;
}

DriverObject->MajorFunction[IRP_MJ_CREATE] = MyCreateClose;
DriverObject->MajorFunction[IRP_MJ_CLOSE] = MyCreateClose;

DriverObject->DriverUnload = DriverUnload;

status = IoCreateDevice(DriverObject,
0,
&ustrDevName,
FILE_DEVICE_UNKNOWN,
0,
FALSE,
&pDeviceObj);

if (!NT_SUCCESS(status))
{
KdPrint(("IoCreateDevice failed ...\n"));
return status;
}

if (!pDeviceObj)
{
KdPrint(("pDeviceObj == NULL\n"));
return STATUS_UNEXPECTED_IO_ERROR;
}

pDeviceObj->Flags |= DO_DIRECT_IO;

status = IoCreateSymbolicLink(&ustrLinkName, &ustrDevName);

pDeviceObj->Flags &= ~DO_DEVICE_INITIALIZING;

return STATUS_SUCCESS;
}

VOID DriverUnload(IN PDRIVER_OBJECT DriverObject)
{
UNICODE_STRING ustrLinkName;

KdPrint(("DriverUnload ...\n"));

RtlInitUnicodeString(&ustrLinkName, L"\\DosDevices\\demo0");

IoDeleteSymbolicLink(&ustrLinkName);
IoDeleteDevice(DriverObject->DeviceObject);
}

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

NTSTATUS MyDefaultHandler(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
{
Irp->IoStatus.Status = STATUS_NOT_SUPPORTED;
Irp->IoStatus.Information = 0;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return Irp->IoStatus.Status;
}

时间: 2024-10-26 07:36:01

基本NT式驱动代码结构的相关文章

《Windows驱动开发技术详解》之编程加载NT式驱动

之前我们加载驱动都是利用INSTDRV这个应用,其原理是在注册表中写入相应的字段,这一节我们手动编写代码去加载驱动,其原理类似: 设备驱动程序的动态加载主要由服务控制管理程序(Service Control Manager,SCM)系统组件完成.加载和卸载NT驱动分为四个步骤: 为NT驱动创建新的服务: 开启此服务: 关闭此服务: 删除NT驱动所创建的服务. LoadNTDriver装载驱动代码主要流程如下: 代码如下: 1 BOOL LoadNTDriver(char*lpszDriverNa

YJX_Driver_022_NT式驱动的安装

1. NT式驱动的安装 A.OpenSCManager B.CreateService C.OpenService D.StartService E.CloseServiceHandle F.集成到loadNTDriver函数 [320]#include <winsvc.h> [435]MSDN中的 OpenSCManager SC_HANDLE OpenSCManager( LPCTSTR lpMachineName, // 指向计算机名称,此处为NULL表示指向本机 LPCTSTR lpD

驱动代码内部相关关键字等

1.     LPVOID -指针 一个没有类型的指针,也就是说你可以将任意类型的指针赋值给LPVOID类型的变量(一般作为参数传递),然后在使用的时候再转换回来.可以将其理解为long型的指针,指向void型,没有函数返回值. 2.     PDWORD -短指针(LPDWORD也基本一样.) windef.h中定义的数据类型,原文如下: typedef DWORD near *PDWORD; 表示指向DWORD的短指针类型,是WINDOWS编程中常用的数据类型之一. 3.BOOL和bool

platform总线驱动代码分析

/************************************************************************/ Linux内核版本:2.6.35.7 运行平台:三星s5pv210 /************************************************************************/ 1.本例中通过使用Linux驱动模型中的platform总线和led驱动框架编写出来的led驱动代码来分析platform总线的工作

CSS基础(1) - 设计代码结构

本章内容: 设计代码结构 有意义的文档的重要性 命名约定 什么时候使用ID和类名 微格式 HTML CSS的不同版本 文档类型 DOCTYPE切换和浏览器模式 1.类名区分大小写 2.类名的过度依赖 3.DIV和SPAN DIV是有语义的代表division.他可以将文档分为几个有意义的区域. SPAN 可以将行内元素分组 4.微格式 概念:源自网络 微格式按照某种已有的被广泛应用的标准,通过对内容块的语义标记,可以让外部应用程序.聚合程序和搜索引擎能够做以 下事情: 在爬取Web内容时,能够更

Python外壳:代码结构

使用zip()并行迭代 days = ['Monday', 'Tuesday', 'Wednesday']>>> fruits = ['banana', 'orange', 'peach']>>> drinks = ['coffee', 'tea', 'beer']>>> desserts = ['tiramisu', 'ice cream', 'pie', 'pudding']>>> for day, fruit, drink, d

zepto源码分析-代码结构【转载】

本来想学习一下jQuery的源码,但由于jQuery的源码有10000多行,设计相当复杂,所以决定从zepto开始,分析一个成熟的框架的代码结构及执行步骤. 网上也有很多zepto的源码分析,有的给源码添加注释,有的谈与jQuery的不同,但是都没有系统的讲解zepto框架的代码结构及初始化Zepto对象的过程. 准备 默认你已经对面向对象有一定的了解,本文是边实践边写的,虽有些乱,但好处是为大家提供了分析的思路. 英文文档. 中文文档 注意在文中$变量表示一个函数对象,而$()表示执行函数,他

Linux时间子系统(十七) ARM generic timer驱动代码分析

一.前言 关注ARM平台上timer driver(clocksource chip driver和clockevent chip driver)的驱动工程师应该会注意到timer硬件的演化过程.在单核时代,各个SOC vendor厂商购买ARM core的IP,然后自己设计SOC上的peripherals,这里面就包括了timer的硬件.由于没有统一的标准,各个厂商的设计各不相同,这给驱动工程师带来了工作量.然而,如果仅仅是工作量的话就还好,实际上,不仅仅如此.linux的时间子系统要求硬件t

C++第三十八篇 -- 研究一下Windows驱动开发(二)--WDM式驱动的加载

基于Windows驱动开发技术详解这本书 一.简单的INF文件剖析 INF文件是一个文本文件,由若干个节(Section)组成.每个节的名称用一个方括号指示,紧接着方括号后面的就是节内容.每一行就是一项内容,其形式都是类似SomeEntry=SomwValue.每个项的顺序是可以颠倒的,但系统分析INF文件的时候,是顺序解析的.INF中注释语句是用分号开头的. 二.WDM设备安装在注册表中的变化 WDM式驱动程序的安装会在三个方面修改注册表,分别是硬件子键(Hardware).类子键(Class