我无法在驱动程序中调用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函数?
答案 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的等效项。