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

  • 相关阅读:
    HTML框架
    HTML链接
    kzalloc 函数详解(转载)
    LCD接口(转载)
    S3C2440上RTC时钟驱动开发实例讲解(转载)
    PHP 真值与空值
    http chunked 理解
    c# 基础
    美式音标注意事项
    groovy 闭包
  • 原文地址:https://www.cnblogs.com/zwt1234/p/4618112.html
Copyright © 2011-2022 走看看