2012-10-25 79 views
1

本書Windows NT/2000 Native API Reference提供了未記錄的(由Microsoft)本機API提供的全面文檔(儘管過時)。不過我很好奇,反正是有找到kernel32.dll中,advapi.dll等NTDLL.DLL和用戶模式的功能宣稱低級功能之間的映射..將用戶模式dll中的高級函數映射到NTDLL.dll

例如:

我知道功能CreateFile映射到NtCreateFile。但我沒有ntdll.dll中的MoveFileWithProgressW函數在kernel32.dll中的確切功能。

+0

它是無證的。 –

回答

3

你可以轉儲從用戶模式的系統DLL使用dumpbin.exe工具從Windows SDK/Visual Studio的出口和尋找轉發功能:

dumpbin -exports kernel32.dll | find/I "forwarded" > fwd.txt

這將創建fwd.txt文件包含的轉發功能列表,像這樣:

151 96 EnterCriticalSection (forwarded to NTDLL.RtlEnterCriticalSection) 
361 168 GetLastError (forwarded to NTDLL.RtlGetLastWin32Error) 
518 205 HeapAlloc (forwarded to NTDLL.RtlAllocateHeap) 
524 20B HeapFree (forwarded to NTDLL.RtlFreeHeap) 
528 20F HeapReAlloc (forwarded to NTDLL.RtlReAllocateHeap) 
530 211 HeapSize (forwarded to NTDLL.RtlSizeHeap) 

3

與標準Windows(用戶模式)API相比,NT本機API是較低級別的API。所以在很多情況下都沒有一一對應的關係。我猜測MoveFileWithProgress在用戶空間中使用較低級別的打開/讀取/寫入/關閉例程來實現。

換句話說,如果你想使用Native API,你需要重新實現一堆便利功能,如MoveFileWithProgress

Wine項目重新實現了Windows API。您可以看到their implementation以瞭解它是如何完成的。 (搜索頁面中的「MoveFileWithProgress」)

+2

Wine使用'wine_nt_to_unix_file_name',然後是'rename'。最好鏈接到[ReactOS'MoveFileWithProgressW'](http://svn.reactos.org/svn/reactos/tags/ReactOS-0.3.16/reactos/dll/win32/kernel32/client/file/move.c?view =標記#L224)。如果目標位於同一捲上,則它將['NtSetInformationFile'](http://msdn.microsoft.com/zh-cn/library/ff567096)與['FILE_RENAME_INFORMATION'](http://msdn.microsoft.com/zh-cn/ .com/en-us/library/ff540344)結構。 – eryksun