Pegram
论坛版主
论坛版主
  • 注册日期2005-12-03
  • 最后登录2013-08-23
  • 粉丝13
  • 关注5
  • 积分1333分
  • 威望4717点
  • 贡献值1点
  • 好评度78点
  • 原创分0分
  • 专家分2分
阅读:1377回复:3

这个页错误是怎么回事啊!

楼主#
更多 发布于:2007-03-19 16:53
  代码如下,简单明目(错误蹊跷):
POBJECT_NAME_INFORMATION  nameInfo = NULL;
...
nameInfo =
        (POBJECT_NAME_INFORMATION)ExAllocatePoolWithTag( NonPagedPool, 256*2, SFLT_POOL_TAG );
    status = ObQueryNameString(irpSp->FileObject, nameInfo, 256*2, &size );
    if(status == STATUS_BUFFER_OVERFLOW)
    {
        nameInfo = (POBJECT_NAME_INFORMATION)ExAllocatePoolWithTag( NonPagedPool, size + 2, SFLT_POOL_TAG );
        ASSERT(NULL != nameInfo);
        ObQueryNameString(irpSp->FileObject, nameInfo, size+2, &size );
    }

------->    if(nameInfo->Name.Length != 0 && nameInfo->Name.Buffer != NULL &&
        0 == RtlCompareString((PSTRING)nameInfo->Name.Buffer,
        (PSTRING)L"\\Device\\HarddiskVolume1\\good.doc", TRUE))
    {....
    }
在"------->" 的地方出现了页错误了。怎么回事?nameInfo已经正确取得了啦!
这个代码是在MJ_Create里面写的,此时IoCallDriver()已经调用返回了![p:4]
《寒江独钓》与《竹林蹊径》的合作作者。精通USB开发,设计了CY001 USB驱动套件(http://bbs.driverdevelop.com/read.php?tid-119314.html)。
rayyang2000
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2012-09-13
  • 粉丝3
  • 关注0
  • 积分1036分
  • 威望925点
  • 贡献值3点
  • 好评度823点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-03-20 06:51
引用第0楼张书爱玉2007-03-19 18:53发表的“这个页错误是怎么回事啊!”:
  代码如下,简单明目(错误蹊跷):
...
------->    if(nameInfo->Name.Length != 0 && nameInfo->Name.Buffer != NULL &&
       0 == RtlCompareString((PSTRING)nameInfo->Name.Buffer,
       (PSTRING)L"\\Device\\HarddiskVolume1\\good.doc", TRUE)
)
.......


typedef struct _STRING {
    USHORT Length;
    USHORT MaximumLength;
#ifdef MIDL_PASS
    [size_is(MaximumLength), length_is(Length) ]
#endif // MIDL_PASS
    PCHAR Buffer;
} STRING;


LONG
  RtlCompareString(
    IN PSTRING  String1,
    IN PSTRING  String2,
    BOOLEAN  CaseInSensitive
    );

typedef struct _OBJECT_NAME_INFORMATION {
  UNICODE_STRING Name;
} OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION;

typedef struct _UNICODE_STRING {
    USHORT Length;
    USHORT MaximumLength;
#ifdef MIDL_PASS
    [size_is(MaximumLength / 2), length_is((Length) / 2) ] USHORT * Buffer;
#else // MIDL_PASS
    PWSTR  Buffer;
#endif // MIDL_PASS
} UNICODE_STRING;


NTSTATUS
  ObQueryNameString(
    IN PVOID  Object,
    OUT POBJECT_NAME_INFORMATION  ObjectNameInfo,
    IN ULONG  Length,
    OUT PULONG  ReturnLength
    );

仔细看看这些定义~~~你彻底把东西搞混了...

而且第二次ExAllocatePoolWithTag的时候,要把前一次的memory释放掉
天天coding-debugging中----超稀饭memory dump file ======================================================== [b]Windows Device Driver Development and Consulting Service[/b] [color=blue][url]http://www.ybwork.com[/url][/color] ========================================================
Pegram
论坛版主
论坛版主
  • 注册日期2005-12-03
  • 最后登录2013-08-23
  • 粉丝13
  • 关注5
  • 积分1333分
  • 威望4717点
  • 贡献值1点
  • 好评度78点
  • 原创分0分
  • 专家分2分
板凳#
发布于:2007-03-20 09:40
真是谢谢阿。我不知道STRING的定义竟然是这样的,一直以为是字符串呢。没有你的提示,我怎么也不能领会到这个地步啊,谢谢。
《寒江独钓》与《竹林蹊径》的合作作者。精通USB开发,设计了CY001 USB驱动套件(http://bbs.driverdevelop.com/read.php?tid-119314.html)。
qiweixue
驱动小牛
驱动小牛
  • 注册日期2004-07-21
  • 最后登录2011-12-19
  • 粉丝0
  • 关注0
  • 积分1006分
  • 威望274点
  • 贡献值0点
  • 好评度268点
  • 原创分1分
  • 专家分0分
地板#
发布于:2008-01-04 16:36
我还以为是ObQueryNameString错误呢
http://www.osronline.com/showThread.cfm?link=25276

看错了,
游客

返回顶部