/***************************************************************************************
* AUTHOR : yifi
* DATE : 2015-11-5
* MODULE : EnumIoTimer.C
*
* Command:
* Source of IOCTRL Sample Driver
*
* Description:
* Demonstrates communications between USER and KERNEL.
*
****************************************************************************************
* Copyright (C) 2010 yifi.
****************************************************************************************/ //#######################################################################################
//# I N C L U D E S
//####################################################################################### #ifndef CXX_ENUMIOTIMER_H
# include "EnumIoTimer.h"
#endif NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegisterPath)
{ DriverObject->DriverUnload = UnloadDriver; EnumIoTimer();
return STATUS_SUCCESS;
} BOOLEAN EnumIoTimer()
{
PLIST_ENTRY IoTimerQueueHead = ;
PUCHAR IoInitializeTimer = ;
KIRQL OldIrql;
PUCHAR StartSearchAddress = NULL;
PUCHAR EndSearchAddress = NULL;
PUCHAR i = NULL;
INT32 iOffset = ;
UCHAR v1 = , v2 = , v3 = ; IoInitializeTimer = (PUCHAR)GetExportVariableAddressFormNtosExportTableByVariableName(L"IoInitializeTimer");
if (IoInitializeTimer == NULL)
{
return FALSE;
}
StartSearchAddress = IoInitializeTimer;
EndSearchAddress = StartSearchAddress + 0x500; #ifdef _WIN64
for (i = StartSearchAddress;i<EndSearchAddress;i++)
{
if (MmIsAddressValid(i) && MmIsAddressValid(i + ) && MmIsAddressValid(i + ))
{
v1 = *i;
v2 = *(i + );
v3 = *(i + );
if (v1 == 0x48 && v2 == 0x8d && v3 == 0x0d)
{
memcpy(&iOffset, i + , );
IoTimerQueueHead = (PLIST_ENTRY)(iOffset + (ULONG64)i + );
break;
} }
} #else for (i = StartSearchAddress; i < EndSearchAddress; i++)
{
v1 = *i;
if (v1 == 0xb9)
{
IoTimerQueueHead = (PLIST_ENTRY)*(PULONG32)(i + );
break;
}
}
#endif if (IoTimerQueueHead == NULL)
{
return FALSE;
} DbgPrint("获得了\r\n");
OldIrql = KeRaiseIrqlToDpcLevel(); if (IoTimerQueueHead && MmIsAddressValid((PVOID)IoTimerQueueHead))
{
PLIST_ENTRY NextEntry = IoTimerQueueHead->Flink;
while (MmIsAddressValid(NextEntry) && NextEntry != (PLIST_ENTRY)IoTimerQueueHead)
{
PIO_TIMER Timer = CONTAINING_RECORD(NextEntry, IO_TIMER, TimerList); if (Timer && MmIsAddressValid(Timer))
{
DbgPrint("Timer 对象: %p\r\n", Timer);
}
NextEntry = NextEntry->Flink; }
}
KeLowerIrql(OldIrql);
return TRUE;
} VOID UnloadDriver(PDRIVER_OBJECT DriverObject)
{
return;
} PVOID
GetExportVariableAddressFormNtosExportTableByVariableName(WCHAR *wzVariableName)
{
UNICODE_STRING uniVariableName;
PVOID VariableAddress = NULL; if (wzVariableName && wcslen(wzVariableName) > )
{
RtlInitUnicodeString(&uniVariableName, wzVariableName); //从Ntos模块的导出表中获得一个导出变量的地址
VariableAddress = MmGetSystemRoutineAddress(&uniVariableName);
} return VariableAddress;
}

代码

 /***************************************************************************************
* AUTHOR : yifi
* DATE : 2015-11-5
* MODULE : EnumIoTimer.H
*
* IOCTRL Sample Driver
*
* Description:
* Demonstrates communications between USER and KERNEL.
*
****************************************************************************************
* Copyright (C) 2010 yifi.
****************************************************************************************/ #ifndef CXX_ENUMIOTIMER_H
#define CXX_ENUMIOTIMER_H #include <ntifs.h> typedef struct _IO_TIMER_WIN7_X64
{
INT16 Type;
INT16 TimerFlag;
LONG32 Unknown;
LIST_ENTRY TimerList;
PVOID TimerRoutine;
PVOID Context;
PVOID DeviceObject;
}IO_TIMER_WIN7_X64, *PIO_TIMER_WIN7_X64; typedef struct _IO_TIMER_WINXP_X86
{
INT16 Type;
INT16 TimerFlag;
LIST_ENTRY TimerList;
PVOID TimerRoutine;
PVOID Context;
PVOID DeviceObject;
} IO_TIMER_WINXP_X86, *PIO_TIMER_WINXP_X86; #ifdef _WIN64
#define PIO_TIMER PIO_TIMER_WIN7_X64
#define IO_TIMER IO_TIMER_WIN7_X64
#else
#define PIO_TIMER PIO_TIMER_WINXP_X86
#define IO_TIMER IO_TIMER_WINXP_X86
#endif VOID UnloadDriver(PDRIVER_OBJECT DriverObject);
BOOLEAN EnumIoTimer();
PVOID GetExportVariableAddressFormNtosExportTableByVariableName(WCHAR *wzVariableName); #endif

