2013-10-28 26 views
1

我試試這個簡單的代碼來計算硬盤的寫入速度在我的應用程序:鏈接失敗。如何使用'NtQuerySystemTime'窗口功能?

#include <winternl.h> 

... 
float speed; 
double divident; 
PLARGE_INTEGER systime0, systime1; 
LONGLONG elapsed_time; 
... 

write_flag = true ; 

NtQuerySystemTime(systime0) ; 

f_out->write(out_buffer0, chunk_len0); 
f_out->write(out_buffer1, chunk_len1); 

NtQuerySystemTime(systime1); 

elapsed_time = systime1->QuadPart - systime0->QuadPart; 

write_flag = false ; 

divident = static_cast<double>(chunk_len0 + chunk_len1)/1.048576 ; // 1.024 * 1.024 = 1.048576; divident yield value 1000000 times greater then value in MB 
divident *= 10 ; // I want 'speed' to be in MB/s 
speed = divident/static_cast<double>(elapsed_time) ; 
... 

,但它無法鏈接。

在MSDN中,NtQuerySystemTime documentation說,有沒有相關的導入庫,而我必須使用LoadLibrary()GetProcAddress()功能動態鏈接到Ntdll.dll。但我不明白如何使用這些功能。有人可以提供一個如何使用這些函數的代碼示例嗎?

+1

這同一篇文章也說: 「應用程序應該使用'GetSystemTimeAsFileTime'功能」。那你爲什麼不呢?你覺得'NtQuerySystemTime'給你,你不能另外獲得? –

+0

嗯,也許我應該仔細閱讀,但是解釋如何使用'NtQuerySystemTime()'的問題的答案對我來說也是好的,因爲我將會學到更多 – user1978386

+1

由於GetSystemTimeAsFileTime執行相同的操作,所以沒有理由使用NtQuerySystemTime,將在未來版本的Windows中受支持。確保您的客戶瞭解您的程序依賴於明確記錄爲「可能隨時停止工作」的功能,以便在它停止工作時,他們將會打電話給您,而不是Microsoft。 –

回答

1

這就是你將如何使用這個功能。

HMODULE hNtDll = GetModuleHandleA("ntdll"); 
NTSTATUS (WINAPI *NtQuerySystemTime)(PLARGE_INTEGER) = 
    (NTSTATUS (WINAPI*)(PLARGE_INTEGER))GetProcAddress(hNtDll, "NtQuerySystemTime"); 
1
#include <stdio.h> 
#include <windows.h> 

typedef NTSYSAPI (CALLBACK *LPNTQUERYSYSTEMTIME)(PLARGE_INTEGER); 

void main(void) 
{ 
    PLARGE_INTEGER SystemTime; 
    SystemTime = (PLARGE_INTEGER) malloc(sizeof(LARGE_INTEGER)); 

    HMODULE hNtDll = GetModuleHandleA("ntdll"); 

    LPNTQUERYSYSTEMTIME fnNtQuerySystemTime = (LPNTQUERYSYSTEMTIME)GetProcAddress(hNtDll, "NtQuerySystemTime"); 

    if(fnNtQuerySystemTime){ 

     printf("found NtQuerySystemTime function at ntdll.dll address:%p\n",fnNtQuerySystemTime); 
     fnNtQuerySystemTime(SystemTime); 
     printf("%llx\n", SystemTime->QuadPart); 

    } 

    free(SystemTime); 
} 
+1

不要在C++中使用'malloc()'和'free()',而應該使用'new'和'delete'(或者更好一些,像std :: auto_ptr或std :: unique_ptr這樣的智能指針) 。在這種情況下,我不會動態分配'SystemTime',我會在堆棧中聲明它,然後使用'&'運算符將它傳遞給'NtQuerySystemTime()',例如:'LARGE_INTEGER SystemTime; ... fnNtQuerySystemTime(&SystemTime); printf(「%llx \ n」,SystemTime.QuadPart); ...' –

+0

@RemyLebeau最近我學習了ansi c,並在Visual C++ 6中編寫了這段代碼,不知道C++,我已經嘗試了你的建議,它引發了一個錯誤:error C2664:'int(union _LARGE_INTEGER *)':無法將參數1從'union _LARGE_INTEGER **'轉換爲'union _LARGE_INTEGER *' – Jame

+0

問題標記爲C++。如果你遇到了錯誤,那麼你做錯了什麼。 –