6855|17

75

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

ZwWriteFile错误导致蓝屏 [复制链接]

最近写一个过滤驱动,拦截用户操作,将内容备份到指定文件。
创建文件成功,但在ZwWriteFile这里发生错误导致蓝屏。
应该不是数组越界,好像是文件创建参数指定什么的有问题。
第一次写驱动程序,感觉挺难的。谁来帮忙看看。

相关代码如下:


  1. #define FILE_NAME (L"\\??\\c:\\tmp\\tmp")
  2. #define MAX_SIZE 512
  3. struct
  4. {
  5.         ULONG Length;
  6.         UCHAR Str[MAX_SIZE];
  7. } Buffer;
复制代码



  1.         NTSTATUS                        status;
  2.         OBJECT_ATTRIBUTES                objectAttributes;
  3.         IO_STATUS_BLOCK                ioStatusBlock;
  4.         UNICODE_STRING                filePath;
  5.         HANDLE                        handle;
  6.        
  7.         RtlInitUnicodeString(&filePath, FILE_NAME);
  8.        
  9.         InitializeObjectAttributes(
  10.                 OUT &objectAttributes,
  11.                 IN &filePath,
  12.                 IN OBJ_CASE_INSENSITIVE,
  13.                 IN NULL,
  14.                 IN NULL
  15.                 );

  16.         status = ZwCreateFile(
  17.                 OUT &handle,
  18.                 IN GENERIC_ALL | FILE_APPEND_DATA,
  19.                 IN &objectAttributes,
  20.                 OUT &ioStatusBlock,
  21.                 IN NULL,
  22.                 IN FILE_ATTRIBUTE_NORMAL,
  23.                 IN FILE_SHARE_READ | FILE_SHARE_WRITE,
  24.                 IN FILE_OPEN_IF,
  25.                 IN FILE_SYNCHRONOUS_IO_NONALERT,
  26.                 IN NULL,
  27.                 IN 0);
  28.         if (!NT_SUCCESS(status))
  29.         {
  30.                 DbgPrint("ZwCreateFile error\n");
  31.                 return 0;
  32.         }
  33.         status = ZwWriteFile(
  34.                 IN handle,
  35.                 IN NULL,
  36.                 IN NULL,
  37.                 IN NULL,
  38.                 OUT &ioStatusBlock,
  39.                 IN Buffer.Str,
  40.                 IN Buffer.Length,
  41.                 IN NULL,
  42.                 IN NULL
  43.          );
  44.        
  45.         if (!NT_SUCCESS(status))
  46.         {
  47.                 DbgPrint("ZwWriteFile error\n");
  48.         }
复制代码

最新回复

帮顶,坐等高手!!  详情 回复 发表于 2010-6-18 12:50
点赞 关注

回复
举报

67

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
蓝屏信息是什么?把蓝屏信息贴出来大家看看。

看上去ZwWriteFile的第6,7参数有问题,(PVOID Buffer, ULONG Length)。你的Buffer变量定义并赋值了么?好像你只是声明了,并没有定义。所以,系统有可能在操作空指针。
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
引用 1 楼 huntercao 的回复:
蓝屏信息是什么?把蓝屏信息贴出来大家看看。

看上去ZwWriteFile的第6,7参数有问题,(PVOID Buffer, ULONG Length)。你的Buffer变量定义并赋值了么?好像你只是声明了,并没有定义。所以,系统有可能在操作空指针。

应该不是这个问题,上面的仅是抽取出来的一部分代码,我没全贴上
错误代码为
Stop:0x000000b8
 
 
 

回复

86

帖子

0

TA的资源

一粒金砂(初级)

4
 
我开始学习时,蓝屏了n次,用windbg + 虚拟机单步调试,找到蓝屏代码,再分析
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

5
 
把更详细的BSOD信息贴出来, Bug Check 0xB8: ATTEMPTED_SWITCH_FROM_DPC告诉不了更有用的信息。

