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