windows驱动开发书籍(windows驱动开发前景)

windows驱动开发书籍(windows驱动开发前景)HelloWDM cpp include HelloWDM h 函数名称 DriverEntry 功能描述 初始化驱动程序 定位和申请硬件资源 创建内核对象 参数列表 pDriverObjec

大家好,我是讯享网,很高兴认识大家。

《Windows驱动开发技术详解》读书笔记(二)_#pragma
讯享网《Windows驱动开发技术详解》读书笔记(二)_ico_02HelloWDM.cpp
#include ”HelloWDM.h”

/
* 函数名称:DriverEntry
* 功能描述:初始化驱动程序,定位和申请硬件资源,创建内核对象
* 参数列表:
      pDriverObject:从I/O管理器中传进来的驱动对象
      pRegistryPath:驱动程序在注册表的中的路径
* 返回 值:返回初始化驱动状态
/
#pragma INITCODE 
extern ”C” NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject,
                                IN PUNICODE_STRING pRegistryPath)
{
    KdPrint((“Enter DriverEntry “));

    pDriverObject->DriverExtension->AddDevice = HelloWDMAddDevice;
    pDriverObject->MajorFunction[IRP_MJ_PNP] = HelloWDMPnp;
    pDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = 
    pDriverObject->MajorFunction[IRP_MJ_CREATE] = 
    pDriverObject->MajorFunction[IRP_MJ_READ] = 
    pDriverObject->MajorFunction[IRP_MJ_WRITE] = HelloWDMDispatchRoutine;
    pDriverObject->DriverUnload = HelloWDMUnload;

    KdPrint((“Leave DriverEntry “));
    return STATUS_SUCCESS;
}

/
*
* 函数名称:HelloWDMAddDevice
* 功能描述:添加新设备
* 参数列表:
      DriverObject:从I/O管理器中传进来的驱动对象
      PhysicalDeviceObject:从I/O管理器中传进来的物理设备对象
* 返回 值:返回添加新设备状态
/
#pragma PAGEDCODE
NTSTATUS HelloWDMAddDevice(IN PDRIVER_OBJECT DriverObject,
                           IN PDEVICE_OBJECT PhysicalDeviceObject)

    PAGED_CODE();
    KdPrint((“Enter HelloWDMAddDevice “));

    NTSTATUS status;
    PDEVICE_OBJECT fdo;
    UNICODE_STRING devName;
    RtlInitUnicodeString(&devName,L”\Device\MyWDMDevice”);
    status = IoCreateDevice(
        DriverObject,
        sizeof(DEVICE_EXTENSION),
        &(UNICODE_STRING)devName,
        FILE_DEVICE_UNKNOWN,
        0,
        FALSE,
        &fdo);
    if( !NT_SUCCESS(status))
        return status;
    PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION)fdo->DeviceExtension;
    pdx->fdo = fdo;
    pdx->NextStackDevice = IoAttachDeviceToDeviceStack(fdo, PhysicalDeviceObject);
    UNICODE_STRING symLinkName;
    RtlInitUnicodeString(&symLinkName,L”\DosDevices\HelloWDM”);

    pdx->ustrDeviceName = devName;
    pdx->ustrSymLinkName = symLinkName;
    status = IoCreateSymbolicLink(&(UNICODE_STRING)symLinkName,&(UNICODE_STRING)devName);

    if( !NT_SUCCESS(status))
    {
        IoDeleteSymbolicLink(&pdx->ustrSymLinkName);
        status = IoCreateSymbolicLink(&symLinkName,&devName);
        if( !NT_SUCCESS(status))
        {
            return status;
        }
    }

    fdo->Flags |= DO_BUFFERED_IO | DO_POWER_PAGABLE;
    fdo->Flags &= ~DO_DEVICE_INITIALIZING;

    KdPrint((“Leave HelloWDMAddDevice “));
    return STATUS_SUCCESS;
}

