鱼C论坛

 找回密码
 立即注册
查看: 1944|回复: 0

一个WDM驱动开发框架

[复制链接]
发表于 2015-3-31 16:11:23 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
下面是我起初学习WDM的时候的一个驱动开发框架。分享之。。。。。
#include "DriverWDM.h"

#pragma INITCODE 
extern "C" NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject,IN PUNICODE_STRING RegistryPath)
{
        NTSTATUS status;
        KdPrint(("enter DriverEntry\n"));

        pDriverObject->DriverExtension->AddDevice = HelloWDMAddDevice;
        pDriverObject->MajorFunction[IRP_MJ_PNP] = HelloWDMPnp;
        pDriverObject->MajorFunction[IRP_MJ_CREATE] = 
        pDriverObject->MajorFunction[IRP_MJ_READ] = 
        pDriverObject->MajorFunction[IRP_MJ_WRITE] = HelloDDKDispatchRoutine;
}

NTSTATUS HelloWDMAddDevice(IN PDRIVER_OBJECT pDriverObject,IN PDEVICE_OBJECT pPhysicalDeviceObject)
{
        PAGED_CODE();
        KdPrint(("Enter HelloWDMAddDevice\n"));
        UNICODE_STRING devName;                //设备名字
        NTSTATUS status        ;
        PDEVICE_OBJECT fdo;        //功能设备对象
        PDEVICE_EXTENSION pdx;        //设备扩展

        RtlInitUnicodeString(&devName,L"\\Device\\MyWDMDevice");
        status = IoCreateDevice(pDriverObject,sizeof(DEVICE_EXTENSION),&(UNICODE_STRING)devName,FILE_DEVICE_UNKNOWN,0,false,&fdo);
        //判断是否成功创建设备
        if(!NT_SUCCESS(status))
        {
                return status;
        }

        //得到设备扩展,然后填充它
        pdx = (PDEVICE_EXTENSION)fdo->DeviceExtension;
        pdx->fdo = fdo;

        UNICODE_STRING symLinkName;
        RtlInitUnicodeString(&symLinkName,L"\\DosDevices\\HelloWDM");
        status = IoCreateSymbolicLink(&symLinkName,&devName);

        //如果创建符号连接失败。则进行相应的删除操作
        if (!NT_SUCCESS(status))
        {
                //再一次创建符号连接
                IoDeleteSymbolicLink(&symLinkName);
                status = IoCreateSymbolicLink(&symLinkName,&devName);
                if(!NTSTATUS(status))
                {
                        return status;
                }
        }

        //在设备扩展中记录设备的符号名字和设备名字
        pdx->ustrSymLinkName = symLinkName;
        pdx->ustrDeviceName = devName;

        //设置设备标志
        fdo->Flags |= DO_BUFFERED_IO | DO_POWER_PAGABLE;
        fdo->Flags &= ~DO_DEVICE_INITIALIZING;

        KdPrint(("leave HelloWDMDevice\n"));
        return STATUS_SUCCESS;

}



想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 10:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表