我试图使用名为NTCreateFile
的函数。当我编译时,它给了我一个错误的说法
“找不到ntcreatefile标识符”。我包括头winternl.h
。因此,接下来我尝试使用ZwCreatFile
,根据msdn i includedntifs.h
,但我无法包含该头。上面写着“无法打开/找到目录”。我正在使用v@2008。怎么了?我有什么遗漏吗?
Eddi1:
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 documentation,第一段说:
注意在使用此功能之前,
请阅读Calling Internal APIs。
上面说:(我强调了重要的部分)
winternl.h头文件公开
内部windows api的原型。
没有关联的导入库,
所以开发人员必须使用运行时
调用函数的动态链接
在这个头文件中描述。
中的功能和结构
winternl.h是
操作系统,随时可能更改
从一个windows版本到
接下来,甚至可能是
每个版本的服务包。到
保持您的
应用程序,您应该使用
而是同等的公共职能。
更多信息请参见
头文件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