2010-06-03 80 views
4

我試圖使用名爲NTCreateFile的函數。當我編譯它給了我一個錯誤,說 「_NTCreateFile標識符找不到」。我輸入了標題winternl.h。所以接下來我嘗試使用ZwCreatFile,根據MSDN我包括ntifs.h,但我不能包括該頭。它說「無法打開/查找目錄」。我正在使用V @ 2008。問題是什麼?我錯過了什麼?無法在win32項目中包含ntifs.h

EDIT1:

typedef NTSTATUS (*fp_CreatFile)(
    OUT PHANDLE FileHandle, 
    IN ACCESS_MASK DesiredAccess, 
    IN POBJECT_ATTRIBUTES ObjectAttributes, 
    OUT PIO_STATUS_BLOCK IoStatusBlock, 
    IN PLARGE_INTEGER AllocationSize OPTIONAL, 
    IN ULONG FileAttributes, 
    IN ULONG ShareAccess, 
    IN ULONG CreateDisposition, 
    IN ULONG CreateOptions, 
    IN PVOID EaBuffer OPTIONAL, 
    IN ULONG EaLength 
    ); 
OBJECT_ATTRIBUTES myAttributes; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    fp_CreatFile myFunction; 
    HMODULE module = LoadLibrary(L"ntdll.dll"); 
    if(NULL != module) 
    { 
     myFunction = (fp_CreatFile)GetProcAddress(module,"NtCreateFile"); 
    } 

    UNICODE_STRING string; 
    IO_STATUS_BLOCK fileStatus; 
    string.Length = 56; 
    string.Buffer = L"C:\\user\\kiddo\\Desktop\\7zFM.exe"; 
    string.MaximumLength = 56; 

    HANDLE fileHandle; 
    myAttributes.ObjectName = &string; 
    myAttributes.Length = sizeof(OBJECT_ATTRIBUTES); 
    long mystatus = myFunction(&fileHandle,FILE_GENERIC_READ,&myAttributes ,&fileStatus,NULL,FILE_ATTRIBUTE_NORMAL,FILE_SHARE_READ, 
     NULL,NULL,NULL,NULL); 
    return 0; 
} 

當試圖調用,它提供了以下錯誤消息框。 錯誤: 運行時檢查失敗#0 - ESP的值未正確保存在函數調用中。這通常是調用一個調用約定的函數聲明的結果,其中函數指針聲明的調用約定不同。

+0

你應該逐字地發佈編譯器輸出消息(複製和粘貼會更簡單和更準確的說明*);知道這是否是鏈接器或編譯器錯誤(該消息會告訴我們這一點)非常重要。很明顯,找不到的文件是一個處理器錯誤,但是在你嘗試修復原始問題之前*怎麼辦? – Clifford 2010-06-03 10:19:53

回答

4

如果你讀了MSDN documentation,第一段說:

Note Before using this function, please read Calling Internal APIs .

其中說:(我強調的重要組成部分)

The Winternl.h header file exposes prototypes of internal Windows APIs. There is no associated import library, so developers must use run-time dynamic linking to call the functions described in this header file.

The functions and structures in Winternl.h are internal to the operating system and subject to change from one release of Windows to the next, and possibly even between service packs for each release. To maintain the compatibility of your application, you should use the equivalent public functions instead. Further information is available in the header file, Winternl.h, and the documentation for each function.

If you do use these functions, you can access them through run-time dynamic linking using LoadLibrary and GetProcAddress. This gives your code an opportunity to respond gracefully if the function has been changed or removed from the operating system. Signature changes, however, may not be detectable.

所以你必須加載功能,你想要在使用它們之前使用NtDll.dll

這裏是一個非測試示例代碼示例:

typedef NTSTATUS (__stdcall *NtCreateFile)(
    OUT PHANDLE FileHandle, 
    IN ACCESS_MASK DesiredAccess, 
    IN POBJECT_ATTRIBUTES ObjectAttributes, 
    OUT PIO_STATUS_BLOCK IoStatusBlock, 
    IN PLARGE_INTEGER AllocationSize OPTIONAL, 
    IN ULONG FileAttributes, 
    IN ULONG ShareAccess, 
    IN ULONG CreateDisposition, 
    IN ULONG CreateOptions, 
    IN PVOID EaBuffer OPTIONAL, 
    IN ULONG EaLength 
    ); 

NtCreateFile _NtCreateFile = (NtCreateFile)GetProcAddress(GetModuleHandle("ntdll.dll"),"NtCreateFile"); 

// You can now use the function 
_NtCreateFile(/* params */); 

// Don't forget the release the resources 
+0

謝謝你的回覆ereOn,我確實喜歡你的建議,但又有一個RunTime錯誤..請檢查我的編輯進一步 – kiddo 2010-06-03 11:24:32

+0

@kiddo:你最後的錯誤很明顯:你嘗試調用另一個「調用約定「而不是它編譯的那個。如果你在你的函數聲明前嘗試了其中的一個:'__cdecl','__stdcall'(**可能是這個**)或'__fastcall'?我編輯了我的答案以添加有趣的部分。 – ereOn 2010-06-03 12:06:00

+0

它的工作,但它沒有收到任何文件句柄..請幫助我,如果你有關於函數的知識NtCreateFile – kiddo 2010-06-03 12:16:47

1

ZwCreateFile函數是Windows驅動程序工具包,不是Windows SDK的一部分。您需要安裝驅動程序工具包。 NTCreateFile使用的一些宏和類型也需要WDK頭。這在MSDN的文檔中有明確說明。

1

由於錯誤消息明確指出,您的調用約定錯誤,因此您放棄了NTAPI。它應該是:

typedef NTSTATUS (__stdcall * fp_CreatFile)(
    // etc.. 
); 

正確地初始化myAttributes通常很重要。我沒有看到你做任何可以保證調用未記錄的本機API函數的任何東西。儘可能堅持CreateFile()。

+0

是的,它的工作..但它沒有做任何事情..對此功能有任何想法..Ncreatic文件 – kiddo 2010-06-03 12:05:06

+0

原生的Windows API是無證的,我不應該知道它的任何事情。當然,它確實有*什麼是函數返回值? – 2010-06-03 12:20:12

+0

它的垃圾值..一些大的負值 – kiddo 2010-06-03 12:25:47

1

幾種可能性:

  • 你說的錯誤消息是 「找不到_NTCreateFile標識符」。 API的名稱是NtCreateFile()(注意小寫't')。有可能你只是使用了錯誤的名字。

  • ntifs.h和相關的鏈接庫包含在Windows驅動程序工具包(WDK)中,可以從這裏下載:http://www.microsoft.com/whdc/devtools/wdk/wdkpkg.mspx。您應該可以使用WDK直接執行您想要的操作,而不是使用動態鏈接。但是你通常必須購買一個全新的構建系統,或者找出如何將頭文件和庫集成到當前版本中。可以使用dynamic linking technique outlined by ereOn