• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > 22.DriverBase-ObReferenceObjectByHandle通过Ring3句柄获得Ring0对象

22.DriverBase-ObReferenceObjectByHandle通过Ring3句柄获得Ring0对象

作者:hgy413的专栏 字体:[增加 减小] 来源:互联网 时间:2017-08-17

hgy413的专栏通过本文主要向大家介绍了22.DriverBase-ObReferenceObjectByHandle通过Ring3句柄获得Ring0对象等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

示例ring3的event传入ring0,并在ring0设置有信号状态
ring0:

#include "Driver.h"

#pragma INITCODE
extern "C" NTSTATUS DriverEntry (
            IN PDRIVER_OBJECT pDriverObject,
            IN PUNICODE_STRING pRegistryPath    ) 
{
    NTSTATUS status;
    pDriverObject->DriverUnload = HelloDDKUnload;
    pDriverObject->MajorFunction[IRP_MJ_CREATE] = HelloDDKDispatchRoutine;
    pDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = HelloDDKDeviceIOControl;
    status = CreateDevice(pDriverObject);
    return status;
}

#pragma PAGEDCODE
NTSTATUS CreateDevice (IN PDRIVER_OBJECT    pDriverObject) 
{
    NTSTATUS status;
    PDEVICE_OBJECT pDevObj;
    PDEVICE_EXTENSION pDevExt;

    //创建设备名称
    UNICODE_STRING devName;
    RtlInitUnicodeString(&devName,L"\\Device\\Handle2Object");

    //创建设备
    status = IoCreateDevice( pDriverObject,
                        sizeof(DEVICE_EXTENSION),
                        &(UNICODE_STRING)devName,
                        FILE_DEVICE_UNKNOWN,
                        0, TRUE,
                        &pDevObj );
    if (!NT_SUCCESS(status))
        return status;

    pDevObj->Flags |= DO_DIRECT_IO;
    pDevExt = (PDEVICE_EXTENSION)pDevObj->DeviceExtension;
    pDevExt->pDevice = pDevObj;
    pDevExt->ustrDeviceName = devName;


    //创建符号链接
    UNICODE_STRING symLinkName;
    RtlInitUnicodeString(&symLinkName,L"\\??\\Handle2ObjectLink");
    pDevExt->ustrSymLinkName = symLinkName;
    status = IoCreateSymbolicLink( &symLinkName,&devName );
    if (!NT_SUCCESS(status)) 
    {
        IoDeleteDevice( pDevObj );
        return status;
    }
    return STATUS_SUCCESS;
}

#pragma PAGEDCODE
VOID HelloDDKUnload (IN PDRIVER_OBJECT pDriverObject) 
{
    PDEVICE_OBJECT  pNextObj;
    KdPrint(("Enter DriverUnload\n"));
    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 );
    }
}

#pragma PAGEDCODE
NTSTATUS HelloDDKDeviceIOControl(IN PDEVICE_OBJECT pDevObj,
                                 IN PIRP pIrp)
{
    NTSTATUS status = STATUS_SUCCESS;
    KdPrint(("Enter HelloDDKDeviceIOControl\n"));

    //得到当前堆栈
    PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(pIrp);
    //得到输入缓冲区大小
    ULONG cbin = stack->Parameters.DeviceIoControl.InputBufferLength;
    //得到输出缓冲区大小
    ULONG cbout = stack->Parameters.DeviceIoControl.OutputBufferLength;
    //得到IOCTL码
    ULONG code = stack->Parameters.DeviceIoControl.IoControlCode;

    ULONG info = 0;

    switch (code)
    {                       // process request
        case IOCTL_TEST1:
        {
            KdPrint(("IOCTL_TEST1\n"));
            HANDLE hUserEvent= *(HANDLE*)pIrp->AssociatedIrp.SystemBuffer;
            PKEVENT pEvent;
            // 由事件句柄得到内核事件数据结构
            status = ObReferenceObjectByHandle(hUserEvent,EVENT_MODIFY_STATE,*ExEventObjectType,KernelMode,(PVOID*)&pEvent,NULL);// 参看MSDN
            // 设置事件
            KeSetEvent(pEvent,IO_NO_INCREMENT,FALSE);
            // 减小引用计数
            ObDereferenceObject(pEvent);
            break;
        }

        default:
            status = STATUS_INVALID_VARIANT;
    }

    // 完成IRP
    pIrp->IoStatus.Status = status;
    pIrp->IoStatus.Information = info;  // bytes xfered
    IoCompleteRequest( pIrp, IO_NO_INCREMENT );
    KdPrint(("Leave HelloDDKDeviceIOControl\n"));

    return status;
}

