一般驱动层开发都会调用到ntoskrnl,ntdll导出的API,如果直接使用的话,会报identifier not found的错误。其实API已经实现了,我们的驱动是有内核负责加载的,应该就可以读取到,所以加个声明,如:
如果是ntoskrnl导出的
声明API前加NTKERNELAPI
如果是ntdll导出的
声明前加NTSYSAPI
如:
NTKERNELAPI
NTSTATUS
IoQueryVolumeInformation(
IN PFILE_OBJECT FileObject,
IN FS_INFORMATION_CLASS FsInformationClass,
IN ULONG Length,
OUT PVOID FsInformation,
OUT PULONG ReturnedLength
);
NTSTATUS
IoQueryVolumeInformation(
IN PFILE_OBJECT FileObject,
IN FS_INFORMATION_CLASS FsInformationClass,
IN ULONG Length,
OUT PVOID FsInformation,
OUT PULONG ReturnedLength
);
其实NTKERNELAPI和NTSYSAPI宏定义都是一样的,在ntddk.h和ntdef.h里面,如下
#define NTKERNELAPI DECLSPEC_IMPORT
#define NTSYSAPI DECLSPEC_IMPORT
#if (defined(_M_IX86) || defined(_M_IA64) || defined(_M_AMD64)) && !defined(MIDL_PASS)
#define DECLSPEC_IMPORT __declspec(dllimport)
#else
#define DECLSPEC_IMPORT
#endif
#define DECLSPEC_IMPORT __declspec(dllimport)
#else
#define DECLSPEC_IMPORT
#endif
另外如果你加了声明,还是报error LNK2019: unresolved external symbol,说明你声明的方式还是不对的,请注意,如果你的代码文件是.cpp,那么需要加extern "C"的声明。