60楼#
发布于:2010-02-01 15:36
回 楼主(zhjie374) 的帖子
学习,好人 |
|
61楼#
发布于:2010-02-13 10:54
学习了!
![]() ![]() ![]() ![]() |
|
62楼#
发布于:2010-03-11 15:07
最近在做这个,特地赶来看看,不错~ 多谢楼主分享
![]() |
|
63楼#
发布于:2010-03-12 09:21
我晕. 这两天我也在看这个. 我怎摸拦不住读写U盘的请求. 看网上有文章说拦截IRP_MJ_SCSI, 我拦截也没拦截住.
谁告诉你拦截身摸的? |
|
|
64楼#
发布于:2010-04-13 12:52
代码被删掉了?
|
|
65楼#
发布于:2010-05-31 09:04
up~~~
|
|
66楼#
发布于:2010-07-14 17:09
好人啊,好人,支持这样的共享精神。
|
|
67楼#
发布于:2010-08-17 22:29
特地赶来, 学习下!
|
|
68楼#
发布于:2012-04-16 16:34
英雄不问出处,谢谢了。
|
|
69楼#
发布于:2013-01-08 21:15
新人冒泡。各位大神求指教
|
|
70楼#
发布于:2013-01-08 21:17
新人报道,求大神指点
|
|
71楼#
发布于:2014-01-15 12:29
我大二时做了一个U盘过滤,在总线驱动上的。。。不知道扔哪去了
|
|
72楼#
发布于:2015-04-13 13:27
USB监控难么?
|
|
73楼#
发布于:2015-05-01 18:37
谢谢分享
|
|
74楼#
发布于:2015-07-07 16:02
我觉得这个帖子基本解决不了问题,关键问题根本跳过部描述
|
|
75楼#
发布于:2015-07-17 18:40
对于u盘只读控制,还有一个办法,就是在文件系统中文件打开或写的时候检查一下卷下面的总线类型,如果是usb或1394等可热插拨的,就进行禁止操作。
关于检查总线类型,可以向下面发送irp解决: |
|
|
76楼#
发布于:2015-07-17 18:47
#pragma once #include <tchar.h> #include <winioctl.h> /* * USB 输助函数 * Author: M.Y * Version: 1.0 * Revision: 1 */ typedef enum _Sg_disk_type { NONE_TYPE=0, IDE_DISK, USB_DISK, F1394_DISK, // 1394总线盘 } SG_DISK_TYPE; // SetupDiGetInterfaceDeviceDetail所需要的输出长度 #define INTERFACE_DETAIL_SIZE (1024) // IOCTL_STORAGE_GET_MEDIA_TYPES_EX可能返回不止一条DEVICE_MEDIA_INFO,故定义足够的空间 #define MEDIA_INFO_SIZE (sizeof(GET_MEDIA_TYPES) + sizeof(DEVICE_MEDIA_INFO) * 15) #define IOCTL_STORAGE_QUERY_PROPERTY CTL_CODE(IOCTL_STORAGE_BASE, 0x0500, METHOD_BUFFERED, FILE_ANY_ACCESS) // 查询存储设备属性的类型 typedef enum _STORAGE_QUERY_TYPE { PropertyStandardQuery = 0, // 读取描述 PropertyExistsQuery, // 测试是否支持 PropertyMaskQuery, // 读取指定的描述 PropertyQueryMaxDefined // 验证数据 } STORAGE_QUERY_TYPE, *PSTORAGE_QUERY_TYPE; // 查询存储设备还是适配器属性 typedef enum _STORAGE_PROPERTY_ID { StorageDeviceProperty = 0, // 查询设备属性 StorageAdapterProperty // 查询适配器属性 } STORAGE_PROPERTY_ID, *PSTORAGE_PROPERTY_ID; // 查询属性输入的数据结构 typedef struct _STORAGE_PROPERTY_QUERY { STORAGE_PROPERTY_ID PropertyId; // 设备/适配器 STORAGE_QUERY_TYPE QueryType; // 查询类型 UCHAR AdditionalParameters[1]; // 额外的数据(仅定义了象征性的1个字节) } STORAGE_PROPERTY_QUERY, *PSTORAGE_PROPERTY_QUERY; // 查询属性输出的数据结构 typedef struct _STORAGE_DEVICE_DESCRIPTOR { ULONG Version; // 版本 ULONG Size; // 结构大小 UCHAR DeviceType; // 设备类型 UCHAR DeviceTypeModifier; // SCSI-2额外的设备类型 BOOLEAN RemovableMedia; // 是否可移动 BOOLEAN CommandQueueing; // 是否支持命令队列 ULONG VendorIdOffset; // 厂家设定值的偏移 ULONG ProductIdOffset; // 产品ID的偏移 ULONG ProductRevisionOffset; // 产品版本的偏移 ULONG SerialNumberOffset; // 序列号的偏移 STORAGE_BUS_TYPE BusType; // 总线类型 ULONG RawPropertiesLength; // 额外的属性数据长度 UCHAR RawDeviceProperties[1]; // 额外的属性数据(仅定义了象征性的1个字节) } STORAGE_DEVICE_DESCRIPTOR, *PSTORAGE_DEVICE_DESCRIPTOR; class SgUSB { public: static SG_DISK_TYPE GetDriveType(TCHAR chDrv) { TCHAR szDeviceName[7]=_T("\\\\?\\x:"); SG_DISK_TYPE disktype; PSTORAGE_DEVICE_DESCRIPTOR pDevDesc; pDevDesc = (PSTORAGE_DEVICE_DESCRIPTOR)new BYTE[sizeof(STORAGE_DEVICE_DESCRIPTOR) + 512 - 1]; pDevDesc->Size = sizeof(STORAGE_DEVICE_DESCRIPTOR) + 512 - 1; szDeviceName[4]=chDrv; HANDLE hHandle=OpenDevice(szDeviceName); if( hHandle == INVALID_HANDLE_VALUE ) return NONE_TYPE; if(GetDriveProperty(hHandle,pDevDesc) ) { switch(pDevDesc->BusType ) { case BusType1394: disktype = F1394_DISK; break; case BusTypeUsb: disktype =USB_DISK; break; default: disktype= NONE_TYPE; } } else disktype= NONE_TYPE; delete []pDevDesc; CloseHandle(hHandle); return disktype; } static HANDLE OpenDevice(LPCTSTR pszDevicePath) { HANDLE hDevice; // 打开设备 hDevice= ::CreateFile(pszDevicePath, // 设备路径 GENERIC_READ | GENERIC_WRITE, // 读写方式 FILE_SHARE_READ | FILE_SHARE_WRITE, // 共享方式 NULL, // 默认的安全描述符 OPEN_EXISTING, // 创建方式 0, // 不需设置文件属性 NULL); // 不需参照模板文件 return hDevice; } static BOOL GetDriveGeometry(HANDLE hDevice, PDISK_GEOMETRY pGeometry) { PGET_MEDIA_TYPES pMediaTypes; // 内部用的输出缓冲区 DWORD dwOutBytes; // 输出数据长度 BOOL bResult; // DeviceIoControl的返回结果 // 申请内部用的输出缓冲区 pMediaTypes = (PGET_MEDIA_TYPES)::GlobalAlloc(LMEM_ZEROINIT, MEDIA_INFO_SIZE); // 用IOCTL_STORAGE_GET_MEDIA_TYPES_EX取介质类型参数 bResult = ::DeviceIoControl(hDevice, // 设备句柄 IOCTL_STORAGE_GET_MEDIA_TYPES_EX, // 取介质类型参数 NULL, 0, // 不需要输入数据 pMediaTypes, MEDIA_INFO_SIZE, // 输出数据缓冲区 &dwOutBytes, // 输出数据长度 (LPOVERLAPPED)NULL); // 用同步I/O if(bResult) { // 注意到结构DEVICE_MEDIA_INFO是在结构DISK_GEOMETRY的基础上扩充的 // 为简化程序,用memcpy代替如下多条赋值语句: // pGeometry->MediaType = (MEDIA_TYPE)pMediaTypes->MediaInfo[0].DeviceSpecific.DiskInfo.MediaType; // pGeometry->Cylinders = pMediaTypes->MediaInfo[0].DeviceSpecific.DiskInfo.Cylinders; // pGeometry->TracksPerCylinder = pMediaTypes->MediaInfo[0].DeviceSpecific.DiskInfo.TracksPerCylinder; // ... ... ::memcpy(pGeometry, pMediaTypes->MediaInfo, sizeof(DISK_GEOMETRY)); } // 释放内部缓冲区 ::GlobalFree(pMediaTypes); return bResult; } static BOOL GetDriveProperty(HANDLE hDevice, PSTORAGE_DEVICE_DESCRIPTOR pDevDesc) { STORAGE_PROPERTY_QUERY Query; // 查询输入参数 DWORD dwOutBytes; // IOCTL输出数据长度 BOOL bResult; // IOCTL返回值 // 指定查询方式 Query.PropertyId = StorageDeviceProperty; Query.QueryType = PropertyStandardQuery; // 用IOCTL_STORAGE_QUERY_PROPERTY取设备属性信息 bResult = ::DeviceIoControl(hDevice, // 设备句柄 IOCTL_STORAGE_QUERY_PROPERTY, // 取设备属性信息 &Query, sizeof(STORAGE_PROPERTY_QUERY), // 输入数据缓冲区 pDevDesc, pDevDesc->Size, // 输出数据缓冲区 &dwOutBytes, // 输出数据长度 (LPOVERLAPPED)NULL); // 用同步I/O return bResult; } }; |
|
|
77楼#
发布于:2015-07-17 18:47
注意,以上代码是用户态的,但是核心思想就是发送irp下去
|
|
|
78楼#
发布于:2018-09-04 18:57
用户被禁言,该主题自动屏蔽! |
|
上一页
下一页