[c#]USB接続デバイス管理 4-構造体の準備

デバイスの状態の検知が終わりましたので、状態操作のために『setupapi.dll』を利用します。
ここで注意点ですが、ビルドや動作状態が32bitである必要があります。
管理人は Windows7(64bit)にて動作確認を行いましたが、32bitビルドを行う必要がありました。
[IntPtr].sizeの差などの要因があるため)
まずは状態の格納を行うための構造体等を用意。

        [Flags()]
        internal enum SetupFlag
        {Default = 1, Present = 2,AllClasses = 4, Profile = 8,DeviceInterface = (int)0x10}

        internal enum Function
        {
            Select = 1,Install = 2,Properties = 4,
            Remove = 5,FoundDevice = 7,PropertyChange = (int)0x12,
        }

        /// デバイス状態格納
        internal enum StatusAction
        {Enable = 1, Disable = 2,PropChange = 3, Start = 4,Stop = 5}

        [Flags()]
        internal enum Scope
        {Global = 1, ConfigSpecific = 2,ConfigGeneral = 4}

        [StructLayout(LayoutKind.Sequential)]
        internal struct DeviceInfoData
        {
            public int Size;
            public Guid ClassGuid;
            public int DevInst;
            public int Reserved;
        }

        [StructLayout(LayoutKind.Sequential)]
        internal struct PropertyParameters
        {
            public int Size;
            public Function MyFunction;
            public StatusAction StateChange;
            public Scope Scope;
            public int Profile;
        }

これらを『setupapi.dll』利用の際の引数などするための受け皿とします。

【各ページへのリンク】

[c#]USB接続デバイス管理 3-デバイス詳細情報取得まとめ

今回は[DeviceID]にて操作を行いたい機器のピックアップを行います。
操作を行いたい機器の[DeviceID]を格納する配列を用意します。
機器の[DeviceID]の調べ方はこちらを参照。

検出したデバイスの詳細情報を取得し、操作を行いたいデバイス状態を調べれる状態にします。
(ManagementObjectオブジェクトの[Properties]プロパティにて取得)
[Win32_PnPEntity]の詳細情報についてはこちらを参照。

    class Program
    {
        // 情報取得コマンド
        static ManagementObjectSearcher MyOCS = new ManagementObjectSearcher("SELECT * FROM Win32_PnPEntity");
        // 取得Object格納
        static ManagementObjectCollection MyOC;
        /// 接続許可機器のDeviceid格納
        static string[] Array_Permit_DeviceID = { "USBSTOR\\DISK&VEN_BUFFALO&PROD_USB_FLASH_DISK&REV_4000\\A085001000075193&0" ,
                                                  "USBSTOR\\DISK&VEN_BUFFALO&PROD_EXTERNAL_HDD&REV_0000\\00000002032664A&0"};

        static void Main(string[] args)
        {
            //接続されてるPnPDeviceの総数
            int CountDevice = MyOCS.Get().Count;
            //1Scan前のPnPDeviceの総数
            int CountDeviceBefour = CountDevice;
            //検出デバイスのDeviceIDを一時格納
            string Value_DeviceID = string.Empty;
            //ループ動作(←ループ条件は、後程要検証)
            while (true)
            {
                MyOC = MyOCS.Get();
                CountDevice = MyOC.Count;
                if (CountDevice != CountDeviceBefour)//ここでデバイス数変化時の処理を行う。
                {
                    string[] Array_DeviceID;//取得ID分解用配列
                    foreach (ManagementObject MyObject in MyCollection)
                    {
                        Value_DeviceID = MyObject["DeviceID"].ToString();
                        Array_DeviceID = Value_DeviceID.Split('\\');
                        if (Array_DeviceID[0].Contains("USB"))//ここで検出時の処理を行う。
                        {
                            for (int i = 0; i < Array_Permit_DeviceID.Length; i++)
                            {
                                if (Array_Permit_DeviceID[i] == Value_DeviceID)//ここでDeviceIDが一致した場合の処理を行う。
                                {break;}
                            }
                        }
                    }
                    Array_DeviceID = null;
                }
                CountDeviceBefour = CountDevice;
            }
        }
    }

ここまでは、デバイスの情報取得と特定となります。
間違い、指摘事項が御座いましたら御教授の程、御願い致します。

【各ページへのリンク】

[c#]USB接続デバイス管理 2-USB接続デバイスの検出

MyOCS.Get()にて取得した ManagementObjectCollectionからUSBに関連するデバイスをピックアップします。
まずは、Win32_PnPEntityクラスの[DeviceID]プロパティを取得します。
ハブを含め、USBに関連する機器は、本プロパティ値の最初の方に大体『USB』という値を持っています。
※[Service]プロパティや判定に使用する値を変更すれば、検出できる機器の変化などの応用が可能です。

例①:USBフラッシュメモリ
USBSTOR\DISK&VEN_BUFFALO&PROD_USB_FLASH_DISK&REV_4000\A085001000000000&0
例②:外付けHDD(USB接続)
USBSTOR\DISK&VEN_BUFFALO&PROD_EXTERNAL_HDD&REV_0000\000000020300000&0
例③:スマートフォン(Interfaceドライバ含む)
USB\VID_0FCE&PID_51C9&MI_00\7&2A800000&0&0000
USB\VID_0FCE&PID_51C9&MI_01\7&2A800000&0&0001

この傾向より、取得したID値を『/』にて文字配列に分解し、『USB』という文字列が含まれているか否かで大まかに検出します。

                string[] Array_DeviceID;//取得ID分解用配列
                foreach (ManagementObject MyObject in MyCollection)
                {
                    Array_DeviceID = MyObject["DeviceID"].ToString().Split('\\');
                    if (Array_DeviceID[0].Contains("USB"))
                    {
                        //ここで検出時の処理を行う。
                    }
                }

今回はここまで。

【各ページへのリンク】