zoukankan      html  css  js  c++  java
  • win驱动开发笔记-NT式基本结构

    入口函数

    /************************************************************************
    * 函数名称:DriverEntry
    * 功能描述:初始化驱动程序,定位和申请硬件资源,创建内核对象
    * 参数列表:
          pDriverObject:从I/O管理器中传进来的驱动对象
          pRegistryPath:驱动程序在注册表的中的路径
    * 返回 值:返回初始化驱动状态
    *************************************************************************/
    #pragma INITCODE
    extern "C" NTSTATUS DriverEntry (
                IN PDRIVER_OBJECT pDriverObject,
                IN PUNICODE_STRING pRegistryPath    ) 
    {
        NTSTATUS status;
        KdPrint(("Enter DriverEntry
    "));
    
        //注册其他驱动调用函数入口
        pDriverObject->DriverUnload = HelloDDKUnload;
        pDriverObject->MajorFunction[IRP_MJ_CREATE] = HelloDDKDispatchRoutine;
        pDriverObject->MajorFunction[IRP_MJ_CLOSE] = HelloDDKDispatchRoutine;
        pDriverObject->MajorFunction[IRP_MJ_WRITE] = HelloDDKDispatchRoutine;
        pDriverObject->MajorFunction[IRP_MJ_READ] = HelloDDKDispatchRoutine;
        
        //创建驱动设备对象
        status = CreateDevice(pDriverObject);
       
        Dump(pDriverObject);
    
        KdPrint(("DriverEntry end
    "));
        return status;
    }

    分发函数

    /************************************************************************
    * 函数名称:HelloDDKDispatchRoutine
    * 功能描述:对读IRP进行处理
    * 参数列表:
          pDevObj:功能设备对象
          pIrp:从IO请求包
    * 返回 值:返回状态
    *************************************************************************/
    #pragma PAGEDCODE
    NTSTATUS HelloDDKDispatchRoutine(IN PDEVICE_OBJECT pDevObj,
                                     IN PIRP pIrp) 
    {
        KdPrint(("Enter HelloDDKDispatchRoutine
    "));
        NTSTATUS status = STATUS_SUCCESS;
        // 完成IRP
        pIrp->IoStatus.Status = status;
        pIrp->IoStatus.Information = 0;    // bytes xfered
        IoCompleteRequest( pIrp, IO_NO_INCREMENT );
        KdPrint(("Leave HelloDDKDispatchRoutine
    "));
        return status;
    }

    创建设备与符号链接

    /************************************************************************
    * 函数名称:CreateDevice
    * 功能描述:初始化设备对象
    * 参数列表:
          pDriverObject:从I/O管理器中传进来的驱动对象
    * 返回 值:返回初始化状态
    *************************************************************************/
    #pragma INITCODE
    NTSTATUS CreateDevice (
            IN PDRIVER_OBJECT    pDriverObject) 
    {
        NTSTATUS status;
        PDEVICE_OBJECT pDevObj;
        PDEVICE_EXTENSION pDevExt;
        
        //创建设备名称
        UNICODE_STRING devName;
        RtlInitUnicodeString(&devName,L"\Device\MyDDKDevice");
        
        //创建设备
        status = IoCreateDevice( pDriverObject,
                            sizeof(DEVICE_EXTENSION),
                            &(UNICODE_STRING)devName,
                            FILE_DEVICE_UNKNOWN,
                            0, TRUE,
                            &pDevObj );
        if (!NT_SUCCESS(status))
            return status;
    
        pDevObj->Flags |= DO_BUFFERED_IO;
        pDevExt = (PDEVICE_EXTENSION)pDevObj->DeviceExtension;
        pDevExt->pDevice = pDevObj;
        pDevExt->ustrDeviceName = devName;
        //创建符号链接
        UNICODE_STRING symLinkName;
        RtlInitUnicodeString(&symLinkName,L"\??\HelloDDK");
        pDevExt->ustrSymLinkName = symLinkName;
        status = IoCreateSymbolicLink( &symLinkName,&devName );
        if (!NT_SUCCESS(status)) 
        {
            IoDeleteDevice( pDevObj );
            return status;
        }
        
        return STATUS_SUCCESS;
    }
    
    #pragma INITCODE
    NTSTATUS CreateDevice2 (
            IN PDRIVER_OBJECT    pDriverObject) 
    {
        NTSTATUS status;
        PDEVICE_OBJECT pDevObj;
        PDEVICE_EXTENSION pDevExt;
        
        //创建设备名称
        UNICODE_STRING devName;
        RtlInitUnicodeString(&devName,L"\Device\MyDDKDevice2");
        
        //创建设备
        status = IoCreateDevice( pDriverObject,
                            sizeof(DEVICE_EXTENSION),
                            &(UNICODE_STRING)devName,
                            FILE_DEVICE_UNKNOWN,
                            0, TRUE,
                            &pDevObj );
        if (!NT_SUCCESS(status))
            return status;
    
        pDevObj->Flags |= DO_BUFFERED_IO;
        pDevExt = (PDEVICE_EXTENSION)pDevObj->DeviceExtension;
        pDevExt->pDevice = pDevObj;
        pDevExt->ustrDeviceName = devName;
        //创建符号链接
        UNICODE_STRING symLinkName;
        RtlInitUnicodeString(&symLinkName,L"\??\HelloDDK2");
        pDevExt->ustrSymLinkName = symLinkName;
        status = IoCreateSymbolicLink( &symLinkName,&devName );
        if (!NT_SUCCESS(status)) 
        {
            IoDeleteDevice( pDevObj );
            return status;
        }
        return STATUS_SUCCESS;
    }

    卸载函数

    /************************************************************************
    * 函数名称:HelloDDKUnload
    * 功能描述:负责驱动程序的卸载操作
    * 参数列表:
          pDriverObject:驱动对象
    * 返回 值:返回状态
    *************************************************************************/
    #pragma PAGEDCODE
    VOID HelloDDKUnload (IN PDRIVER_OBJECT pDriverObject) 
    {
        PDEVICE_OBJECT    pNextObj;
        KdPrint(("Enter DriverUnload
    "));
        pNextObj = pDriverObject->DeviceObject;
        while (pNextObj != NULL) 
        {
            PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)
                pNextObj->DeviceExtension;
    
            //删除符号链接
            UNICODE_STRING pLinkName = pDevExt->ustrSymLinkName;
            IoDeleteSymbolicLink(&pLinkName);
            pNextObj = pNextObj->NextDevice;
            IoDeleteDevice( pDevExt->pDevice );
        }
    }
  • 相关阅读:
    python convert csv to xlsx
    org.openqa.selenium.remote.SessionNotFoundException: The FirefoxDriver cannot be used after quit() was called.
    Selenium webdriver 操作日历控件
    SVN eclipse插件错误
    java.lang.UnsupportedClassVersionError: Unsupported major.minor version 52.0的错误
    如何获取web中某个元素的id
    Selenium 进行web自动化测试
    Navicat远程连接MySQL数据库
    Linux grep命令详解
    Linux awk命令详解
  • 原文地址:https://www.cnblogs.com/xuankuwa/p/3657982.html
Copyright © 2011-2022 走看看