利用IoBuildDeviceIoControlRequest构造irp获得存储设备总线类型源代码

 本代码演示用IoBuildDeviceIoControlRequest向下层存储设备的DeviceObject发送一个代码为

IOCTL_STORAGE_QUERY_PROPERTY的IRP_MJ_DEVICE_IO_CONTROL的Irp获取到存储设备所在的总线类型。

此代码来源于互联网,所有权归原作者所有。

ULONG GetStorageDeviceBusType(IN PDEVICE_OBJECT DeviceObject)
{
   PIRP NewIrp;
   PSTORAGE_DEVICE_DESCRIPTOR Descriptor;
   STORAGE_PROPERTY_QUERY Query;
   CHAR Buffer[BUFFER_SIZE];
   KEVENT WaitEvent;
   NTSTATUS Status;
   IO_STATUS_BLOCK IoStatus;

   // first set the query properties
   Query.PropertyId = StorageDeviceProperty;
   Query.QueryType = PropertyStandardQuery;

   // initialize the waitable event
   KeInitializeEvent(&WaitEvent, NotificationEvent, FALSE);

   // we should build the query irp ourselves
   NewIrp = IoBuildDeviceIoControlRequest(IOCTL_STORAGE_QUERY_PROPERTY, DeviceObject,
       (PVOID)&Query, sizeof(Query), (PVOID)Buffer, NAME_BUFFER_SIZE, FALSE, &WaitEvent,

&IoStatus);

   if (NULL == NewIrp)    // can't create new irp
   {
       DbgPrint("[%s] [%u] I can't create a new irp to query the property of device (%p)!/n",
           __FILE__, __LINE__, DeviceObject);
       return BusTypeUnknown;
   }

   // send this irp to the storage device
   Status = IoCallDriver(DeviceObject, NewIrp);

   if (Status == STATUS_PENDING)
   {
       Status = KeWaitForSingleObject(&WaitEvent, Executive, KernelMode, FALSE, NULL);
       Status = IoStatus.Status;
   }
      
   if (!NT_SUCCESS(Status))
   {
       DbgPrint("[%s] [%u] Query IOCTL_STORAGE_QUERY_PROPERTY of device (%p) failed, Status=0x%

08X!/n",
           __FILE__, __LINE__, DeviceObject, Status);
       return BusTypeUnknown;
   }

   Descriptor = (PSTORAGE_DEVICE_DESCRIPTOR)Buffer;
   return Descriptor->BusType;
}

若本函数返回BusType=3是一般硬盘,BusType=7是USB接口设备。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值