首页
社区
课程
招聘
[求助]DeviceIoControl 通讯 ,在内核返回时蓝屏.技术能力有限.请教
发表于: 2013-8-13 10:09 6645

[求助]DeviceIoControl 通讯 ,在内核返回时蓝屏.技术能力有限.请教

2013-8-13 10:09
6645
0: kd> !analyze -v
*******************************************************************************
*                                                                             *
*                        Bugcheck Analysis                                    *
*                                                                             *
*******************************************************************************

BAD_POOL_HEADER (19)
The pool is already corrupt at the time of the current request.
This may or may not be due to the caller.
The internal pool links must be walked to figure out a possible cause of
the problem, and then special pool applied to the suspect tags or the driver
verifier to a suspect driver.
Arguments:
Arg1: 00000020, a pool block header size is corrupt.
Arg2: 8217eb58, The pool entry we were looking for within the page.
Arg3: 8217eb68, The next pool entry.
Arg4: 1a020001, (reserved)

Debugging Details:
------------------

*************************************************************************
***                                                                   ***
***                                                                   ***
***    Your debugger is not using the correct symbols                 ***
***                                                                   ***
***    In order for this command to work properly, your symbol path   ***
***    must point to .pdb files that have full type information.      ***
***                                                                   ***
***    Certain .pdb files (such as the public OS symbols) do not      ***
***    contain the required information.  Contact the group that      ***
***    provided you with these symbols if you need this command to    ***
***    work.                                                          ***
***                                                                   ***
***    Type referenced: kernel32!pNlsUserInfo                         ***
***                                                                   ***
*************************************************************************
*************************************************************************
***                                                                   ***
***                                                                   ***
***    Your debugger is not using the correct symbols                 ***
***                                                                   ***
***    In order for this command to work properly, your symbol path   ***
***    must point to .pdb files that have full type information.      ***
***                                                                   ***
***    Certain .pdb files (such as the public OS symbols) do not      ***
***    contain the required information.  Contact the group that      ***
***    provided you with these symbols if you need this command to    ***
***    work.                                                          ***
***                                                                   ***
***    Type referenced: kernel32!pNlsUserInfo                         ***
***                                                                   ***
*************************************************************************

BUGCHECK_STR:  0x19_20

POOL_ADDRESS:  8217eb58 Nonpaged pool

DEFAULT_BUCKET_ID:  DRIVER_FAULT

PROCESS_NAME:  Xfilter.exe

IRP_ADDRESS:  81ef4008

DEVICE_OBJECT: 81f3d030

DRIVER_OBJECT: 81f4dd20

IMAGE_NAME:  xpacket.sys

DEBUG_FLR_IMAGE_TIMESTAMP:  52099028

MODULE_NAME: xpacket

FAULTING_MODULE: f88da000 xpacket

LAST_CONTROL_TRANSFER:  from 804f9df9 to 8052c5dc

