3619|6

69

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

如何读取U盘扇区并对U盘进行加解密? [复制链接]

如题,如何在一个U盘过滤驱动里读取U盘扇区并对U盘进行加解密?
请大家指点一下

最新回复

來學習了。   详情 回复 发表于 2009-9-25 17:30
点赞 关注

回复
举报

81

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
我想在过滤驱动里创建一个IRP,功能号为IRP_MJ_READ,不知道到底怎么写是读取U盘的零扇区?
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
我想在SCSI的派遣函数里读取U盘的O扇区,如果发现我写入的标识,则允许使用U盘。如果没发现,则禁用
#pragma LOCKEDCODE
NTSTATUS DispatchForSCSI(IN PDEVICE_OBJECT fido, IN PIRP Irp)
{
    KdPrint((DRIVERNAME " - Enter DispatchForSCSI \n"));
    //获得设备扩展
        PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) fido->DeviceExtension;
        //获得I/O堆栈
        PIO_STACK_LOCATION irpStack = IoGetCurrentIrpStackLocation(Irp);
        PDEVICE_OBJECT DeviceObject = pdx->DeviceObject;
        NTSTATUS status;

        if (_wcsnicmp(DeviceObject->AttachedDevice->DriverObject->DriverName.Buffer,L"\\Driver\\USBSTOR",15)==0)
        {
                status = ReadSector(fido,Irp);//在这里读0扇区,如果没发现自己写入的标识,则禁用U盘
                if (!NT_SUCCESS(status))
                {
                        Irp->IoStatus.Status = STATUS_ACCESS_DENIED;
                        Irp->IoStatus.Information = 0;
                        IoCompleteRequest( Irp, IO_NO_INCREMENT );
            return STATUS_ACCESS_DENIED;
                }
    }

}
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

4
 
我想lz这样做也应该可以达到控制访问权限的目的,但是加密怎么做?
有一个想法供lz参考,你可以在文件系统filter层里面做动作,这个层面就是用来实现lz想要实现的功能的
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

5
 
引用 3 楼 guopeixin 的回复:
我想lz这样做也应该可以达到控制访问权限的目的,但是加密怎么做?
有一个想法供lz参考,你可以在文件系统filter层里面做动作,这个层面就是用来实现lz想要实现的功能的

不好意思,看错了,lz是想直接操作sector
SCSI本身不是很了解,只是知道它是一种很老的协议,用在u盘的驱动里也应该是做什么转换的,应该可以吧,
惭愧,惭愧
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

6
 
我自己参考别人的代码写了点代码,读U盘扇区没有成功。
过滤驱动过载在注册表HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{36FC9E60-C465-11CF-8056-444553540000}下,

部分代码如下:高手们给指点一下
#pragma LOCKEDCODE
NTSTATUS DispatchForSCSI(IN PDEVICE_OBJECT fido, IN PIRP Irp)
{
    KdPrint((DRIVERNAME " - Enter DispatchForSCSI \n"));
    //获得设备扩展
        PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) fido->DeviceExtension;
        //获得I/O堆栈
        PIO_STACK_LOCATION irpStack = IoGetCurrentIrpStackLocation(Irp);
        PDEVICE_OBJECT DeviceObject = pdx->DeviceObject;
        NTSTATUS status;

        if (_wcsnicmp(DeviceObject->AttachedDevice->DriverObject->DriverName.Buffer,L"\\Driver\\USBSTOR",15)==0)
        {
                //读取U盘扇区,没有标识禁用
                status = HandleStartDevice(fido,Irp);
                if (!NT_SUCCESS(status))
                {
                        Irp->IoStatus.Status = STATUS_ACCESS_DENIED;
                        Irp->IoStatus.Information = 0;
                        IoCompleteRequest( Irp, IO_NO_INCREMENT );
            return STATUS_ACCESS_DENIED;
                }

                //获取自旋锁
                status = IoAcquireRemoveLock(&pdx->RemoveLock, Irp);
                //判断是否成功获取自旋锁
                if (!NT_SUCCESS(status))
                        //结束IRP请求
                        return CompleteRequest(Irp, status, 0);
                //略过当前I/O堆栈
                IoSkipCurrentIrpStackLocation(Irp);
                //调用底层驱动程序
                status = IoCallDriver(pdx->LowerDeviceObject, Irp);
                //释放自旋锁
                IoReleaseRemoveLock(&pdx->RemoveLock, Irp);
        return status;
    }
}

NTSTATUS
HandleStartDevice(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP              Irp
    )
{
    NTSTATUS ntStatus;
        CHAR buffer[512] = {0};
        ULONG Length = 512;

    // Read the device descriptor
    //ntStatus = ReadandSelectDescriptors(DeviceObject);

        ntStatus = ReadSector(DeviceObject,&buffer,Length);
    if(!NT_SUCCESS(ntStatus))
        {
        KdPrint(("ReadandSelectDescriptors failed\n"));
        return ntStatus;
    }
    return ntStatus;
}

NTSTATUS ReadSector(PDEVICE_OBJECT DeviceObject, PVOID Buffer, ULONG Length)
{
    KEVENT event;
    NTSTATUS ntStatus = STATUS_SUCCESS;
        PIRP Irp;
    LARGE_INTEGER lioffset = {0};
    IO_STATUS_BLOCK iostatus = {0};
        PDEVICE_EXTENSION  pdx;
        pdx = (PDEVICE_EXTENSION)DeviceObject->DeviceExtension;

        lioffset.QuadPart = 512;

       
    //初始化事件
    KeInitializeEvent(&event, NotificationEvent, FALSE);
   
    Irp = IoBuildSynchronousFsdRequest(IRP_MJ_READ,
                pdx->LowerDeviceObject,
                Buffer,
                Length,
                &lioffset,
                &event,
                &iostatus);
       
    if(0 == Irp)
    {
        KdPrint(("IoBuildSynchronousFsdRequest fail! \n"));
        return STATUS_INSUFFICIENT_RESOURCES;
    }
       
    //发送IRP
    ntStatus = IoCallDriver(pdx->LowerDeviceObject, Irp);
       
    //等待事件
    if(STATUS_PENDING == ntStatus)
    {
        KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, 0);
                ntStatus = iostatus.Status;
    }
       
    if(iostatus.Information == 0)
    {
        KdPrint(("iostatus.Information == 0 \n"));
        goto _end;
    }
       
    KdPrint(("iostatus.Information == 0x%x \n", iostatus.Information));

_end:
       
    return ntStatus;
       
}
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

7
 
來學習了。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表