磁盘过滤驱动中关于DiskDeviceControl处理
来源:互联网 发布:淘宝工厂直销 编辑:程序博客网 时间:2024/05/21 00:45
http://bbs.pediy.com/showthread.php?t=167696
你看看WDK src\storage\class\disk\disk.c里的DiskDeviceControl,里边有磁盘设备需要处理的所有IOCTL的过程
PS:如果你测试的是XP系统,那么不要看最新的WDK里的DISK源码,要看与XP匹配WDK的DISK源码才好。
代码:
__control_entrypoint(DeviceDriver)NTSTATUSDiskDeviceControl( PDEVICE_OBJECT DeviceObject, PIRP Irp )/*++Routine Description: I/O system entry for device controls to SCSI disks.Arguments: Fdo - Pointer to functional device object created by system. Irp - IRP involved.Return Value: Status is returned.--*/{ PIO_STACK_LOCATION irpStack = IoGetCurrentIrpStackLocation(Irp); NTSTATUS status = STATUS_SUCCESS; ULONG ioctlCode; ASSERT(DeviceObject != NULL); Irp->IoStatus.Information = 0; ioctlCode = irpStack->Parameters.DeviceIoControl.IoControlCode; TracePrint((TRACE_LEVEL_VERBOSE, TRACE_FLAG_IOCTL, "DiskDeviceControl: Received IOCTL 0x%X for device %p through IRP %p\n", ioctlCode, DeviceObject, Irp)); switch (ioctlCode) { case IOCTL_DISK_GET_CACHE_INFORMATION: { status = DiskIoctlGetCacheInformation(DeviceObject, Irp); break; } case IOCTL_DISK_SET_CACHE_INFORMATION: { status = DiskIoctlSetCacheInformation(DeviceObject, Irp); break; } case IOCTL_DISK_GET_CACHE_SETTING: { status = DiskIoctlGetCacheSetting(DeviceObject, Irp); break; } case IOCTL_DISK_SET_CACHE_SETTING: { status = DiskIoctlSetCacheSetting(DeviceObject, Irp); break; } case IOCTL_DISK_GET_DRIVE_GEOMETRY: { status = DiskIoctlGetDriveGeometry(DeviceObject, Irp); break; } case IOCTL_DISK_GET_DRIVE_GEOMETRY_EX: { status = DiskIoctlGetDriveGeometryEx( DeviceObject, Irp ); break; } case IOCTL_DISK_VERIFY: { status = DiskIoctlVerify(DeviceObject, Irp); break; } case IOCTL_DISK_GET_LENGTH_INFO: { status = DiskIoctlGetLengthInfo(DeviceObject, Irp); break; } case IOCTL_DISK_IS_WRITABLE: { status = DiskIoctlIsWritable(DeviceObject, Irp); break; } case IOCTL_DISK_UPDATE_DRIVE_SIZE: { status = DiskIoctlUpdateDriveSize(DeviceObject, Irp); break; } case IOCTL_DISK_REASSIGN_BLOCKS: { status = DiskIoctlReassignBlocks(DeviceObject, Irp); break; } case IOCTL_DISK_REASSIGN_BLOCKS_EX: { status = DiskIoctlReassignBlocksEx(DeviceObject, Irp); break; } case IOCTL_DISK_INTERNAL_SET_VERIFY: { status = DiskIoctlSetVerify(DeviceObject, Irp); break; } case IOCTL_DISK_INTERNAL_CLEAR_VERIFY: { status = DiskIoctlClearVerify(DeviceObject, Irp); break; } case IOCTL_STORAGE_GET_MEDIA_TYPES_EX: { status = DiskIoctlGetMediaTypesEx(DeviceObject, Irp); break; } case IOCTL_STORAGE_PREDICT_FAILURE : { status = DiskIoctlPredictFailure(DeviceObject, Irp); break; } case SMART_GET_VERSION: { status = DiskIoctlSmartGetVersion(DeviceObject, Irp); break; } case SMART_RCV_DRIVE_DATA: { status = DiskIoctlSmartReceiveDriveData(DeviceObject, Irp); break; } case SMART_SEND_DRIVE_COMMAND: { status = DiskIoctlSmartSendDriveCommand(DeviceObject, Irp); break; } case IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS: case IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS_ADMIN: { status = DiskIoctlGetVolumeDiskExtents(DeviceObject, Irp); break; } default: { // // Pass the request to the common device control routine. // return(ClassDeviceControl(DeviceObject, Irp)); break; } } // end switch if (!NT_SUCCESS(status)) { TracePrint((TRACE_LEVEL_ERROR, TRACE_FLAG_IOCTL, "DiskDeviceControl: IOCTL 0x%X to device %p failed with error 0x%X\n", ioctlCode, DeviceObject, status)); if (IoIsErrorUserInduced(status) && (Irp->Tail.Overlay.Thread != NULL)) { IoSetHardErrorOrVerifyDevice(Irp, DeviceObject); } } // // DiskIoctlVerify() (IOCTL_DISK_VERIFY) function returns STATUS_PENDING // and completes the IRP in the work item. Do not touch or complete // the IRP if STATUS_PENDING is returned. // if (status != STATUS_PENDING) { Irp->IoStatus.Status = status; ClassReleaseRemoveLock(DeviceObject, Irp); ClassCompleteRequest(DeviceObject, Irp, IO_NO_INCREMENT); } return(status);} // end DiskDeviceControl()
- 磁盘过滤驱动中关于DiskDeviceControl处理
- bootsect.s中关于取得磁盘驱动参数
- 实现一个具有还原功能的磁盘卷过滤驱动
- 文件过滤驱动中的重入处理
- 文件过滤驱动中的重入处理
- 文件过滤驱动中的重入处理
- 过滤驱动中创建IRP时IO堆栈单元的细节处理
- 关于TDI过滤驱动中的TDI_SEND
- 关于键盘过滤驱动中写入文件乱码的问题的解决!
- 在驱动中写磁盘文件
- 磁盘驱动
- 驱动------过滤
- shell 过滤磁盘信息
- 磁盘(卷)过滤总结
- <寒江独钓>Windows内核安全编程__具有还原功能的磁盘卷过滤驱动
- 中间层过滤驱动和封包的16进制处理
- [转载]关于文件系统和磁盘驱动的一点学习心得
- 关于磁盘驱动的学习 转星际盟主
- Ubuntu 12.10 64bit 下Android 环境设定
- UDP
- demo for insert values into sorted single list
- [VC++]编程获取系统网卡列表及IP地址信息
- 11个重要的数据库设计规则
- 磁盘过滤驱动中关于DiskDeviceControl处理
- Hadoop报错信息处理积累
- 面向对象的基本特征
- JAVA每日面试题2013/4/23
- JSP-IE不居中
- 手游团队的三种死法
- POJ 1925 dp
- Mina通信框架学习初步
- ubuntu 12.10安装jdk