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

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

?? main.cpp

?? 使用DDK來進行編程
?? CPP
字號:
/*
  Name: main.cpp
  Copyright: 
  Author: Gump Yang
  Date: 16-01-06 21:52
  Description: for cly
*/
#include <string>
#include <cstdlib>
#include <sstream>
#include <iostream>

using namespace std;

#include <windows.h>
#include <initguid.h>
#include <setupapi.h>

#include <ddk\scsi.h>
#include <ddk\ntddscsi.h>
#include <ddk\ntdddisk.h>
#include <ddk\ntddstor.h>

DEFINE_GUID(DiskClassGuid,               0x53f56307L, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);

const int MAX_DEVICE = 16;

// SetupDiGetInterfaceDeviceDetail所需要的輸出長度
#define INTERFACE_DETAIL_SIZE	(1024)

// IOCTL_STORAGE_GET_MEDIA_TYPES_EX可能返回不止一條DEVICE_MEDIA_INFO,故定義足夠的空間
#define MEDIA_INFO_SIZE		(sizeof(GET_MEDIA_TYPES) + sizeof(DEVICE_MEDIA_INFO) * 15)

// 從GUID獲得設備路徑
// lpGuid: GUID指針
// pszDevicePath: 設備路徑指針的指針
// 返回值: 成功得到的設備路徑個數
int GetDevicePath(LPGUID lpGuid, LPTSTR* pszDevicePath)
{
	HDEVINFO hDevInfoSet;
	SP_DEVICE_INTERFACE_DATA ifdata;
	PSP_DEVICE_INTERFACE_DETAIL_DATA pDetail;
	int nCount;
	BOOL bResult;

	// 取得一個該GUID相關的設備信息集句柄
	hDevInfoSet = ::SetupDiGetClassDevs(lpGuid, 	// 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,					// 不需額外的設備描述
				lpGuid,					// 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;
}

// 打開設備
// pszDevicePath: 設備的路徑
HANDLE OpenDevice(LPCTSTR pszDevicePath)
{
	HANDLE hDevice;

	// 打開設備
	hDevice= ::CreateFile(pszDevicePath,			// 設備路徑
			GENERIC_READ | GENERIC_WRITE,			// 讀寫方式
			FILE_SHARE_READ | FILE_SHARE_WRITE,		// 共享方式
			NULL,									// 默認的安全描述符
			OPEN_EXISTING,							// 創建方式
			0,										// 不需設置文件屬性
			NULL);									// 不需參照模板文件

	return hDevice;
}

// 取設備屬性信息
// hDevice -- 設備句柄
// pDevDesc -- 輸出的設備描述和屬性信息緩沖區指針(包含連接在一起的兩部分)
BOOL GetDriveProperty(HANDLE hDevice, PSTORAGE_DEVICE_DESCRIPTOR pDevDesc)
{
	STORAGE_PROPERTY_QUERY	Query;	// 查詢輸入參數
	DWORD dwOutBytes;				// IOCTL輸出數據長度
	BOOL bResult;					// IOCTL返回值

	// 指定查詢方式
	Query.PropertyId = StorageDeviceProperty;
	Query.QueryType = PropertyStandardQuery;

	// 用IOCTL_STORAGE_QUERY_PROPERTY取設備屬性信息
	bResult = ::DeviceIoControl(hDevice,			// 設備句柄
			IOCTL_STORAGE_QUERY_PROPERTY,			// 取設備屬性信息
			&Query, sizeof(STORAGE_PROPERTY_QUERY),	// 輸入數據緩沖區
			pDevDesc, pDevDesc->Size,				// 輸出數據緩沖區
			&dwOutBytes,							// 輸出數據長度
			(LPOVERLAPPED)NULL);					// 用同步I/O	

	return bResult;
}

#define CDB10GENERIC_LENGTH                  10

typedef struct _SCSI_PASS_THROUGH_WITH_BUFFERS {
    SCSI_PASS_THROUGH spt;
    ULONG             Filler;      // realign buffers to double word boundary
    UCHAR             ucSenseBuf[32];
    UCHAR             ucDataBuf[512];
} SCSI_PASS_THROUGH_WITH_BUFFERS, *PSCSI_PASS_THROUGH_WITH_BUFFERS;

typedef struct _SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER {
    SCSI_PASS_THROUGH_DIRECT sptd;
    ULONG             Filler;      // realign buffer to double word boundary
    UCHAR             ucSenseBuf[32];
} SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER, *PSCSI_PASS_THROUGH_DIRECT_WITH_BUFFER;

unsigned long ReadDrive(HANDLE hDevice)
{
    cout << "讀取數據" << endl; 
    
    SCSI_PASS_THROUGH_WITH_BUFFERS sptwb;

    ZeroMemory(&sptwb,sizeof(SCSI_PASS_THROUGH_WITH_BUFFERS));
    
    sptwb.spt.Length = sizeof(SCSI_PASS_THROUGH);
    sptwb.spt.PathId = 0;
    sptwb.spt.TargetId = 1;
    sptwb.spt.Lun = 0;
    sptwb.spt.CdbLength = CDB10GENERIC_LENGTH;
    sptwb.spt.SenseInfoLength = 24;
    sptwb.spt.DataIn = SCSI_IOCTL_DATA_IN;
    sptwb.spt.DataTransferLength = 1;
    sptwb.spt.TimeOutValue = 2;
    sptwb.spt.DataBufferOffset =
    offsetof(SCSI_PASS_THROUGH_WITH_BUFFERS,ucDataBuf);
    sptwb.spt.SenseInfoOffset = 
    offsetof(SCSI_PASS_THROUGH_WITH_BUFFERS,ucSenseBuf);
    sptwb.spt.Cdb[0] = SCSIOP_READ;
    sptwb.spt.Cdb[1] = 0x20;
    sptwb.spt.Cdb[2] = 0xd0;
    sptwb.spt.Cdb[3] = 0;
    sptwb.spt.Cdb[4] = 0;
    sptwb.spt.Cdb[5] = 0;
    sptwb.spt.Cdb[6] = 0;
    sptwb.spt.Cdb[7] = 0;
    sptwb.spt.Cdb[8] = 0x01;
    sptwb.spt.Cdb[9] = 0;
    
    cout << "輸出控制字: "; 
    for (int i = 0; i < sptwb.spt.CdbLength; i++) {
        cout << hex << (int)sptwb.spt.Cdb[i] << " ";
    }
    cout << endl;

    ULONG length = 0, returned = 0;
	BOOL bResult;					// IOCTL返回值
        
    length = offsetof(SCSI_PASS_THROUGH_WITH_BUFFERS,ucDataBuf) +
    sptwb.spt.DataTransferLength;
    
    bResult = DeviceIoControl(hDevice,
                              IOCTL_SCSI_PASS_THROUGH,
                              &sptwb,
                              sizeof(SCSI_PASS_THROUGH),
                              &sptwb,
                              length,
                              &returned,
                              FALSE);
}

unsigned long GetDriveCapacity(HANDLE hDevice)
{
    cout << "讀取容量" << endl;
    ULONG length = 0, returned = 0;
	BOOL bResult;					// IOCTL返回值
    
    SCSI_PASS_THROUGH_WITH_BUFFERS sptwb;

    ZeroMemory(&sptwb,sizeof(SCSI_PASS_THROUGH_WITH_BUFFERS));
    
    sptwb.spt.Length = sizeof(SCSI_PASS_THROUGH);
    sptwb.spt.PathId = 0;
    sptwb.spt.TargetId = 1;
    sptwb.spt.Lun = 0;
    sptwb.spt.CdbLength = CDB10GENERIC_LENGTH;
    sptwb.spt.SenseInfoLength = 24;
    sptwb.spt.DataIn = SCSI_IOCTL_DATA_IN;
    sptwb.spt.DataTransferLength = 8;
    sptwb.spt.TimeOutValue = 2;
    sptwb.spt.DataBufferOffset =
    offsetof(SCSI_PASS_THROUGH_WITH_BUFFERS,ucDataBuf);
    sptwb.spt.SenseInfoOffset = 
    offsetof(SCSI_PASS_THROUGH_WITH_BUFFERS,ucSenseBuf);
    sptwb.spt.Cdb[0] = SCSIOP_READ_CAPACITY;
    sptwb.spt.Cdb[1] = 0;
    sptwb.spt.Cdb[2] = 0;
    sptwb.spt.Cdb[3] = 0;
    sptwb.spt.Cdb[4] = 0;
    sptwb.spt.Cdb[5] = 0;
    sptwb.spt.Cdb[6] = 0;
    sptwb.spt.Cdb[7] = 0;
    sptwb.spt.Cdb[8] = 0x0;
    sptwb.spt.Cdb[9] = 0x0;
    
    cout << "輸出控制字: "; 
    for (int i = 0; i < sptwb.spt.CdbLength; i++) {
        cout << hex << (int)sptwb.spt.Cdb[i] << " ";
    }
    cout << endl;
    
    length = offsetof(SCSI_PASS_THROUGH_WITH_BUFFERS,ucDataBuf) +
    sptwb.spt.DataTransferLength;
    
    bResult = DeviceIoControl(hDevice,
                              IOCTL_SCSI_PASS_THROUGH,
                              &sptwb,
                              sizeof(SCSI_PASS_THROUGH),
                              &sptwb,
                              length,
                              &returned,
                              FALSE);

    READ_CAPACITY_DATA outdata;
    ZeroMemory(&outdata, sizeof(READ_CAPACITY_DATA));
    
    cout << "取得數據: "; 
    for (int i = 0; i < sptwb.spt.DataTransferLength; i++) {
        cout << hex << (int)sptwb.ucDataBuf[i] << " ";
    }
    cout << endl;
    
    outdata.LogicalBlockAddress = (int)(sptwb.ucDataBuf[0] << 24) +
                                  (int)(sptwb.ucDataBuf[1] << 16) +
                                  (int)(sptwb.ucDataBuf[2] << 8) +
                                  (int)sptwb.ucDataBuf[3];

    outdata.BytesPerBlock = (int)(sptwb.ucDataBuf[4] << 24) +
                            (int)(sptwb.ucDataBuf[5] << 16) +
                            (int)(sptwb.ucDataBuf[6] << 8) +
                            (int)sptwb.ucDataBuf[7];

    return outdata.LogicalBlockAddress * outdata.BytesPerBlock;
}


int main(int argc, char *argv[])
{
    HANDLE hDevice;
	PSTORAGE_DEVICE_DESCRIPTOR pDevDesc;
	
	string strInfo;
	
	int nDevice;
	int i, j, n;
	char* szDevicePath[MAX_DEVICE];		// 設備路徑
    
	LPGUID lpGuid[] = {
		(LPGUID)&DiskClassGuid, 
	};		// 一些存儲設備的GUID

	// 分配需要的空間
	for(i=0;i<MAX_DEVICE;i++) 
        szDevicePath[i]=new char[256];
	
	pDevDesc = (PSTORAGE_DEVICE_DESCRIPTOR)new BYTE[sizeof(STORAGE_DEVICE_DESCRIPTOR) + 512 - 1];
	pDevDesc->Size = sizeof(STORAGE_DEVICE_DESCRIPTOR) + 512 - 1;

	// 對感興趣的類型的存儲設備,逐一獲取設備信息
	for(i=0; i<sizeof(lpGuid)/sizeof(LPGUID); i++)
	{
		// 取設備路徑
		nDevice = GetDevicePath(lpGuid[i], szDevicePath);

		// 對同一類的存儲設備,逐一獲取設備信息
		for(j=0; j<nDevice; j++)
		{
			// 打開設備
			hDevice=OpenDevice(szDevicePath[j]);

			if(hDevice != INVALID_HANDLE_VALUE)
			{
				// 取設備信息
				GetDriveProperty(hDevice, pDevDesc);
                if (pDevDesc->BusType == BusTypeUsb)  {
//                    cout << "發現U盤" << endl;
//    				n = GetDriveCapacity(hDevice);
//                    cout << "容量為: " << dec << n << endl;
                    cout << "test" << endl;
                    ReadDrive(hDevice);
                }

				// 關閉設備
				CloseHandle(hDevice);
			}
		}
	}

	// 釋放空間
	delete pDevDesc;

	for(i=0;i<MAX_DEVICE;i++) delete []szDevicePath[i];

    system("PAUSE");
    return EXIT_SUCCESS;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日本韩国欧美在线| 日韩欧美精品在线| 久久蜜桃av一区二区天堂| 麻豆久久一区二区| 欧美一区二区三区在线看| 亚洲美女电影在线| 91老师片黄在线观看| 一区二区三区日韩欧美| 欧美丝袜丝交足nylons图片| 日韩国产欧美一区二区三区| 欧美成人女星排行榜| 高清国产一区二区| 亚洲综合一二三区| 久久丝袜美腿综合| 欧美性受极品xxxx喷水| 一本到不卡免费一区二区| 蜜桃久久av一区| 六月丁香综合在线视频| **性色生活片久久毛片| 欧美精品色综合| 成人做爰69片免费看网站| 偷窥少妇高潮呻吟av久久免费| 日韩欧美电影在线| 国产偷国产偷精品高清尤物 | 一本一本久久a久久精品综合麻豆| 成人深夜视频在线观看| 色哟哟欧美精品| 欧美精品一卡两卡| 国产午夜精品美女毛片视频| 亚洲欧美日韩系列| 日韩av一级片| 成人国产视频在线观看| 久久精品国产一区二区三 | 一区二区三区在线视频观看58| 亚洲一线二线三线视频| 久久精品国产免费| 成人av网在线| 日韩色在线观看| 欧美亚洲高清一区二区三区不卡| 欧美日韩一二三| 91麻豆国产在线观看| 91精品国产高清一区二区三区 | 欧美成人a在线| 亚洲精品国产精华液| 国产精品网曝门| 国产日韩在线不卡| 久久久久久久综合色一本| 玉米视频成人免费看| 久久黄色级2电影| 在线观看av不卡| 91极品美女在线| 久久久久久久久久久黄色| 亚洲综合偷拍欧美一区色| 国产大陆亚洲精品国产| 国产成人激情av| 欧美一区二区在线播放| 亚洲激情av在线| 成人午夜大片免费观看| 日韩视频一区二区三区在线播放 | 欧美最猛黑人xxxxx猛交| 精品国产1区2区3区| 久久综合九色综合97_久久久| 一级做a爱片久久| 成人黄色777网| 亚洲国产成人午夜在线一区| 国产欧美一区二区三区在线看蜜臀 | 午夜私人影院久久久久| 99久久久久免费精品国产| 91亚洲大成网污www| 久久精品水蜜桃av综合天堂| 日韩高清在线电影| 日韩一区二区免费在线电影| 亚洲chinese男男1069| 精品一二三四在线| 国产一二三精品| 成人av综合在线| 国产欧美精品一区| 国产99精品在线观看| 国产色婷婷亚洲99精品小说| 国产精品正在播放| 在线观看www91| 亚洲综合精品自拍| 欧美性视频一区二区三区| 亚洲国产乱码最新视频| 精品一区二区三区av| 日韩你懂的在线观看| 韩国女主播成人在线观看| 91天堂素人约啪| 亚洲欧美日韩人成在线播放| 在线观看www91| 日产国产欧美视频一区精品 | 美女脱光内衣内裤视频久久影院| 欧美群妇大交群的观看方式| 国产丝袜美腿一区二区三区| 国产精品一线二线三线| 成人免费小视频| 欧美日韩成人综合在线一区二区| 午夜av电影一区| 337p日本欧洲亚洲大胆色噜噜| 国产成人av电影在线观看| 亚洲欧美偷拍另类a∨色屁股| 欧美在线免费视屏| 久久精品国产99国产精品| 国产亚洲欧美日韩俺去了| 91在线视频观看| 日韩国产成人精品| 中文字幕一区二区三区精华液| 欧亚一区二区三区| 国产一区在线观看麻豆| 中文字幕亚洲区| 日韩欧美中文字幕一区| 国产99精品国产| 三级影片在线观看欧美日韩一区二区 | 免费观看成人av| 在线看日韩精品电影| 日韩精品电影在线| 国产日韩精品一区二区三区在线| 91福利社在线观看| 久久99国产乱子伦精品免费| 国产精品久久福利| 99精品国产视频| 九色|91porny| 亚洲高清视频中文字幕| 国产欧美综合在线| 欧美www视频| 欧美精品丝袜久久久中文字幕| 成人毛片视频在线观看| 欧美a一区二区| 亚洲综合免费观看高清在线观看| 亚洲精品一线二线三线| 欧美色爱综合网| 91在线丨porny丨国产| 精品一区二区三区在线播放视频| 一区二区理论电影在线观看| 久久精品一区二区三区不卡| 51精品国自产在线| 日韩不卡一二三区| 一区二区三区日韩在线观看| 久久久精品欧美丰满| 欧美一级搡bbbb搡bbbb| 欧美在线|欧美| 色婷婷久久久亚洲一区二区三区| 成人丝袜18视频在线观看| 国产专区欧美精品| 精一区二区三区| 久久精品99久久久| 另类调教123区| 另类小说视频一区二区| 免费国产亚洲视频| 美国毛片一区二区| 久久99最新地址| 美脚の诱脚舐め脚责91| 久久国产乱子精品免费女| 免费在线观看精品| 久久99国内精品| 韩国三级电影一区二区| 国产主播一区二区| 成人午夜免费av| 91色婷婷久久久久合中文| 91亚洲国产成人精品一区二区三| 91视频一区二区三区| 欧洲人成人精品| 欧美日本乱大交xxxxx| 欧美男同性恋视频网站| 8x8x8国产精品| 欧美成人女星排行榜| 久久久国产一区二区三区四区小说| 欧美不卡视频一区| 久久综合九色综合欧美亚洲| 国产精品免费视频一区| √…a在线天堂一区| 亚洲福利一区二区| 日韩av网站在线观看| 国产精品影音先锋| 91蝌蚪国产九色| 在线观看91av| 久久精品亚洲一区二区三区浴池| 欧美国产乱子伦| 亚洲午夜免费电影| 麻豆国产91在线播放| 成人黄色在线看| 欧美日韩黄色一区二区| 久久综合精品国产一区二区三区 | 亚洲精品国产视频| 日本特黄久久久高潮| 国产精品系列在线观看| 成人app软件下载大全免费| 在线观看免费亚洲| 久久先锋影音av鲁色资源| 亚洲欧美日韩国产综合在线| 日本一道高清亚洲日美韩| 国产成人在线看| 欧美丰满一区二区免费视频| 国产夜色精品一区二区av| 一区二区三国产精华液| 九九视频精品免费| 欧美日韩国产影片| 欧美国产禁国产网站cc| 日韩av电影免费观看高清完整版| 国产99久久久国产精品潘金网站|