阅读:1462回复:5
初学WDM,有问题请教各位
在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,请问我错哪里了? |
|
|
沙发#
发布于:2002-03-15 22:36
你没有初始化这个BufferLock
还有,当你用DeviceIoControl的时候必须保证驱动程序能够收到这个请求! |
|
板凳#
发布于: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; } |
|
|
地板#
发布于:2002-03-15 19:15
用户被禁言,该主题自动屏蔽! |
|
地下室#
发布于:2002-03-15 18:47
可是我不是做设备驱动啊
那个可以不设置啊。。。一般是设备驱动才设置。。。 我刚才安装你说的改了一下,可是还是不行啊 |
|
|
5楼#
发布于:2002-03-15 18:31
pIrp->IoStatus.Information表示驱动程序返回应用程序的字节数!
改为pIrp->IoStatus.Information=sizeof(\"12345\"); |
|
|