|
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
用户被禁言,该主题自动屏蔽! |
|
上一页
下一页