STACK_TEXT:  
f54a4600 804f9df9 00000003 f54a495c 00000000 nt!RtlpBreakWithStatusInstruction
f54a464c 804fa9e4 00000003 81fbb9f8 8217eb58 nt!KiBugCheckDebugBreak+0x19
f54a4a2c 804faf33 00000019 00000020 8217eb58 nt!KeBugCheck2+0x574
f54a4a4c 8054c583 00000019 00000020 8217eb58 nt!KeBugCheckEx+0x1b
f54a4a9c 804f5c10 8217eb60 00000000 81ef4048 nt!ExFreePoolWithTag+0x2a3
f54a4af4 80500843 81ef4048 f54a4b40 f54a4b34 nt!IopCompleteRequest+0xf4
f54a4b44 806e7ef2 00000000 00000000 f54a4b5c nt!KiDeliverApc+0xb3
f54a4b44 806e7adf 00000000 00000000 f54a4b5c hal!HalpApcInterrupt+0xc6
f54a4bcc 804fd4e7 81ef4048 81ef4008 00000000 hal!KeReleaseQueuedSpinLock+0x37
f54a4bec 804f27e6 81ef4048 81fbb9f8 00000000 nt!KeInsertQueueApc+0x6d
f54a4c20 f88daf38 81ef4078 804d2160 8217eb60 nt!IopfCompleteRequest+0x1d8
f54a4c40 804f018f 81f3d030 81ef4008 806e7410 xpacket!XPacketIoControl+0x88 [e:\vcsoucre\xfilter2_for_9x_2k_xp\system.driver.ndis\xpacket.c @ 195]
f54a4c50 80580982 81ef4078 81fbb9f8 81ef4008 nt!IopfCallDriver+0x31
f54a4c64 805817f7 81f3d030 81ef4008 81fbb9f8 nt!IopSynchronousServiceTail+0x70
f54a4d00 8057a274 00000104 00000000 00000000 nt!IopXxxControlFile+0x5c5
f54a4d34 8054261c 00000104 00000000 00000000 nt!NtDeviceIoControlFile+0x2a
f54a4d34 7c92e4f4 00000104 00000000 00000000 nt!KiFastCallEntry+0xfc
0012883c 7c92d26c 7c801675 00000104 00000000 ntdll!KiFastSystemCallRet
00128840 7c801675 00000104 00000000 00000000 ntdll!NtDeviceIoControlFile+0xc
001288a0 00429655 00000104 804d2160 001288d4 kernel32!DeviceIoControl+0xdd
001288cc 004297c2 c0a88001 009c70f4 00000003 Xfilter!XF_GetNameFromIp+0x65 [e:\vcsoucre\xfilter2_for_9x_2k_xp\common\xcommon.cpp @ 525]
0012897c 0041efba c0a88001 009c70f4 00128b9c Xfilter!GetNameFromIp+0xc2 [e:\vcsoucre\xfilter2_for_9x_2k_xp\common\xcommon.cpp @ 588]
001289a4 0045fe51 00000003 00000017 1dcaa790 Xfilter!CMonitorSub::OnAddList+0x34a [e:\vcsoucre\xfilter2_for_9x_2k_xp\xfilter\monitorsub.cpp @ 137]
00128b14 0045f5e2 00000403 00000003 00000017 Xfilter!CWnd::OnWndMsg+0x841 [f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\wincore.cpp @ 2330]
00128b34 0045bb23 00000403 00000003 00000017 Xfilter!CWnd::WindowProc+0x32 [f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\wincore.cpp @ 2067]
00128bb4 0045c0e6 009d5144 000102f0 00000403 Xfilter!AfxCallWndProc+0xf3 [f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\wincore.cpp @ 248]
00128bd4 77d18734 000102f0 00000403 00000003 Xfilter!AfxWndProc+0xa6 [f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\wincore.cpp @ 411]
00128c00 77d18816 0045c040 000102f0 00000403 USER32!InternalCallWinProc+0x28
00128c68 77d189cd 00000000 0045c040 000102f0 USER32!UserCallWinProcCheckWow+0x150
00128cc8 77d18a10 00128cf0 00000000 00128d10 USER32!DispatchMessageWorker+0x306
00128cd8 77d27721 00128cf0 00250126 00000001 USER32!DispatchMessageW+0xf
00128d10 77d249c4 000a012e 00250126 00000001 USER32!DialogBox2+0x15a
00128d38 77d3a956 77d10000 001861a8 00250126 USER32!InternalDialogBox+0xd0
00128ff8 77d3a2bc 00129154 00000000 ffffffff USER32!SoftModalMessageBox+0x938
00129148 77d663fd 00129154 00000028 00250126 USER32!MessageBoxWorker+0x2ba
001291a0 77d664a2 00250126 00152330 0019ca80 USER32!MessageBoxTimeoutW+0x7a
001291d4 77d50877 00250126 001293bc 00946180 USER32!MessageBoxTimeoutA+0x9c
001291f4 77d5082f 00250126 001293bc 00946180 USER32!MessageBoxExA+0x1b
00129210 00798edc 00250126 001293bc 00946180 USER32!MessageBoxA+0x45
00129268 00774e17 001293bc 00946180 00012012 Xfilter!__crtMessageBoxA+0x20c [f:\dd\vctools\crt_bld\self_x86\crt\src\crtmbox.c @ 158]
0012a3cc 007806d8 00000002 00908974 0012b430 Xfilter!__crtMessageWindowA+0x3b7 [f:\dd\vctools\crt_bld\self_x86\crt\src\dbgrpt.c @ 363]
0012f460 00774a52 00000002 00908974 000000b7 Xfilter!_VCrtDbgReportA+0x7d8 [f:\dd\vctools\crt_bld\self_x86\crt\src\dbgrptt.c @ 417]
0012f480 00774a1b 00000002 00908974 000000b7 Xfilter!_CrtDbgReportV+0x22 [f:\dd\vctools\crt_bld\self_x86\crt\src\dbgrpt.c @ 241]
0012f4a8 0047deb0 00000002 00908974 000000b7 Xfilter!_CrtDbgReport+0x2b [f:\dd\vctools\crt_bld\self_x86\crt\src\dbgrpt.c @ 258]
0012f4e8 00494db9 00908974 000000b7 00000000 Xfilter!AfxAssertFailedLine+0x30 [f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\afxasert.cpp @ 25]
0012f634 00431d0b 01a84150 00008042 00000000 Xfilter!CFile::Open+0xb9 [f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\filecore.cpp @ 183]
0012f674 00431edb 1dcadb30 0012f9bc 0017d5e8 Xfilter!CXLogFile::OpenLog+0x8b [e:\vcsoucre\xfilter2_for_9x_2k_xp\common\xlogfile.cpp @ 126]
0012f7b4 0041913c 009c6e80 00000005 0012f934 Xfilter!CXLogFile::AddLog+0x4b [e:\vcsoucre\xfilter2_for_9x_2k_xp\common\xlogfile.cpp @ 172]
0012f7c4 0045fe51 00000000 009c6e80 1dcad5b0 Xfilter!CLogSub::OnAddLog+0x2c [e:\vcsoucre\xfilter2_for_9x_2k_xp\xfilter\logsub.cpp @ 59]
0012f934 0045f5e2 00000404 00000000 009c6e80 Xfilter!CWnd::OnWndMsg+0x841 [f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\wincore.cpp @ 2330]
0012f954 0045bb23 00000404 00000000 009c6e80 Xfilter!CWnd::WindowProc+0x32 [f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\wincore.cpp @ 2067]
0012f9d4 0045c0e6 009d6358 00010338 00000404 Xfilter!AfxCallWndProc+0xf3 [f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\wincore.cpp @ 248]
0012f9f4 77d18734 00010338 00000404 00000000 Xfilter!AfxWndProc+0xa6 [f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\wincore.cpp @ 411]
0012fa20 77d18816 0045c040 00010338 00000404 USER32!InternalCallWinProc+0x28
0012fa88 77d2927b 00000000 0045c040 00010338 USER32!UserCallWinProcCheckWow+0x150
0012fac4 77d2f40b 00c7c618 00c5a288 00000000 USER32!SendMessageWorker+0x4a5
0012fae4 00442d14 00010338 00000404 00000000 USER32!SendMessageA+0x7f
0012fb00 0041c9f0 00000404 00000000 009c6e80 Xfilter!CWnd::SendMessageA+0x44 [f:\dd\vctools\vc7libs\ship\atlmfc\include\afxwin2.inl @ 42]
0012fb20 0041ef80 00000000 009d5bec 009c6e80 Xfilter!CMonitorSub::AddListCenter+0x20 [e:\vcsoucre\xfilter2_for_9x_2k_xp\xfilter\monitorsub.cpp @ 223]
0012fb4c 0045fe51 00000003 00000000 1dcad038 Xfilter!CMonitorSub::OnAddList+0x310 [e:\vcsoucre\xfilter2_for_9x_2k_xp\xfilter\monitorsub.cpp @ 132]
0012fcbc 0045f5e2 00000403 00000003 00000000 Xfilter!CWnd::OnWndMsg+0x841 [f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\wincore.cpp @ 2330]
0012fcdc 0045bb23 00000403 00000003 00000000 Xfilter!CWnd::WindowProc+0x32 [f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\wincore.cpp @ 2067]
0012fd5c 0045c0e6 009d5144 000102f0 00000403 Xfilter!AfxCallWndProc+0xf3 [f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\wincore.cpp @ 248]
0012fd7c 77d18734 000102f0 00000403 00000003 Xfilter!AfxWndProc+0xa6 [f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\wincore.cpp @ 411]
0012fda8 77d18816 0045c040 000102f0 00000403 USER32!InternalCallWinProc+0x28
0012fe10 77d189cd 00000000 0045c040 000102f0 USER32!UserCallWinProcCheckWow+0x150
0012fe70 77d196c7 0017d5a0 00000001 0012fea0 USER32!DispatchMessageWorker+0x306
0012fe80 0048e7d2 0017d5a0 0012fea8 0048d66a USER32!DispatchMessageA+0xf
0012fea0 0048fcfe 009c7828 0012fec8 0048f50d Xfilter!AfxInternalPumpMessage+0x102 [f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\thrdcore.cpp @ 183]
0012feac 0048f50d 00000001 009c7828 0017d570 Xfilter!CWinThread::PumpMessage+0xe [f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\thrdcore.cpp @ 900]
0012fec8 0048cc99 009c7828 008b59d2 ffffffff Xfilter!CWinThread::Run+0x8d [f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\thrdcore.cpp @ 629]
0012fedc 007cb86f 00fe1eb0 0012fe01 0012ffa8 Xfilter!CWinApp::Run+0x59 [f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\appcore.cpp @ 822]
0012ff00 007cb70a 00400000 00000000 00152321 Xfilter!AfxWinMain+0xef [f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\winmain.cpp @ 47]
0012ff18 0076f3e2 00400000 00000000 00152321 Xfilter!WinMain+0x1a [f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\appmodul.cpp @ 26]
0012ffb8 0076f28f 0012fff0 7c817067 0222d720 Xfilter!__tmainCRTStartup+0x142 [f:\dd\vctools\crt_bld\self_x86\crt\src\crt0.c @ 275]

