[英]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.