鑫郁飞

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 683|回复: 1

win7 64 驱动的 HelloWord 这个驱动X86 X64 win7 win 10通用

[复制链接]

管理员

Rank: 9Rank: 9Rank: 9

阅读权限
200
积分
11234
精华
8
主题
26
帖子
40
分享
0
日志
0
QQ
QQ
QQ
QQ
在线时间
7 小时
最后登录
2017-12-26
注册时间
2016-11-22
听众
0
收听
0
自我介绍
QQ150330575
发表于 2017-8-25 00:37:13 | 显示全部楼层 |阅读模式
//其实与x86驱动开发差不多哈,这个驱动X86 X64 win7 win 10通用
#include<ntddk.h>

typedef unsigned int DWORD;

//【1】定义符号链接,一般来说修改为驱动的名字即可
#define DEVICE_NAME L"\\Device\\yjx_x64_QQ150330575"
#define LINK_NAME   L"\\DosDevices\\yjx_x64_QQ150330575"
#define LINK_GLOBAL_NAME L"\\DosDevices\\Global\\yjx_x64_QQ150330575"
//【2】定义驱动功能号和名字,提供接口给应用程序调用
#define IOCTL_IO_TEST  CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800,METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_SAY_HELLO CTL_CODE(FILE_DEVICE_UNKNOWN, 0x801,METHOD_BUFFERED, FILE_ANY_ACCESS)


//【3】驱动卸载的处理例程
NTSTATUS DriverUnload(PDRIVER_OBJECT pDriverObj)
{
        UNICODE_STRING strLink;
        strLink;

        pDriverObj;
        if (pDriverObj->DeviceObject)
        {
        IoDeleteDevice(pDriverObj->DeviceObject);
        };
        DbgPrint("yjxriverUnload  驱动卸载\n");

        return STATUS_SUCCESS;
         
}

//【4】IRP_MJ_CREATE对应的处理例程,一般不用管它
NTSTATUS DispatchCreate(PDEVICE_OBJECT pDevObj, PIRP pIrp) //unreferenced formal parameter,,未使用的参数
{
        pDevObj = pDevObj;

        DbgPrint("[yjx]DispatchCreate-------驱动 IRP_MJ_CREATE对应的处理例程\n");
        pIrp->IoStatus.Status = STATUS_SUCCESS;
        pIrp->IoStatus.Information = 0;
        IoCompleteRequest(pIrp, IO_NO_INCREMENT);
        return STATUS_SUCCESS;
}
//【5】IRP_MJ_CLOSE对应的处理例程,一般不用管它
NTSTATUS DispatchClose(PDEVICE_OBJECT pDevObj, PIRP pIrp)
{
        UNREFERENCED_PARAMETER(pDevObj);
        DbgPrint("[yjx:]DispatchClose  驱动IRP_MJ_CLOSE对应的处理例程, \n");
        pIrp->IoStatus.Status = STATUS_SUCCESS;
        pIrp->IoStatus.Information = 0;
        IoCompleteRequest(pIrp, IO_NO_INCREMENT);
        return STATUS_SUCCESS;
}


//【6】IRP_MJ_DEVICE_CONTROL对应的处理例程,驱动最重要的函数之一,一般走正常途径调
//用驱动功能的程序,都会经过这个函数
NTSTATUS DispatchIoctl(PDEVICE_OBJECT pDevObj, PIRP pIrp)
{
        NTSTATUS status = STATUS_INVALID_DEVICE_REQUEST;
        PIO_STACK_LOCATION pIrpStack;
        ULONG uIoControlCode;
        PVOID pIoBuffer;
        ULONG uInSize;
        ULONG uOutSize;
        UNREFERENCED_PARAMETER(pDevObj);
        DbgPrint("[yjx驱动] IRP_MJ_DEVICE_CONTROL对应的处理例程\n");
        pIrpStack = IoGetCurrentIrpStackLocation(pIrp);
        //控制码
        uIoControlCode = pIrpStack->arameters.DeviceIoControl.IoControlCode;
        //输入输出缓冲区
        pIoBuffer = pIrp->AssociatedIrp.SystemBuffer;
        //输入区域大小
        uInSize = pIrpStack->arameters.DeviceIoControl.InputBufferLength;
        //输出区域大小
        uOutSize = pIrpStack->arameters.DeviceIoControl.OutputBufferLength;
        switch (uIoControlCode)

        {
                //在这里加入接口
        case IOCTL_IO_TEST:
        {
                DWORD dw = 0;
                //获得输入的内容
                memcpy(&dw, pIoBuffer, sizeof(DWORD));
                //使用输入的内容
                dw++;
                //输出处理的结果
                memcpy(pIoBuffer, &dw, sizeof(DWORD));
                //处理成功,返回非STATUS_SUCCESS会让DeviveIoControl返回失败
                status = STATUS_SUCCESS;
                break;
        }
        case IOCTL_SAY_HELLO:
        {
                DbgPrint("[yjx驱动]IOCTL_SAY_HELLO\n");
                status = STATUS_SUCCESS;
                break;
        }
        }
        if (status == STATUS_SUCCESS)
                pIrp->IoStatus.Information = uOutSize;
        else
                pIrp->IoStatus.Information = 0;
        pIrp->IoStatus.Status = status;
        IoCompleteRequest(pIrp, IO_NO_INCREMENT);
        DbgPrint("[yjx驱动] IRP_MJ_DEVICE_CONTROL对应的处理例程  return status=%08X \n", status);
        return status;
}

#
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObj, PUNICODE_STRING
        pRegistryString)
{
UNICODE_STRING ustrDevName; //驱动名
        PDEVICE_OBJECT pDevObj;
        NTSTATUS status = STATUS_SUCCESS;
        pDriverObj;
        pRegistryString;
        //创建驱动设备
        RtlInitUnicodeString(&ustrDevName, DEVICE_NAME);
        status = IoCreateDevice(pDriverObj, 0, &ustrDevName, FILE_DEVICE_UNKNOWN,
                0, FALSE, &pDevObj);

        ////初始化驱动例程
        pDriverObj->MajorFunction[IRP_MJ_CREATE] = DispatchCreate;
        pDriverObj->MajorFunction[IRP_MJ_CLOSE] = DispatchClose;
        pDriverObj->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DispatchIoctl;
        pDriverObj->DriverUnload = DriverUnload;

        DbgPrint("yjx驱动加载 Hello World  \n");
        return status;
}

回复

使用道具 举报

学前班

Rank: 2

阅读权限
0
积分
11
精华
0
主题
0
帖子
5
分享
0
日志
0
在线时间
0 小时
最后登录
2017-11-17
注册时间
2017-11-17
听众
0
收听
0
发表于 2017-11-17 11:23:06 | 显示全部楼层
驱动签名怎么办?没法调试啊?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|鑫郁飞网络科技有限公司 ( 渝ICP备16011958号-1 )

GMT+8, 2018-6-23 12:32 , Processed in 0.057752 second(s), 20 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表