STACK_COMMAND:  kb

FOLLOWUP_IP:
xpacket!XPacketIoControl+88 [e:\vcsoucre\xfilter2_for_9x_2k_xp\system.driver.ndis\xpacket.c @ 195]
f88daf38 33c0            xor     eax,eax

FAULTING_SOURCE_CODE:  
   191:         Irp->IoStatus.Information = IoControl.dioc_cbOutBuf;
   192:     Irp->IoStatus.Status = STATUS_SUCCESS;
   193:         IoCompleteRequest(Irp, IO_NO_INCREMENT);
   194:
>  195:         return STATUS_SUCCESS;
   196: }
   197:
   198: //
   199: // 2002/05/24 move to here
   200: //

SYMBOL_STACK_INDEX:  b

SYMBOL_NAME:  xpacket!XPacketIoControl+88

FOLLOWUP_NAME:  MachineOwner

FAILURE_BUCKET_ID:  0x19_20_xpacket!XPacketIoControl+88

BUCKET_ID:  0x19_20_xpacket!XPacketIoControl+88

Followup: MachineOwner
---------

Ring3 通讯代码:
DWORD dwIp;
char* Name;

        BOOL result =  DeviceIoControl(hHandle,
                                                IOCTL_XPACKET_GET_NAME_FROM_IP,  
                                                &dwIp,                                       
                                                sizeof(dwIp),       
                                                Name,                               
                                                sizeof(Name),                                               
                                                &dwByteCount,                                       
                                                NULL                                       
                                                );

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 750
活跃值: (228)
能力值: ( LV9,RANK:780 )
在线值:
发帖
回帖
粉丝
2
内核代码不是很清楚,没有源码吗?