/
*
* 函数名称:DefaultPnpHandler
* 功能描述:对PNP IRP进行缺省处理
* 参数列表:
      pdx:设备对象的扩展
      Irp:从IO请求包
* 返回 值:返回状态

#pragma PAGEDCODE
NTSTATUS DefaultPnpHandler(PDEVICE_EXTENSION pdx, PIRP Irp)
{
    PAGED_CODE();
    KdPrint((“Enter DefaultPnpHandler “));
    IoSkipCurrentIrpStackLocation(Irp);
    KdPrint((“Leave DefaultPnpHandler “));
    return IoCallDriver(pdx->NextStackDevice, Irp);
}

/
*
* 函数名称:HandleRemoveDevice
* 功能描述:对IRP_MN_REMOVE_DEVICE IRP进行处理
* 参数列表:
      fdo:功能设备对象
      Irp:从IO请求包
* 返回 值:返回状态
/
#pragma PAGEDCODE
NTSTATUS HandleRemoveDevice(PDEVICE_EXTENSION pdx, PIRP Irp)
{
    PAGED_CODE();
    KdPrint((“Enter HandleRemoveDevice “));

    Irp->IoStatus.Status = STATUS_SUCCESS;
    NTSTATUS status = DefaultPnpHandler(pdx, Irp);
    IoDeleteSymbolicLink(&(UNICODE_STRING)pdx->ustrSymLinkName);

    //调用IoDetachDevice()把fdo从设备栈中脱开:
    if (pdx->NextStackDevice)
        IoDetachDevice(pdx->NextStackDevice);
    
    //删除fdo:
    IoDeleteDevice(pdx->fdo);
    KdPrint((“Leave HandleRemoveDevice “));
    return status;
}

/
*
* 函数名称:HelloWDMPnp
* 功能描述:对即插即用IRP进行处理
* 参数列表:
      fdo:功能设备对象
      Irp:从IO请求包
* 返回 值:返回状态
*/
#pragma PAGEDCODE
NTSTATUS HelloWDMPnp(IN PDEVICE_OBJECT fdo,
                        IN PIRP Irp)
{
    PAGED_CODE();

    KdPrint((“Enter HelloWDMPnp “));
    NTSTATUS status = STATUS_SUCCESS;
    PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) fdo->DeviceExtension;
    PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(Irp);
    static NTSTATUS (*fcntab[])(PDEVICE_EXTENSION pdx, PIRP Irp) = 
    {
        DefaultPnpHandler,        // IRP_MN_START_DEVICE
        DefaultPnpHandler,        // IRP_MN_QUERY_REMOVE_DEVICE
        HandleRemoveDevice,        // IRP_MN_REMOVE_DEVICE
        DefaultPnpHandler,        // IRP_MN_CANCEL_REMOVE_DEVICE
        DefaultPnpHandler,        // IRP_MN_STOP_DEVICE
        DefaultPnpHandler,        // IRP_MN_QUERY_STOP_DEVICE
        DefaultPnpHandler,        // IRP_MN_CANCEL_STOP_DEVICE
        DefaultPnpHandler,        // IRP_MN_QUERY_DEVICE_RELATIONS
        DefaultPnpHandler,        // IRP_MN_QUERY_INTERFACE
        DefaultPnpHandler,        // IRP_MN_QUERY_CAPABILITIES
        DefaultPnpHandler,        // IRP_MN_QUERY_RESOURCES
        DefaultPnpHandler,        // IRP_MN_QUERY_RESOURCE_REQUIREMENTS
        DefaultPnpHandler,        // IRP_MN_QUERY_DEVICE_TEXT
        DefaultPnpHandler,        // IRP_MN_FILTER_RESOURCE_REQUIREMENTS
        DefaultPnpHandler,        // 
        DefaultPnpHandler,        // IRP_MN_READ_CONFIG
        DefaultPnpHandler,        // IRP_MN_WRITE_CONFIG
        DefaultPnpHandler,        // IRP_MN_EJECT
        DefaultPnpHandler,        // IRP_MN_SET_LOCK
        DefaultPnpHandler,        // IRP_MN_QUERY_ID
        DefaultPnpHandler,        // IRP_MN_QUERY_PNP_DEVICE_STATE
        DefaultPnpHandler,        // IRP_MN_QUERY_BUS_INFORMATION
        DefaultPnpHandler,        // IRP_MN_DEVICE_USAGE_NOTIFICATION
        DefaultPnpHandler,        // IRP_MN_SURPRISE_REMOVAL
    };

    ULONG fcn = stack->MinorFunction;
    if (fcn >= arraysize(fcntab))
    {                        // 未知的子功能代码
        status = DefaultPnpHandler(pdx, Irp); // some function we don’t know about
        return status;
    }                        

