SP_DEVINSTALL_PARAMS_A
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| cbSize | DWORD | 4 | +0 | +0 | SP_DEVINSTALL_PARAMS 構造体のサイズ (バイト単位)。 |
| Flags | SETUP_DI_DEVICE_INSTALL_FLAGS | 4 | +4 | +4 | インストールおよびユーザーインターフェイスの操作を制御するフラグです。一部のフラグはデバイスインストール要求を送信する前に設定できますが、その他のフラグは一部の要求の処理中に自動的に設定されます。Flags には次の値の組み合わせを指定できます。 フラグの値は、デバイスインストールアプリケーションおよびインストーラーが書き込み可能なもの、読み取り専用 (OS のみが設定)、予約済み、廃止済みのグループに分けて示します。最初のグループは書き込み可能なフラグです。 DI_CLASSINSTALLPARAMSクラスインストールパラメーターを使用する場合に設定します。SetupDiSetClassInstallParams は、呼び出し元がパラメーターを指定するとこのフラグを設定し、呼び出し元が NULL のパラメーターポインターを指定するとこのフラグをクリアします。 DI_COMPAT_FROM_CLASSSetupDiBuildDriverInfoList に対して、INF ファイルではなくクラスドライバーリストからデバイスの互換ドライバーの一覧を作成させる場合に設定します。 DI_DRIVERPAGE_ADDEDインストーラーがシステム提供のドライバープロパティページを置き換えるページを提供する場合に、クラスインストーラーまたはコインストーラーによって設定されます。このフラグが設定されている場合、オペレーティングシステムはシステム提供のドライバーページを表示しません。 DI_DONOTCALLCONFIGMG特定のデバイスインストール関数 (たとえば SetupDiInstallDevice) の実行中に、デバイスの削除や再列挙のために構成マネージャーを呼び出すべきでない場合に設定します。 このフラグが設定されている場合、デバイスインストールアプリケーション、クラスインストーラー、コインストーラーは次の関数を呼び出してはなりません。 CM_Reenumerate_DevNode CM_Reenumerate_DevNode_Ex CM_Query_And_Remove_SubTree CM_Query_And_Remove_SubTree_Ex CM_Setup_DevNode CM_Setup_DevNode_Ex CM_Set_HW_Prof_Flags CM_Set_HW_Prof_Flags_Ex CM_Enable_DevNode CM_Enable_DevNode_Ex CM_Disable_DevNode CM_Disable_DevNode_Ex DI_ENUMSINGLEINFインストーラーおよびその他のデバイスインストールコンポーネントが、SP_DEVINSTALL_PARAMS.DriverPath で指定された INF ファイルのみを検索する必要がある場合に設定します。このフラグが設定されている場合、DriverPath にはディレクトリのパスではなく単一の INF ファイルのパスが格納されます。 DI_INF_IS_SORTED[デバイスの選択] ページで、ドライバーをアルファベット順に並べ替えるのではなく INF ファイルに記述されている順序で一覧表示することを示すために設定します。 DI_INSTALLDISABLEDデバイスを既定で無効な状態でインストールする場合に設定します。認識されるためには、Windows が DIF_INSTALLDEVICE 要求の既定のハンドラーを呼び出す前にこのフラグを設定しなければなりません。 DI_NEEDREBOOTNT ベースのオペレーティングシステムでは、デバイスのインストール後またはデバイスの状態変更後にコンピューターの再起動が必要な場合にこのフラグが設定されます。クラスインストーラーまたはコインストーラーは、再起動が必要であると判断した場合、デバイスインストール中の任意の時点でこのフラグを設定できます。 DI_NEEDRESTARTDI_NEEDREBOOT と同じです。 DI_NOBROWSEユーザーが OEM ディスクのパスを選択する際に参照を無効にする場合に設定します。デバイスインストールアプリケーションは、ユーザーがインストールメディアの場所からのみインストールできるように制限するためにこのフラグを設定します。 DI_NODI_DEFAULTACTIONクラスインストーラーが ERR_DI_DO_DEFAULT を返した場合、またはクラスインストーラーが存在しない場合に、SetupDiCallClassInstaller が既定の処理を実行しないようにする場合に設定します。 DI_NOFILECOPYSetupDiInstallDevice などのデバイスインストールアプリケーションおよびコンポーネントが、ファイルのコピーをスキップする必要がある場合に設定します。 DI_NOVCP新しいコピーキューの作成を無効にする場合に設定します。SP_DEVINSTALL_PARAMS.FileQueue に指定された、呼び出し元が用意したコピーキューを使用します。 DI_NOWRITE_IDSSetupDiInstallDevice が、INF で指定されたハードウェア ID および互換 ID を、デバイスノード (devnode) のデバイスプロパティに書き込まないようにする場合に設定します。このフラグは、ルート列挙デバイスに対してのみ設定してください。 このフラグは DI_FLAGSEX_ALWAYSWRITEIDS フラグより優先されます。 DI_PROPERTIES_CHANGEデバイスのプロパティが変更され、インストーラーのユーザーインターフェイスの更新が必要になった場合に、デバイスマネージャーによって設定されます。 DI_QUIETINSTALLデバイスインストーラー関数が何も表示せずに動作し、可能な限り既定の選択肢を使用しなければならない場合に設定します。このフラグが設定されている場合、クラスインストーラーおよびコインストーラーは UI を表示してはなりません。 DI_RESOURCEPAGE_ADDEDインストーラーがシステム提供のリソースプロパティページを置き換えるページを提供する場合に、クラスインストーラーまたはコインストーラーによって設定されます。このフラグが設定されている場合、オペレーティングシステムはシステム提供のリソースページを表示しません。 DI_SHOWOEMOEM ディスクのサポートを許可する場合に設定します。このフラグが設定されている場合、オペレーティングシステムは [デバイスの選択] ページに "Have Disk" (ディスク使用) ボタンを表示します。このフラグは、システム提供のウィザードでは既定で設定されます。 DI_USECI_SELECTSTRINGSクラスインストーラーまたはコインストーラーが、SetupDiSelectDevice の実行中に使用する文字列を提供した場合に設定します。 次のフラグは読み取り専用です (OS のみが設定します)。 DI_DIDCLASSSetupDiBuildDriverInfoList が、このクラスのデバイス用のドライバーの一覧を既に作成している場合に設定されます。この一覧が既に作成されている場合、そこにはすべてのドライバー情報が含まれており、このフラグは常に設定されます。SetupDiDestroyDriverInfoList は、クラスのドライバー一覧を削除するときにこのフラグをクリアします。 このフラグは読み取り専用です。オペレーティングシステムのみがこのフラグを設定します。 DI_DIDCOMPATSetupDiBuildDriverInfoList が、このデバイス用の互換ドライバーの一覧を既に作成している場合に設定されます。この一覧が既に作成されている場合、そこにはすべてのドライバー情報が含まれており、このフラグは常に設定されます。SetupDiDestroyDriverInfoList は、互換ドライバーの一覧を削除するときにこのフラグをクリアします。 このフラグは、特定のデバイス情報要素に関連付けられたデバイスインストールパラメーターでのみ設定され、デバイス情報セット全体のパラメーターでは設定されません。 このフラグは読み取り専用です。オペレーティングシステムのみがこのフラグを設定します。 DI_MULTMFGSデバイスセットアップクラスのドライバー一覧に複数の製造元から提供されたドライバーが含まれている場合に、SetupDiBuildDriverInfoList によって設定されます。 このフラグは読み取り専用です。オペレーティングシステムのみがこのフラグを設定します。 次のフラグは予約済みです。 次のフラグは廃止されています。 |
| FlagsEx | SETUP_DI_DEVICE_INSTALL_FLAGS_EX | 4 | +8 | +8 | インストールおよびユーザーインターフェイスの操作をさらに制御するための追加のフラグです。一部のフラグはデバイスインストーラー関数を呼び出す前に設定できますが、その他のフラグは一部の関数の処理中に自動的に設定されます。FlagsEx には次の値の組み合わせを指定できます。 フラグの値は、デバイスインストールアプリケーションおよびインストーラーが書き込み可能なもの、読み取り専用 (OS のみが設定)、予約済み、廃止済みのグループに分けて示します。 最初のグループは書き込み可能なフラグです。 DI_FLAGSEX_ALLOWEXCLUDEDDRVS設定されている場合、"Exclude From Select" とマークされたドライバーを含めます。 たとえば、このフラグが設定されている場合、SetupDiSelectDevice は Exclude From Select 状態のドライバーを表示し、SetupDiBuildDriverInfoList は要求されたドライバー一覧に Exclude From Select のドライバーを含めます。 ドライバーは、INF ファイルで ExcludeFromSelect とマークされている場合、またはセットアップクラス全体がクラスインストーラーの INF で NoInstallClass もしくは NoUseClass とマークされているデバイスのドライバーである場合に "Exclude From Select" となります。PnP デバイスのドライバーは通常 "Exclude From Select" です。PnP デバイスは手動でインストールすべきではありません。PnP デバイスのドライバーファイルの一覧を作成するには、SetupDiBuildDriverInfoList の呼び出し元はこのフラグを設定しなければなりません。 DI_FLAGSEX_ALWAYSWRITEIDS設定されていて、かつ DI_NOWRITE_IDS フラグがクリアされている場合、ハードウェア ID と互換 ID を常に devnode のデバイスプロパティに書き込みます。このフラグは、ルート列挙デバイスに対してのみ設定してください。 DI_FLAGSEX_APPENDDRIVERLIST設定されている場合、SetupDiBuildDriverInfoList は既存の一覧に新しいドライバー一覧を追加します。このフラグは、複数の場所を検索する場合に意味を持ちます。 DI_FLAGSEX_DRIVERLIST_FROM_URL設定されている場合、SP_DEVINSTALL_PARAMS.DriverPath で指定された URL から取得した INF に基づいてドライバー一覧を作成します。DriverPath が空の文字列の場合は、Windows Update の Web サイトを使用します。 現在、オペレーティングシステムは URL をサポートしていません。このフラグは、SetupDiBuildDriverInfoList に Windows Update の Web サイトを検索させるために使用します。 DI_QUIETINSTALL が設定されている場合は、このフラグを設定しないでください。 DI_FLAGSEX_EXCLUDE_OLD_INET_DRIVERS設定されている場合、ドライバー一覧の作成時に古いインターネットドライバーを含めません。デバイスに使用できる候補ドライバーの一覧を作成する場合は、常にこのフラグを設定してください。デバイスに現在インストールされているドライバーの一覧を取得するだけの場合は、このフラグをクリアできます。 DI_FLAGSEX_FILTERCLASSES設定されている場合、SetupDiBuildClassInfoList はクラスの包含フィルターを確認します。つまり、クラスが NoInstallClass とマークされているデバイスはクラス一覧に含まれません。 DI_FLAGSEX_FILTERSIMILARDRIVERS(Windows XP 以降。) 設定されている場合、SetupDiBuildDriverInfoList はクラスドライバー一覧の作成時に「類似」ドライバーも含めます。「類似」ドライバーとは、INF ファイル内のハードウェア ID または互換 ID のいずれかが、ハードウェアのハードウェア ID または互換 ID のいずれかと部分的に (あるいは完全に) 一致するドライバーです。 DI_FLAGSEX_FINISHINSTALL_ACTION(Windows Vista 以降。) 詳細については、Marking a Device as having a Finish-Install Action to Perform を参照してください。 DI_FLAGSEX_INET_DRIVER設定されている場合、そのドライバーはインターネットから取得されたものです。Windows はインターネットからドライバーファイルを再度取得できることを保証できないため、今後のデバイスのインストールにこのデバイスの INF を使用しません。 DI_FLAGSEX_INSTALLEDDRIVER(Windows XP 以降。) 設定されている場合、SetupDiBuildDriverInfoList は、クラスドライバーまたはデバイス互換ドライバーの一覧を作成する際に、現在インストールされているドライバーのみを含めます。 DI_FLAGSEX_NO_CLASSLIST_NODE_MERGE(Windows XP 以降。) 設定されている場合、クラスドライバーの一覧を作成する際に、SetupDiBuildDriverInfoList は、同じ INF に由来し、ドライバーの説明とランクが同じであるドライバー一覧内のノードをマージしません。 DI_FLAGSEX_NO_DRVREG_MODIFYデバイスのハードウェアキーおよびソフトウェア (ドライバー) キーに対する AddReg エントリと DelReg エントリを処理しません。つまり、INF ファイルの DDInstall セクションおよび DDInstall.HW セクション内の AddReg エントリと DelReg エントリです。 DI_FLAGSEX_POWERPAGE_ADDED設定されている場合、インストーラーが電源プロパティダイアログ用の独自のページを追加しています。オペレーティングシステムはシステム提供の電源プロパティページを表示しません。このフラグは、デバイスが電源管理をサポートしている場合にのみ意味を持ちます。 DI_FLAGSEX_PROPCHANGE_PENDING設定されている場合、ユーザーが 1 つ以上のデバイスプロパティシートに変更を加えています。通常、このフラグはプロパティページプロバイダーが設定します。 ユーザーがデバイスのプロパティシートを閉じると、デバイスマネージャーは DI_FLAGSEX_PROPCHANGE_PENDING フラグを確認します。設定されている場合、デバイスマネージャーはこのフラグをクリアし、DI_PROPERTIES_CHANGE フラグを設定して、何かが変更されたことを通知するために DIF_PROPERTYCHANGE 要求をインストーラーに送信します。 DI_FLAGSEX_RECURSIVESEARCH(Windows Vista 以降。) 設定されている場合、SetupDiBuildDriverInfoList が DriverPath の値で指定されたパス内の INF を検索する際、検索は再帰的に行われます。 DI_FLAGSEX_SEARCH_PUBLISHED_INFS(Windows Vista 以降。) 設定されている場合、SetupDiBuildDriverInfoList が INF のパスや検索パスを指定せずに INF を検索する際、検索対象はドライバーストアにインポート済みの INF のみに制限されます。 DI_FLAGSEX_SETFAILEDINSTALLインストールが失敗した場合に設定します。このフラグが設定されている場合、SetupDiInstallDevice 関数は、デバイスの ConfigFlags レジストリ値に FAILEDINSTALL フラグを設定するだけです。DI_FLAGSEX_SETFAILEDINSTALL が設定されている場合、コインストーラーは DIF_INSTALLDEVICE に対して NO_ERROR を返さなければならず、クラスインストーラーは NO_ERROR または ERROR_DI_DO_DEFAULT を返さなければなりません。 DI_FLAGSEX_USECLASSFORCOMPAT互換ドライバーの一覧を作成する際に、デバイスのセットアップクラスで INF ファイルを絞り込みます。デバイスのセットアップクラスが判明している場合、このフラグを設定すると、プリコンパイルされていない INF ファイルを検索するときに互換ドライバーの一覧の作成に要する時間を短縮できます。DI_COMPAT_FROM_CLASS が設定されている場合、このフラグは無視されます。 次のフラグは読み取り専用です。これらのフラグはオペレーティングシステムのみが設定します。 DI_FLAGSEX_CI_FAILEDクラスインストーラーの読み込みまたは開始に失敗した場合に、オペレーティングシステムによって設定されます。このフラグは読み取り専用です。 DI_FLAGSEX_DIDCOMPATINFOWindows がデバイスと互換性のあるドライバーノードの一覧を作成済みであることを示します。このフラグは読み取り専用です。 DI_FLAGSEX_DIDINFOLISTWindows が、指定されたセットアップクラスの INF ファイルに記載されているすべてのドライバーを含むドライバーノードの一覧を作成済みであることを示します。HDEVINFO セットまたはデバイスに関連付けられたクラスがないために、指定されたセットアップクラスが NULL である場合、この一覧には利用可能なすべての INF ファイルのすべてのドライバーノードが含まれます。このフラグは読み取り専用です。 DI_FLAGSEX_IN_SYSTEM_SETUP設定されている場合、インストールはシステムの初期セットアップ中に行われています。このフラグは読み取り専用です。 次のフラグは予約済みであり、使用してはなりません。 DI_FLAGSEX_ALTPLATFORM_DRVSEARCH DI_FLAGSEX_OLDINF_IN_CLASSLIST DI_FLAGSEX_RESTART_DEVICE_ONLY DI_FLAGSEX_USEOLDINFSEARCH 次のフラグは廃止されています。 DI_FLAGSEX_AUTOSELECTRANK0 |
| hwndParent | HWND | 8/4 | +12 | +12 | このデバイスに関連するユーザーインターフェイスのダイアログを所有するウィンドウハンドルです。 |
| InstallMsgHandler | PSP_FILE_CALLBACK_A | 8/4 | +20 | +16 | ファイルのコピー中に発生するイベントを処理するために使用されるコールバックです。インストーラーは、たとえばファイルキューをコミットする際に特別な処理を行うためにコールバックを使用できます。 |
| InstallMsgHandlerContext | void* | 8/4 | +28 | +20 | InstallMsgHandler コールバックが使用するプライベートデータです。 |
| FileQueue | void* | 8/4 | +36 | +24 | ファイル操作をキューに入れるがコミットはしない、呼び出し元が用意したファイルキューへのハンドルです。 ファイルキューをデバイス情報セットに関連付けた場合 (SetupDiSetDeviceInstallParams)、デバイス情報セットを削除する前に、そのキューとデバイス情報セットの関連付けを解除しなければなりません。ファイルキューの関連付けを解除しないと、Windows はデバイス情報セットの参照カウントを減らすことができず、メモリを解放できません。 このキューは、ファイル操作をキューに入れるがコミットしないことを示す DI_NOVCP フラグが設定されている場合にのみ使用されます。 |
| ClassInstallReserved | UINT_PTR | 8/4 | +44 | +28 | クラスインストーラー用データへのポインターです。コインストーラーはこのフィールドを使用してはなりません。 |
| Reserved | DWORD | 4 | +52 | +32 | 予約済みです。内部使用専用です。 |
| DriverPath | CHAR | 260 | +56 | +36 | このパスは SetupDiBuildDriverInfoList 関数によって使用されます。 |
公式ドキュメント
SP_DEVINSTALL_PARAMS 構造体には、特定のデバイス情報要素に関連付けられた、またはデバイス情報セット全体にグローバルに関連付けられたデバイスインストールパラメーターが格納されます。
解説(Remarks)
setupapi.h ヘッダーは、UNICODE プリプロセッサ定数の定義に基づいてこの関数の ANSI 版または Unicode 版を自動的に選択するエイリアスとして SP_DEVINSTALL_PARAMS を定義しています。エンコーディング中立のエイリアスと、エンコーディング中立ではないコードを混在させて使用すると不整合が生じ、コンパイルエラーや実行時エラーの原因となる場合があります。詳細については、関数プロトタイプの規則を参照してください。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
各言語での定義
#include <windows.h>
// SP_DEVINSTALL_PARAMS_A (x64 316 / x86 296 バイト)
#pragma pack(push, 1)
typedef struct SP_DEVINSTALL_PARAMS_A {
DWORD cbSize;
SETUP_DI_DEVICE_INSTALL_FLAGS Flags;
SETUP_DI_DEVICE_INSTALL_FLAGS_EX FlagsEx;
HWND hwndParent;
PSP_FILE_CALLBACK_A InstallMsgHandler;
void* InstallMsgHandlerContext;
void* FileQueue;
UINT_PTR ClassInstallReserved;
DWORD Reserved;
CHAR DriverPath[260];
} SP_DEVINSTALL_PARAMS_A;
#pragma pack(pop)using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Unicode)]
public struct SP_DEVINSTALL_PARAMS_A
{
public uint cbSize;
public uint Flags;
public uint FlagsEx;
public IntPtr hwndParent;
public IntPtr InstallMsgHandler;
public IntPtr InstallMsgHandlerContext;
public IntPtr FileQueue;
public UIntPtr ClassInstallReserved;
public uint Reserved;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 260)] public sbyte[] DriverPath;
}Imports System.Runtime.InteropServices
<StructLayout(LayoutKind.Sequential, Pack:=1, CharSet:=CharSet.Unicode)>
Public Structure SP_DEVINSTALL_PARAMS_A
Public cbSize As UInteger
Public Flags As UInteger
Public FlagsEx As UInteger
Public hwndParent As IntPtr
Public InstallMsgHandler As IntPtr
Public InstallMsgHandlerContext As IntPtr
Public FileQueue As IntPtr
Public ClassInstallReserved As UIntPtr
Public Reserved As UInteger
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=260)> Public DriverPath() As SByte
End Structureimport ctypes
from ctypes import wintypes
class SP_DEVINSTALL_PARAMS_A(ctypes.Structure):
_pack_ = 1
_fields_ = [
("cbSize", wintypes.DWORD),
("Flags", wintypes.DWORD),
("FlagsEx", wintypes.DWORD),
("hwndParent", ctypes.c_void_p),
("InstallMsgHandler", ctypes.c_void_p),
("InstallMsgHandlerContext", ctypes.c_void_p),
("FileQueue", ctypes.c_void_p),
("ClassInstallReserved", ctypes.c_size_t),
("Reserved", wintypes.DWORD),
("DriverPath", ctypes.c_byte * 260),
]#[repr(C, packed(1))]
pub struct SP_DEVINSTALL_PARAMS_A {
pub cbSize: u32,
pub Flags: u32,
pub FlagsEx: u32,
pub hwndParent: *mut core::ffi::c_void,
pub InstallMsgHandler: *mut core::ffi::c_void,
pub InstallMsgHandlerContext: *mut core::ffi::c_void,
pub FileQueue: *mut core::ffi::c_void,
pub ClassInstallReserved: usize,
pub Reserved: u32,
pub DriverPath: [i8; 260],
}import "golang.org/x/sys/windows"
type SP_DEVINSTALL_PARAMS_A struct {
cbSize uint32
Flags uint32
FlagsEx uint32
hwndParent uintptr
InstallMsgHandler uintptr
InstallMsgHandlerContext uintptr
FileQueue uintptr
ClassInstallReserved uintptr
Reserved uint32
DriverPath [260]int8
}type
SP_DEVINSTALL_PARAMS_A = packed record
cbSize: DWORD;
Flags: DWORD;
FlagsEx: DWORD;
hwndParent: Pointer;
InstallMsgHandler: Pointer;
InstallMsgHandlerContext: Pointer;
FileQueue: Pointer;
ClassInstallReserved: NativeUInt;
Reserved: DWORD;
DriverPath: array[0..259] of Shortint;
end;const SP_DEVINSTALL_PARAMS_A = extern struct {
cbSize: u32,
Flags: u32,
FlagsEx: u32,
hwndParent: ?*anyopaque,
InstallMsgHandler: ?*anyopaque,
InstallMsgHandlerContext: ?*anyopaque,
FileQueue: ?*anyopaque,
ClassInstallReserved: usize,
Reserved: u32,
DriverPath: [260]i8,
};type
SP_DEVINSTALL_PARAMS_A {.packed.} = object
cbSize: uint32
Flags: uint32
FlagsEx: uint32
hwndParent: pointer
InstallMsgHandler: pointer
InstallMsgHandlerContext: pointer
FileQueue: pointer
ClassInstallReserved: uint
Reserved: uint32
DriverPath: array[260, int8]align(1)
struct SP_DEVINSTALL_PARAMS_A
{
uint cbSize;
uint Flags;
uint FlagsEx;
void* hwndParent;
void* InstallMsgHandler;
void* InstallMsgHandlerContext;
void* FileQueue;
size_t ClassInstallReserved;
uint Reserved;
byte[260] DriverPath;
}HSP用 定義
HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; SP_DEVINSTALL_PARAMS_A サイズ: 296 バイト(x86)
dim st, 74 ; 4byte整数×74(構造体サイズ 296 / 4 切り上げ)
; cbSize : DWORD (+0, 4byte) st.0 = 値 / 値 = st.0 (lpoke/lpeek も可)
; Flags : SETUP_DI_DEVICE_INSTALL_FLAGS (+4, 4byte) st.1 = 値 / 値 = st.1 (lpoke/lpeek も可)
; FlagsEx : SETUP_DI_DEVICE_INSTALL_FLAGS_EX (+8, 4byte) st.2 = 値 / 値 = st.2 (lpoke/lpeek も可)
; hwndParent : HWND (+12, 4byte) st.3 = 値 / 値 = st.3 (lpoke/lpeek も可)
; InstallMsgHandler : PSP_FILE_CALLBACK_A (+16, 4byte) st.4 = 値 / 値 = st.4 (lpoke/lpeek も可)
; InstallMsgHandlerContext : void* (+20, 4byte) st.5 = 値 / 値 = st.5 (lpoke/lpeek も可)
; FileQueue : void* (+24, 4byte) st.6 = 値 / 値 = st.6 (lpoke/lpeek も可)
; ClassInstallReserved : UINT_PTR (+28, 4byte) st.7 = 値 / 値 = st.7 (lpoke/lpeek も可)
; Reserved : DWORD (+32, 4byte) st.8 = 値 / 値 = st.8 (lpoke/lpeek も可)
; DriverPath : CHAR (+36, 260byte) varptr(st)+36 を基点に操作(260byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; SP_DEVINSTALL_PARAMS_A サイズ: 316 バイト(x64)
dim st, 79 ; 4byte整数×79(構造体サイズ 316 / 4 切り上げ)
; cbSize : DWORD (+0, 4byte) st.0 = 値 / 値 = st.0 (lpoke/lpeek も可)
; Flags : SETUP_DI_DEVICE_INSTALL_FLAGS (+4, 4byte) st.1 = 値 / 値 = st.1 (lpoke/lpeek も可)
; FlagsEx : SETUP_DI_DEVICE_INSTALL_FLAGS_EX (+8, 4byte) st.2 = 値 / 値 = st.2 (lpoke/lpeek も可)
; hwndParent : HWND (+12, 8byte) qpoke st,12,値 / qpeek(st,12) ※IronHSPのみ。3.7/3.8は lpoke st,12,下位 : lpoke st,16,上位
; InstallMsgHandler : PSP_FILE_CALLBACK_A (+20, 8byte) qpoke st,20,値 / qpeek(st,20) ※IronHSPのみ。3.7/3.8は lpoke st,20,下位 : lpoke st,24,上位
; InstallMsgHandlerContext : void* (+28, 8byte) qpoke st,28,値 / qpeek(st,28) ※IronHSPのみ。3.7/3.8は lpoke st,28,下位 : lpoke st,32,上位
; FileQueue : void* (+36, 8byte) qpoke st,36,値 / qpeek(st,36) ※IronHSPのみ。3.7/3.8は lpoke st,36,下位 : lpoke st,40,上位
; ClassInstallReserved : UINT_PTR (+44, 8byte) qpoke st,44,値 / qpeek(st,44) ※IronHSPのみ。3.7/3.8は lpoke st,44,下位 : lpoke st,48,上位
; Reserved : DWORD (+52, 4byte) st.13 = 値 / 値 = st.13 (lpoke/lpeek も可)
; DriverPath : CHAR (+56, 260byte) varptr(st)+56 を基点に操作(260byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global SP_DEVINSTALL_PARAMS_A, pack=1
#field int cbSize
#field int Flags
#field int FlagsEx
#field intptr hwndParent
#field intptr InstallMsgHandler
#field intptr InstallMsgHandlerContext
#field intptr FileQueue
#field intptr ClassInstallReserved
#field int Reserved
#field byte DriverPath 260
#endstruct
stdim st, SP_DEVINSTALL_PARAMS_A ; NSTRUCT 変数を確保
st->cbSize = 100
mes "cbSize=" + st->cbSize