zoukankan      html  css  js  c++  java
  • 基本NT式驱动代码结构

    #include <ntddk.h>

    void DriverUnload(IN PDRIVER_OBJECT DriverObject);
    NTSTATUS MyCreateClose(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
    NTSTATUS MyDefaultHandler(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);

    NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegPath)
    {
    UNICODE_STRING ustrDevName, ustrLinkName;
    PDEVICE_OBJECT pDeviceObj = NULL;
    NTSTATUS status;
    unsigned int i;

    KdPrint(("DriverEntry ... "));

    RtlInitUnicodeString(&ustrDevName, L"\Device\demo0");
    RtlInitUnicodeString(&ustrLinkName, L"\DosDevices\demo0");

    for (i=0; i<IRP_MJ_MAXIMUM_FUNCTION; i++)
    {
    DriverObject->MajorFunction[i] = MyDefaultHandler;
    }

    DriverObject->MajorFunction[IRP_MJ_CREATE] = MyCreateClose;
    DriverObject->MajorFunction[IRP_MJ_CLOSE] = MyCreateClose;

    DriverObject->DriverUnload = DriverUnload;

    status = IoCreateDevice(DriverObject,
    0,
    &ustrDevName,
    FILE_DEVICE_UNKNOWN,
    0,
    FALSE,
    &pDeviceObj);

    if (!NT_SUCCESS(status))
    {
    KdPrint(("IoCreateDevice failed ... "));
    return status;
    }

    if (!pDeviceObj)
    {
    KdPrint(("pDeviceObj == NULL "));
    return STATUS_UNEXPECTED_IO_ERROR;
    }

    pDeviceObj->Flags |= DO_DIRECT_IO;

    status = IoCreateSymbolicLink(&ustrLinkName, &ustrDevName);

    pDeviceObj->Flags &= ~DO_DEVICE_INITIALIZING;

    return STATUS_SUCCESS;
    }

    VOID DriverUnload(IN PDRIVER_OBJECT DriverObject)
    {
    UNICODE_STRING ustrLinkName;

    KdPrint(("DriverUnload ... "));

    RtlInitUnicodeString(&ustrLinkName, L"\DosDevices\demo0");

    IoDeleteSymbolicLink(&ustrLinkName);
    IoDeleteDevice(DriverObject->DeviceObject);
    }

    NTSTATUS MyCreateClose(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
    {
    Irp->IoStatus.Status = STATUS_SUCCESS;
    Irp->IoStatus.Information = 0;
    IoCompleteRequest(Irp, IO_NO_INCREMENT);
    return STATUS_SUCCESS;
    }

    NTSTATUS MyDefaultHandler(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
    {
    Irp->IoStatus.Status = STATUS_NOT_SUPPORTED;
    Irp->IoStatus.Information = 0;
    IoCompleteRequest(Irp, IO_NO_INCREMENT);
    return Irp->IoStatus.Status;
    }

  • 相关阅读:
    CodeForces
    Vs2012在Linux开发中的应用(6):改写Makefile项目的Build过程
    Mac 上VitrualBox安装CentOS6.5 调整root分区的大小
    iOS面试常见题
    C语言入门(2)——安装VS2013开发环境并编写第一个C语言程序
    大数据
    HDU 5188 背包
    Android 上的 制表符(tab) —— 一个奇妙的字符 (cocos2dx crash)
    mysql读写分离(主从复制)实现
    高仿webqq做的一个webos桌面效果和web聊天工具,桌面效果完好,功能强大
  • 原文地址:https://www.cnblogs.com/debug-me/p/6159894.html
Copyright © 2011-2022 走看看