亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? usbdisk.cpp

?? usb設備或者可移動的usb存貯器的檢測程序
?? CPP
字號:
// USBDisk.cpp : Defines the entry point for the application.
//

#include "stdafx.h"
#include "resource.h"

#include <stdio.h>

#include <dbt.h>						// For DeviceChange.
#include <winioctl.h>					// For DeviceIOCtl.

#define MAX_LOADSTRING 100

// Add fro USB Task.

// USB letters' container
TCHAR   szMoveDiskName[33];
TCHAR	szDrvName[33];
BOOL	bInitUSBs;
// Drive type names
#define DRVUNKNOWN		0
#define DRVFIXED		1
#define DRVREMOTE		2
#define DRVRAM			3
#define DRVCD			4
#define DRVREMOVE		5

// IOCTL control code
#define IOCTL_STORAGE_QUERY_PROPERTY   CTL_CODE(IOCTL_STORAGE_BASE, 0x0500, METHOD_BUFFERED, FILE_ANY_ACCESS)

//// The following structures all can find at MSDN.
// enumeration type specifies the various types of storage buses
typedef enum _STORAGE_BUS_TYPE {
    BusTypeUnknown = 0x00,
    BusTypeScsi,
    BusTypeAtapi,
    BusTypeAta,
    BusType1394,
    BusTypeSsa,
    BusTypeFibre,
    BusTypeUsb,
    BusTypeRAID,
    BusTypeMaxReserved = 0x7F
} STORAGE_BUS_TYPE, *PSTORAGE_BUS_TYPE;

// retrieve the storage device descriptor data for a device. 
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;

// retrieve the properties of a storage device or adapter. 
typedef enum _STORAGE_QUERY_TYPE {
  PropertyStandardQuery = 0,
  PropertyExistsQuery,
  PropertyMaskQuery,
  PropertyQueryMaxDefined

} STORAGE_QUERY_TYPE, *PSTORAGE_QUERY_TYPE;

// retrieve the properties of a storage device or adapter. 
typedef enum _STORAGE_PROPERTY_ID {
  StorageDeviceProperty = 0,
  StorageAdapterProperty,
  StorageDeviceIdProperty

} STORAGE_PROPERTY_ID, *PSTORAGE_PROPERTY_ID;

// retrieve the properties of a storage device or adapter. 
typedef struct _STORAGE_PROPERTY_QUERY {
  STORAGE_PROPERTY_ID  PropertyId;
  STORAGE_QUERY_TYPE  QueryType;
  UCHAR  AdditionalParameters[1];

} STORAGE_PROPERTY_QUERY, *PSTORAGE_PROPERTY_QUERY;

/****************************************************************************
*
*    FUNCTION: GetDisksProperty(HANDLE hDevice, PSTORAGE_DEVICE_DESCRIPTOR pDevDesc)
*
*    PURPOSE:  get the info of specified device
*
****************************************************************************/
BOOL GetDisksProperty(HANDLE hDevice, PSTORAGE_DEVICE_DESCRIPTOR pDevDesc)
{
	STORAGE_PROPERTY_QUERY	Query;	// input param for query
	DWORD dwOutBytes;				// IOCTL output length
	BOOL bResult;					// IOCTL return val

	// specify the query type
	Query.PropertyId = StorageDeviceProperty;
	Query.QueryType = PropertyStandardQuery;

	// Query using IOCTL_STORAGE_QUERY_PROPERTY 
	bResult = ::DeviceIoControl(hDevice,			// device handle
			IOCTL_STORAGE_QUERY_PROPERTY,			// info of device property
			&Query, sizeof(STORAGE_PROPERTY_QUERY),	// input data buffer
			pDevDesc, pDevDesc->Size,				// output data buffer
			&dwOutBytes,							// out's length
			(LPOVERLAPPED)NULL);					

	return bResult;
}

