文档章节

弹出U盘代码

rise-worlds
 rise-worlds
发布于 2016/06/20 13:38
字数 566
阅读 4
收藏 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

粉丝 2
博文 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
754
10
DELL R710 服务器重装系统

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

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

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

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

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

Rainy0426
2017/06/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周日乱弹 —— 我,小小编辑,食人族酋长

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @宇辰OSC :分享娃娃的单曲《飘洋过海来看你》: #今日歌曲推荐# 《飘洋过海来看你》- 娃娃 手机党少年们想听歌,请使劲儿戳(这里) @宇辰OSC...

小小编辑
今天
706
10
MongoDB系列-- SpringBoot 中对 MongoDB 的 基本操作

SpringBoot 中对 MongoDB 的 基本操作 Database 库的创建 首先 在MongoDB 操作客户端 Robo 3T 中 创建数据库: 增加用户User: 创建 Collections 集合(类似mysql 中的 表): 后面我们大部分都...

TcWong
今天
40
0
spring cloud

一、从面试题入手 1.1、什么事微服务 1.2、微服务之间如何独立通讯的 1.3、springCloud和Dubbo有哪些区别 1.通信机制:DUbbo基于RPC远程过程调用;微服务cloud基于http restFUL API 1.4、spr...

榴莲黑芝麻糊
今天
26
0
Executor线程池原理与源码解读

线程池为线程生命周期的开销和资源不足问题提供了解决方 案。通过对多个任务重用线程,线程创建的开销被分摊到了多个任务上。 线程实现方式 Thread、Runnable、Callable //实现Runnable接口的...

小强的进阶之路
昨天
75
0
maven 环境隔离

解决问题 即 在 resource 文件夹下面 ,新增对应的资源配置文件夹,对应 开发,测试,生产的不同的配置内容 <resources> <resource> <directory>src/main/resources.${deplo......

之渊
昨天
73
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部