zyfnhct
驱动牛犊
驱动牛犊
  • 注册日期2008-06-24
  • 最后登录2013-07-07
  • 粉丝0
  • 关注0
  • 积分11分
  • 威望110点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
60楼#
发布于:2010-02-01 15:36
回 楼主(zhjie374) 的帖子
学习,好人
guenli
驱动牛犊
驱动牛犊
  • 注册日期2009-12-18
  • 最后登录2010-02-19
  • 粉丝0
  • 关注0
  • 积分61分
  • 威望611点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
61楼#
发布于:2010-02-13 10:54
学习了!
Sanicle
驱动牛犊
驱动牛犊
  • 注册日期2004-08-11
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分32分
  • 威望54点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
62楼#
发布于:2010-03-11 15:07
最近在做这个,特地赶来看看,不错~ 多谢楼主分享
hnsyz
驱动牛犊
驱动牛犊
  • 注册日期2001-12-31
  • 最后登录2010-04-20
  • 粉丝1
  • 关注0
  • 积分108分
  • 威望259点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
63楼#
发布于:2010-03-12 09:21
我晕. 这两天我也在看这个. 我怎摸拦不住读写U盘的请求. 看网上有文章说拦截IRP_MJ_SCSI, 我拦截也没拦截住.
谁告诉你拦截身摸的?
学习,交流
crazy4stef
驱动牛犊
驱动牛犊
  • 注册日期2008-08-24
  • 最后登录2016-01-09
  • 粉丝2
  • 关注0
  • 积分42分
  • 威望425点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
64楼#
发布于:2010-04-13 12:52
代码被删掉了?
yixql
驱动牛犊
驱动牛犊
  • 注册日期2010-05-12
  • 最后登录2010-12-06
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望61点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
65楼#
发布于:2010-05-31 09:04
up~~~
cyyhtzx
驱动牛犊
驱动牛犊
  • 注册日期2009-03-31
  • 最后登录2012-08-01
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望61点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
66楼#
发布于:2010-07-14 17:09
好人啊,好人,支持这样的共享精神。
bajiao
驱动牛犊
驱动牛犊
  • 注册日期2010-07-29
  • 最后登录2011-01-02
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望41点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
67楼#
发布于:2010-08-17 22:29
特地赶来, 学习下!
yukun840101
驱动牛犊
驱动牛犊
  • 注册日期2009-07-29
  • 最后登录2016-05-23
  • 粉丝2
  • 关注2
  • 积分23分
  • 威望251点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
68楼#
发布于:2012-04-16 16:34
英雄不问出处,谢谢了。
o7781693
驱动牛犊
驱动牛犊
  • 注册日期2013-01-08
  • 最后登录2013-01-11
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望31点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
69楼#
发布于:2013-01-08 21:15
新人冒泡。各位大神求指教
o7781693
驱动牛犊
驱动牛犊
  • 注册日期2013-01-08
  • 最后登录2013-01-11
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望31点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
70楼#
发布于:2013-01-08 21:17
新人报道,求大神指点
liwen930723
驱动牛犊
驱动牛犊
  • 注册日期2013-10-13
  • 最后登录2014-12-10
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望81点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
71楼#
发布于:2014-01-15 12:29
我大二时做了一个U盘过滤,在总线驱动上的。。。不知道扔哪去了
hyb951
驱动牛犊
驱动牛犊
  • 注册日期2015-04-12
  • 最后登录2015-07-08
  • 粉丝0
  • 关注1
  • 积分2分
  • 威望21点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
72楼#
发布于:2015-04-13 13:27
USB监控难么?
hyb951
驱动牛犊
驱动牛犊
  • 注册日期2015-04-12
  • 最后登录2015-07-08
  • 粉丝0
  • 关注1
  • 积分2分
  • 威望21点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
73楼#
发布于:2015-05-01 18:37
谢谢分享
whisper_lc
驱动牛犊
驱动牛犊
  • 注册日期2015-07-07
  • 最后登录2015-07-10
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望11点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
74楼#
发布于:2015-07-07 16:02
我觉得这个帖子基本解决不了问题,关键问题根本跳过部描述
znsoft
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2023-10-25
  • 粉丝300
  • 关注6
  • 积分910分
  • 威望14796点
  • 贡献值7点
  • 好评度2410点
  • 原创分5分
  • 专家分100分
  • 社区居民
  • 最爱沙发
  • 社区明星
75楼#
发布于:2015-07-17 18:40
对于u盘只读控制,还有一个办法,就是在文件系统中文件打开或写的时候检查一下卷下面的总线类型,如果是usb或1394等可热插拨的,就进行禁止操作。

关于检查总线类型,可以向下面发送irp解决:
http://www.zndev.com 免费源码交换网 ----------------------------- 软件创造价值,驱动提供力量! 淡泊以明志,宁静以致远。 ---------------------------------- 勤用搜索,多查资料,先搜再问。
znsoft
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2023-10-25
  • 粉丝300
  • 关注6
  • 积分910分
  • 威望14796点
  • 贡献值7点
  • 好评度2410点
  • 原创分5分
  • 专家分100分
  • 社区居民
  • 最爱沙发
  • 社区明星
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;
    }




};

 
 
http://www.zndev.com 免费源码交换网 ----------------------------- 软件创造价值,驱动提供力量! 淡泊以明志,宁静以致远。 ---------------------------------- 勤用搜索,多查资料,先搜再问。
znsoft
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2023-10-25
  • 粉丝300
  • 关注6
  • 积分910分
  • 威望14796点
  • 贡献值7点
  • 好评度2410点
  • 原创分5分
  • 专家分100分
  • 社区居民
  • 最爱沙发
  • 社区明星
77楼#
发布于:2015-07-17 18:47
注意,以上代码是用户态的,但是核心思想就是发送irp下去
http://www.zndev.com 免费源码交换网 ----------------------------- 软件创造价值,驱动提供力量! 淡泊以明志,宁静以致远。 ---------------------------------- 勤用搜索,多查资料,先搜再问。
snmqd
禁止发言
禁止发言
  • 注册日期2018-08-24
  • 最后登录2018-09-04
  • 粉丝0
  • 关注0
  • 积分-133分
  • 威望80点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
78楼#
发布于:2018-09-04 18:57
用户被禁言,该主题自动屏蔽!
上一页 下一页
游客

返回顶部