阅读:1864回复:5
NdisMoveMemory出现蓝屏。。
这是驱动层的代码
NTSTATUS DevIoCtrl(PDEVICE_OBJECT dev, PIRP irp ) { PIO_STACK_LOCATION irpStack; NTSTATUS status = STATUS_SUCCESS; ULONG inputBufferLength; ULONG outputBufferLength; ULONG ioControlCode; PUCHAR buffer; Log log1; //我自定义的结构体 UNREFERENCED_PARAMETER(dev); irpStack = IoGetCurrentIrpStackLocation(irp); inputBufferLength = irpStack->Parameters.DeviceIoControl.InputBufferLength; outputBufferLength = irpStack->Parameters.DeviceIoControl.OutputBufferLength; buffer = irp->AssociatedIrp.SystemBuffer; ioControlCode = irpStack->Parameters.DeviceIoControl.IoControlCode; switch(ioControlCode) { case IOCTRL_READ_DATA: if(outputBufferLength == sizeof(Log)) { log1.a = 4; log1.b = 123456; log1.c = 456; log1.d = 789; NdisMoveMemory(buffer,&log1,sizeof(Log)); //这句导致蓝屏 break; } } irp->IoStatus.Status = status; IoCompleteRequest(irp, IO_NO_INCREMENT); return status; } 这是用户层的代码 Log log; ULONG len,len1; len = sizeof(Log); DeviceIoControl(Handle,IOCTRL_READ_DATA,NULL,0,&log,len,&len1,NULL); 刚开始学驱动。。找不到是什么问题 。。哪位大大帮帮我吧。。3Q了、、 |
|
沙发#
发布于:2008-12-17 22:04
up....帮帮忙吧。。
|
|
板凳#
发布于:2008-12-18 17:09
你的IOCTRL_READ_DATA是什么类型的,类型不同输入输出缓冲区也不同,导致蓝屏一般是内存访问不当造成的,不知道你应用层的输入输出缓冲区给出了足够的空间了没有?
|
|
地板#
发布于:2008-12-18 18:19
先谢谢LS的先。。
IOCTRL_READ_DATA这个也分什么类型的吗?不是一个预定义的东西吗。。。我用户层调用的代码也在上面了。。不知道有没有问题 。。 |
|
地下室#
发布于:2008-12-18 19:34
你的IOCTRL_READ_DATA 应该是IOCTL请求操作代码 ,IOCTL请求有METHOD_BUFFERED、METHOD_IN_DIRECT、METHOD_OUT_DIRECT、METHOD_NEITHER几种吧,前三种是在irp->AssociatedIrp.SystemBuffer,而最后一种是在irp->Parameters.DeviceIoControl.Type3InputBuffer
话说……难道IOCTRL_READ_DATA 不是你自己定义的么? 代码不完整,也没有办法看到你的输入输出缓冲区是不是分配了空间,我想主要应该是这边的问题了。建议去看下DeviceIoControl的参数具体意义。 |
|
5楼#
发布于:2008-12-18 20:20
非常感谢 kkkhmy 大哥。。。问题已经解决了。。再次感谢。。
但是我怎么给你评分呢(难道要版主才可以??)。。 |
|