首页
社区
课程
招聘
[解决]vs2010配置驱动开发
发表于: 2010-7-19 19:29 20501

[解决]vs2010配置驱动开发

2010-7-19 19:29
20501
我用的是vs2010和winddk7配合开发,vs2010设置http://www.cnblogs.com/wubiyu/archive/2010/05/17/1737420.html
编译
#include "ntddk.h"

NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject,PUNICODE_STRING RegistryPath)
{
#if DBG
  _asm                int 3
#endif
  DbgPrint("haha");
        return STATUS_UNSUCCESSFUL;
}
成功,
但是再做寒江独钓第一个例子的时候(串口过滤那个)
调用ObDereferenceObject,
UNICODE_STRING name_str;
        static WCHAR name[32] = { 0 };
        PFILE_OBJECT fileobj = NULL;
        PDEVICE_OBJECT devobj = NULL;
        PVOID *p=NULL;

        // 输入字符串。  总的作用:将已开辟内存空间 name 的首 sizeof(WCHAR)*32 个字节的值设为值 0。
        memset(name,0,sizeof(WCHAR)*32);

        RtlStringCchPrintfW(
                name,32,
                L"\\Device\\Serial%d",id);
        RtlInitUnicodeString(&name_str,name);
       

        // 打开设备对象
        *status = IoGetDeviceObjectPointer(&name_str, FILE_ALL_ACCESS, &fileobj, &devobj);
        if (*status == STATUS_SUCCESS)
                ObDereferenceObject(fileobj);

链接时报SerialFilter.obj : error LNK2019: 无法解析的外部符号 _ObfDereferenceObject@4,该符号在函数 _ccpOpenCom@8 中被引用
其中
链接器设置如下

/OUT:"E:\profit\driver\DriverStudy\Driver\\Serialfilter.sys" /NOLOGO /LIBPATH:"E:\software\driver\winddk\lib\wxp\i386" "ntoskrnl.lib" "hal.lib" "ntstrsafe.lib" "BufferOverflowK.lib" "ntdll.lib" "wdm.lib"[/COLOR] /NODEFAULTLIB /MANIFEST:NO /ManifestFile:"Driver\Serialfilter.sys.intermediate.manifest" /ALLOWISOLATION /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /DEBUG /PDB:"E:\profit\driver\DriverStudy\Driver\Serialfilter.pdb" /SUBSYSTEM:NATIVE /Driver /PGD:"E:\profit\driver\DriverStudy\Driver\Serialfilter.pgd" /TLBID:1 /ENTRY:"DriverEntry" /BASE:"0x10000" /MACHINE:X86 /ERRORREPORT:QUEUE

已经加了"ntoskrnl.lib" ,为什么还报找不到方法
我别的方法链接基本上都正常,像IoGetDeviceObjectPointer这些都没问题
另外还有
1: error LNK2019: 无法解析的外部符号 _IofCompleteRequest@8,该符号在函数 _SFdispatch@8 中被引用
1>: error LNK2019: 无法解析的外部符号 _IofCallDriver@8,该符号在函数 _SFdispatch@8 中被引用

