ZwWriteFile错误导致蓝屏

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

相关代码如下:


#define FILE_NAME (L"\\??\\c:\\tmp\\tmp")
#define MAX_SIZE 512
struct
{
ULONG Length;
UCHAR Str[MAX_SIZE];
} Buffer;




NTSTATUS status;
OBJECT_ATTRIBUTES objectAttributes;
IO_STATUS_BLOCK ioStatusBlock;
UNICODE_STRING filePath;
HANDLE handle;

RtlInitUnicodeString(&filePath, FILE_NAME);

InitializeObjectAttributes(
OUT &objectAttributes,
IN &filePath,
IN OBJ_CASE_INSENSITIVE,
IN NULL,
IN NULL
);

status = ZwCreateFile(
OUT &handle,
IN GENERIC_ALL | FILE_APPEND_DATA,
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);
if (!NT_SUCCESS(status))
{
DbgPrint("ZwCreateFile error\n");
return 0;
}
status = ZwWriteFile(
IN handle,
IN NULL,
IN NULL,
IN NULL,
OUT &ioStatusBlock,
IN Buffer.Str,
IN Buffer.Length,
IN NULL,
IN NULL
);

if (!NT_SUCCESS(status))
{
DbgPrint("ZwWriteFile error\n");
}
...全文
400 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
cvBct8yd 2010-12-12
  • 打赏
  • 举报
回复
bvBct8yd 2010-12-12
  • 打赏
  • 举报
回复
avBct8yd 2010-12-12
  • 打赏
  • 举报
回复
kongzhongxx 2010-06-18
  • 打赏
  • 举报
回复
帮顶,坐等高手!!
elated 2010-06-12
  • 打赏
  • 举报
回复
DPC
elated 2010-06-12
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 huntercao 的回复:]
鉴于你的设计需求,可以试着在Complete Routine里面创建DPC,或者Work Item,在对应的DPC或者Work item里面进行写文件操作会比较安全。
[/Quote]
在完成例程里创建DCP好像也不行,和上面一样的错误。
我在初始化时开一个线程,一进入后就等待事件。在完成例程里设置事件触发,这样问题解决。
elated 2010-06-11
  • 打赏
  • 举报
回复
出错的地方是创建线程的函数


status = PsCreateSystemThread(
&threadHandle,
(ACCESS_MASK)0L,
NULL,
NULL,
NULL,
kbdFlush,
&FlushBuffer);
elated 2010-06-11
  • 打赏
  • 举报
回复
我是在写一个键盘过滤程序,用了两个缓冲区,每一次击键写一个字符到第一个缓冲,这个缓冲满后再把它中的数据复制到第二个缓冲区,再创建一个线程从第二个缓冲区中复制数据到文件。

调试信息如下:
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
elated 2010-06-11
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 huntercao 的回复:]
把更详细的BSOD信息贴出来, Bug Check 0xB8: ATTEMPTED_SWITCH_FROM_DPC告诉不了更有用的信息。

1. 最好用WinDBG调试,蓝屏后,用!analyze -v提取比较完整的蓝屏信息;不然大家很难帮你;
2. 猜测一下:你的ZwWriteFile() 是在某一个IRP的Complete Routine里面调用的么?
[/Quote]
好像是这个问题,但我把它放在一个新创建的线程里还是错误。到创建线程那里会出错,在Complete Routine创建线程也不可以么?
hfCoder 2010-06-11
  • 打赏
  • 举报
回复
不懂,up
cjyh0036 2010-06-11
  • 打赏
  • 举报
回复
不懂,up
hfCoder 2010-06-11
  • 打赏
  • 举报
回复
u p
曹大夯 2010-06-11
  • 打赏
  • 举报
回复
鉴于你的设计需求,可以试着在Complete Routine里面创建DPC,或者Work Item,在对应的DPC或者Work item里面进行写文件操作会比较安全。
曹大夯 2010-06-11
  • 打赏
  • 举报
回复
在IRP Complete Routine里面做事会有非常多的限制。具体你可以去看WDK文档。

如果真要创建线程,建议在收到某个IRP的时候(比如 IRP_MJ_CREATE)或者AddDevice的时候进行,而不要在Complete Routine里面。
cnzdgs 2010-06-11
  • 打赏
  • 举报
回复
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);
老马何以识途 2010-06-10
  • 打赏
  • 举报
回复
很有可能是中断级别问题,仔细看看你的实现代码上下文在什么样的中断级别。
曹大夯 2010-06-10
  • 打赏
  • 举报
回复
把更详细的BSOD信息贴出来, Bug Check 0xB8: ATTEMPTED_SWITCH_FROM_DPC告诉不了更有用的信息。

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

hunt2088 2010-06-10
  • 打赏
  • 举报
回复
我开始学习时,蓝屏了n次,用windbg + 虚拟机单步调试,找到蓝屏代码,再分析
elated 2010-06-10
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 huntercao 的回复:]
蓝屏信息是什么?把蓝屏信息贴出来大家看看。

看上去ZwWriteFile的第6,7参数有问题,(PVOID Buffer, ULONG Length)。你的Buffer变量定义并赋值了么?好像你只是声明了,并没有定义。所以,系统有可能在操作空指针。
[/Quote]
应该不是这个问题,上面的仅是抽取出来的一部分代码,我没全贴上
错误代码为
Stop:0x000000b8
曹大夯 2010-06-10
  • 打赏
  • 举报
回复
蓝屏信息是什么?把蓝屏信息贴出来大家看看。

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

21,597

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