【问题标题】:How to use winapi functions in ring0 (kernel mode)?如何在ring0(内核模式)中使用winapi函数?
【发布时间】:2013-12-22 13:48:31
【问题描述】:

我无法在驱动程序中调用FileTimeToSystemTime() 方法。错误是:

错误 C4013:'FileTimeToSystemTime' 未定义;假设 extern 返回 int

另外我不能包含windows.h,因为我已经包含了ntddk.h,这会导致很多错误。 如果我在标题中将其声明为BOOL FileTimeToSystemTime(IN const PFILETIME, OUT PSYSTEMTIME);,我会收到下一个错误:

错误 C2061:语法错误:标识符“FileTimeToSystemTime”

错误 C2059:语法错误:';'

错误 C2059:语法错误:'type'

错误 C4013:'FileTimeToSystemTime' 未定义;假设 extern 返回 int

最后,如果我为此方法编写一个实现:

BOOL FileTimeToSystemTime(const PFILETIME pFileTime, PSYSTEMTIME pSystemTime)
{
    CALL_ENTRY
    long long tmp;
    memcpy(&tmp, pFileTime, sizeof (FILETIME));
    time_t aTime_t = tmp / 10000;
    tm aTm;

    if (!gmtime_r(&aTime_t, &aTm ))
        return FALSE;

    pSystemTime->wYear = aTm.tm_year + 1900;
    pSystemTime->wMonth = aTm.tm_mon;
    pSystemTime->wDayOfWeek = aTm.tm_wday;
    pSystemTime->wDay = aTm.tm_mday;
    pSystemTime->wHour = aTm.tm_hour;
    pSystemTime->wMinute = aTm.tm_min;
    pSystemTime->wSecond = aTm.tm_sec;
    pSystemTime->wMilliseconds = 0;

    return TRUE;
}

我遇到了与上面列出的相同的错误。在内核模式下调用此方法的正确方法是什么?或者一般如何从windows驱动调用winapi函数?

【问题讨论】:

  • -1。您想编写驱动程序,但您没有基本知识。请先阅读一些文档。或者你想写蓝屏生成器????

标签: c windows kernel driver


【解决方案1】:

winapi 是原生操作系统之上的一个子系统。 Windows NT 最初有三个子系统:Posix、OS/2 和 Win32。旨在使从其他操作系统移植程序变得容易。 Win32 深受 Windows 3.x 的 api 的影响。 Posix 和 OS/2 在很大程度上被忽略并被删除,Win32 以压倒性优势获胜。这些天称为“Winapi”以避免“32”,它被移植到 64 位代码,变化非常小。

在设备驱动程序领域,您不再使用这样的子系统,而是编写本机操作系统。因此,您需要忘记 winapi 函数并改用本机 API。

您使用KeQuerySystemTime() 获取系统时间。必要时转换为本地时间 ExSystemTimeToLocalTime()。您可以使用 RtlTimeToTimeFields() 辅助函数生成等效的 SYSTEMTIME。

【讨论】:

    猜你喜欢
    • 2011-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-24
    • 2020-10-22
    • 1970-01-01
    • 2015-05-03
    • 2018-08-15
    相关资源
    最近更新 更多