1. 最好用WinDBG调试,蓝屏后,用!analyze -v提取比较完整的蓝屏信息;不然大家很难帮你;
2. 猜测一下:你的ZwWriteFile() 是在某一个IRP的Complete  Routine里面调用的么?

 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

6
 
很有可能是中断级别问题,仔细看看你的实现代码上下文在什么样的中断级别。
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

7
 
    status = ZwCreateFile(
        OUT &handle,
        IN GENERIC_ALL | FILE_APPEND_DATA | SYNCHRONIZE,
        IN &objectAttributes,
        OUT &ioStatusBlock,
        IN NULL,
        IN FILE_ATTRIBUTE_NORMAL,
        IN FILE_SHARE_READ | FILE_SHARE_WRITE,
        IN FILE_OPEN_IF,
        IN FILE_SYNCHRONOUS_IO_NONALERT,
        IN NULL,
        IN 0);
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

8
 
引用 4 楼 huntercao 的回复:
把更详细的BSOD信息贴出来, Bug Check 0xB8: ATTEMPTED_SWITCH_FROM_DPC告诉不了更有用的信息。

1. 最好用WinDBG调试,蓝屏后,用!analyze -v提取比较完整的蓝屏信息;不然大家很难帮你;
2. 猜测一下:你的ZwWriteFile() 是在某一个IRP的Complete Routine里面调用的么?

好像是这个问题,但我把它放在一个新创建的线程里还是错误。到创建线程那里会出错,在Complete Routine创建线程也不可以么?
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

9
 
我是在写一个键盘过滤程序,用了两个缓冲区,每一次击键写一个字符到第一个缓冲,这个缓冲满后再把它中的数据复制到第二个缓冲区,再创建一个线程从第二个缓冲区中复制数据到文件。

调试信息如下:
ATTEMPTED_SWITCH_FROM_DPC (b8)
A wait operation, attach process, or yield was attempted from a DPC routine.
This is an illegal operation and the stack track will lead to the offending
code and original DPC routine.
Arguments:
Arg1: 00000000, Original thread which is the cause of the failure
Arg2: 00000000, New thread
Arg3: 00000000, Stack address of the original thread
Arg4: 00000000

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


DEFAULT_BUCKET_ID:  DRIVER_FAULT

BUGCHECK_STR:  0xB8

PROCESS_NAME:  System

LAST_CONTROL_TRANSFER:  from 804f8bad to 80528bec

STACK_TEXT:  
8054a2a0 804f8bad 00000003 8054a5fc 00000000 nt!RtlpBreakWithStatusInstruction
8054a2ec 804f979a 00000003 805537c0 81bbb3c8 nt!KiBugCheckDebugBreak+0x19
8054a6cc 804f9ca0 000000b8 00000000 00000000 nt!KeBugCheck2+0x574
8054a6ec 80542a47 000000b8 ffffffff 00000202 nt!KeBugCheck+0x14
8054a6fc 805428bf 8054a714 806d3753 0000003d nt!SwapContext+0x157
8054a70c 806d3a86 8054a7e0 806d3753 badb0d00 nt!KiDispatchInterrupt+0x7f
8054a70c 806d3753 8054a7e0 806d3753 badb0d00 hal!HalpDispatchInterrupt+0xba
8054a784 805463ed 00000000 8054a8c8 00000000 hal!ExAcquireFastMutex+0xf
8054a7e0 805dc9a8 00000001 00000001 63416553 nt!ExAllocatePoolWithTag+0x4ed
8054a808 805dcdb7 00000000 00000000 00000000 nt!RtlpInheritAcl+0x28
8054a8e4 805e819f 00000000 e1110c40 8054a93c nt!RtlpNewSecurityObject+0x387
8054a910 805b69a1 00000000 00000000 8054a93c nt!SeAssignSecurity+0x4f
8054a940 805b9fd7 8054aa54 00000000 816868c0 nt!ObAssignSecurity+0x35
8054aa28 805c796c 816868c0 8054aa54 00000000 nt!ObInsertObject+0x473
8054ab80 805c83ed 8054abdc 00000000 00000000 nt!PspCreateThread+0x618
8054abb4 f09a5e46 8054abdc 00000000 00000000 nt!PsCreateSystemThread+0x33
8054abfc 804f16ae 81b08b70 8175d118 81b08b70 KbdFilter!kbdfReadComplete+0x1c6 [g:\code\kernel\kbdfilter\kbd_filter.c @ 440]
8054ac2c f9c4d314 00000000 8187f950 80542320 nt!IopfCompleteRequest+0xa2
8054ac48 f9a1c712 0000000c 81751f0c 8175d218 kbdclass!KeyboardClassServiceCallback+0x182
8054acac 80542b9d 8187fafc 0187f898 00000000 i8042prt!I8042KeyboardIsrDpc+0xf0
8054acd0 80542b16 00000000 0000000e 00000000 nt!KiRetireDpcList+0x46
8054acd4 00000000 0000000e 00000000 00000000 nt!KiIdleLoop+0x26


