gongxp123456
驱动牛犊
驱动牛犊
  • 注册日期2004-12-15
  • 最后登录2013-10-10
  • 粉丝0
  • 关注0
  • 积分617分
  • 威望383点
  • 贡献值1点
  • 好评度59点
  • 原创分0分
  • 专家分0分
阅读:2440回复:1

以SCSI控制方式实现指定盘符的目标磁盘只读

楼主#
更多 发布于:2009-07-29 16:47
按照驱动小妹的"U盘只读可控制 驱动程序实例",http://bbs.driverdevelop.com/htm_data/16/0708/104501.html
<<驱动开发详解>>有一个例子,不能在WDK下build,我改了一下,可以直接在WDK,build,作为LowerFilters挂载在{4D36E967-E325-11CE-BFC1-08002BE10318}下,所有磁盘都只读了。
如果要控制指定的盘符驱动器,比如C、H等,我原来以为,根据得到的IRP,查询设备全部设备的名字,再和自己需要的设备名对比就可以,最简单的如:
//用于得到下层设备名称
pDeviceObject = irpStack->DeviceObject;
//枚举所以下层的设备对象:
while ( pDeviceObject )
{
    DisPlayDrv(pDeviceObject);
    // 进一步判断当前设备上 VPB 中的设备
    if ( pDeviceObject->Vpb && pDeviceObject->Vpb->DeviceObject ){
    DisPlayDrv( pDeviceObject->Vpb->DeviceObject );
    if ( pDeviceObject->Vpb->DeviceObject->AttachedDevice ){
    DisPlayDrv( pDeviceObject->Vpb->DeviceObject );
    }
    }
    // 得到建立在此驱动上的下一个设备 DEVICE_OBJECT
   pDeviceObject = pDeviceObject->NextDevice;
}

VOID DisPlayDrv(PDEVICE_OBJECT  pDeviceObject)
{
 NTSTATUS status;
 ULONG ReturnLength;
 UCHAR Buffer[sizeof(OBJECT_NAME_INFORMATION)+(256*sizeof(WCHAR))];
 POBJECT_NAME_INFORMATION ObjectNameInfo = (POBJECT_NAME_INFORMATION)Buffer;
 status = ObQueryNameString(pDeviceObject, ObjectNameInfo, sizeof(Buffer), &ReturnLength);
 if (NT_SUCCESS(status)){
  KdPrint(("得到的设备名称%wZ,字符长%d,返回长:%u,",&ObjectNameInfo->Name,ObjectNameInfo->Name.Length,ReturnLength));
  //KdPrint(("得到的设备名称%wZ",ObjectNameInfo->Name));
 }
 else {
  KdPrint(("得到的设备失败%s",OsrNTStatusToString(status)));
 }
}
打印出来的状态都是成功,但是,设备名称却是NULL.
能后采用下面的办法,可以打印两三中下层设备的名称,但远达不到目的。请那位大侠来开导一下:
VOID  DisPlayDrv( PDEVICE_OBJECT DevObj )
{
  POBJECT_HEADER ObjectHeader;
  POBJECT_HEADER_NAME_INFO ObjectNameInfo;
  if ( DevObj == NULL )
  {
    DbgPrint( "DevObj is NULL!\n" );
    return;
  }
  //
  // 得到对象头
  //
  ObjectHeader = OBJECT_TO_OBJECT_HEADER( DevObj );
  if ( ObjectHeader )
  {
    //
    // 查询设备名称并打印
    //
    ObjectNameInfo = OBJECT_HEADER_TO_NAME_INFO( ObjectHeader );
    if ( ObjectNameInfo && ObjectNameInfo->Name.Buffer )
    {
      DbgPrint( "Driver Name:%S - Device Name:%S - Driver Address:0x%x - Device Address:0x%x\n",
                DevObj->DriverObject->DriverName.Buffer,
                ObjectNameInfo->Name.Buffer,
                DevObj->DriverObject,
                DevObj );
    }
    //
    // 对于没有名称的设备,则打印 NULL
    //
    else if ( DevObj->DriverObject )
    {
      DbgPrint( "Driver Name:%S - Device Name:%S - Driver Address:0x%x - Device Address:0x%x\n",
                DevObj->DriverObject->DriverName.Buffer,
                L"NULL",
                DevObj->DriverObject,
                DevObj );
    }
  }
}

附件名称/大小 下载次数 最后更新
MyFilter.rar (4KB)  28 2009-07-29 16:47
seanwan
驱动牛犊
驱动牛犊
  • 注册日期2007-08-20
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分14分
  • 威望96点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2009-08-03 17:32
盘符驱动器是嘛意思?
逻辑分区(盘符)和磁盘驱动器是两个概念!
游客

返回顶部