22.DriverBase-ObReferenceObjectByHandle通过Ring3句柄获得Ring0对象
来源:互联网 发布:淘宝一比一高仿奢侈品 编辑:程序博客网 时间:2024/06/16 09:33
ObReferenceObjectByHandle
示例ring3的event传入ring0,并在ring0设置有信号状态
ring0:
#include "Driver.h"#pragma INITCODEextern "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 PAGEDCODENTSTATUS 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 PAGEDCODEVOID 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 PAGEDCODENTSTATUS 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 PAGEDCODENTSTATUS 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;}
阅读全文
0 0
- 22.DriverBase-ObReferenceObjectByHandle通过Ring3句柄获得Ring0对象
- Ring3 调用 NtQueryObject 获得文件句柄对应的对象名时调用线程死锁的原因
- Ring3获得所有对象类型
- 通过IE句柄 获得 IE Document对象和IWebBrowser2对象
- 通过IE句柄 获得 IE Document对象和IWebBrowser2对象
- [收藏] Ring0 Call Ring3
- Ring0 Call Ring3
- 所谓ring0和ring3
- ring0调用ring3-apc
- Ring3转入Ring0跟踪
- ring0和ring3简介
- MFC通过对话框窗口句柄获得对话框对象指针
- MFC通过对话框窗口句柄获得对话框对象指针
- MFC通过对话框窗口句柄获得对话框对象指针
- MFC通过对话框窗口句柄获得对话框对象指针
- MFC通过对话框窗口句柄获得对话框对象指针
- ring0调用Ring3的代码
- ring3 & ring0 通用InlineHook代码
- 三种方式实现二维码(java)
- Mac OS 登录服务器使用 iTerm2 rz/sz命令
- CEF3研究(三)
- QT QSS 记录下 留着以后用
- fastbin
- 22.DriverBase-ObReferenceObjectByHandle通过Ring3句柄获得Ring0对象
- 从mac向iPhone Simulator粘贴
- 上拉刷新下拉加载的实现
- Android sqlitedatabase 数据库创建
- ValueError: Shape must be rank 0 but is rank 1 for 'train_data/ReadFile' (op: 'ReadFile') with input
- [CSDN_Markdown] 数学公式对齐
- weex native端 js 调试方法
- android平台调试
- 从零开始的RxJava之旅(3)---- RxJava进阶RxJava2