include <ntddk.h>
//定义数据内存空间段
#define PAGECODE code_seg("PAGE")//可以用于虚拟内存
#define INITCODE code_seg("INIT")//代码运行在这块内存上,运行一次就释放
#pragma PAGECODE
VOID DriverUnLoad(PDriverObject pDriverObject)
{
DbgPrint("卸载成功");
}
#pragma INITCODE
NTSTATUS CreateDevice(IN PDRIVER_OBJECT pDriverObject)
{
/*
NTSTATUS IoCreateDevice
(
IN PDRIVER_OBJECT DriverObject,
IN ULONG DeviceExtensionSize,
IN PUNICODE_STRING DeviceNameOPTIONAL,
IN DEVICE_TYPE DeviceType,
IN ULONG DeviceCharacteristics,
IN BOOLEAN Exclusive,
OUT PDEVICE_OBJECT *DeviceObject
);
*/
NTSTATUS status;//状态
UNICODE_STRING DeviceName;//设备名字
UNICODE_STRING LinkName;//连接符号
PDEVICE_OBJECT PDeviceObject;//用来接受创建的设备
RtlInitUnicodeString(&deviceName,"\\Device\\dashixiong");//赋值
status = IoCreateDevice(pDriverObject,0,&deviceName,FILE_DEVICE_UNKNOWN,0,TRUE,&pDeviceObj,&pDeviceObject);
if(!NT_SUCCESS(status))
{
//如果创建失败
//如果失败
if (status==STATUS_INSUFFICIENT_RESOURCES)
{
KdPrint(("资源不足 STATUS_INSUFFICIENT_RESOURCES"));
}
if (status==STATUS_OBJECT_NAME_EXISTS )
{
KdPrint(("指定对象名存在"));
}
if (status==STATUS_OBJECT_NAME_COLLISION)
{
KdPrint(("//对象名有冲突"));
}
KdPrint(("设备创建失败...++++++++"));
return status;
}
DbgPrint("设备创建成功");
pDeviObject->Flags|=DO_BUFFRED_IO;//
//创建符号连接
RtlInitUnicodeSString(&LinkName,"\\??\\yjxLinkName2");//指定符号连接
stauts = IoCreateSymbolicLink(&LinkName,&DeviceName);
//判断符号是否创建成功
if(!NT__STATUS(stauts))
{
DbgPrint("创建失败");
IodDeleteDevice(pDeviceObjecct);//删除我们刚刚创建的设备
return status;
}
return STATUS_SUCCESS;//返回成功
}
#pragma INITCODE
NTSTATUS DriverEntry(PDriverObjecct pDriverObject, UNICODE_STRING regStr)
{
DbgPrint("加载成功");
//添加卸载函数
pDriverObject.DriverUnLoad=DriverUnLoad;
CreateDevice(pDriverObject);//创建设备
}