如何在ring0(内核模式)中使用winapi函数?

时间:2013-12-22 13:48:31

标签: c windows kernel driver

我无法在驱动程序中调用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 个答案:

答案 0 :(得分:8)

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的等效项。