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

我不能在驱动程序中调用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函数?

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。