/****************************************************************************
*
*    FUNCTION: chFirstDriverFrameMask(ULONG unitmask)
*
*    PURPOSE:  get the logic name of driver
*
****************************************************************************/
char chFirstDriveFromMask (ULONG unitmask)
{

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

/****************************************************************************
*
*    FUNCTION: ReInitUSB_Disk_Letter()
*
*    PURPOSE:  get the usb disks, and filling the 'szMoveDiskName' with them
*
****************************************************************************/
void ReInitUSB_Disk_Letter()
{
	int k = 0;
	DWORD			MaxDriveSet, CurDriveSet;
	DWORD			drive, drivetype;
	TCHAR			szBuf[300];
	HANDLE			hDevice;
	PSTORAGE_DEVICE_DESCRIPTOR pDevDesc;

	for(k=0; k<26; k++)
		szMoveDiskName[k] = '\0';	
	k = 1;		
	// Get available drives we can monitor
	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 );
			switch ( GetDriveType( szDrvName ) )  
			{
				case 0:					// The drive type cannot be determined.
				case 1:					// The root directory does not exist.
					drivetype = DRVUNKNOWN;
					break;
				case DRIVE_REMOVABLE:	// The drive can be removed from the drive.
					drivetype = DRVREMOVE;
					szMoveDiskName[k] = chFirstDriveFromMask(temp);
					szMoveDiskName[0]=k;
					k++;
					break;
				case DRIVE_CDROM:		// The drive is a CD-ROM drive.
					break;
				case DRIVE_FIXED:		// The disk cannot be removed from the drive.
					drivetype = DRVFIXED;
					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))
						{
							if(pDevDesc->BusType == BusTypeUsb)
							{
								szMoveDiskName[k] = chFirstDriveFromMask(temp);
								szMoveDiskName[0]=k;
								k++;
							}
						}

						delete pDevDesc;
						CloseHandle(hDevice);
					}
					
					break;
				case DRIVE_REMOTE:		// The drive is a remote (network) drive.
					drivetype = DRVREMOTE;
					szMoveDiskName[k] = chFirstDriveFromMask(temp);
					szMoveDiskName[0]=k;
					k++;
					break;
				case DRIVE_RAMDISK:		// The drive is a RAM disk.
					drivetype = DRVRAM;
					break;
			}
		}
	}

}
///////////////////////////////////////////////////////////////////////////////////
// Global Variables:
HINSTANCE hInst;											// current instance
TCHAR szTitle[MAX_LOADSTRING];								// The title bar text
TCHAR szWindowClass[MAX_LOADSTRING];						// The title bar text

// Foward declarations of functions included in this code module:
ATOM				MyRegisterClass(HINSTANCE hInstance);
BOOL				InitInstance(HINSTANCE, int);
LRESULT CALLBACK	WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK	About(HWND, UINT, WPARAM, LPARAM);

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
 	// TODO: Place code here.
	MSG msg;
	HACCEL hAccelTable;

	// Initialize global strings
	LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
	LoadString(hInstance, IDC_USBDISK, szWindowClass, MAX_LOADSTRING);
	MyRegisterClass(hInstance);

	// Perform application initialization:
	if (!InitInstance (hInstance, nCmdShow)) 
	{
		return FALSE;
	}

	hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_USBDISK);

	// Main message loop:
	while (GetMessage(&msg, NULL, 0, 0)) 
	{
		if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) 
		{
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
	}

	return msg.wParam;
}



//
//  FUNCTION: MyRegisterClass()
//
//  PURPOSE: Registers the window class.
//
//  COMMENTS:
//
//    This function and its usage is only necessary if you want this code
//    to be compatible with Win32 systems prior to the 'RegisterClassEx'
//    function that was added to Windows 95. It is important to call this function
//    so that the application will get 'well formed' small icons associated
//    with it.
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
	WNDCLASSEX wcex;

	wcex.cbSize = sizeof(WNDCLASSEX); 

	wcex.style			= CS_HREDRAW | CS_VREDRAW;
	wcex.lpfnWndProc	= (WNDPROC)WndProc;
	wcex.cbClsExtra		= 0;
	wcex.cbWndExtra		= 0;
	wcex.hInstance		= hInstance;
	wcex.hIcon			= LoadIcon(hInstance, (LPCTSTR)IDI_USBDISK);
	wcex.hCursor		= LoadCursor(NULL, IDC_ARROW);
	wcex.hbrBackground	= (HBRUSH)(COLOR_WINDOW+1);
	wcex.lpszMenuName	= (LPCSTR)IDC_USBDISK;
	wcex.lpszClassName	= szWindowClass;
	wcex.hIconSm		= LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);

	return RegisterClassEx(&wcex);
}

//
//   FUNCTION: InitInstance(HANDLE, int)
//
//   PURPOSE: Saves instance handle and creates main window
//
//   COMMENTS:
//
//        In this function, we save the instance handle in a global variable and
//        create and display the main program window.
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   HWND hWnd;

   hInst = hInstance; // Store instance handle in our global variable

   hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

   if (!hWnd)
   {
      return FALSE;
   }

   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);

   return TRUE;
}

