检测本机的U盘

先安装DDK(200多兆).将$(DDKHome)/inc/wxp加入包含文件.然后将usbhead.h加入stdafx.h最后.

______________________________________________________________

//头文件:usbhead.h

#include "devioctl.h"
#include "usbdi.h"
#include <dbt.h>      
#include <winioctl.h>     

//这两个头文件是C语言写的.
extern "C" {
#include "hidsdi.h"
#include <setupapi.h>}


#define DRVUNKNOWN  0
#define DRVFIXED  1
#define DRVREMOTE  2
#define DRVRAM   3
#define DRVCD   4
#define DRVREMOVE  5
typedef enum _STORAGE_BUS_TYPE /*{
    BusTypeUnknown = 0x00,
    BusTypeScsi,
    BusTypeAtapi,
    BusTypeAta,
    BusType1394,
    BusTypeSsa,
    BusTypeFibre,
    BusTypeUsb,
    BusTypeRAID,
    BusTypeMaxReserved = 0x7F
}*/ STORAGE_BUS_TYPE, *PSTORAGE_BUS_TYPE;
typedef struct _STORAGE_DEVICE_DESCRIPTOR {
  ULONG  Version;
  ULONG  Size;
  UCHAR  DeviceType;
  UCHAR  DeviceTypeModifier;
  BOOLEAN  RemovableMedia;
  BOOLEAN  CommandQueueing;
  ULONG  VendorIdOffset;
  ULONG  ProductIdOffset;
  ULONG  ProductRevisionOffset;
  ULONG  SerialNumberOffset;
  STORAGE_BUS_TYPE  BusType;
  ULONG  RawPropertiesLength;
  UCHAR  RawDeviceProperties[1];

} STORAGE_DEVICE_DESCRIPTOR, *PSTORAGE_DEVICE_DESCRIPTOR;
typedef enum _STORAGE_QUERY_TYPE {
  PropertyStandardQuery = 0,
  PropertyExistsQuery,
  PropertyMaskQuery,
  PropertyQueryMaxDefined

} STORAGE_QUERY_TYPE, *PSTORAGE_QUERY_TYPE;

typedef enum _STORAGE_PROPERTY_ID {
  StorageDeviceProperty = 0,
  StorageAdapterProperty,
  StorageDeviceIdProperty

} STORAGE_PROPERTY_ID, *PSTORAGE_PROPERTY_ID;

typedef struct _STORAGE_PROPERTY_QUERY {
  STORAGE_PROPERTY_ID  PropertyId;
  STORAGE_QUERY_TYPE  QueryType;
  UCHAR  AdditionalParameters[1];

} STORAGE_PROPERTY_QUERY, *PSTORAGE_PROPERTY_QUERY;

typedef struct _STRING_DESCRIPTOR_NODE
{
    struct _STRING_DESCRIPTOR_NODE *Next;
    UCHAR                           DescriptorIndex;
    USHORT                          LanguageID;
    USB_STRING_DESCRIPTOR           StringDescriptor[0];
} STRING_DESCRIPTOR_NODE, *PSTRING_DESCRIPTOR_NODE;
extern void WINAPI HIDIOCompletionRoutine(DWORD, DWORD, LPOVERLAPPED);
#define IOCTL_STORAGE_QUERY_PROPERTY   CTL_CODE(IOCTL_STORAGE_BASE, 0x0500, METHOD_BUFFERED, FILE_ANY_ACCESS)
________________________________________________________________________________

程序文件:

在某个CPP文件中加入下列代码:(调用TestTestUDisk函数)

BOOL GetDisksProperty(HANDLE hDevice, PSTORAGE_DEVICE_DESCRIPTOR pDevDesc)
{
 STORAGE_PROPERTY_QUERY Query; 
 DWORD dwOutBytes;    
 BOOL bResult;     

 Query.PropertyId = StorageDeviceProperty;
 Query.QueryType = PropertyStandardQuery;

 bResult = ::DeviceIoControl(hDevice,   
   IOCTL_STORAGE_QUERY_PROPERTY,   
   &Query, sizeof(STORAGE_PROPERTY_QUERY), 
   pDevDesc, pDevDesc->Size,    
   &dwOutBytes,       
   (LPOVERLAPPED)NULL);     

 return bResult;
}

char chFirstDriveFromMask(ULONG unitmask)
{
      char i;
      for (i = 0; i < 26; ++i) 
      {
           if (unitmask & 0x1)
    break;
            unitmask = unitmask >> 1;
      }
    return (i + 'A');
}

static CString sss;

void ShowMessage(CString str)
{
 sss.Append(str);
 //AfxMessageBox(str);
}

void ShowMessageAll()
{
 AfxMessageBox(sss);
}

void TestTestUDisk()
{
 // TODO: 检测U盘
 int k = 0;
 DWORD   MaxDriveSet, CurDriveSet;
 DWORD   drive, drivetype;
 TCHAR   szBuf[300];
 HANDLE   hDevice;
 TCHAR   szMoveDiskName[33];
 TCHAR   szDrvName[33];
 PSTORAGE_DEVICE_DESCRIPTOR pDevDesc;

 char* p;
 CString str;

 for(k=0; k<26; k++)
  szMoveDiskName[k] = '/0';
 k = 1;  
 MaxDriveSet = CurDriveSet = 0;

 MaxDriveSet = GetLogicalDrives();
 CurDriveSet = MaxDriveSet;
 for ( drive = 0; drive < 32; ++drive ) 
 {
  if ( MaxDriveSet & (1 << drive) ) 
  {
   DWORD temp = 1<<drive;
   _stprintf( szDrvName, _T("%c://"), 'A'+drive );
   if(GetDriveType( szDrvName )== DRIVE_REMOVABLE)
   {
     drivetype = DRVREMOVE;

     sprintf(szBuf, "?//%c:", 'A'+drive);
     hDevice = CreateFile(szBuf, GENERIC_READ,
       FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, NULL, NULL);

     if (hDevice != INVALID_HANDLE_VALUE)
     {

      pDevDesc = (PSTORAGE_DEVICE_DESCRIPTOR)new BYTE[sizeof(STORAGE_DEVICE_DESCRIPTOR) + 512 - 1];

      pDevDesc->Size = sizeof(STORAGE_DEVICE_DESCRIPTOR) + 512 - 1;

      if(GetDisksProperty(hDevice, pDevDesc))
      {
        szMoveDiskName[k] = chFirstDriveFromMask(temp);
        szMoveDiskName[0]=k;
        ShowMessage("/r/n/r/n找到U盘,名称:/r/n");
        p= (char*)pDevDesc;
        str = (pDevDesc->VendorIdOffset ? &p[pDevDesc->VendorIdOffset]:"(NULL)");
        ShowMessage(str);

        ShowMessage("/r/n产品ID:/r/n");
        str=(pDevDesc->ProductIdOffset ? &p[pDevDesc->ProductIdOffset]:"(NULL)");
        ShowMessage(str);
        ShowMessage("/r/n产品版本:/r/n");
        str = (pDevDesc->ProductRevisionOffset ? &p[pDevDesc->ProductRevisionOffset] : "(NULL)");
        ShowMessage(str);
        ShowMessage("/r/n序列号:/r/n");
        str = (pDevDesc->SerialNumberOffset ? &p[pDevDesc->SerialNumberOffset] : "(NULL)");
        ShowMessage(str);
        str.Format("/r/nU盘符:/r/n%s",&szMoveDiskName[k]);
        ShowMessage(str);

        k++;
      }

      delete pDevDesc;
      CloseHandle(hDevice);
     }
   }
   }

  }

  if(szMoveDiskName[0]==0)
  {
   str="/r/n没有U盘/r/n";
   ShowMessage(str);
  }
 ShowMessageAll();
 sss="";
}
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值