你的IOCTL_XPACKET_GET_NAME_FROM_IP 的定义是什么?

什么缓冲方式?METHOD_BUFFERED ?

如果是METHOD_BUFFERED  

Irp->IoStatus.SystemBuffer 是输入也是输出
2013-8-13 10:30
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
3
1:释放了一块被损坏的内存。
2:自旋锁使用不当。
2013-8-13 10:51
0
雪    币: 112
活跃值: (57)
能力值: ( LV12,RANK:200 )
在线值:
发帖
回帖
粉丝
4
Ring3 通讯代码:
DWORD dwIp;
char* Name;

  BOOL result =  DeviceIoControl(hHandle,
            IOCTL_XPACKET_GET_NAME_FROM_IP,  
            &dwIp,         
            sizeof(dwIp),  
            Name,        
            sizeof(Name),            
            &dwByteCount,         
            NULL         
            );

sizeof(Name) 这里错了吧?
char * Name 是你开辟的一个Buffer,  
sizeof(Name) size是 4
你应该传入 char * Name = new char[nYourBufferSize]的 nYourBufferSize

  BOOL result =  DeviceIoControl(hHandle,
            IOCTL_XPACKET_GET_NAME_FROM_IP,  
            &dwIp,         
            sizeof(dwIp),  
            Name,        
            nYourBufferSize,            
            &dwByteCount,         
            NULL         
            );

