danxuezx
驱动牛犊
驱动牛犊
  • 注册日期2009-03-01
  • 最后登录2011-09-18
  • 粉丝0
  • 关注0
  • 积分75分
  • 威望601点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1979回复:1

由windbg里的这些信息怎样得到错误的原因

楼主#
更多 发布于:2010-04-21 17:46
windbg刚开始使用,目前只知道单步执行,g等几个简单的命令。
下面是出错的地方的一些信息,由下面的信息再用什么命令怎样分析一下才能得到具体的原因呢?

VScsiDisk!VScsiDiskScsiInternalDeviceIoControlDispatch+0x478:
f7fc4308 0fb74dac        movzx   ecx,word ptr [ebp-54h]
kd> p
VScsiDisk!VScsiDiskScsiInternalDeviceIoControlDispatch+0x48b:
f7fc431b 8b55f4          mov     edx,dword ptr [ebp-0Ch]
kd> p
VScsiDisk!VScsiDiskScsiInternalDeviceIoControlDispatch+0x4df:
f7fc436f 8b4df4          mov     ecx,dword ptr [ebp-0Ch]
kd> p
VScsiDisk!VScsiDiskScsiInternalDeviceIoControlDispatch+0x4e7:
f7fc4377 8b550c          mov     edx,dword ptr [ebp+0Ch]
kd> p
VScsiDisk!VScsiDiskScsiInternalDeviceIoControlDispatch+0x4f0:
f7fc4380 8b4df4          mov     ecx,dword ptr [ebp-0Ch]
kd> p
VScsiDisk!VScsiDiskScsiInternalDeviceIoControlDispatch+0x504:
f7fc4394 8b4df0          mov     ecx,dword ptr [ebp-10h]
kd> p
Access violation - code c0000005 (!!! second chance !!!)
nt!memcpy+0x33:
80535ae3 f3a5            rep movs dword ptr es:[edi],dword ptr [esi]

出错的代码是:

                      if((METHOD_OUT_DIRECT == METHOD_FROM_CTL_CODE(ulIoCode) ) ||
                (METHOD_IN_DIRECT == METHOD_FROM_CTL_CODE(ulIoCode)))
            {
            buffer = MmGetSystemAddressForMdl(Irp->MdlAddress);
            }

            if(METHOD_BUFFERED == METHOD_FROM_CTL_CODE(ulIoCode))
            {
            buffer = Irp->AssociatedIrp.SystemBuffer;
            }

            if(METHOD_NEITHER == METHOD_FROM_CTL_CODE(ulIoCode))
            {
                buffer = Irp->UserBuffer ;
            }
                      
                       RtlCopyMemory(g_Buffer + logicalBlockAddress*512, buffer, srb->DataTransferLength );
            
走了RtlCopyMemory(g_Buffer + logicalBlockAddress*512, buffer, srb->DataTransferLength );代码后windbg出现了上面的信息。


其中g_Buffer是全局变量:
UCHAR * g_Buffer=NULL;
g_Buffer=ExAllocatePoolWithTag( NonPagedPool ,VSCSI_BUFFER_SIZE ,'RAMB');
这里分配内存是成功的。
此时其它变量的值:
logicalBlockAddress = 0;
srb->DataTransferLength = 1;
buffer = 0x00000000;
跟踪发现buffer是由第2个if中得到的值,即:buffer = Irp->AssociatedIrp.SystemBuffer;
 
hust_9
驱动牛犊
驱动牛犊
  • 注册日期2010-05-06
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分22分
  • 威望141点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2010-05-19 12:23
兄弟啊,你都会用WINDBG了啊。
我生用driverstudio成了一个驱动,用VC6.0打开,功能里面挂了两个子工程,分别编译都能过,我怎么调试呢??
游客

返回顶部