//
//  FUNCTION: WndProc(HWND, unsigned, WORD, LONG)
//
//  PURPOSE:  Processes messages for the main window.
//
//  WM_COMMAND	- process the application menu
//  WM_PAINT	- Paint the main window
//  WM_DESTROY	- post a quit message and return
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	int				wmId, wmEvent;
	PAINTSTRUCT		ps;
	HDC				hdc;
	TCHAR			szHello[256];
	//LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTRING);

	switch (message) 
	{
		case WM_COMMAND:
			wmId    = LOWORD(wParam); 
			wmEvent = HIWORD(wParam); 
			// Parse the menu selections:
			switch (wmId)
			{
				case IDM_ABOUT:
				   DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
				   break;
				case IDM_EXIT:
				   DestroyWindow(hWnd);
				   break;
				default:
				   return DefWindowProc(hWnd, message, wParam, lParam);
			}
			break;
		case WM_PAINT:
			hdc = BeginPaint(hWnd, &ps);
			// TODO: Add any drawing code here...
			RECT rt;
			GetClientRect(hWnd, &rt);

			if(bInitUSBs)
				strcpy(szHello, "\n\nNow analysing the usb disks of this machine.");
			else
				sprintf(szHello, "\n\nUSB disk(s) are: \n%s", &szMoveDiskName[1]);

			if(szMoveDiskName[0] == 0)
				strcpy(szHello, "\n\nThere is no any USB disks detected!");

			DrawText(hdc, szHello, strlen(szHello), &rt, DT_CENTER);
			EndPaint(hWnd, &ps);
			break;
		case WM_DESTROY:
			PostQuitMessage(0);
			break;
		case WM_CREATE:
			bInitUSBs = TRUE;

			ReInitUSB_Disk_Letter();

			bInitUSBs = FALSE;

			GetClientRect(hWnd, &rt);
			InvalidateRect(hWnd, &rt, TRUE);
			break;
		case WM_DEVICECHANGE:	
			switch (wParam){
				case DBT_DEVICEARRIVAL:				// 
				case DBT_DEVICEREMOVECOMPLETE:		// We only concern about these two cases.
					{
						bInitUSBs = TRUE;

						ReInitUSB_Disk_Letter();

						bInitUSBs = FALSE;

						RECT rt;
						GetClientRect(hWnd, &rt);
						InvalidateRect(hWnd, &rt, TRUE);
					}
			}
		break;

		default:
			return DefWindowProc(hWnd, message, wParam, lParam);
   }
   return 0;
}

