2013-12-22 55 views
1

我不能在驅動程序中調用FileTimeToSystemTime()方法。錯誤是:如何在ring0中使用winapi函數(內核模式)?

錯誤C4013:'FileTimeToSystemTime'未定義;假設外部返回int

此外,我不能包括windows.h,因爲我已經包括ntddk.h,它會導致很多錯誤。 我若在頭BOOL FileTimeToSystemTime(IN const PFILETIME, OUT PSYSTEMTIME);我得到下一個錯誤:

錯誤C2061:語法錯誤:標識符 'FileTimeToSystemTime'

錯誤C2059:語法錯誤: ';'

錯誤C2059:語法錯誤: '類型'

錯誤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

-1。你想寫驅動程序,但你沒有元素知識。請先閱讀一些文件。或者你希望寫BSOD發生器? – Xearinox

回答

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。

相關問題