わびさびサンプルソース

WindowsやHTML5などのプログラムのサンプルコードやフリーソフトを提供します。

ドライブのモデル名、接続I/F情報を取得する

指定したドライブまたは、パーティションのドライブのモデル名、接続I/F情報をIOCTL_STORAGE_QUERY_PROPERTYを使って取得します。

ドライブのモデル名、接続I/F情報を取得する
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
#include <stdio.h>
#include <tchar.h>
#include <iostream>
#include <fstream>
#include <windows.h>
 
 
 
/*
    ファイルサイズの取得
*/
int _tmain
(
      int argc
    , _TCHAR* argv[]
)
{
    // 標準出力にユニコードを表示できるようにする
    setlocale( LC_ALL, "Japanese" );
 
    // "i:"はドライブレターです。パーティションを指定しても取得できます。
    HANDLE hDevice = CreateFile(L"¥¥¥¥.¥¥i:", 0,
//  HANDLE hDevice = CreateFile(L"¥¥¥¥?¥¥GLOBALROOT¥¥Device¥¥Harddisk9¥¥Partition1", 0,
                    FILE_SHARE_READ | FILE_SHARE_WRITE,
                    NULL, OPEN_EXISTING, 0, NULL);
 
    if ( hDevice != INVALID_HANDLE_VALUE ) {
 
        DWORD dwResult = 0;
 
        STORAGE_PROPERTY_QUERY tStragePropertyQuery;
        tStragePropertyQuery.PropertyId = StorageDeviceProperty;
        tStragePropertyQuery.QueryType  = PropertyStandardQuery;
 
 
        // メモリの確保
        DWORD dwInfoSize = 4096;
        STORAGE_DEVICE_DESCRIPTOR* tpStorageDeviceDescripter = (STORAGE_DEVICE_DESCRIPTOR*)malloc( dwInfoSize );
        if ( NULL == tpStorageDeviceDescripter ) {
            goto err;
        }
 
 
        /*
            IOCTL_STORAGE_QUERY_PROPERTY
        */
        BOOL bResult = ::DeviceIoControl(
            (HANDLE) hDevice                            // handle to device
          , IOCTL_STORAGE_QUERY_PROPERTY                // dwIoControlCode
          , &tStragePropertyQuery                       // lpInBuffer
          , (DWORD)sizeof( tStragePropertyQuery )       // nInBufferSize
          , (LPVOID)tpStorageDeviceDescripter           // output buffer
          , (DWORD)dwInfoSize                           // size of output buffer
          , (LPDWORD)&dwResult                          // number of bytes returned
          , (LPOVERLAPPED)NULL                          // OVERLAPPED structure
        );
 
        if ( 0 == bResult ) {
 
            // 取得失敗
            std::wcout << L"IOCTL_DISK_GET_DRIVE_LAYOUT_EX失敗(" << ::GetLastError() << L")" << std::endl;
            ::CloseHandle( hDevice );
            goto err;
        }
 
        std::wcout << L"Version             = " << tpStorageDeviceDescripter->Version               << std::endl;
        std::wcout << L"Size                = " << tpStorageDeviceDescripter->Size                  << std::endl;
        std::wcout << L"DeviceType          = " << tpStorageDeviceDescripter->DeviceType            << std::endl;
        std::wcout << L"DeviceTypeModifier  = " << tpStorageDeviceDescripter->DeviceTypeModifier    << std::endl;
        std::wcout << L"RemovableMedia      = " << tpStorageDeviceDescripter->RemovableMedia        << std::endl;
        std::wcout << L"CommandQueueing     = " << tpStorageDeviceDescripter->CommandQueueing       << std::endl;
        std::wcout << L"VendorId            = " << (CHAR*)tpStorageDeviceDescripter + tpStorageDeviceDescripter->VendorIdOffset        << std::endl;
        std::wcout << L"ProductId           = " << (CHAR*)tpStorageDeviceDescripter + tpStorageDeviceDescripter->ProductIdOffset       << std::endl;
        std::wcout << L"ProductRevision     = " << (CHAR*)tpStorageDeviceDescripter + tpStorageDeviceDescripter->ProductRevisionOffset << std::endl;
        if ( ( 0 < tpStorageDeviceDescripter->SerialNumberOffset ) && ( -1 != tpStorageDeviceDescripter->SerialNumberOffset ) ) {
            std::wcout << L"SerialNumber        = " << (CHAR*)tpStorageDeviceDescripter + tpStorageDeviceDescripter->SerialNumberOffset    << std::endl;
        }
        else {
            std::wcout << L"SerialNumber        = " << std::endl;
        }
        std::wcout << L"BusType             = " << tpStorageDeviceDescripter->BusType;
        switch( tpStorageDeviceDescripter->BusType ) {
        case BusTypeUnknown:           std::wcout << L"(Unknown)"           << std::endl; break;
        case BusTypeScsi:              std::wcout << L"(Scsi)"              << std::endl; break;
        case BusTypeAtapi:             std::wcout << L"(Atapi)"             << std::endl; break;
        case BusTypeAta:               std::wcout << L"(Ata)"               << std::endl; break;
        case BusType1394:              std::wcout << L"(1394)"              << std::endl; break;
        case BusTypeSsa:               std::wcout << L"(Ssa)"               << std::endl; break;
        case BusTypeFibre:             std::wcout << L"(Fibre)"             << std::endl; break;
        case BusTypeUsb:               std::wcout << L"(Usb)"               << std::endl; break;
        case BusTypeRAID:              std::wcout << L"(RAID)"              << std::endl; break;
        case BusTypeiScsi:             std::wcout << L"(iScsi)"             << std::endl; break;
        case BusTypeSas:               std::wcout << L"(Sas)"               << std::endl; break;
        case BusTypeSata:              std::wcout << L"(Sata)"              << std::endl; break;
        case BusTypeSd:                std::wcout << L"(Sd)"                << std::endl; break;
        case BusTypeMmc:               std::wcout << L"(Mmc)"               << std::endl; break;
        case BusTypeVirtual:           std::wcout << L"(Virtual)"           << std::endl; break;
        case BusTypeFileBackedVirtual: std::wcout << L"(FileBackedVirtual)" << std::endl; break;
        case BusTypeMax:               std::wcout << L"(Max)"               << std::endl; break;
        case BusTypeMaxReserved:       std::wcout << L"(MaxReserved)"       << std::endl; break;
        }
        std::wcout << L"RawPropertiesLength = " << tpStorageDeviceDescripter->RawPropertiesLength   << std::endl;
//      std::wcout << L"RawDeviceProperties = " << tpStorageDeviceDescripter->RawDeviceProperties   << std::endl;
 
 
err:
        // メモリ解放
        if ( NULL != tpStorageDeviceDescripter ) {
            free( tpStorageDeviceDescripter );
        }
 
        // ハンドルのクローズ
        ::CloseHandle( hDevice );
    }
 
    // 正常終了
    return( 0 );
}

実行結果

Version             = 40
Size                = 120
DeviceType          = 0
DeviceTypeModifier  = 0
RemovableMedia      = 1
CommandQueueing     = 0
VendorId            = BUFFALO
ProductId           = ClipDrive
ProductRevision     = 1.11
SerialNumber        = 230760A43EB9F10E
BusType             = 7(Usb)
RawPropertiesLength = 36






わびさびサンプルソース

WindowsやHTML5などのプログラムのサンプルコードやフリーソフトを提供します。