![](/img/trans.png)
[英]Why include direct.h or sys/stat.h conditionally based on _WIN32 or __linux__?
[英]Not able to include ntifs.h in win32 project
我試圖使用名為NTCreateFile
的函數。 當我編譯它時給了我一個錯誤,說“找不到_NTCreateFile標識符”。 我包含了標題winternl.h
。 接下來我嘗試使用ZwCreatFile
,根據MSDN我包括ntifs.h
,但我無法包含該標頭。 它說“無法打開/找到目錄”。 我正在使用V @ 2008。 問題是什么? 我錯過了什么嗎?
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的值未在函數調用中正確保存。 這通常是調用使用一個調用約定聲明的函數和使用不同調用約定聲明的函數指針的結果。
如果您閱讀MSDN文檔 ,第一段說:
注意在使用此功能之前,請閱讀Calling Internal API 。
其中說:(我突出了重要部分)
Winternl.h頭文件公開了內部Windows API的原型。 沒有關聯的導入庫, 因此開發人員必須使用運行時動態鏈接來調用此頭文件中描述的函數 。
Winternl.h中的函數和結構是操作系統的內部結構,可能會從一個Windows版本更改為下一個版本,甚至可能在每個版本的Service Pack之間發生變化。 要保持應用程序的兼容性,您應該使用等效的公共函數。 有關詳細信息,請參見頭文件Winternl.h以及每個函數的文檔。
如果使用這些函數,則可以使用LoadLibrary和GetProcAddress通過運行時動態鏈接訪問它們 。 如果函數已從操作系統更改或刪除,則可以使代碼有機會正常響應。 但是,可能無法檢測到簽名更改。
因此,您必須先從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
ZwCreateFile是Windows驅動程序工具包的一部分,而不是Windows SDK。 您需要安裝驅動程序工具包。 NTCreateFile使用的某些宏和類型也需要WDK頭。 MSDN上的文檔中明確說明了這一點。
正如錯誤消息所明確指出的那樣,您的調用約定錯誤,您刪除了NTAPI。 它應該是:
typedef NTSTATUS (__stdcall * fp_CreatFile)(
// etc..
);
正確初始化myAttributes通常很重要。 我沒有看到你做任何可以保證調用未記錄的本機API函數。 只要你願意,堅持使用CreateFile()。
幾種可能性:
您說錯誤消息是“找不到_NTCreateFile標識符”。 API的名稱是NtCreateFile()
(注意小寫的't')。 您可能只是使用了錯誤的名稱。
ntifs.h
和相關鏈接庫包含在Windows驅動程序工具包(WDK)中,可從此處下載: http : //www.microsoft.com/whdc/devtools/wdk/wdkpkg.mspx 。 您應該能夠使用WDK比使用動態鏈接更直接地執行您想要的操作。 但是你通常需要購買一個全新的構建系統,或者弄清楚如何將頭文件和庫集成到你當前的構建中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.