#pragma PAGEDCODE
NTSTATUS HelloDDKDispatchRoutine(IN PDEVICE_OBJECT pDevObj,
                                 IN PIRP pIrp) 
{
    KdPrint(("Enter HelloDDKDispatchRoutine\n"));
    NTSTATUS status = STATUS_SUCCESS;
    // 完成IRP
    pIrp->IoStatus.Status = status;
    pIrp->IoStatus.Information = 0; // bytes xfered
    IoCompleteRequest( pIrp, IO_NO_INCREMENT );
    KdPrint(("Leave HelloDDKDispatchRoutine\n"));
    return status;
}

ring3:

// Handle2ObjectRing3.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <windows.h>
#include <process.h>

#define IOCTL_TEST1 CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS)
unsigned __stdcall ThreadProc(PVOID lp)
{
    HANDLE hEvent = *(HANDLE*)lp;
    WaitForSingleObject(hEvent,INFINITE);
    return 0;
}

int _tmain(int argc, _TCHAR* argv[])
{
    HANDLE hDevice = 
        CreateFileA("\\\\.\\Handle2ObjectLink",
        GENERIC_READ | GENERIC_WRITE,
        0,      // share mode none
        NULL,   // no security
        OPEN_EXISTING,
        FILE_ATTRIBUTE_NORMAL,
        NULL );     // no template
    if (INVALID_HANDLE_VALUE == hDevice)
    {
        printf("fail:%d",GetLastError());
        system("pause");
        return 1;
    }
    // 创建用户模式同步事件
    HANDLE hEvent = CreateEvent(NULL,FALSE,FALSE,NULL);
    HANDLE hThread = (HANDLE)_beginthreadex(NULL,0,ThreadProc,&hEvent,0,NULL);
    DWORD dwOutPut;
    DeviceIoControl(hDevice,IOCTL_TEST1,&hEvent,sizeof(hEvent),NULL,0,&dwOutPut,NULL);
    WaitForSingleObject(hThread,INFINITE);
    CloseHandle(hDevice);
    CloseHandle(hThread);
    CloseHandle(hEvent);
    system("pause");
    return 0;
}
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

相关文章

  • 2017-05-28HDOJ 1443 约瑟夫环的最新应用分析详解
  • 2017-05-28详解C 语言项目中.h文件和.c文件的关系
  • 2017-05-28C语言中6组指针和自增运算符结合方式的运算顺序问题
  • 2017-05-28C语言入门的一些基本资源推荐和程序语法概览
  • 2017-05-28C语言 坐标移动详解及实例代码
  • 2017-05-28基于C语言EOF与getchar()的使用详解
  • 2017-05-28C++动态规划之最长公子序列实例
  • 2017-05-28简单谈谈C++中指针与引用的区别
  • 2017-05-28STL常用容器详细解析
  • 2017-05-28C语言之双向链表详解及实例代码

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • break的使用for循环嵌套示例
    • 文件编译时出现multiple definition of 'xxxxxx'的具体解决方法
    • c++ 探讨奶牛生子的问题
    • sqlserver,sqlite,access数据库链接字符串整理
    • 浅谈C++中对象的复制与对象之间的相互赋值
    • 基于结构体与指针的详解
    • VC++植物大战僵尸中文版修改器实现代码
    • C# 使用反射来实现对象的深度复制方法
    • 《C++ primer plus》读书笔记(三)
    • 用C++实现DBSCAN聚类算法

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有