cxxxx
驱动牛犊
驱动牛犊
  • 注册日期2008-05-17
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望81点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1864回复:5

NdisMoveMemory出现蓝屏。。

楼主#
更多 发布于:2008-12-17 20:09
这是驱动层的代码
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了、、
cxxxx
驱动牛犊
驱动牛犊
  • 注册日期2008-05-17
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望81点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2008-12-17 22:04
up....帮帮忙吧。。
kkkhmy
驱动牛犊
驱动牛犊
  • 注册日期2008-04-21
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分23分
  • 威望198点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2008-12-18 17:09
你的IOCTRL_READ_DATA是什么类型的,类型不同输入输出缓冲区也不同,导致蓝屏一般是内存访问不当造成的,不知道你应用层的输入输出缓冲区给出了足够的空间了没有?
cxxxx
驱动牛犊
驱动牛犊
  • 注册日期2008-05-17
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望81点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2008-12-18 18:19
先谢谢LS的先。。

IOCTRL_READ_DATA这个也分什么类型的吗?不是一个预定义的东西吗。。。我用户层调用的代码也在上面了。。不知道有没有问题 。。
kkkhmy
驱动牛犊
驱动牛犊
  • 注册日期2008-04-21
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分23分
  • 威望198点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
地下室#
发布于: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的参数具体意义。
cxxxx
驱动牛犊
驱动牛犊
  • 注册日期2008-05-17
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望81点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2008-12-18 20:20
非常感谢 kkkhmy  大哥。。。问题已经解决了。。再次感谢。。

但是我怎么给你评分呢(难道要版主才可以??)。。
游客

返回顶部