zoukankan      html  css  js  c++  java
  • WDM驱动加载方式理解

    当PC得知有新设备插入时,总线驱动会创建相应的物理驱动PDO,然后提示有新设备插入,这时候调用相应Driver的AddDevice方法创建功能驱动FDO

    下面是一个典型的AddDevice方法

    #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;
    }

    细心的人也许会觉得这个方法的第二个参数PhysicalDeviceObject,即PDO,来的有些莫名其妙,没有交代类型等

    这个对象在inf可以指定它的类型,比如

    ServiceType=1

  • 相关阅读:
    添加一个用户到指定用户组: gpasswd –a 用户名 组名 usermod –G 组名 用户名
    MySQL创建用户和授权
    shell
    启动脚本
    TODO
    mysql表分区
    mysql导入千万级数据实操
    mysql快速保存插入大量数据一些方法总结(转)
    MySQL存储过程插入数据过慢处理方法(转)
    mysql备份删库建库导入库
  • 原文地址:https://www.cnblogs.com/zwt1234/p/4618112.html
Copyright © 2011-2022 走看看