#if DBG
    static char* fcnname[] = 
    {
        ”IRP_MN_START_DEVICE”,
        ”IRP_MN_QUERY_REMOVE_DEVICE”,
        ”IRP_MN_REMOVE_DEVICE”,
        ”IRP_MN_CANCEL_REMOVE_DEVICE”,
        ”IRP_MN_STOP_DEVICE”,
        ”IRP_MN_QUERY_STOP_DEVICE”,
        ”IRP_MN_CANCEL_STOP_DEVICE”,
        ”IRP_MN_QUERY_DEVICE_RELATIONS”,
        ”IRP_MN_QUERY_INTERFACE”,
        ”IRP_MN_QUERY_CAPABILITIES”,
        ”IRP_MN_QUERY_RESOURCES”,
        ”IRP_MN_QUERY_RESOURCE_REQUIREMENTS”,
        ”IRP_MN_QUERY_DEVICE_TEXT”,
        ”IRP_MN_FILTER_RESOURCE_REQUIREMENTS”,
        ”“,
        ”IRP_MN_READ_CONFIG”,
        ”IRP_MN_WRITE_CONFIG”,
        ”IRP_MN_EJECT”,
        ”IRP_MN_SET_LOCK”,
        ”IRP_MN_QUERY_ID”,
        ”IRP_MN_QUERY_PNP_DEVICE_STATE”,
        ”IRP_MN_QUERY_BUS_INFORMATION”,
        ”IRP_MN_DEVICE_USAGE_NOTIFICATION”,
        ”IRP_MN_SURPRISE_REMOVAL”,
    };

    KdPrint((“PNP Request (%s) “, fcnname[fcn]));
#endif // DBG

    status = (*fcntab[fcn])(pdx, Irp);
    KdPrint((“Leave HelloWDMPnp “));
    return status;
}

/

* 函数名称:HelloWDMDispatchRoutine
* 功能描述:对缺省IRP进行处理
* 参数列表:
      fdo:功能设备对象
      Irp:从IO请求包
* 返回 值:返回状态
/
#pragma PAGEDCODE
NTSTATUS HelloWDMDispatchRoutine(IN PDEVICE_OBJECT fdo,
                                 IN PIRP Irp)
{
    PAGED_CODE();
    KdPrint((“Enter HelloWDMDispatchRoutine “));
    Irp->IoStatus.Status = STATUS_SUCCESS;
    Irp->IoStatus.Information = 0;    // no bytes xfered
    IoCompleteRequest( Irp, IO_NO_INCREMENT );
    KdPrint((“Leave HelloWDMDispatchRoutine “));
    return STATUS_SUCCESS;
}

/
*
* 函数名称:HelloWDMUnload
* 功能描述:负责驱动程序的卸载操作
* 参数列表:
      DriverObject:驱动对象
* 返回 值:返回状态
*/
#pragma PAGEDCODE
void HelloWDMUnload(IN PDRIVER_OBJECT DriverObject)
{
    PAGED_CODE();
    KdPrint((“Enter HelloWDMUnload “));
    KdPrint((“Leave HelloWDMUnload “));
}

小讯
上一篇 2025-05-30 22:09
下一篇 2025-04-15 07:56

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/202147.html