首页
社区
课程
招聘
[求助][求助]一个很鬼异的问题(DDK编译器引起的吗?)请教大家!
发表于: 2012-9-6 19:23 5636

[求助][求助]一个很鬼异的问题(DDK编译器引起的吗?)请教大家!

2012-9-6 19:23
5636
整个项目比较大,代码上千行!!!

仅修改里面几行引起很怪的问题:
  修改前:
        RtlInitUnicodeString(&mKbdD, L"\\Driver\\kbdclass");
    mStatus = ObReferenceObjectByName(&mKbdD, OBJ_CASE_INSENSITIVE, NULL, 0, *IoDriverObjectType, KernelMode, NULL, &gKbdDO);
    if (!NT_SUCCESS(mStatus))  {               
                DbgPrint("ObReferenceObjectByName \\Driver\\kbdclass failed %x.\n", mStatus);
                return mStatus;
        }
    ObfDereferenceObject(gKbdDO);

        KeAcquireSpinLock(&Globals.SpinLock, &mKirql);
        MmPressKeyRecord = (PUCHAR)ExAllocatePoolWithTag(NonPagedPool, MAXPRESSKEYSIZE, MemoryTag);
    if (NULL != MmPressKeyRecord) {
            OldKeyboardRead = (OldMajorFunc)gKbdDO->MajorFunction[IRP_MJ_READ];
            InterlockedCompareExchangePointer((PVOID)&gKbdDO->MajorFunction[IRP_MJ_READ], MyIRPKeyboardRead, OldKeyboardRead);//多CPU HOOK:本处指令,有待测试             
        }
        KeReleaseSpinLock(&Globals.SpinLock, mKirql);
  修改后:

        RtlInitUnicodeString(&mKbdD, L"\\Driver\\kbdclass");
    mStatus = ObReferenceObjectByName(&mKbdD, OBJ_CASE_INSENSITIVE, NULL, 0, (POBJECT_TYPE)IoDriverObjectType, KernelMode, NULL, &gKbdDO);
    if (!NT_SUCCESS(mStatus))  {               
                DbgPrint("ObReferenceObjectByName \\Driver\\kbdclass failed %x.\n", mStatus);
                return mStatus;
        }

        //KeAcquireSpinLock(&Globals.SpinLock, &mKirql);
        KeRaiseIrql(HIGH_LEVEL, &mKirql);
        MmPressKeyRecord = (PUCHAR)ExAllocatePoolWithTag(NonPagedPool, MAXPRESSKEYSIZE, MemoryTag);
    if (NULL != MmPressKeyRecord) {
            OldKeyboardRead = (OldMajorFunc)gKbdDO->MajorFunction[IRP_MJ_READ];
            //InterlockedCompareExchangePointer((PVOID)&gKbdDO->MajorFunction[IRP_MJ_READ], MyIRPKeyboardRead, OldKeyboardRead);//多CPU HOOK:本处指令,有待测试             
                gKbdDO->MajorFunction[IRP_MJ_READ] = MyIRPKeyboardRead;
        }
        //KeReleaseSpinLock(&Globals.SpinLock, mKirql);
        KeLowerIrql(mKirql);

    ObfDereferenceObject(gKbdDO);

修改后的加载
      提示!!!ObReferenceObjectByName \Driver\kbdclass failed c0000024.

使用WINDBG加载上PDB调试,蓝屏位置在代码其他处!!!!

修改前的加载,测试很久无此问题.......

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

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 952
活跃值: (1821)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
查一下 c0000024 是什么
2012-9-6 21:39
0
雪    币: 222
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
我是指,会不会是编译器优化,或者其他什么问题引起?
2012-9-6 23:30
0
雪    币: 952
活跃值: (1821)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
这点可以告诉你,99.99999999%不会是这原因,编译器bug还没遇到过,你想多了
2012-9-7 00:14
0
雪    币: 5
活跃值: (1131)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
你的类型定义错了:
extern "C"
{
        extern POBJECT_TYPE                 *IoDriverObjectType;
}
2012-9-7 07:47
0
雪    币: 222
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
主要是测试win7发现问题。xp 2003也没有问题。
2012-9-7 07:58
0
雪    币: 1233
活跃值: (907)
能力值: ( LV12,RANK:750 )
在线值:
发帖
回帖
粉丝
7
为什么第一个是ObReferenceObjectByName 参数是 *IoDriverObjectType
第二个ObReferenceObjectByName 调用参数是IoDriverObjectType呢?搞不懂呢
2012-9-7 08:10
0
雪    币: 222
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
原来还真是这的问题,非常感谢!!但是引起的问题位置很神奇。
2012-9-7 08:28
0
游客
登录 | 注册 方可回帖
返回
//