// Mesage handler for about box.
LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
	switch (message)
	{
		case WM_INITDIALOG:
				return TRUE;

		case WM_COMMAND:
			if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) 
			{
				EndDialog(hDlg, LOWORD(wParam));
				return TRUE;
			}
			break;
	}
    return FALSE;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩三级伦理片妻子的秘密按摩| 久久久www成人免费毛片麻豆 | 日韩视频在线你懂得| 欧美tickling挠脚心丨vk| 91成人在线精品| 国产成a人亚洲精品| 欧美aaa在线| 一区二区激情视频| 国产精品女同互慰在线看| 国产三级一区二区三区| 国产视频一区二区在线| 亚洲美女淫视频| 依依成人精品视频| 亚洲黄色小视频| 激情欧美日韩一区二区| 国产乱淫av一区二区三区| 国产成人在线免费| 在线91免费看| 国产精品另类一区| 日韩视频一区二区在线观看| 国产亚洲一区二区在线观看| 亚洲成av人片| 日韩精品色哟哟| 激情综合网最新| 九九精品一区二区| 91黄视频在线观看| 国产精品天干天干在观线| 免费人成黄页网站在线一区二区| 91亚洲男人天堂| 欧美三级视频在线| 4hu四虎永久在线影院成人| 中国色在线观看另类| 免费亚洲电影在线| 欧美日本不卡视频| 国产午夜亚洲精品理论片色戒| 亚洲高清免费一级二级三级| 青娱乐精品视频| 国产精品一二二区| 亚洲一区二区三区不卡国产欧美| 国产精品天天看| 韩国女主播成人在线| 7777精品伊人久久久大香线蕉完整版 | 伊人开心综合网| 不卡的av网站| 欧美写真视频网站| 日韩欧美的一区二区| 中文字幕精品一区二区三区精品| 亚洲一区二区三区四区中文字幕| 91在线视频观看| 成人性生交大片免费看视频在线| 91丨porny丨蝌蚪视频| 国产精品视频免费看| 粉嫩嫩av羞羞动漫久久久| 久久综合久久综合九色| 亚洲午夜日本在线观看| 日本乱人伦aⅴ精品| 亚洲精选免费视频| 欧美性一级生活| 天使萌一区二区三区免费观看| 欧美日韩国产综合一区二区| 午夜欧美视频在线观看| 国产成人一级电影| 国产精品国产三级国产普通话蜜臀| 丁香亚洲综合激情啪啪综合| 国产精品成人免费精品自在线观看| 99久久久国产精品免费蜜臀| 亚洲免费观看高清完整版在线观看| 一道本成人在线| 国产日韩欧美一区二区三区乱码| 午夜精品久久久久久久久久久 | 青青草原综合久久大伊人精品优势| 欧美精品一卡二卡| 亚洲视频一二三区| 国产91精品一区二区麻豆网站| 欧美国产日韩精品免费观看| 91在线国产观看| 天天色综合天天| 久久久高清一区二区三区| 91在线视频在线| 日韩不卡一二三区| 5566中文字幕一区二区电影| 激情综合网激情| 一区二区三区在线影院| 日韩亚洲国产中文字幕欧美| 国产精品69毛片高清亚洲| 亚洲精品伦理在线| 精品精品欲导航| 日韩精品三区四区| 日本一区二区三区高清不卡 | 国产精品一区不卡| 亚洲一区二区视频在线观看| 欧美哺乳videos| 91久久线看在观草草青青| 久久精品国产免费| 日韩欧美国产一区二区在线播放| 风间由美中文字幕在线看视频国产欧美| 亚洲另类色综合网站| 欧美tickling挠脚心丨vk| 色婷婷综合久久久久中文一区二区| 蜜桃久久av一区| 久久久www成人免费无遮挡大片| 一本色道久久综合亚洲aⅴ蜜桃 | 不卡一区二区三区四区| 日本成人中文字幕| 亚洲欧美一区二区三区国产精品| 久久夜色精品国产噜噜av| 欧美日韩一区二区电影| 成人av资源站| 国产精品一品二品| 久久av中文字幕片| 三级欧美在线一区| 亚洲一卡二卡三卡四卡| 中文文精品字幕一区二区| 欧美xxxx在线观看| 3751色影院一区二区三区| 色网综合在线观看| 99re6这里只有精品视频在线观看| 国产一区二区女| 亚洲丝袜另类动漫二区| 国产亚洲欧美在线| 久久伊人蜜桃av一区二区| 欧美一级生活片| 成人综合日日夜夜| 国产美女视频91| 国产揄拍国内精品对白| 久久精品国产秦先生| 免费高清在线一区| 免费高清在线一区| 美国av一区二区| 日韩av成人高清| 美女视频一区在线观看| 蜜桃久久久久久| 麻豆91精品视频| 国产在线一区观看| 国产精品一区免费在线观看| 精品一区二区免费在线观看| 久久精品国产秦先生| 国内精品久久久久影院一蜜桃| 精品一区二区三区香蕉蜜桃| 久久精品国产免费| 欧美综合久久久| 精品91自产拍在线观看一区| 在线成人午夜影院| 337p亚洲精品色噜噜噜| 91精选在线观看| 精品99久久久久久| 国产精品高潮呻吟| 亚洲乱码国产乱码精品精的特点| 亚洲尤物在线视频观看| 丝袜脚交一区二区| 精油按摩中文字幕久久| 成人性生交大片| 在线看日本不卡| 日韩一区二区免费在线电影| 欧美大片日本大片免费观看| 久久综合资源网| 国产精品高潮久久久久无| 亚洲一区二区三区在线播放| 日韩av电影免费观看高清完整版| 国产一区二区三区香蕉| 91在线观看高清| 91精品国产综合久久久久| 久久在线免费观看| 亚洲免费观看高清完整版在线观看熊| 亚洲午夜在线视频| 激情伊人五月天久久综合| av电影天堂一区二区在线| 国产成+人+日韩+欧美+亚洲| 色综合色综合色综合色综合色综合 | 精品久久免费看| 久久久久国色av免费看影院| 一区在线播放视频| 91精品国模一区二区三区| 久久日一线二线三线suv| 亚洲天堂精品视频| 日本不卡中文字幕| jlzzjlzz亚洲女人18| 91精品国产综合久久精品性色| 中文字幕久久午夜不卡| 美日韩一区二区| 欧美网站大全在线观看| 国产欧美精品一区二区色综合| 亚洲午夜久久久久久久久久久 | 精品久久久久久久久久久久久久久| 久久精品视频一区二区三区| 亚洲一区二区三区四区在线观看 | 蜜桃视频免费观看一区| 91农村精品一区二区在线| 秋霞午夜av一区二区三区| 亚洲乱码国产乱码精品精的特点| 日韩一区欧美二区| 97久久精品人人做人人爽| 2014亚洲片线观看视频免费| 亚洲成a人在线观看| 99视频有精品| 久久精品亚洲国产奇米99| 免费的国产精品| 欧美日韩综合一区| 亚洲欧洲成人av每日更新| 国产九九视频一区二区三区|