代码

枚举IoTimer的更多相关文章

  1. 驱动开发:内核枚举IoTimer定时器

    今天继续分享内核枚举系列知识,这次我们来学习如何通过代码的方式枚举内核IoTimer定时器,内核定时器其实就是在内核中实现的时钟,该定时器的枚举非常简单,因为在IoInitializeTimer初始化 ...

  2. 驱动开发:内核枚举DpcTimer定时器

    在笔者上一篇文章<驱动开发:内核枚举IoTimer定时器>中我们通过IoInitializeTimer这个API函数为跳板,向下扫描特征码获取到了IopTimerQueueHead也就是I ...

  3. 驱动开发:Win10内核枚举SSDT表基址

    三年前面朝黄土背朝天的我,写了一篇如何在Windows 7系统下枚举内核SSDT表的文章<驱动开发:内核读取SSDT表基址>三年过去了我还是个单身狗,开个玩笑,微软的Windows 10系 ...

  4. Swift enum(枚举)使用范例

    //: Playground - noun: a place where people can play import UIKit var str = "Hello, playground& ...

  5. 编写高质量代码:改善Java程序的151个建议(第6章:枚举和注解___建议88~92)

    建议88:用枚举实现工厂方法模式更简洁 工厂方法模式(Factory Method Pattern)是" 创建对象的接口,让子类决定实例化哪一个类,并使一个类的实例化延迟到其它子类" ...

  6. Objective-C枚举的几种定义方式与使用

    假设我们需要表示网络连接状态,可以用下列枚举表示: enum CSConnectionState { CSConnectionStateDisconnected, CSConnectionStateC ...

  7. Help Hanzo (素数筛+区间枚举)

    Help Hanzo 题意:求a~b间素数个数(1 ≤ a ≤ b < 231, b - a ≤ 100000).     (全题在文末) 题解: a~b枚举必定TLE,普通打表MLE,真是头疼 ...

  8. 枚举:enum

    枚举 所谓枚举就是指定好取值范围,所有内容只能从指定范围取得. 例如,想定义一个color类,他只能有RED,GREEN,BLUE三种植. 使用简单类完成颜色固定取值问题. 1,就是说,一个类只能完成 ...

  9. .NET 基础一步步一幕幕[方法、结构、枚举]

    方法.结构.枚举 方法: 将一堆代码进行重用的一种机制. 语法: [访问修饰符] 返回类型 <方法名>(参数列表){ 方法主体: } 返回值类型:如果不需要写返回值,写void 方法名:P ...

随机推荐

  1. iOS - Swift NSRect 位置和尺寸

    前言 结构体,这个结构体用来表示事物的坐标点和宽高度. public typealias NSRect = CGRect public struct CGRect { public var origi ...

  2. Nginx基础知识之————日志管理

    一.Server段,可以看到如下类似信息 #access_log logs/host.access.log main; 说明该server, 它的访问日志的文件是  logs/host.access. ...

  3. mysql概要(十五)存储过程

    1.定义: 2.查看所有存储过程: show procedure status; 3.创建存储过程: create procedure 存储过程名字(参数) begin s1l语句; end$     ...

  4. u盘在电脑读不出来,但别的可以读,别的u盘在我电脑又可以识别怎么回事?

    不知道我的U盘是怎么回事,在我自己的电脑里读不出来,下面有U盘图标,但我的电脑里就是找不到U盘盘符,但把这个U盘放其他电脑上又可以读取,我以为是我的电脑的问题,但用其他的U盘插我电脑又没问题,完全摸不 ...

  5. Java中List、Collections实现梭哈游戏

    package ch8; import java.util.*; /** * Created by Jiqing on 2016/11/27. */ public class ShowHand { / ...

  6. activity去标题栏操作&保留高版本主题

    方式一:每个类都需要去添加此代码 在setContentView(R.layout.activity_splash); 前设置以下代码 requestWindowFeature(Window.FEAT ...

  7. Android照相机模块编程 照片颠倒问题及查询摄像头参数问题的解决

    这两天编程弄Android照相机模块,设置好各种参数后,发现预览的时候,照片是颠倒了,不是上下颠倒而是颠倒90°. 我的手机是华为U9200,用的Android4.0.3,后来看到http://www ...

  8. 转:Unicode汉字编码表

    转自:http://blog.csdn.net/huangxy10/article/details/10012119 Unicode汉字编码表 1 Unicode编码表  Unicode只有一个字符集 ...

  9. JavaScript的事件对象_事件流

    事件流事件流是描述的从页面接受事件的顺序,当几个都具有事件的元素层叠在一起的时候,那么你点击其中一个元素,并不是只有当前被点击的元素会触发事件,而层叠在你点击范围的所有元素都会触发事件.事件流包括两种 ...

  10. 牛客网 --java问答题

    http://www.nowcoder.com/ 主要是自己什么都不怎么会.在这里可以学习很多的! 第一天看题自己回答,第二天看牛客网的答案! 1 什么是Java虚拟机?为什么Java被称作是“平台无 ...