新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 本版讨论.NET,C#,ASP,VB技术
    [返回] 中文XML论坛 - 专业的XML技术讨论区计算机技术与应用『 Dot NET,C#,ASP,VB 』 → 用C#访问硬盘物理扇区和逻辑扇区的方法 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 5878 个阅读者浏览上一篇主题  刷新本主题   平板显示贴子 浏览下一篇主题
     * 贴子主题: 用C#访问硬盘物理扇区和逻辑扇区的方法 举报  打印  推荐  IE收藏夹 
       本主题类别: Description Logics    
     卷积内核 帅哥哟,离线,有人找我吗?
      
      
      威望:8
      头衔:总统
      等级:博士二年级(版主)
      文章:3942
      积分:27590
      门派:XML.ORG.CN
      注册:2004/7/21

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给卷积内核发送一个短消息 把卷积内核加入好友 查看卷积内核的个人资料 搜索卷积内核在『 Dot NET,C#,ASP,VB 』的所有贴子 访问卷积内核的主页 引用回复这个贴子 回复这个贴子 查看卷积内核的博客楼主
    发贴心情 用C#访问硬盘物理扇区和逻辑扇区的方法


    int __fastcall C_BA580_PATH::GetUsbDevice(AnsiString* strUsbDriverName)
    {
      char lpBuffer[MAX_DRIVER_STRING_LENGHT];
      char*lpSingleDevice;

      DWORD nBufferLength = MAX_DRIVER_STRING_LENGHT;
      DWORD dwSignleDeviceBufferIndex =0, dwDeviceNum =0;

      lpSingleDevice = (char*)malloc(sizeof(char)* MAX_DRIVER_STRING_LENGHT);
      if(lpSingleDevice == NULL)
      {
      ShowMessage("系统分配内存错误");
      return 0;
      }
      memset(lpSingleDevice,0x0,MAX_DRIVER_STRING_LENGHT);
      memset(lpBuffer,0x0,MAX_DRIVER_STRING_LENGHT);

      nBufferLength = GetLogicalDriveStrings(nBufferLength,lpBuffer); //列举盘符

      for(DWORD i =0; i< nBufferLength; i++)
      {
      if(lpBuffer[i] != 0x00) //分离各个离盘符
      {
      lpSingleDevice[dwSignleDeviceBufferIndex] = lpBuffer[i];
      dwSignleDeviceBufferIndex++;
      continue;
      }
      lpSingleDevice[dwSignleDeviceBufferIndex] = 0x0;
      dwSignleDeviceBufferIndex = 0;
      if(*lpSingleDevice == 'A') //A盘 不需要
      continue;
      if(GetDriveType(lpSingleDevice) == DRIVE_REMOVABLE) //获取移动磁盘
      {
      strUsbDriverName[dwDeviceNum] = lpSingleDevice ;
      dwDeviceNum++;
      }

      }
      free(lpSingleDevice);
      return dwDeviceNum;
    }

    2.获取PID,UID,序列号信息

    int CUSBPortDlg::GetDevicePath(LPGUID lpGuid, LPTSTR* pszDevicePath)
    {
      HDEVINFO hDevInfoSet; //设备信息集句柄;
      SP_DEVICE_INTERFACE_DATA ifdata;
      PSP_DEVICE_INTERFACE_DETAIL_DATA pDetail;
      int nCount;
      BOOL bResult;
    LPGUID UsbClassGuid;
    CHANGER_PRODUCT_DATA ProductBuffer;
    unsigned long BytesReturned;
      
    UsbClassGuid = (LPGUID)malloc(sizeof(GUID));
    UsbClassGuid->Data1 = 0xa5dcbf10L;
    UsbClassGuid->Data2 = 0x6530;
    UsbClassGuid->Data3 = 0x11d2;
    UsbClassGuid->Data4[0] = 0x90;
    UsbClassGuid->Data4[1] = 0x1F;
    UsbClassGuid->Data4[2] = 0x00;
    UsbClassGuid->Data4[3] = 0xC0;
    UsbClassGuid->Data4[4] = 0x4F;
    UsbClassGuid->Data4[5] = 0xB9;
    UsbClassGuid->Data4[6] = 0x51;
    UsbClassGuid->Data4[7] = 0xED;  

      // 取得一个该GUID相关的设备信息集句柄
      hDevInfoSet = SetupDiGetClassDevs(UsbClassGuid, // class GUID
      NULL, // 无关键字
      NULL, // 不指定父窗口句柄
      DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); // 目前存在的设备
      
      // 失败...
      if (hDevInfoSet == INVALID_HANDLE_VALUE)
      {
      return 0;
      }
      
      // 申请设备接口数据空间
      pDetail = (PSP_DEVICE_INTERFACE_DETAIL_DATA)::GlobalAlloc(LMEM_ZEROINIT, INTERFACE_DETAIL_SIZE);
      
      pDetail->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
      
      nCount = 0;
      bResult = TRUE;
      
      // 设备序号=0,1,2... 逐一测试设备接口,到失败为止
      while (bResult)
      {
      ifdata.cbSize = sizeof(ifdata);
       
      // 枚举符合该GUID的设备接口
      bResult = ::SetupDiEnumDeviceInterfaces(
      hDevInfoSet, // 设备信息集句柄
      NULL, // 不需额外的设备描述
      UsbClassGuid, // GUID
      (ULONG)nCount, // 设备信息集里的设备序号
      &ifdata); // 设备接口信息
       
      if (bResult)
      {
      // 取得该设备接口的细节(设备路径)
      bResult = SetupDiGetInterfaceDeviceDetail(
      hDevInfoSet, // 设备信息集句柄
      &ifdata, // 设备接口信息
      pDetail, // 设备接口细节(设备路径)
      INTERFACE_DETAIL_SIZE, // 输出缓冲区大小
      NULL, // 不需计算输出缓冲区大小(直接用设定值)
      NULL); // 不需额外的设备描述
      if (bResult)
      {
      // 复制设备路径到输出缓冲区
      ::strcpy(pszDevicePath[nCount], pDetail->DevicePath);
      // 调整计数值
      nCount++;
      }
      }
      }
      // 释放设备接口数据空间
      ::GlobalFree(pDetail);
      // 关闭设备信息集句柄
      ::SetupDiDestroyDeviceInfoList(hDevInfoSet);
      return nCount;
    }


       收藏   分享  
    顶(0)
      




    ----------------------------------------------
    事业是国家的,荣誉是单位的,成绩是领导的,工资是老婆的,财产是孩子的,错误是自己的。

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2012/7/23 9:45:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 Dot NET,C#,ASP,VB 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/5/25 15:41:36

    本主题贴数2,分页: [1]

     *树形目录 (最近20个回帖) 顶端 
    主题:  用C#访问硬盘物理扇区和逻辑扇区的方法(3471字) - 卷积内核,2012年7月23日
        回复:  C#利用Zgke.DriverLoader T = new Zgke.DriverLoader(..(4031字) - 卷积内核,2012年7月23日

    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    492.188ms