STACK_COMMAND:  kb

FOLLOWUP_IP:
KbdFilter!kbdfReadComplete+1c6 [g:\code\kernel\kbdfilter\kbd_filter.c @ 440]
f09a5e46 8945e8          mov     dword ptr [ebp-18h],eax

FAULTING_SOURCE_CODE:  
   436:                                                                                                 NULL,
   437:                                                                                                 NULL,
   438:                                                                                                 NULL,
   439:                                                                                                 kbdFlush,
>  440:                                                                                                 &FlushBuffer);
   441:                                         if (!NT_SUCCESS(status))
   442:                                         {
   443:                                                 goto ERROR;
   444:                                         }
   445:                                        


SYMBOL_STACK_INDEX:  10

SYMBOL_NAME:  KbdFilter!kbdfReadComplete+1c6

FOLLOWUP_NAME:  MachineOwner

MODULE_NAME: KbdFilter

IMAGE_NAME:  KbdFilter.sys

DEBUG_FLR_IMAGE_TIMESTAMP:  4c1132f3

FAILURE_BUCKET_ID:  0xB8_KbdFilter!kbdfReadComplete+1c6

BUCKET_ID:  0xB8_KbdFilter!kbdfReadComplete+1c6

Followup: MachineOwner
 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

10
 
出错的地方是创建线程的函数

  1.                                        
  2.         status = PsCreateSystemThread(
  3.                                                                                                 &threadHandle,
  4.                                                                                                 (ACCESS_MASK)0L,
  5.                                                                                                 NULL,
  6.                                                                                                 NULL,
  7.                                                                                                 NULL,
  8.                                                                                                 kbdFlush,
  9.                                                                                                 &FlushBuffer);
复制代码
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

11
 
在IRP Complete Routine里面做事会有非常多的限制。具体你可以去看WDK文档。

如果真要创建线程,建议在收到某个IRP的时候(比如 IRP_MJ_CREATE)或者AddDevice的时候进行,而不要在Complete Routine里面。
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

12
 
鉴于你的设计需求,可以试着在Complete Routine里面创建DPC,或者Work Item,在对应的DPC或者Work item里面进行写文件操作会比较安全。
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

13
 
u p
 
 
 

回复

99

帖子

0

TA的资源

一粒金砂(初级)

14
 
不懂,up
 
 
 

回复

49

帖子

0

TA的资源

一粒金砂(初级)

15
 
不懂,up
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

16
 
引用 11 楼 huntercao 的回复:
鉴于你的设计需求,可以试着在Complete Routine里面创建DPC,或者Work Item,在对应的DPC或者Work item里面进行写文件操作会比较安全。

在完成例程里创建DCP好像也不行,和上面一样的错误。
我在初始化时开一个线程,一进入后就等待事件。在完成例程里设置事件触发,这样问题解决。
 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

17
 
DPC
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

18
 
帮顶,坐等高手!!
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表