文档章节

弹出U盘代码

rise-worlds
 rise-worlds
发布于 2016/06/20 13:37
字数 566
阅读 11
收藏 0
//以下代码来自网上,需DDK、SDK支持




#include <windows.h>
#include <Setupapi.h>
#include <winioctl.h>
#include <cfgmgr32.h>
#include <regstr.h>  
#include <initguid.h>  
#include <stdio.h>
extern   "C"   
{    
 #include   "hidsdi.h"    
}  
DEFINE_GUID(GUID_DEVINTERFACE_DISK,                   0x53f56307L, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
DEFINE_GUID(GUID_DEVINTERFACE_CDROM,                  0x53f56308L, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
//-------------------------------------------------
DEVINST GetDrivesDevInstByDiskNumber(long DiskNumber, UINT DriveType);
//-------------------------------------------------
//-------------------------------------------------
int main(int argc, char* argv[])
{
 if ( argc != 2 ) {
  return 1;
 }
 
 //printf("in \n\n");
 
 char DriveLetter = argv[1][0];
 DriveLetter &= ~0x20; // uppercase
 
 if ( DriveLetter < 'A' || DriveLetter > 'Z' )
 {
  return 1;
 }
 
 char szRootPath[] = "X:\\";   // "X:\"
 szRootPath[0] = DriveLetter;
 
 char szVolumeAccessPath[] = "\\\\.\\X:";   // "\\.\X:"
 szVolumeAccessPath[4] = DriveLetter;
 
 long DiskNumber = -1;
 
 HANDLE hVolume = CreateFile(szVolumeAccessPath, 0, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, NULL, NULL);
 if (hVolume == INVALID_HANDLE_VALUE) {
  return 1;
 }
 
 STORAGE_DEVICE_NUMBER sdn;
 DWORD dwBytesReturned = 0;
 long res = DeviceIoControl(hVolume, IOCTL_STORAGE_GET_DEVICE_NUMBER, NULL, 0, &sdn, sizeof(sdn), &dwBytesReturned, NULL);
 if ( res ) {
  DiskNumber = sdn.DeviceNumber;
 }
 CloseHandle(hVolume);
 
 if ( DiskNumber == -1 ) {
  return 1;
 }
 
 UINT DriveType = GetDriveType(szRootPath);
 
 DEVINST DevInst = GetDrivesDevInstByDiskNumber(DiskNumber, DriveType);
 
 if ( DevInst == 0 ) {
  return 1;
 }
 
 ULONG Status = 0;
 ULONG ProblemNumber = 0;
 PNP_VETO_TYPE VetoType = PNP_VetoTypeUnknown;
 WCHAR VetoNameW[MAX_PATH];
 bool bSuccess = false;
 
 res = CM_Get_Parent(&DevInst, DevInst, 0);  // disk's parent, e.g. the USB bridge, the SATA port....
 res = CM_Get_DevNode_Status(&Status, &ProblemNumber, DevInst, 0);
 bool IsRemovable = ((Status & DN_REMOVABLE) != 0);
 
 
 for ( long tries=1; tries<=3; tries++ ) { // sometimes we need some tries...
  VetoNameW[0] = 0;
  if ( IsRemovable ) {
   res = CM_Request_Device_EjectW(DevInst, &VetoType, VetoNameW, sizeof(VetoNameW), 0);
   //res = CM_Request_Device_EjectW(DevInst, &VetoType, NULL, 0, 0);  // with MessageBox or 'bubble'
  } else {
   res = CM_Query_And_Remove_SubTreeW(DevInst, &VetoType, VetoNameW, sizeof(VetoNameW), 0); // CM_Query_And_Remove_SubTreeA is not implemented under W2K!
  }
  bSuccess = (res==CR_SUCCESS && VetoType==PNP_VetoTypeUnknown);
  if ( bSuccess )  {
   break;
  } else {
   Sleep(200); // required to give the next tries a chance!
  }
 }
 
 if ( bSuccess ) {
  printf("Success\n\n");
  return 0;
 }
 
 printf("failed\n");
 
 printf("Result=0x%2X\n", res);
 
 if ( VetoNameW[0] ) {
  printf("VetoName=%ws)\n\n", VetoNameW);
 }
 return 1;
}
//-----------------------------------------------------------
 

//-----------------------------------------------------------
DEVINST GetDrivesDevInstByDiskNumber(long DiskNumber, UINT DriveType) {
 
 GUID* guid;
 
 switch (DriveType) {
 case DRIVE_REMOVABLE:
  //break;
 case DRIVE_FIXED:
  guid = (GUID*)(void*)&GUID_DEVINTERFACE_DISK;
  break;
 case DRIVE_CDROM:
  guid = (GUID*)(void*)&GUID_DEVINTERFACE_CDROM;
  break;
 default:
  return 0;
 }
 
 // Get device interface info set handle for all devices attached to system
 HDEVINFO hDevInfo = SetupDiGetClassDevs(guid, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
 
 if (hDevInfo == INVALID_HANDLE_VALUE){
  return 0;
 }
 
 // Retrieve a context structure for a device interface of a device
 // information set.
 DWORD dwIndex = 0;
 SP_DEVICE_INTERFACE_DATA devInterfaceData = {0};
 devInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
 BOOL bRet = FALSE;
 
 BYTE Buf[1024];
 PSP_DEVICE_INTERFACE_DETAIL_DATA pspdidd = (PSP_DEVICE_INTERFACE_DETAIL_DATA)Buf;
 SP_DEVICE_INTERFACE_DATA         spdid;
 SP_DEVINFO_DATA                  spdd;
 DWORD                            dwSize;
 
 spdid.cbSize = sizeof(spdid);
 
 while ( true ){
  bRet = SetupDiEnumDeviceInterfaces(hDevInfo, NULL, guid, dwIndex, &devInterfaceData);
  if (!bRet) {
   break;
  }
  
  SetupDiEnumInterfaceDevice(hDevInfo, NULL, guid, dwIndex, &spdid);
  
  dwSize = 0;
  SetupDiGetDeviceInterfaceDetail(hDevInfo, &spdid, NULL, 0, &dwSize, NULL);
  
  if ( dwSize!=0 && dwSize<=sizeof(Buf) ) {
   //pspdidd = (PSP_DEVICE_INTERFACE_DETAIL_DATA)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwSize);
   //if ( pspdidd == NULL ) {
   //return 0; // damn
   //}
   pspdidd->cbSize = sizeof(*pspdidd); // 5 Bytes!
   
   ZeroMemory((PVOID)&spdd, sizeof(spdd));
   spdd.cbSize = sizeof(spdd);
   
   long res = SetupDiGetDeviceInterfaceDetail(hDevInfo, &spdid, pspdidd, dwSize, &dwSize, &spdd);
   if ( res ) {
    
    // the device instance id string contains the serial number if the
    // device has one...
    // char szDevInstId[260] = {0};
    // SetupDiGetDeviceInstanceId(hDevInfo, &spdd, szDevInstId, 260, NULL);
    // printf("DevInstId=%s\n", szDevInstId);
    
    HANDLE hDrive = CreateFile(pspdidd->DevicePath, 0, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, NULL, NULL);
    if ( hDrive != INVALID_HANDLE_VALUE ) {
     STORAGE_DEVICE_NUMBER sdn;
     DWORD dwBytesReturned = 0;
     res = DeviceIoControl(hDrive, IOCTL_STORAGE_GET_DEVICE_NUMBER, NULL, 0, &sdn, sizeof(sdn), &dwBytesReturned, NULL);
     if ( res ) {
      if ( DiskNumber == (long)sdn.DeviceNumber ) {
       CloseHandle(hDrive);
       //HeapFree(GetProcessHeap(), 0, pspdidd);
       SetupDiDestroyDeviceInfoList(hDevInfo);
       return spdd.DevInst;
      }
     }
     CloseHandle(hDrive);
    }
   }
   //HeapFree(GetProcessHeap(), 0, pspdidd);
  }
  dwIndex++;
 }
 
 SetupDiDestroyDeviceInfoList(hDevInfo);
 
 return 0;
}

本文转载自:http://www.cnblogs.com/flying_bat/archive/2008/03/16/1108132.html

rise-worlds

rise-worlds

粉丝 3
博文 1755
码字总数 0
作品 0
深圳
程序员
私信 提问
使用UltraISO制作ubuntu安装u盘启动盘图文教程

制作U盘启动1.gif 1、首先打开UltraISO软件,尽量下载最新版的 http://www.cr173.com/soft/15480.html 2、点击工具栏中的第二个打开镜像文件工具,如图红色方框标志按钮,然后在打开的“打开...

胖先森
2017/09/07
0
0
用JAVA编个程序放U盘里,当对U盘中的文件操作时弹出一个窗口!

如题,用JAVA编个程序放U盘里,当对U盘中的文件操作时弹出一个窗口,或者打开U盘时弹出窗口也行。具体思想是什么?

time王博
2012/12/09
760
10
DELL R710 服务器重装系统

DELL R710 服务器重装系统 从光盘启动,死活都是失败了。没搞明白什么原因。最后从U盘启动成功装了系统。下面简单的说一下U盘的处理步骤。装系统就不说了,引导进去之后,都是图形操作界面。...

lwkai
02/25
387
0
U盘安装系统提示windows无法安装所需的文件 文件可能损坏或丢失解决方法

在使用U盘或U盘pe安装win7、win8、win8.1和win10原版系统时,进行到“正在准备要安装的文件”出现了错误,提示“Windows 无法安装所需的文件。文件可能损坏或丢失。请确保安装所需的所有文件...

临江仙卜算子
2018/10/08
293
0
虚拟机怎样设置bios第一启动为u盘启动

总共三步骤:安装创建虚拟机和准备u启动u盘 - 虚拟机添加u盘设备 - 设置虚拟机bios启动项第一项为u盘 【前提条件】 1.已经用u启动制作好启动盘的u盘一个。 2.安装虚拟机(VMware Workstatio...

Rainy0426
2017/06/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

java通过ServerSocket与Socket实现通信

首先说一下ServerSocket与Socket. 1.ServerSocket ServerSocket是用来监听客户端Socket连接的类,如果没有连接会一直处于等待状态. ServetSocket有三个构造方法: (1) ServerSocket(int port);...

Blueeeeeee
今天
6
0
用 Sphinx 搭建博客时,如何自定义插件?

之前有不少同学看过我的个人博客(http://python-online.cn),也根据我写的教程完成了自己个人站点的搭建。 点此:使用 Python 30分钟 教你快速搭建一个博客 为防有的同学不清楚 Sphinx ,这...

王炳明
昨天
5
0
黑客之道-40本书籍助你快速入门黑客技术免费下载

场景 黑客是一个中文词语,皆源自英文hacker,随着灰鸽子的出现,灰鸽子成为了很多假借黑客名义控制他人电脑的黑客技术,于是出现了“骇客”与"黑客"分家。2012年电影频道节目中心出品的电影...

badaoliumang
昨天
16
0
很遗憾,没有一篇文章能讲清楚线程的生命周期!

(手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本。 简介 大家都知道线程是有生命周期,但是彤哥可以认真负责地告诉你网上几乎没有一篇文章讲得是完全正确的。 ...

彤哥读源码
昨天
18
0
jquery--DOM操作基础

本文转载于:专业的前端网站➭jquery--DOM操作基础 元素的访问 元素属性操作 获取:attr(name);$("#my").attr("src"); 设置:attr(name,value);$("#myImg").attr("src","images/1.jpg"); ......

前端老手
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部