驱动之路_基本的创建设备

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);//创建设备
}

 

posted @ 2013-09-14 12:18  宝贝,我永远都在  阅读(134)  评论(0)    收藏  举报