Windows 驱动程序时间戳函数

2024-03-14

我正在修改现有的 Windows 内核设备驱动程序,并且需要在其中捕获时间戳。我打算使用 time.h 库并调用 Clock() 函数来实现这一点,但是在 Windows Visual Studio 下,链接失败。所以我把它作为我需要在驱动程序库中工作的一种手段。

我找到了以下函数 KeInitializeTimer 和 KeSetTimerEx,但如果我打算设置计时器并唤醒它,则会使用这些函数。我真正需要的是能给我一个时间戳的东西。

有任何想法吗?


我正在更新我的问题并提供答案,以便其他人从我的发现中受益。

要获取时间戳,可以使用 KeQueryTickCount()。该例程将为您提供自系统启动以来发生的间隔中断的计数。但是,如果您需要查明自上次捕获的时间戳以来已经过去了 X 时间,您还需要查询系统以确定每个间隔时钟中断所需的时间。

ULONG KeQueryTimeIncrement() 给出 100 纳秒单位的数量。

Example:

PLARGE_INTEGER timeStamp;

KeQueryTickCount(&timeStamp);

请注意 PLARGE_INTEGER 的定义如下:

#if defined(MIDL_PASS)
typedef struct _LARGE_INTEGER {
#else // MIDL_PASS
typedef union _LARGE_INTEGER {
    struct {
        ULONG LowPart;
        LONG HighPart;
    } DUMMYSTRUCTNAME;
    struct {
        ULONG LowPart;
        LONG HighPart;
    } u;
#endif //MIDL_PASS
    LONGLONG QuadPart;
} LARGE_INTEGER;

假设您想查看自上次获取时间戳以来是否过去了 30 秒,您可以执行以下操作:

ULONG tickIncrement, ticks;
LARGE_INTEGER waitTillTimeStamp;
tickIncrement = KeQueryTimeIncrement();

// 1sec 是 1,000,000,000 纳秒,但是,因为 KeQueryTimeIncrement 位于 // 100ns 增量,除以该值,常数就是 10,000,000

ticks = ((30 * 10,000,000) / tickIncrement);
KeQueryTickCount(&waitTillTimeStamp);
waitTillTimeStamp.QuadPart += ticks;

<.....Some code and time passage....>
KeQueryTickCount(&currTimeStamp);


if (waitTillTimeStamp.QuadPart < currTimeStamp.QuadPart) {
    <...Do whatever...>
}

另一个帮助您理解这一点的例子是,如果您想将获得的时间戳转换为时间值(例如毫秒),该怎么办?

LARGE_INTEGER mSec, currTimeStamp;
ULONG timeIncrement;

timeIncrement = KeQueryTimeIncrement();


KeQueryTickCount(&currTimeStamp);

// 1 millisecond is 1,000,000 nano seconds, but remember divide by 100 to account for 
// KeQueryTickCount granularity.
mSec.QuadPart = (currTimeStamp.QuadPart * timeIncrement) / 10000;

请记住,此示例用于演示目的,mSec 不是以毫秒为单位的当前时间。根据上面使用的 API,它只是系统启动以来经过的毫秒数。

您还可以使用 GetTickCount(),但这会返回一个 DWORD,因此只能为您提供自系统启动以来最多 49.7 天的毫秒数。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Windows 驱动程序时间戳函数 的相关文章

随机推荐

  • 如何在 .Net Core ActionFilterAttribute 中使用依赖注入?

    身份验证所需属性类 public class AuthenticationRequiredAttribute ActionFilterAttribute ILoginTokenKeyApi loginTokenKeyApi IMemoryC
  • 使用 TensorFlow 进行训练和预测出了什么问题?

    请看下面写的代码 x tf placeholder float None 80 W tf Variable tf zeros 80 2 b tf Variable tf zeros 2 y tf nn softmax tf matmul x
  • 从事件返回一个值——这方面有好的实践吗?

    我正在做一个使用异步 TCP 套接字的小型多线程应用程序 但我会说到重点 我正在使用自定义事件从表单读取值 并且事件使用的委托在完成时返回一个字符串 我的问题是 这是正确的吗 可以从事件中返回值吗 或者有更好的方法来做到这一点吗 就像使用表
  • 从Python中的非线性方程组中找到复​​数根

    我一直在测试一种已在文献中发表的算法 该算法涉及在 Matlab 和 Python 中求解一组 m 非线性方程 非线性方程组涉及包含复数的输入变量 因此所得解也应该是复数 到目前为止 我已经能够通过使用以下代码行在 Matlab 中获得相当
  • 将附件上传到 azure devops [REST API]

    我很难通过 api 在我的 azure devops 存储库中添加附件 public static void putAttachments Integer id try URL url new URL https dev azure com
  • HtmlService 表不支持电子表格中的换行符和超链接

    我正在编写 Google Apps 脚本 以使用 HtmlService 将电子表格中的数据显示到 HTML 表中 但我面临以下两个挑战 如果电子表格单元格值中有换行符 表格会将其显示为单行 如果电子表格单元格具有超链接 例如链接到 Goo
  • XmlElement(name="custom_name") 在与其余服务集成的 Spring Boot 中不起作用

    我对休息服务世界几乎是新手 在这里我试图更改输出 xml 中显示的字段名称 不确定 我是否遵循正确的方法 任何帮助都是一件好事 活动 java import javax xml bind annotation XmlAccessType i
  • 为什么 Windows 为其系统地址空间保留 1Gb(或 2Gb)?

    众所周知 Windows 应用程序在 32 位系统上通常有 2Gb 的私有地址空间 使用 3Gb 开关可以将该空间扩展到 3Gb 操作系统自行保留剩余的 4Gb 我的问题是为什么 在内核模式下运行的代码 即设备驱动程序代码 有自己的地址空间
  • DCPCrypt/Delphi 未正确编码 Rijndael

    我有 DCPCrypt 包 最新版本 并尝试在 Delphi2007 中使用来自 NIST 分发的 AES 已知答案测试 KAT 向量的测试值进行 AES Rijndael CBC 编码 128 位块 256 位密钥 一个样本测试向量 KE
  • 具有符合协议的惰性、私有属性的 Swift Struct

    首先 我有一个仅定义一些只读属性的协议 例如 protocol Example var var1 String get var varArray String get 然后我想创建一个符合该协议的结构 我遇到的问题是我有两个相互冲突的要求
  • Firestore 查询具有多个值的循环

    我正在尝试使用字符串中保存的数据检索多个 Firestore 文档 这个想法是 对于数组中的每个值 我将使用 Firestore 查询来检索与该查询匹配的文档并将其推送到另一个数组 我在实现此目标时遇到了一些问题 到目前为止我已经尝试过 e
  • “Microsoft VBScript 运行时错误‘800a000d’‘800a000d’

    我有下一个代码 其工作原理如下 从url接收一些参数 将此数据插入名为 clients 的表中 然后我选择客户表中最后引入的数据 最后 它尝试将此数据插入到另一个名为 users 的表中 但我收到这个错误 Microsoft VBScrip
  • 在 jQuery.load() 上对容器的高度进行动画处理

    我正在使用 container div load url 通过 ajax 填充 div 我想将高度设置为返回内容的高度 但真的不知道如何实现这一点 我尝试过使用这样的东西 main fadeOut function main load ur
  • 由于文件 libmpi.so.1 丢失而出错

    我使用 Omnet 和 Veins 进行模拟 直到我昨晚从 Ubuntu 15 升级到 16 04 LTS 之前它都工作正常 现在 我在尝试运行模拟时收到以下错误 error while loading shared libraries l
  • 语音识别监听器在 Galaxy SII 中不起作用

    我正在开发一个Android应用程序 它总是监听用户的声音 当我在 Sony X10i 上运行时它可以工作 但在 Samsung Galaxy SII 上则不起作用 这是我的代码 SpeechRecognizer speechRecogni
  • Android比较imageView和image

    我想将当前 imageView 与 R drawable 中的图像进行比较 我想我已经尝试了一切 但我无法解决这个问题 我尝试了堆栈溢出的所有方法 XML
  • npm 安装失败,出现 make not found 错误

    当我尝试在 Nodejs 服务器上安装时间时 出现以下错误 email protected cdn cgi l email protection install var www track node modules time node gy
  • 如何使用 OpenGL ES 2.0 着色器完成这些图像处理任务?

    如何使用 OpenGL ES 2 0 着色器执行以下图像处理任务 色彩空间变换 RGB YUV HSL Lab 图像的旋转 转换为草图 转换为油画 我刚刚向我的开源添加了过滤器GPU图像框架 https github com BradLar
  • 为什么HashMap比HashSet快?

    我一直在阅读 研究原因HashMap比HashSet 我不太明白以下说法 HashMap比HashSet因为这些值与唯一的键相关联 In HashSet 成员对象用于计算两个对象的哈希码值可以相同 因此equals 方法用于检查相等性 如果
  • Windows 驱动程序时间戳函数

    我正在修改现有的 Windows 内核设备驱动程序 并且需要在其中捕获时间戳 我打算使用 time h 库并调用 Clock 函数来实现这一点 但是在 Windows Visual Studio 下 链接失败 所以我把它作为我需要在驱动程序