BigBall
驱动牛犊
驱动牛犊
  • 注册日期2002-03-08
  • 最后登录2002-05-30
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1460回复:5

初学WDM,有问题请教各位

楼主#
更多 发布于:2002-03-15 18:09
在sys里,我
pDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = Dispatch;
ring 3会给sys发一个IOCTL_KNLDRV_SAFE,希望sys收到请求后,返回一个字符串给ring3的进程。
于是我:
static NTSTATUS Dispatch (IN PDEVICE_OBJECT pDeviceObject, IN PIRP pIrp)
{
    ULONG               ControlCode;
    PIO_STACK_LOCATION  pISL;
    KIRQL irql;
    KSPIN_LOCK BufferLock;
    ULONG BufferSize = 0;
    ULONG BytesTxd = 0;
    ULONG OutputLength = 0;
    UNREFERENCED_PARAMETER (pDeviceObject);
    pISL = IoGetCurrentIrpStackLocation (pIrp);
    pISL->Parameters.DeviceIoControl.OutputBufferLength;
    KeAcquireSpinLock(&BufferLock,&irql);

    switch (pISL->MajorFunction)
    {
        case IRP_MJ_CREATE:
             .....
             break;
        case IRP_MJ_CLOSE:
 .....
             break;
        case IRP_MJ_DEVICE_CONTROL:
        
             ControlCode = pISL->Parameters.DeviceIoControl.IoControlCode;
         if (ControlCode == IOCTL_KNLDRV_SAFE)
         {
BytesTxd = OutputLength;
RtlCopyMemory(pIrp->AssociatedIrp.SystemBuffer,\"1234567\",BytesTxd);
         }
           break;
    }
    KeReleaseSpinLock(&BufferLock,irql);
    pIrp->IoStatus.Status      = STATUS_SUCCESS;
    pIrp->IoStatus.Information = 0L;            
    IoCompleteRequest (pIrp, IO_NO_INCREMENT);
    return pIrp->IoStatus.Status;  
}

------------------------
ring 3下,我这样发送消息给sys的:
for (;;)
{
if (DeviceIoControl (hDevice,
IOCTL_KNLDRV_SAFE,
NULL,
0,
OutBuffer,
9,
&dwRet,
NULL))
{
printf (\"|%s,%d|   \", OutBuffer, dwRet);
}
else
printf (\"发送失败!\\n\");
}

可是我从ring3上收到的OutBuffer全部是空的,dwRet为0,请问我错哪里了?
一个初学者:)
tigerzd
驱动老牛
驱动老牛
  • 注册日期2001-08-25
  • 最后登录2004-12-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-03-15 18:31
pIrp->IoStatus.Information表示驱动程序返回应用程序的字节数!
改为pIrp->IoStatus.Information=sizeof(\"12345\");
犯强汉者,虽远必诛! [img]http://www.driverdevelop.com/forum/upload/tigerzd/2002-12-13_sf10.JPG[/img]
BigBall
驱动牛犊
驱动牛犊
  • 注册日期2002-03-08
  • 最后登录2002-05-30
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-03-15 18:47
可是我不是做设备驱动啊
那个可以不设置啊。。。一般是设备驱动才设置。。。
我刚才安装你说的改了一下,可是还是不行啊
一个初学者:)
Tom.Cat
禁止发言
禁止发言
  • 注册日期2001-10-10
  • 最后登录2019-07-29
  • 粉丝1
  • 关注0
  • 积分-53792分
  • 威望197411点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2002-03-15 19:15
用户被禁言,该主题自动屏蔽!
BigBall
驱动牛犊
驱动牛犊
  • 注册日期2002-03-08
  • 最后登录2002-05-30
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-03-15 19:51
感谢楼上几位的帮助,我照你们的方法改了一下,可是还是不行,我比较笨,不知道哪里出问题了,初学WDM,比较头大

static NTSTATUS Dispatch (IN PDEVICE_OBJECT pDeviceObject, IN PIRP pIrp)
{
    ULONG               ControlCode;
    PIO_STACK_LOCATION  pISL;
    KIRQL irql;
    KSPIN_LOCK BufferLock;
    ULONG BufferSize = 0;
    ULONG BytesTxd = 0L;
    ULONG OutputLength = 0;
    NTSTATUS status = STATUS_SUCCESS;
    UNREFERENCED_PARAMETER (pDeviceObject);
    pISL = IoGetCurrentIrpStackLocation (pIrp);
    OutputLength = pISL->Parameters.DeviceIoControl.OutputBufferLength;
    KeAcquireSpinLock(&BufferLock,&irql);

    switch (pISL->MajorFunction)
    {
        case IRP_MJ_CREATE:
             Loadsys ();
             break;
        case IRP_MJ_CLOSE:
    Unloadsys ();
             break;
        case IRP_MJ_DEVICE_CONTROL:
        
             ControlCode = pISL->Parameters.DeviceIoControl.IoControlCode;
         if (ControlCode == IOCTL_KNLDRV_SAFE)
         {
         if( OutputLength<BytesTxd)
status = STATUS_INVALID_PARAMETER;
else
{
BytesTxd = sizeof (\"1234567\");
RtlCopyMemory(pIrp->AssociatedIrp.SystemBuffer,\"1234567\",BytesTxd);
}
         }
           break;
    }
    KeReleaseSpinLock(&BufferLock,irql);
    pIrp->IoStatus.Status      = status;
    pIrp->IoStatus.Information = BytesTxd;            
    IoCompleteRequest (pIrp, 0);
    return pIrp->IoStatus.Status;  
}
一个初学者:)
guardee
驱动巨牛
驱动巨牛
  • 注册日期2002-11-08
  • 最后登录2010-05-29
  • 粉丝2
  • 关注1
  • 积分2分
  • 威望34点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-03-15 22:36
你没有初始化这个BufferLock
还有,当你用DeviceIoControl的时候必须保证驱动程序能够收到这个请求!
游客

返回顶部