#pragma once
#pragma warning (disable : 4100 4995 4002)
#include "IRP.h"
/*卸载函数*/
void Unload
(PDRIVER_OBJECT pDriverObject//驱动对象
)
{
//用来取得要删除设备对象
PDEVICE_OBJECT pDev;
pDev = pDriverObject->DeviceObject;
//删除设备
IoDeleteDevice(pDev);
//取符号链接名字
UNICODE_STRING symLinkName;
RtlInitUnicodeString(&symLinkName, L"\\??\\ZyLinkName");
//删除符号链接
IoDeleteSymbolicLink(&symLinkName);
DbgPrint(("驱动成功卸载\n"));
}
/*创建设备函数*/
NTSTATUS CreateMyDevice
(IN PDRIVER_OBJECT pDriverObject//驱动对象
)
{
/*创建设备*/
UNICODE_STRING devName;//设备名称
RtlInitUnicodeString(&devName, L"\\Device\\Zy_Device");//初始化 设备名称 字符串
NTSTATUS status; //创建状态
PDEVICE_OBJECT pDevObj; //设备对象
//开始创建设备对象
status = IoCreateDevice
(
pDriverObject,
200, //设备大小
&devName,
FILE_DEVICE_UNKNOWN,//设备类型
0, //设备特征信息
FALSE, //是否指定设备为独占
&pDevObj
);
//判断 创建设备对象 返回值
if (!NT_SUCCESS(status))
{
if (status == STATUS_INSUFFICIENT_RESOURCES)
{
DbgPrint(("资源不足\n"));
}
if (status == STATUS_OBJECT_NAME_EXISTS)
{
DbgPrint(("指定对象名存在\n"));
}
if (status == STATUS_OBJECT_NAME_COLLISION)
{
DbgPrint(("对象名有冲突\n"));
}
DbgPrint(("设备创建失败\n"));
return status;
}
/*设置读写方式 缓冲区读写*/
pDevObj->Flags |= DO_BUFFERED_IO;
/*直接读写*/
//pDevObj->Flags |= DO_DIRECT_IO;
/*创建符号链接*/
UNICODE_STRING symLinkName;//符号链接
RtlInitUnicodeString(&symLinkName, L"\\??\\ZyLinkName");//初始化符号链接
//开始创建符号链接
status = IoCreateSymbolicLink(&symLinkName, &devName);
//删除无效设备
if (!NT_SUCCESS(status))
{
DbgPrint(("符号链接创建失败\n"));
IoDeleteDevice(pDevObj);
return status;
}
//DbgPrint(("设备创建成功\n"));
return STATUS_SUCCESS;
}
NTSTATUS DriverEntry(
PDRIVER_OBJECT pDriverObject,//驱动对象
PUNICODE_STRING RegistryPath)
{
/*设置派遣函数*/
pDriverObject->MajorFunction[IRP_MJ_CREATE] = ddk_DispatchRoutine;
pDriverObject->MajorFunction[IRP_MJ_CLOSE] = ddk_DispatchRoutine;
pDriverObject->MajorFunction[IRP_MJ_READ] = ddk_DispatchRoutine;
pDriverObject->MajorFunction[IRP_MJ_WRITE] = ddk_DispatchRoutine;
pDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = ddk_DispatchRoutine;
/*设置卸载函数回调*/
pDriverObject->DriverUnload = Unload;
//创建相应的设备
CreateMyDevice(pDriverObject);
DbgPrint(("驱动成功加载\n"));
return STATUS_SUCCESS;
}
- 1
- 2
前往页