您试试~

变量命名要规范, 在您遇到的场景下, 匈牙利命名法的优势就显示出来了~
清晰的变量命名, 在排错过程中,能起到一定的作用。

R3和R0使用DeviceIoControl通讯的例子: D:\WinDDK\7600.16385.1\src\general\ioctl\wdm
您可以参考下,MSS R3怎么用的DeviceIoControl, R0怎么处理 IRP_MJ_DEVICE_CONTROL

MS使用DeviceIoControl通讯的例子下载: wdm.rar

您比对一下,您R3, R0的处理和MS WDK Demo 有何不同?

出现 : Arg1: 00000020, a pool block header size is corrupt.
首先考虑是否Buffer空间够大.

既然您通过WinDbg看到出错的位置, 可以尝试屏蔽一些多于代码, 将问题范围缩小.
e.g. 整理一个demo, R3专门处理DeviceIoControl, R0专门用于处理DeviceIoControl. 在整理的过程中, 您就能发现问题。
如果找不到问题,也方便对照WDK的Demo做试验,继续定位问题。

如果您最小化的Demo, 还不能定位问题,但是问题通过Demo可以重现. 您可以发上来,让路过的同学帮您一起调试.
通过WinDbg看您的工程, 好像功能还蛮多的. 如果将这个工程传上来,让大家帮您定位问题,估计您不舍的~~

FAULTING_SOURCE_CODE:  
   191:   Irp->IoStatus.Information = IoControl.dioc_cbOutBuf;
   192:     Irp->IoStatus.Status = STATUS_SUCCESS;
   193:   IoCompleteRequest(Irp, IO_NO_INCREMENT);
   194: 
>  195:   return STATUS_SUCCESS;
   196: }


您将R0填写缓冲区上面的那些(191行以上的代码)贴出来,就能看见问题。
先尝试将写给R3的Name, 改成一个字符'a', Irp->IoStatus.Information = 1;
这样是不会报错的.

然后看看R0返回的Name Length, 然后再看看R3开辟时分配的Size, 再看看R3传下来时的size.
这个问题就可以定位.
上传的附件:
2013-8-13 10:58
0
游客
登录 | 注册 方可回帖
返回
//