C 无法在win32项目中包含ntifs.h

C 无法在win32项目中包含ntifs.h,c,winapi,kernel,C,Winapi,Kernel,我尝试使用名为NTCreateFile的函数。当我编译时,它给了我一个错误 “\n未找到创建文件标识符”。我输入了标题winternl.h。因此,接下来我尝试使用ZwCreatFile,根据msdni includentifs.h,但我无法包含该头。上面写着“无法打开/找到目录”。我正在使用V@2008. 有什么问题?我遗漏了什么吗 EDIT1: typedef NTSTATUS (*fp_CreatFile)( OUT PHANDLE FileHandle, IN ACCESS

我尝试使用名为
NTCreateFile
的函数。当我编译时,它给了我一个错误 “\n未找到创建文件标识符”。我输入了标题
winternl.h
。因此,接下来我尝试使用
ZwCreatFile
,根据msdni include
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的值。这通常是调用使用一种调用约定声明的函数,并使用另一种调用约定声明的函数指针的结果。

如果您阅读了,第一段会说:

注意:在使用此功能之前, 请阅读

上面说:(我强调了重要的部分)

Winternl.h头文件公开 内部Windows API的原型。 没有关联的导入库, 因此开发人员必须使用运行时 调用函数的动态链接 在这个头文件中描述

图书馆的功能与结构 Winternl.h是 操作系统和系统可能会发生更改 从Windows的一个版本到 下一步,甚至可能是 每个版本的服务包。到 保持您的应用程序的兼容性 应用程序,您应该使用 取而代之的是同等的公共职能。 有关更多信息,请参阅 头文件Winternl.h和 每个功能的文档

如果您确实使用了这些函数,您可以 通过运行时动态数据库访问它们 链接使用和 。这将提供您的代码 优雅回应的机会 如果功能已更改,或 已从操作系统中删除。 但是,签名更改可能不受限制 可检测的

因此,您必须先从
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()。

几种可能性:

  • 您说错误消息是“\u NTCreateFile identifier not found”。API的名称是
    NtCreateFile()
    (注意小写字母“t”)。很可能你只是用错了名字

  • ntifs.h
    和相关链接库包含在Windows驱动程序工具包(WDK)中,可从以下位置下载:。与使用动态链接相比,您应该能够更直接地使用WDK来做您想要做的事情。但是,您通常需要购买一个全新的构建系统,或者了解如何将头文件和库集成到当前构建中

  • 您可以使用


您应该逐字发布编译器输出消息(复制粘贴比描述更简单、更准确);重要的是要知道这是否是链接器或编译器错误(消息会告诉我们)。显然,找不到文件是一个pro processor错误,但是在您尝试修复原始问题之前呢?谢谢您的回复,我确实喜欢您的建议,但是再次出现运行时错误。请检查我的编辑further@kiddo:您的上一个错误非常清楚:您试图使用另一个“调用约定”调用方法而不是为它编译的那个。如果您尝试函数声明前面的选项:
\uuu cdecl
\uu stdcall
(可能是这一个)或
\uu fastcall
?我编辑了我的答案,添加了有趣的部分。它工作了,但没有收到任何文件句柄。如果你知道这个函数,请帮助我NtCreateFile@kiddo我从未使用过这个函数。我所能做的就是以某种方式为您“解密”文档,并为您提供一般性建议。如果您真的陷入困境,我建议您启动一个新的基本示例项目来测试这一点。一旦你让它运行起来,你就可以将它与你的实际代码进行比较,找出它的错误所在。嘿,埃伦……为什么不给我你的电子邮件id……我们会联系的。。。如果你感兴趣的话,是的,它工作了。但是它没有做任何事情。你知道这个函数吗。ntcreatefile本机Windows API没有文档记录,我不应该知道任何关于它的事情。它确实做了些什么,函数返回值是什么?它是一个垃圾值。一些大的负值状态码是大值,而不是垃圾。它们列在ntstatus.h SDK头文件中。