【问题标题】:Read RTC in Windows在 Windows 中读取 RTC
【发布时间】:2019-10-30 05:09:44
【问题描述】:

我不是 C/ASM 开发人员,我想通过 Windows 程序从 RTC 获取当前日期和时间。

Here,我找到了一个 C 代码来做这个。

我通过以下方式更改了该代码,并使用 Visual Studio 2017 cl.exe 编译器对其进行了编译,没有出现错误和警告:

#include <stdio.h>

int main()
{
   unsigned char tvalue, index;

   printf("STARTING...\n");

   for(index = 0; index < 128; index++)
   {
      __asm
      {
         cli             /* Disable interrupts */
         mov al, index   /* Move index address */
                         /* since the 0x80 bit of al is not set, */
                         /* NMI is active */
         out 0x70, al    /* Copy address to CMOS register */
                         /* some kind of real delay here is probably best */
         in al, 0x71     /* Fetch 1 byte to al */
         sti             /* Enable interrupts */
         mov tvalue, al
      }

      printf("%u\n", (unsigned int)tvalue);
   }

   printf("FINISHED!\n");
   return 0;
}

当我尝试从命令提示符执行 exe 时,我什么也没看到,只有“STARTING...”行。

我做错了什么?

非常感谢。

【问题讨论】:

    标签: c windows assembly real-time-clock


    【解决方案1】:

    您找到的示例代码是操作系统代码,而不是 Windows 代码。如果 Windows 允许随机进程与硬件设备(如实时时钟)随机交互,那将是一片混乱。操作系统有一个与实时时钟对话的驱动程序,它不允许进程随机插入它。

    作为最明显的问题,您不能只在现代操作系统运行时禁用进程的中断!

    【讨论】:

    • 谢谢你,大卫。那么绕过WinAPI是不可能的吗?
    • @Fabrizio:除非你能找到一个提权漏洞,让你从用户空间接管内核,否则是的。或者使用管理员权限,加载内核模块。 (我认为 Windows 将其称为“驱动程序”。)
    【解决方案2】:

    我想通过 Windows 获取 RTC 的当前日期和时间 程序。

    在 Windows 上,您使用 Windows APIs(或包装器)

    读取系统时间的主要API有:

    GetSystemTime

    GetSystemTimePreciseAsFileTime

    NtQuerySystemTime

    【讨论】:

    • 谢谢,Castorix。问题是我真的想绕过 Windows API。根据你的说法,这是不可能的。是这样吗?
    • 在启动时,Windows 会从 RTC 读取 SYSTEM 时间,并在用户模式下将其复制到 USER_SHARED_DATA 结构中,因此无需 API 调用即可从此结构中读取它,但是这不常见(我在 Windows 10 上测试过)
    • 当您说“副本”时,您的意思是“地图”吗?所以所有用户空间进程都有一些内核数据的共享映射,他们可以在没有系统调用的情况下读取? Linux 对 VDSO 页面做同样的事情,允许一些简单但常见的系统调用,如 getpid(),实际上不必进入内核。对于clock_gettime,Linux 没有实际导出共享时间计数器,而是导出rdtsc 的比例因子和偏移量,因此在用户空间中可以使用高精度时间。也可能有一个低精度的时间可以在 Linux 中简单地读取,就像您在 Windows 上所说的那样。
    • 是的,它是一个固定区域,从 NT 3.5 IIRC 开始,任何进程都可以读取。它由#define MM_SHARED_USER_DATA_VA 0x7FFE0000 #define USER_SHARED_DATA ((KUSER_SHARED_DATA * const)MM_SHARED_USER_DATA_VA) 定义
    猜你喜欢
    • 2019-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-26
    • 2013-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多