这两个也是有问题的,

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 517
活跃值: (84)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
2
SerialFilter.cpp中有没有正确包含了“ntddk.h”呢?好像你没有用extern "C" {#include <ntddk.h>};呢
2010-7-19 20:25
0
雪    币: 93
活跃值: (43)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
3
因为我采用的是编译为 C 代码 (/TC),所以#include "ntddk.h"
如果这时采用
extern "c"(
#include "ntddk.h"
        #include "ntstrsafe.h"       
};
我这样加了,直接报错,>SerialFilter.cpp(5): error C2059: 语法错误:“字符串”

我怀疑是因为调用约定的缘故,
因为
ObfDereferenceObject定义为这个FASTCALL
NTKERNELAPI
LONG_PTR
FASTCALL
ObfDereferenceObject(
    __in PVOID Object
    );
#endif

因为我根据网上教程选择调用约定为Calling Convention = __stdcall (/Gz),而我看那三个方法都是FASTCALL

如果我把vs2010中的c/c++ 高级选项中调用约定选择为__fastcall (/Gr),则再次编译链接时ObDereferenceObject和那两个都不再报错。。但是别的方法就错的一塌糊涂了

这种情况大家觉得呢
另外我参考了
http://blog.csdn.net/JerKii/archive/2006/05/29/760318.aspx

"对于一个没有指定调用约定的函数声明,编译器会根据当前编译器的配置来使用缺省的调用约定,编译器缺省的调用约定为__cdecl(通过/Gd参数指定)。当使用缺省的调用约定时,IoDeleteDevice的声明将变成 __declspec(dllimport) __cdecl void IoDeleteDevice ( ... ),从而在编译其内部产生__imp__IoDeleteDevice,但是在ntoskrnl.lib中IoDeleteDevice的函数修饰名为__imp__IoDeleteDevice@4(需要注意的是,Windows中的所有库函数均采用的是C的函数修饰名,这从lib文件中大量的__imp__XXXX@n和_XXXX@n函数修饰名可以看出)的decorative name。当编译器通过该decorative name去lib文件中查询连接信息时,自然就查不到了。因为IoDeleteDevice所在的ntoskrnl.exe在实现或在编译的时候使用的__stdcall调用约定,也许是ntddk.h的编写人员忘记给IoDeleteDevice的声明加上NTAPI(即__stdcall)了。所以,为了解决这个问题,我们有两种办法,一种是修改ntddk.h中的声明(即给IoDeleteDevice加上__stdcall调用约定),另外一种方法是更改当前编译器的缺省调用约定(即使用/Gz,即__stdcall)。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/JerKii/archive/2006/05/29/760318.aspx"

1>SerialFilter.obj : error LNK2019: 无法解析的外部符号 @IoGetDeviceObjectPointer@16,该符号在函数 @ccpOpenCom@8 中被引用
1>SerialFilter.obj : error LNK2019: 无法解析的外部符号 @IoDeleteDevice@4,该符号在函数 @ccpAttachDevice@16 中被引用
1>SerialFilter.obj : error LNK2019: 无法解析的外部符号 @IoAttachDeviceToDeviceStack@8,该符号在函数 @ccpAttachDevice@16 中被引用
1>SerialFilter.obj : error LNK2019: 无法解析的外部符号 @IoCreateDevice@28,该符号在函数 @ccpAttachDevice@16 中被引用
1>SerialFilter.obj : error LNK2019: 无法解析的外部符号 @MmMapLockedPagesSpecifyCache@24,该符号在函数 @SFdispatch@8 中被引用
1>SerialFilter.obj : error LNK2019: 无法解析的外部符号 @PoCallDriver@8,该符号在函数 @SFdispatch@8 中被引用
1>SerialFilter.obj : error LNK2019: 无法解析的外部符号 @PoStartNextPowerIrp@4,该符号在函数 @SFdispatch@8 中被引用
1>SerialFilter.obj : error LNK2019: 无法解析的外部符号 @KeDelayExecutionThread@12,该符号在函数 @SFunload@4 中被引用
1>SerialFilter.obj : error LNK2019: 无法解析的外部符号 @IoDetachDevice@4,该符号在函数 @SFunload@4 中被引用
2010-7-19 21:05
0
雪    币: 517
活跃值: (84)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
4
因为VS默认都是编译成C++代码,而ntddk.h是需要以C编译的。才能把里面的函数啊什么的编译成:Function@4这样的形式。否则编译成C++代码会变成Function@YZX这样子。
我用VS2008编译驱动,但由于不在公司,无法把相关配置传上来。
2010-7-19 21:32
0
雪    币: 93
活跃值: (43)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
5
搞定了,找到问题的所在了,
根据triones所说我找了个vs2008配置的对着看,最后发现我配置的vs2010中c/c++中预处理器定义里面的;_WIN32_WINNT=0x0400这句有问题,删掉了,再次编译连接就生成成功了,所以说网上给的那个vs2010配置驱动好像有点问题,
目前进展就到这里,

谢谢triones对我的无私帮助
2010-7-19 22:04
0
雪    币: 201
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
IceFisher,

could you please give me a copy of your setting?
many thanks

my email:
zoe.zhao@bakerhughes.com
2010-10-10 15:21
0
雪    币: 37
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
用VisualDDK解决你一般的驱动开发的环境问题!好用有方便!
2010-10-11 10:19
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
一点小问题:

extern "c"

是不是应为大写字母 "C"
2010-10-19 16:46
0
雪    币: 384
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
每新建一个工程都要弄一大坨设置???
有没有向导或模板之类的玩意???
2010-11-24 22:07
0
雪    币: 43
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
10
http://hi.baidu.com/q_lai_a_qu/blog/item/6fdb6ceeea70bcefb2fb951b.html
2011-4-16 20:32
0
游客
登录 | 注册 方可回帖
返回
//