2013-04-15 49 views
3

自定義(WINNT.H):爲什麼RtlFillMemory/RtlCopyMemory定義爲宏觀

#define RtlCopyMemory(Destination,Source,Length) memcpy((Destination),(Source),(Length)) 
#define RtlFillMemory(Destination,Length,Fill) memset((Destination),(Fill),(Length)) 

我們看到這個函數實際上是宏,它調用的memset/memcpy的功能。

問題是爲什麼?

的淵源此功能由KERNEL32.DLL(但僅作爲存根ntdll.dll中),那麼是什麼原因把它們作爲CRT函數出口?

+0

也許有關這些被認爲是「不安全的」,並正在被棄用的過程 - http://blogs.msdn.com/b/sdl/archive/2009/05/14/please-join-me-in -welcoming-memcpy-to-the-sdl-rogues-gallery.aspx –

+3

「歷史原因不是答案。」爲什麼不?你想讓我們回答這個問題嗎?你爲什麼告訴我們什麼不是答案? –

+0

@Roger Rowland:這不是答案,因爲不解釋爲什麼被定義爲宏,在本文中也不提及RtlZeroMemory,也不是Rtl​​FillMemoery。 – Xearinox

回答

11

Windows API是使用圖層實現的。有很好的文檔winapi,每個Windows程序都應該用它來進行操作系統調用。微軟永遠不能改變它,這樣做會破壞很多傳統程序。底部的是本機操作系統api,名稱以Nt或Zw開頭的函數。沒有證明超出編寫驅動程序所需的內容。微軟定期對每個Windows版本進行更改,這是它在Windows上創新的基本方式,而不會破壞太多的代碼。 Vista是Windows的最後一個版本,在底層發生了巨大的變化,所產生的抱怨已經很好地發佈了。

還有一個介於兩者之間的層,從已發佈的api轉換爲未記錄的輔助函數並返回。它的名字以Rtl開頭。

它們也被認爲是無證的,但程序員已經對它們進行了逆向工程並最終依賴它們。一些已經被微軟記錄下來,因爲它們通常用於調試或填補了winapi中的空白。這對微軟來說是痛苦的,不可避免地當底層發生變化時,這些Rtl功能也需要改變。 RtlCopyMemory和RtlFillMemory特別被濫用,很多VB6代碼都使用它,因爲它沒有發佈相同功能的函數。

那麼,那隻貓是沒有包的。因此,您發現的聲明是Microsoft試圖讓程序使用文檔化功能並停止依賴可能需要更改的功能的嘗試。解決問題的唯一合理的事情。

+0

Thanky你,爲你在這個問題的興趣。你是對的,我看到很多VB6代碼使用了這個功能。 :) – Xearinox

+1

幹得好漢斯。你等到我們拿到「歷史原因不回答」禁令解除。 –

+0

有禁止?很高興我不知道它,我得到了一個老屁的答案標記的一半;) –