diff --git a/PInvoke/SetupAPI/DevPropDef.cs b/PInvoke/SetupAPI/DevPropDef.cs index e7b8638a..5320e25d 100644 --- a/PInvoke/SetupAPI/DevPropDef.cs +++ b/PInvoke/SetupAPI/DevPropDef.cs @@ -1,11 +1,775 @@ using System; using System.Linq; using System.Runtime.InteropServices; +using Vanara.Extensions; +using Vanara.InteropServices; +using FILETIME = System.Runtime.InteropServices.ComTypes.FILETIME; namespace Vanara.PInvoke { public static partial class SetupAPI { + /// Indicates the property store. + [PInvokeData("Devpropdef.h")] + public enum DEVPROPSTORE + { + /// + DEVPROP_STORE_SYSTEM, + + /// + DEVPROP_STORE_USER + } + + /// + /// + /// In Windows Vista and later versions of Windows, the DEVPROPTYPE data type represents the property-data-type identifier that + /// specifies the data type of a device property value in the unified device property model. + /// + /// + /// + /// + /// A property-data-type identifier represents a combination of a base data type and a property-data-type modifier. A + /// property-data-type identifier is property-specific, and generally can represent a single fixed-length base-data-type value, a + /// single variable-length base-data-type value, an array of fixed-length base-data-type values, or a list of variable-length + /// base-data-type values. + /// + /// + /// The device property functions that retrieve or set a device property take a PropertyType parameter that retrieves or supplies + /// the property-data-type identifier for a device property. For example, SetupDiGetDeviceProperty and + /// SetupDiSetDeviceProperty retrieve and set a device property for a device instance. + /// + /// + // https://docs.microsoft.com/en-us/previous-versions/ff543546(v=vs.85) + [PInvokeData("Devpropdef.h")] + [Flags] + public enum DEVPROPTYPE : uint + { + /// + /// In Windows Vista and later versions of Windows, the DEVPROP_TYPEMOD_ARRAY identifier represents a property-data-type + /// modifier that can be combined with the base-data-type identifiers to create a property-data-type identifier that + /// represents an array of base-data-type values. + /// + /// + /// + /// The DEVPROP_TYPEMOD_ARRAY identifier can be combined only with the fixed-length base-data-type identifiers ( + /// DEVPROPTYPE values) that are associated with data. The DEVPROP_TYPEMOD_ARRAY identifier cannot be combined with + /// DEVPROP_TYPE_EMPTY, DEVPROP_TYPE_NULL, or any of the variable-length base-data-type identifiers. + /// + /// + /// To create a property-data-type identifier that represents an array of base-data-type values, perform a bitwise OR between + /// DEVPROP_TYPEMOD_ARRAY and the corresponding DEVPROP_TYPE_Xxx identifier. For example, to specify an array of unsigned bytes, + /// perform the following bitwise OR: (DEVPROP_TYPEMOD_ARRAY | DEVPROP_TYPE_BYTE). + /// + /// The size, in bytes, of an array of base-data-type values is the size, in bytes, of the array. + /// + /// For information about how to create a property-data-type identifier that represents a REG_MULTI_SZ list of NULL-terminated + /// Unicode strings, see DEVPROP_TYPEMOD_LIST. + /// + /// + DEVPROP_TYPEMOD_ARRAY = 0x00001000, + + /// + /// In Windows Vista and later versions of Windows, the DEVPROP_TYPEMOD_LIST identifier represents a property-data-type modifier + /// that can be combined only with the base-data-type identifiersDEVPROP_TYPE_STRING and + /// DEVPROP_TYPE_SECURITY_DESCRIPTOR_STRING to create a property-data-type identifier that represents a REG_MULTI_SZ list + /// of NULL-terminated Unicode strings. + /// + /// + /// + /// DEVPROP_TYPEMOD_LIST cannot be combined with DEVPROP_TYPE_EMPTY, DEVPROP_TYPE_NULL, + /// DEVPROP_TYPE_SECURITY_DESCRIPTOR, or any of the fixed length base-data-type identifiers. + /// + /// + /// To create a property-data-type identifier that represents a string list, perform a bitwise OR between the + /// DEVPROP_TYPEMOD_LIST property-data-type modifier and the corresponding DEVPROP_TYPE_Xxx identifier. For example, to specify + /// a REG_MULTI_SZ list of Unicode strings, perform the following bitwise OR: (DEVPROP_TYPEMOD_LIST | DEVPROP_TYPE_STRING). + /// + /// + /// The size of a REG_MULTI_SZ list of NULL-terminated Unicode strings is size of the list including the final NULL that + /// terminated the list. + /// + /// + /// For information about how to create a property-data-type identifier that represents an array of fixed length data values, + /// see DEVPROP_TYPEMOD_ARRAY. + /// + /// + DEVPROP_TYPEMOD_LIST = 0x00002000, + + /// + /// In Windows Vista and later versions of Windows, the DEVPROP_TYPE_EMPTY identifier represents a special base-data-type + /// identifier that indicates that a property does not exist. + /// + /// + /// Use this base-data-type identifier with the device property functions to delete a property. + /// If a device property function returns this base-data-type identifier, the property does not exist. + /// + /// DEVPROP_TYPE_EMPTY cannot be combined with the property-data-type modifiers DEVPROP_TYPEMOD_ARRAY or DEVPROP_TYPEMOD_LIST. + /// + /// Deleting a Property + /// To delete a property, call the corresponding SetupDiSetXxx property function and set the function parameters as follows: + /// + /// If DEVPROP_TYPE_EMPTY is used in an attempt to delete a property that does not exist, the delete operation will fail, and a + /// call to GetLastError will return ERROR_NOT_FOUND. + /// + /// Retrieving a Property that Does Not Exist + /// + /// A call to a SetupDiGetXxx property function that attempts to retrieve a device property that does not exist will fail, and a + /// subsequent call to GetLastError will return ERROR_NOT_FOUND. The called SetupAPI property function will set the + /// *PropertyType parameter to DEVPROP_TYPE_EMPTY. + /// + /// + DEVPROP_TYPE_EMPTY = 0x00000000, + + /// + /// In Windows Vista and later versions of Windows, the DEVPROP_TYPE_NULL identifier represents a special base-data-type + /// identifier that indicates that a device property exists. However, that the property has no value that is associated with the property. + /// + /// + /// + /// Use this base-property-type identifier with the device property functions to delete the value that is associated with a + /// device property. + /// + /// + /// If a device property function returns this base data type, the property exists, but the property has no value that is + /// associated with it. + /// + /// + /// The DEVPROP_TYPE_NULL identifier cannot be combined with the property-data-type modifiers DEVPROP_TYPEMOD_ARRAY or DEVPROP_TYPEMOD_LIST. + /// + /// Setting a Property of this Type + /// + /// To set a property whose data type is DEVPROP_TYPE_NULL, call the corresponding SetupDiSetXxx property function and + /// set the function parameters as follows: + /// + /// Retrieving a Property of this Type + /// + /// A call to a SetupDiGetXxx property function that attempts to retrieve a device property that has no value will + /// succeed and set the *PropertyType parameter to DEVPROP_TYPE_NULL. + /// + /// + DEVPROP_TYPE_NULL = 0x00000001, + + /// + /// In Windows Vista and later versions of Windows, the DEVPROP_TYPE_BYTE identifier represents the base-data-type identifier + /// that indicates the data type is a SBYTE-typed signed integer. + /// + /// + /// DEVPROP_TYPE_SBYTE can be combined only with the DEVPROP_TYPEMOD_ARRAY property-data-type modifier. + /// Setting a Property of this Type + /// + /// To set a property whose data type is DEVPROP_TYPE_BYTE, call the corresponding SetupDiSetXxx property function, and + /// set the function parameters as follows: + /// + /// + [CorrespondingType(typeof(sbyte))] + DEVPROP_TYPE_SBYTE = 0x00000002, + + /// + /// In Windows Vista and later versions of Windows, the DEVPROP_TYPE_BYTE identifier represents the base-data-type identifier + /// that indicates the data type is a BYTE-typed unsigned integer. + /// + /// + /// DEVPROP_TYPE_BYTE can be combined only with the DEVPROP_TYPEMOD_ARRAY property-data-type modifier. + /// Setting a Property of this Type + /// + /// To set a property whose data type is DEVPROP_TYPE_BYTE, call the corresponding SetupDiSetXxx property function, setting the + /// function input parameters as follows: + /// + /// + [CorrespondingType(typeof(byte))] + DEVPROP_TYPE_BYTE = 0x00000003, + + /// + /// In Windows Vista and later versions of Windows, the DEVPROP_TYPE_INT16 identifier represents the base-data-type identifier + /// that indicates the data type is a SHORT-typed signed integer. + /// + /// + /// DEVPROP_TYPE_SHORT can be combined only with the DEVPROP_TYPEMOD_ARRAY property-data-type modifier. + /// Setting a Property of this Type + /// + /// To set a property whose base data type is DEVPROP_TYPE_INT16, call the corresponding SetupDiSetXxx property function + /// and set the function input parameters as follows: + /// + /// + [CorrespondingType(typeof(short))] + DEVPROP_TYPE_INT16 = 0x00000004, + + /// + /// In Windows Vista and later versions of Windows, the DEVPROP_TYPE_UINT16 identifier represents the base-data-type identifier + /// that indicates that the data type is a USHORT-typed unsigned integer. + /// + /// + /// DEVPROP_TYPE_UINT16 can be combined only with the DEVPROP_TYPEMOD_ARRAY property-data-type modifier. + /// Setting a Property of this Type + /// + /// To set a property whose base data type is DEVPROP_TYPE_UINT16, call the corresponding SetupDiSetXxx property function + /// and set the function input parameters as follows: + /// + /// + [CorrespondingType(typeof(ushort))] + DEVPROP_TYPE_UINT16 = 0x00000005, + + /// + /// In Windows Vista and later versions of Windows, the DEVPROP_TYPE_INT32 identifier represents the base-data-type identifier + /// that indicates that the data type is a LONG-typed signed integer. + /// + /// + /// DEVPROP_TYPE_INT32 can be combined only with the DEVPROP_TYPEMOD_ARRAY property-data-type modifier. + /// Setting a Property of this Type + /// + /// To set a property whose base data type is DEVPROP_TYPE_INT32, call the corresponding SetupDiSetXxx property function, + /// setting the function input parameters as follows: + /// + /// + [CorrespondingType(typeof(int))] + DEVPROP_TYPE_INT32 = 0x00000006, + + /// + /// In Windows Vista and later versions of Windows, the DEVPROP_TYPE_UINT32 identifier represents the base-data-type identifier + /// that indicates that the data type is a ULONG-typed unsigned integer. + /// + /// + /// DEVPROP_TYPE_UINT32 can be combined only with the DEVPROP_TYPEMOD_ARRAY property-data-type modifier. + /// Setting a Property of this Type + /// + /// To set a property whose base data type is DEVPROP_TYPE_UINT32, call the corresponding SetupDiSetXxx property function + /// and set the function input parameters as follows: + /// + /// + [CorrespondingType(typeof(uint))] + DEVPROP_TYPE_UINT32 = 0x00000007, + + /// + /// In Windows Vista and later versions of Windows, the DEVPROP_TYPE_INT64 identifier represents the base-data-type identifier + /// that indicates that the data type is a LONG64-typed signed integer. + /// + /// + /// DEVPROP_TYPE_INT64 can be combined only with the DEVPROP_TYPEMOD_ARRAY property-data-type modifier. + /// Setting a Property of this Type + /// + /// To set a property whose base data type is DEVPROP_TYPE_INT64, call the corresponding SetupDiSetXxx property function + /// and set the function input parameters as follows: + /// + /// + [CorrespondingType(typeof(long))] + DEVPROP_TYPE_INT64 = 0x00000008, + + /// + /// In Windows Vista and later versions of Windows, the DEVPROP_TYPE_INT64 identifier represents the base-data-type identifier + /// that indicates that the data type is a ULONG64-typed unsigned integer. + /// + /// + /// DEVPROP_TYPE_UINT64 can be combined only with the DEVPROP_TYPEMOD_ARRAY property-data-type modifier. + /// Setting a Property of this Type + /// + /// To set a property whose base data type is DEVPROP_TYPE_UINT64, call the corresponding SetupDiSetXxx property function + /// and set the function input parameters as follows: + /// + /// + [CorrespondingType(typeof(ulong))] + DEVPROP_TYPE_UINT64 = 0x00000009, + + /// + /// In Windows Vista and later versions of Windows, the DEVPROP_TYPE_INT64 identifier represents the base-data-type identifier + /// that indicates that the data type is a FLOAT-typed IEEE floating-point number. + /// + /// + /// DEVPROP_TYPE_FLOAT can be combined only with the DEVPROP_TYPEMOD_ARRAY property-data-type modifier. + /// Setting a Property of this Type + /// + /// To set a property whose base data type is DEVPROP_TYPE_FLOAT, call the corresponding SetupDiSetXxx property function, + /// setting the function input parameters as follows: + /// + /// + [CorrespondingType(typeof(float))] + DEVPROP_TYPE_FLOAT = 0x0000000A, + + /// + /// In Windows Vista and later versions of Windows, the DEVPROP_TYPE_DOUBLE identifier represents the base-data-type identifier + /// that indicates that the data type is a DOUBLE-typed IEEE floating-point number. + /// + /// + /// DEVPROP_TYPE_DOUBLE can be combined only with the DEVPROP_TYPEMOD_ARRAY property-data-type modifier. + /// Setting a Property of this Type + /// + /// To set a property whose base data type is DEVPROP_TYPE_DOUBLE, call the corresponding SetupDiSetXxx property function and + /// set the function input parameters as follows: + /// + /// + [CorrespondingType(typeof(double))] + DEVPROP_TYPE_DOUBLE = 0x0000000B, + + /// + /// In Windows Vista and later versions of Windows, the DEVPROP_TYPE_INT64 identifier represents the base-data-type identifier + /// that indicates that the data type is a DECIMAL-typed value. + /// + /// + /// DEVPROP_TYPE_DECIMAL can be combined only with the DEVPROP_TYPEMOD_ARRAY property-data-type modifier. + /// Setting a Property of this Type + /// + /// To set a property whose data type is DEVPROP_TYPE_DECIMAL, call the corresponding SetupDiSetXxx property function and set + /// the function input parameters as follows: + /// + /// + [CorrespondingType(typeof(DECIMAL))] + DEVPROP_TYPE_DECIMAL = 0x0000000C, + + /// + /// In Windows Vista and later versions of Windows, the DEVPROP_TYPE_GUID identifier represents the base-data-type identifier + /// that indicates that the data type is a GUID-typed globally unique identifier (GUID). + /// + /// + /// DEVPROP_TYPE_GUID can be combined only with the DEVPROP_TYPEMOD_ARRAY property-data-type modifier. + /// Setting a Property of this Type + /// + /// To set a property whose base data type is DEVPROP_TYPE_GUID, call the corresponding SetupDiSetXxx property function and set + /// the function input parameters as follows: + /// + /// + [CorrespondingType(typeof(Guid))] + DEVPROP_TYPE_GUID = 0x0000000D, + + /// + /// In Windows Vista and later versions of Windows, the DEVPROP_TYPE_CURRENCY identifier represents the base-data-type + /// identifier that indicates that the data type is a CURRENCY-typed value. + /// + /// + /// DEVPROP_TYPE_CURRENCY can be combined only with the DEVPROP_TYPEMOD_ARRAY property-data-type modifier. + /// Setting a Property of This Type + /// + /// To set a property whose base data type is DEVPROP_TYPE_CURRENCY, call the corresponding SetupDiSetXxx property function and + /// set the function input parameters as follows: + /// + /// + [CorrespondingType(typeof(CY))] + DEVPROP_TYPE_CURRENCY = 0x0000000E, + + /// + /// In Windows Vista and later versions of Windows, the DEVPROP_TYPE_DATE property type represents the base-data-type identifier + /// that indicates that the data type is a DOUBLE-typed value that specifies the number of days since December 31, 1899. For + /// example, January 1, 1900, is 1.0; January 2, 1900, is 2.0; and so on. + /// + /// + /// DEVPROP_TYPE_DATE can be combined only with the DEVPROP_TYPEMOD_ARRAY property-data-type modifier. + /// Setting a Property of this Type + /// + /// To set a property whose base data type is DEVPROP_TYPE_DATE, call the corresponding SetupDiSetXxx property function and set + /// the function input parameters as follows: + /// + /// + [CorrespondingType(typeof(DATE))] + DEVPROP_TYPE_DATE = 0x0000000F, + + /// + /// In Windows Vista and later versions of Windows, the DEVPROP_TYPE_FILETIME property type represents the base-data-type + /// identifier that indicates that the data type is a FILETIME-typed value. + /// + /// + /// We recommend that all time values be represented in Coordinated Universal Time (UTC) units. + /// DEVPROP_TYPE_FILETIME can be combined only with the DEVPROP_TYPEMOD_ARRAY property-data-type modifier. + /// Setting a Property of this Type + /// + /// To set a property whose base data type is DEVPROP_TYPE_FILETIME, call the corresponding SetupDiSetXxx property function and + /// set the function input parameters as follows: + /// + /// + [CorrespondingType(typeof(FILETIME))] + DEVPROP_TYPE_FILETIME = 0x00000010, + + /// + /// In Windows Vista and later versions of Windows, the DEVPROP_TYPE_BOOLEAN property type represents the base-data-type + /// identifier that indicates that the data type is a DEVPROP_BOOLEAN-typed Boolean value. + /// + /// + /// The DEVPROP_BOOLEAN data type and valid Boolean values are defined as follows: + /// + /// typedef CHAR DEVPROP_BOOLEAN, *PDEVPROP_BOOLEAN; #define DEVPROP_TRUE ((DEVPROP_BOOLEAN)-1) #define DEVPROP_FALSE ((DEVPROP_BOOLEAN) 0) + /// + /// DEVPROP_TYPE_BOOLEAN can be combined only with the DEVPROP_TYPEMOD_ARRAY property-data-type modifier. + /// Setting a Property of this Type + /// + /// To set a property whose base data type is DEVPROP_TYPE_BOOLEAN, call the corresponding SetupDiSetXxx property function and + /// set the function input parameters as follows: + /// + /// + [CorrespondingType(typeof(BOOLEAN))] + DEVPROP_TYPE_BOOLEAN = 0x00000011, + + /// + /// In Windows Vista and later versions of Windows, the DEVPROP_TYPE_STRING property type represents the base-data-type + /// identifier that indicates that the data type is a NULL-terminated Unicode string. + /// + /// + /// DEVPROP_TYPE_STRING can be combined only with the DEVPROP_TYPEMOD_LIST property-data-type modifier. + /// Setting a Property of this Type + /// + /// To set a property whose base data type is DEVPROP_TYPE_STRING, call the corresponding SetupDiSetXxx property + /// function, setting the function input parameters as follows: + /// + /// + [CorrespondingType(typeof(string))] + DEVPROP_TYPE_STRING = 0x00000012, + + /// + /// In Windows Vista and later versions of Windows, the DEVPROP_TYPE_STRING_LIST property type represents the base-data-type + /// identifier that indicates that the data type is a REG_MULTI_SZ-typed list of Unicode strings. + /// + /// + /// DEVPROP_TYPE_STRING_LIST cannot be combined with the property-data-type modifiers. + /// Setting a Property of this Type + /// + /// To set a property whose base data type is DEVPROP_TYPE_STRING_LIST, call the corresponding SetupDiSetXxx property + /// function and set the function input parameters as follows: + /// + /// + [CorrespondingType(typeof(System.Collections.Generic.IEnumerable))] + DEVPROP_TYPE_STRING_LIST = DEVPROP_TYPE_STRING | DEVPROP_TYPEMOD_LIST, + + /// + /// In Windows Vista and later versions of Windows, the DEVPROP_TYPE_SECURITY_DESCRIPTOR identifier represents the + /// base-data-type identifier that indicates the data type is a variable-length, self-relative, SECURITY_DESCRIPTOR-typed, + /// security descriptor. + /// + /// + /// DEVPROP_TYPE_SECURITY_DESCRIPTOR cannot be combined with the property-data-type modifiers. + /// Setting a Property of this Type + /// + /// To set a property whose base data type is DEVPROP_TYPE_SECURITY_DESCRIPTOR, call the corresponding SetupDiSetXxx + /// property function and set the function input parameters as follows: + /// + /// + DEVPROP_TYPE_SECURITY_DESCRIPTOR = 0x00000013, + + /// + /// In Windows Vista and later versions of Windows, the DEVPROP_TYPE_SECURITY_DESCRIPTOR_STRING identifier represents the + /// base-data-type identifier that indicates the data type is a NULL-terminated Unicode string that contains a security + /// descriptor in the Security Descriptor Definition Language (SDDL) format. + /// + /// + /// + /// DEVPROP_TYPE_SECURITY_DESCRIPTOR_STRING can be combined only with the DEVPROP_TYPEMOD_LIST property-data-type modifier. + /// + /// Setting a Property of this Type + /// + /// To set a property whose base data type is DEVPROP_TYPE_SECURITY_DESCRIPTOR_STRING, call the corresponding + /// SetupDiSetXxx property function and set the function input parameters as follows: + /// + /// + [CorrespondingType(typeof(string))] + DEVPROP_TYPE_SECURITY_DESCRIPTOR_STRING = 0x00000014, + + /// + /// In Windows Vista and later versions of Windows, the DEVPROP_TYPE_DEVPROPKEY identifier represents the base-data-type + /// identifier that indicates the data type is a DEVPROPKEY-typed device property key. + /// + /// + /// + /// The DEVPROP_TYPE_DEVPROPKEY property type can be combined only with the DEVPROP_TYPEMOD_ARRAY property-data-type modifier. + /// + /// Setting a Property of this Type + /// + /// To set a property whose base data type is DEVPROP_TYPE_DEVPROPKEY, call the corresponding SetupDiSetXxx property function + /// and set the function input parameters as follows: + /// + /// + [CorrespondingType(typeof(DEVPROPKEY))] + DEVPROP_TYPE_DEVPROPKEY = 0x00000015, + + /// + /// In Windows Vista and later versions of Windows, the DEVPROP_TYPE_DEVPROPTYPE identifier represents the base-data-type + /// identifier that indicates the data type is a DEVPROPTYPE-typed value. + /// + /// + /// + /// The DEVPROP_TYPE_DEVPROPTYPE property type can be combined only with the DEVPROP_TYPEMOD_ARRAY property-data-type modifier. + /// + /// Setting a Property of this Type + /// + /// To set a property whose base data type is DEVPROP_TYPE_DEVPROPTYPE, call the corresponding SetupDiSetXxx property function, + /// setting the function input parameters as follows: + /// + /// + [CorrespondingType(typeof(DEVPROPTYPE))] + DEVPROP_TYPE_DEVPROPTYPE = 0x00000016, + + /// + /// In Windows Vista and later versions of Windows, the DEVPROP_TYPE_BINARY identifier represents the base-data-type identifier + /// that indicates that the data type is an array of BYTE-typed unsigned values. + /// + /// + /// The DEVPROP_TYPE_BINARY property type cannot be combined with the property-data-type modifiers. + /// Setting a Property of this Type + /// + /// To set a property whose base data type is DEVPROP_TYPE_BINARY, call the corresponding SetupDiSetXxx property function and + /// set the function input parameters as follows: + /// + /// + [CorrespondingType(typeof(byte[]))] + DEVPROP_TYPE_BINARY = DEVPROP_TYPE_BYTE | DEVPROP_TYPEMOD_ARRAY, + + /// + /// The DEVPROP_TYPE_ERROR identifier represents the base-data-type identifier for the Microsoft Win32 error code values that + /// are defined in WINERROR.H. + /// + /// + /// + /// In Windows Vista and later versions of Windows, the unified device property model also defines a + /// DEVPROP_TYPE_NTSTATUS base-data-type identifier for NTSTATUS error code values. + /// + /// You can combine DEVPROP_TYPE_ERROR only with the DEVPROP_TYPEMOD_ARRAY property-data-type modifier. + /// Setting a Property of This Type + /// + /// To set a property whose base data type is DEVPROP_TYPE_ERROR, call the corresponding SetupDiSetXxx property function and set + /// the function input parameters as follows: + /// + /// Retrieving the Descriptive Text for a Win32 Error Code Value + /// + /// To retrieve the descriptive text that is associated with a Win32 error code, call the FormatMessage function + /// (documented in the Windows SDK) as follows: + /// + /// + [CorrespondingType(typeof(Win32Error))] + DEVPROP_TYPE_ERROR = 0x00000017, + + /// + /// The DEVPROP_TYPE_NTSTATUS identifier represents the base-data-type identifier for the NTSTATUS status code values that are + /// defined in Ntstatus.h. + /// + /// + /// + /// In Windows Vista and later versions of Windows, the unified device property model also defines a DEVPROP_TYPE_ERROR + /// base-data-type identifier for Microsoft Win32 error code values. + /// + /// You can combine DEVPROP_TYPE_NTSTATUS only with the DEVPROP_TYPEMOD_ARRAY property-data-type modifier. + /// Setting a Property of This Type + /// + /// To set a property whose base data type is DEVPROP_TYPE_NTSTATUS, call the corresponding SetupDiSet Xxx property + /// function and set the function input parameters as follows: + /// + /// Retrieving the Descriptive Text for a NTSTATUS Error Code Value + /// + /// To retrieve the descriptive text that is associated with an NTSTATUS error code value, call the FormatMessage + /// function (documented in the Windows SDK) as follows: + /// + /// + [CorrespondingType(typeof(NTStatus))] + DEVPROP_TYPE_NTSTATUS = 0x00000018, + + /// + /// The DEVPROP_TYPE_STRING_INDIRECT identifier represents the base-data-type identifier for a NULL-terminated Unicode string + /// that contains an indirect string reference. + /// + /// + /// + /// An indirect string reference describes a string resource that contains the actual string. The indirect string reference can + /// appear in one of the following formats: + /// + /// + /// @[path \]FileName ,- ResourceID Windows extracts the string from the module that is specified by the + /// path and FileName entries, and the resource identifier of the string is supplied by the ResourceID entry (excluding the + /// required minus sign). The string resource is loaded from the module resource section that best matches one of the caller's + /// preferred UI languages. The path entry is optional. If you specify the path entry, the module must be located in a directory + /// that is in the system-defined search path. + /// + /// + /// @ InfName ,% strkey % Windows extracts the string from the INF Strings section of the INF file + /// in the %SystemRoot%\inf directory whose name is supplied by the InfName entry. The strkey token identifier should match the + /// key of a line in the Strings section that best matches one of the caller's preferred UI languages. If no + /// language-specific Strings sections exist, Windows uses the default Strings section. + /// + /// You cannot combine DEVPROP_TYPE_STRING_INDIRECT with any of the property-data-type modifiers. + /// Setting a Property of This Type + /// + /// To set a property whose base data type is DEVPROP_TYPE_STRING_INDIRECT, call the corresponding SetupDiSet Xxx + /// property function and set the function input parameters as follows: + /// + /// Retrieving the Value of This Property Type + /// + /// When an application calls a SetupDiGet Xxx property function to retrieve the value of a property of this base data + /// type, Windows tries to locate the actual string that the property references. If Windows can retrieve the actual string, it + /// returns the actual string to the caller and identifies the base data type of the retrieved property as + /// DEVPROP_TYPE_STRING. Otherwise, Windows returns the indirect string reference and identifies the base data type of + /// the retrieved property as DEVPROP_TYPE_STRING_INDIRECT. + /// + /// Localizing Static Text + /// + /// Starting with Windows Vista you can localize custom and standard string-type PnP static-text properties using resources from + /// a PE image's string or resource tables by setting static-text property types to DEVPROP_TYPE_STRING_INDIRECT. You can also + /// add non-localized replacement-string data that can be formatted into the static text. + /// + /// + /// Strings located in a PE image's STRINGTABLE resource (as typically performed by LoadString) should use the following format: + /// + /// "@"System32\mydll.dll,-21[;Fallback" String]" + /// "@System32\mydll.dll,-21[;Fallback String with %1, %2, … to %n[;(Arg1,Arg2,…,ArgN)]]" + /// + /// Strings located in a PE images's message-table resource (as typically performed by RtlFindMessage, more commonly used in + /// drivers) should use the following format: + /// + /// "@System32\drivers\mydriver.sys,#21[;Fallback String]" + /// "@System32\drivers\mydriver.sys,#21[;Fallback String with %1, %2, … to %n[;(Arg1,Arg2,…,ArgN)]]" + /// + /// A "Fallback String" is optional but useful because it can be returned if the resource can’t be found or loaded. The fallback + /// string is also returned to non-interactive system processes that are not impersonating a user, and as such cannot show + /// localized text to users anyways. + /// + /// + /// This technique enables you to localize static-text pulled from the string or message table resource that best matches the + /// caller’s locale. + /// + /// + /// Windows will format the trailing arguments into the string (or the fallback string) when they are retrieved from the + /// respective resource table, much as in the same manner as RtlFormatMessage does. + /// + /// + /// Custom and standard string-type PnP static-text is localized when you set the property by loading the resource from the + /// component performing the set operation, which typically happens under the system default locale for system-level components. + /// + /// Note: PE images can use either resource table type (STRINGTABLE resources, or message-table resources). + /// + [CorrespondingType(typeof(string))] + DEVPROP_TYPE_STRING_INDIRECT = 0x00000019, + + /// + /// In Windows Vista and later versions of Windows, the DEVPROP_MASK_TYPE mask can be combined in a bitwise AND with a + /// property-data-type identifier to extract the base-data-type identifier from a property-data-type identifier. + /// + /// + /// This mask cannot be used as a base-data-type identifier, a property-data-type modifier, or a property-data-type identifier. + /// + /// For information about how to extract the DEVPROP_TYPEMOD_Xxx property-data-type modifier from a property-data-type + /// identifier, see DEVPROP_MASK_TYPEMOD. + /// + /// + DEVPROP_MASK_TYPE = 0x00000FFF, + + /// + /// In Windows Vista and later versions of Windows, the DEVPROP_MASK_TYPEMOD mask can be combined in a bitwise AND with a + /// property-data-type identifier to extract the DEVPROP_TYPEMOD_Xxx property-data-type modifier from a + /// property-data-type identifier. + /// + /// + /// This mask cannot be used as a base-data-type identifier, a property-data-type modifier, or property-data-type identifier. + /// + /// For information about how to extract the base-data-type identifier from a property-data-type identifier, see DEVPROP_MASK_TYPE. + /// + /// + DEVPROP_MASK_TYPEMOD = 0x0000F000, + } + + /// Extracts a value from memory of the type specified. + /// Type of the value to extract. + /// The memory handle holding the value. + /// An object of the specified type. + public static object GetObject(this DEVPROPTYPE pType, ISafeMemoryHandle mem) => GetObject(pType, mem.DangerousGetHandle(), mem.Size); + + /// Extracts a value from memory of the type specified. + /// Type of the value to extract. + /// The pointer to the memory holding the value. + /// Size of the allocated memory. + /// An object of the specified type. + public static object GetObject(this DEVPROPTYPE pType, IntPtr mem, SizeT memSize) + { + switch (pType) + { + case DEVPROPTYPE.DEVPROP_TYPE_EMPTY: + case DEVPROPTYPE.DEVPROP_TYPE_NULL: + return null; + + case DEVPROPTYPE.DEVPROP_TYPE_SBYTE: + case DEVPROPTYPE.DEVPROP_TYPE_BYTE: + case DEVPROPTYPE.DEVPROP_TYPE_INT16: + case DEVPROPTYPE.DEVPROP_TYPE_UINT16: + case DEVPROPTYPE.DEVPROP_TYPE_INT32: + case DEVPROPTYPE.DEVPROP_TYPE_UINT32: + case DEVPROPTYPE.DEVPROP_TYPE_INT64: + case DEVPROPTYPE.DEVPROP_TYPE_UINT64: + case DEVPROPTYPE.DEVPROP_TYPE_FLOAT: + case DEVPROPTYPE.DEVPROP_TYPE_DOUBLE: + case DEVPROPTYPE.DEVPROP_TYPE_DECIMAL: + case DEVPROPTYPE.DEVPROP_TYPE_GUID: + case DEVPROPTYPE.DEVPROP_TYPE_FILETIME: + case DEVPROPTYPE.DEVPROP_TYPE_CURRENCY: + case DEVPROPTYPE.DEVPROP_TYPE_DATE: + case DEVPROPTYPE.DEVPROP_TYPE_STRING: + case DEVPROPTYPE.DEVPROP_TYPE_DEVPROPKEY: + case DEVPROPTYPE.DEVPROP_TYPE_DEVPROPTYPE: + case DEVPROPTYPE.DEVPROP_TYPE_ERROR: + case DEVPROPTYPE.DEVPROP_TYPE_NTSTATUS: + case DEVPROPTYPE.DEVPROP_TYPE_SECURITY_DESCRIPTOR_STRING: + case DEVPROPTYPE.DEVPROP_TYPE_BINARY: + return mem.Convert(memSize, CorrespondingTypeAttribute.GetCorrespondingTypes(pType).First()); + + case DEVPROPTYPE.DEVPROP_TYPE_STRING_LIST: + case DEVPROPTYPE.DEVPROP_TYPEMOD_LIST | DEVPROPTYPE.DEVPROP_TYPE_SECURITY_DESCRIPTOR_STRING: + return mem.ToStringEnum(CharSet.Auto, 0, memSize).ToArray(); + + case DEVPROPTYPE.DEVPROP_TYPE_BOOLEAN: + return mem.ToStructure(memSize).Value; + + case DEVPROPTYPE.DEVPROP_TYPE_SECURITY_DESCRIPTOR: + return new System.Security.AccessControl.RawSecurityDescriptor(mem.ToArray(memSize, 0, memSize), 0); + + case DEVPROPTYPE.DEVPROP_TYPE_STRING_INDIRECT: + return Environment.ExpandEnvironmentVariables(StringHelper.GetString(mem, CharSet.Auto, memSize)); + + default: + if (pType.IsFlagSet(DEVPROPTYPE.DEVPROP_TYPEMOD_ARRAY)) + { + var elemtype = CorrespondingTypeAttribute.GetCorrespondingTypes(pType.ClearFlags(DEVPROPTYPE.DEVPROP_TYPEMOD_ARRAY)).First(); + var elemsz = Marshal.SizeOf(elemtype); + return mem.ToArray(elemtype, memSize / elemsz, 0, memSize); + } + break; + } + throw new ArgumentException($"Unable to convert to {pType}."); + } + + /// Splits the provided value into its parts. + /// The value. + /// The type and modifier. + public static (DEVPROPTYPE type, DEVPROPTYPE mod) Split(this DEVPROPTYPE value) => (value & DEVPROPTYPE.DEVPROP_MASK_TYPE, value & DEVPROPTYPE.DEVPROP_MASK_TYPEMOD); + + /// Describes a compound key for a device property. + // https://docs.microsoft.com/en-us/previous-versions/windows/hardware/drivers/dn315029(v=vs.85) typedef struct _DEVPROPCOMPKEY { + // DEVPROPKEY Key; DEVPROPSTORE Store; PCWSTR LocaleName; } DEVPROPCOMPKEY, *PDEVPROPCOMPKEY; + [PInvokeData("Devpropdef.h")] + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] + public struct DEVPROPCOMPKEY + { + /// A DEVPROPKEY structure that represents a key for a property. + public DEVPROPKEY Key; + + /// A DEVPROPSTORE-typed value that indicates the property store. Here are possible values: + public DEVPROPSTORE Store; + + /// A string for the property's locale name. + public string LocaleName; + } + + /// Describes a property for a software device. + // https://docs.microsoft.com/en-us/previous-versions/windows/hardware/drivers/dn315030(v=vs.85) typedef struct _DEVPROPERTY { + // DEVPROPCOMPKEY CompKey; DEVPROPTYPE Type; ULONG BufferSize; PVOID Buffer; } DEVPROPERTY, *PDEVPROPERTY; + [PInvokeData("Devpropdef.h")] + [StructLayout(LayoutKind.Sequential)] + public struct DEVPROPERTY + { + /// A DEVPROPCOMPKEY structure that represents a compound key for a property. + public DEVPROPCOMPKEY CompKey; + + /// + /// A DEVPROPTYPE value that indicates the property type. Valid DEVPROPTYPE values are constructed from base DEVPROP_TYPE_ + /// values, which may be modified by a logical OR with DEVPROP_TYPEMOD_ values, as appropriate. + /// + public DEVPROPTYPE Type; + + /// The size in bytes of the property in Buffer. + public uint BufferSize; + + /// The buffer that contains the property info. + public IntPtr Buffer; + } + /// /// In Windows Vista and later versions of Windows, the DEVPROPKEY structure represents a device property key for a device property /// in the unified device property model. diff --git a/PInvoke/SetupAPI/SetupAPI.cs b/PInvoke/SetupAPI/SetupAPI.cs index 416a9603..62707caf 100644 --- a/PInvoke/SetupAPI/SetupAPI.cs +++ b/PInvoke/SetupAPI/SetupAPI.cs @@ -1,5 +1,4 @@ using System; -using System.Linq; using System.Runtime.InteropServices; using Vanara.Extensions; using Vanara.InteropServices; @@ -176,643 +175,6 @@ namespace Vanara.PInvoke SP_COPY_HARDLINK = 0x10000000, } - /// - /// - /// In Windows Vista and later versions of Windows, the DEVPROPTYPE data type represents the property-data-type identifier that - /// specifies the data type of a device property value in the unified device property model. - /// - /// - /// - /// - /// A property-data-type identifier represents a combination of a base data type and a property-data-type modifier. A - /// property-data-type identifier is property-specific, and generally can represent a single fixed-length base-data-type value, a - /// single variable-length base-data-type value, an array of fixed-length base-data-type values, or a list of variable-length - /// base-data-type values. - /// - /// - /// The device property functions that retrieve or set a device property take a PropertyType parameter that retrieves or supplies - /// the property-data-type identifier for a device property. For example, SetupDiGetDeviceProperty and - /// SetupDiSetDeviceProperty retrieve and set a device property for a device instance. - /// - /// - // https://docs.microsoft.com/en-us/previous-versions/ff543546(v=vs.85) - [PInvokeData("Devpropdef.h")] - [Flags] - public enum DEVPROPTYPE : uint - { - /// - /// In Windows Vista and later versions of Windows, the DEVPROP_TYPEMOD_ARRAY identifier represents a property-data-type - /// modifier that can be combined with the base-data-type identifiers to create a property-data-type identifier that - /// represents an array of base-data-type values. - /// - /// - /// - /// The DEVPROP_TYPEMOD_ARRAY identifier can be combined only with the fixed-length base-data-type identifiers ( - /// DEVPROPTYPE values) that are associated with data. The DEVPROP_TYPEMOD_ARRAY identifier cannot be combined with - /// DEVPROP_TYPE_EMPTY, DEVPROP_TYPE_NULL, or any of the variable-length base-data-type identifiers. - /// - /// - /// To create a property-data-type identifier that represents an array of base-data-type values, perform a bitwise OR between - /// DEVPROP_TYPEMOD_ARRAY and the corresponding DEVPROP_TYPE_Xxx identifier. For example, to specify an array of unsigned bytes, - /// perform the following bitwise OR: (DEVPROP_TYPEMOD_ARRAY | DEVPROP_TYPE_BYTE). - /// - /// The size, in bytes, of an array of base-data-type values is the size, in bytes, of the array. - /// - /// For information about how to create a property-data-type identifier that represents a REG_MULTI_SZ list of NULL-terminated - /// Unicode strings, see DEVPROP_TYPEMOD_LIST. - /// - /// - DEVPROP_TYPEMOD_ARRAY = 0x00001000, - - /// - /// In Windows Vista and later versions of Windows, the DEVPROP_TYPEMOD_LIST identifier represents a property-data-type modifier - /// that can be combined only with the base-data-type identifiersDEVPROP_TYPE_STRING and - /// DEVPROP_TYPE_SECURITY_DESCRIPTOR_STRING to create a property-data-type identifier that represents a REG_MULTI_SZ list - /// of NULL-terminated Unicode strings. - /// - /// - /// - /// DEVPROP_TYPEMOD_LIST cannot be combined with DEVPROP_TYPE_EMPTY, DEVPROP_TYPE_NULL, - /// DEVPROP_TYPE_SECURITY_DESCRIPTOR, or any of the fixed length base-data-type identifiers. - /// - /// - /// To create a property-data-type identifier that represents a string list, perform a bitwise OR between the - /// DEVPROP_TYPEMOD_LIST property-data-type modifier and the corresponding DEVPROP_TYPE_Xxx identifier. For example, to specify - /// a REG_MULTI_SZ list of Unicode strings, perform the following bitwise OR: (DEVPROP_TYPEMOD_LIST | DEVPROP_TYPE_STRING). - /// - /// - /// The size of a REG_MULTI_SZ list of NULL-terminated Unicode strings is size of the list including the final NULL that - /// terminated the list. - /// - /// - /// For information about how to create a property-data-type identifier that represents an array of fixed length data values, - /// see DEVPROP_TYPEMOD_ARRAY. - /// - /// - DEVPROP_TYPEMOD_LIST = 0x00002000, - - /// - /// In Windows Vista and later versions of Windows, the DEVPROP_TYPE_EMPTY identifier represents a special base-data-type - /// identifier that indicates that a property does not exist. - /// - /// - /// Use this base-data-type identifier with the device property functions to delete a property. - /// If a device property function returns this base-data-type identifier, the property does not exist. - /// - /// DEVPROP_TYPE_EMPTY cannot be combined with the property-data-type modifiers DEVPROP_TYPEMOD_ARRAY or DEVPROP_TYPEMOD_LIST. - /// - /// Deleting a Property - /// To delete a property, call the corresponding SetupDiSetXxx property function and set the function parameters as follows: - /// - /// If DEVPROP_TYPE_EMPTY is used in an attempt to delete a property that does not exist, the delete operation will fail, and a - /// call to GetLastError will return ERROR_NOT_FOUND. - /// - /// Retrieving a Property that Does Not Exist - /// - /// A call to a SetupDiGetXxx property function that attempts to retrieve a device property that does not exist will fail, and a - /// subsequent call to GetLastError will return ERROR_NOT_FOUND. The called SetupAPI property function will set the - /// *PropertyType parameter to DEVPROP_TYPE_EMPTY. - /// - /// - DEVPROP_TYPE_EMPTY = 0x00000000, - - /// - /// In Windows Vista and later versions of Windows, the DEVPROP_TYPE_NULL identifier represents a special base-data-type - /// identifier that indicates that a device property exists. However, that the property has no value that is associated with the property. - /// - /// - /// - /// Use this base-property-type identifier with the device property functions to delete the value that is associated with a - /// device property. - /// - /// - /// If a device property function returns this base data type, the property exists, but the property has no value that is - /// associated with it. - /// - /// - /// The DEVPROP_TYPE_NULL identifier cannot be combined with the property-data-type modifiers DEVPROP_TYPEMOD_ARRAY or DEVPROP_TYPEMOD_LIST. - /// - /// Setting a Property of this Type - /// - /// To set a property whose data type is DEVPROP_TYPE_NULL, call the corresponding SetupDiSetXxx property function and - /// set the function parameters as follows: - /// - /// Retrieving a Property of this Type - /// - /// A call to a SetupDiGetXxx property function that attempts to retrieve a device property that has no value will - /// succeed and set the *PropertyType parameter to DEVPROP_TYPE_NULL. - /// - /// - DEVPROP_TYPE_NULL = 0x00000001, - - /// - /// In Windows Vista and later versions of Windows, the DEVPROP_TYPE_BYTE identifier represents the base-data-type identifier - /// that indicates the data type is a SBYTE-typed signed integer. - /// - /// - /// DEVPROP_TYPE_SBYTE can be combined only with the DEVPROP_TYPEMOD_ARRAY property-data-type modifier. - /// Setting a Property of this Type - /// - /// To set a property whose data type is DEVPROP_TYPE_BYTE, call the corresponding SetupDiSetXxx property function, and - /// set the function parameters as follows: - /// - /// - [CorrespondingType(typeof(sbyte))] - DEVPROP_TYPE_SBYTE = 0x00000002, - - /// - /// In Windows Vista and later versions of Windows, the DEVPROP_TYPE_BYTE identifier represents the base-data-type identifier - /// that indicates the data type is a BYTE-typed unsigned integer. - /// - /// - /// DEVPROP_TYPE_BYTE can be combined only with the DEVPROP_TYPEMOD_ARRAY property-data-type modifier. - /// Setting a Property of this Type - /// - /// To set a property whose data type is DEVPROP_TYPE_BYTE, call the corresponding SetupDiSetXxx property function, setting the - /// function input parameters as follows: - /// - /// - [CorrespondingType(typeof(byte))] - DEVPROP_TYPE_BYTE = 0x00000003, - - /// - /// In Windows Vista and later versions of Windows, the DEVPROP_TYPE_INT16 identifier represents the base-data-type identifier - /// that indicates the data type is a SHORT-typed signed integer. - /// - /// - /// DEVPROP_TYPE_SHORT can be combined only with the DEVPROP_TYPEMOD_ARRAY property-data-type modifier. - /// Setting a Property of this Type - /// - /// To set a property whose base data type is DEVPROP_TYPE_INT16, call the corresponding SetupDiSetXxx property function - /// and set the function input parameters as follows: - /// - /// - [CorrespondingType(typeof(short))] - DEVPROP_TYPE_INT16 = 0x00000004, - - /// - /// In Windows Vista and later versions of Windows, the DEVPROP_TYPE_UINT16 identifier represents the base-data-type identifier - /// that indicates that the data type is a USHORT-typed unsigned integer. - /// - /// - /// DEVPROP_TYPE_UINT16 can be combined only with the DEVPROP_TYPEMOD_ARRAY property-data-type modifier. - /// Setting a Property of this Type - /// - /// To set a property whose base data type is DEVPROP_TYPE_UINT16, call the corresponding SetupDiSetXxx property function - /// and set the function input parameters as follows: - /// - /// - [CorrespondingType(typeof(ushort))] - DEVPROP_TYPE_UINT16 = 0x00000005, - - /// - /// In Windows Vista and later versions of Windows, the DEVPROP_TYPE_INT32 identifier represents the base-data-type identifier - /// that indicates that the data type is a LONG-typed signed integer. - /// - /// - /// DEVPROP_TYPE_INT32 can be combined only with the DEVPROP_TYPEMOD_ARRAY property-data-type modifier. - /// Setting a Property of this Type - /// - /// To set a property whose base data type is DEVPROP_TYPE_INT32, call the corresponding SetupDiSetXxx property function, - /// setting the function input parameters as follows: - /// - /// - [CorrespondingType(typeof(int))] - DEVPROP_TYPE_INT32 = 0x00000006, - - /// - /// In Windows Vista and later versions of Windows, the DEVPROP_TYPE_UINT32 identifier represents the base-data-type identifier - /// that indicates that the data type is a ULONG-typed unsigned integer. - /// - /// - /// DEVPROP_TYPE_UINT32 can be combined only with the DEVPROP_TYPEMOD_ARRAY property-data-type modifier. - /// Setting a Property of this Type - /// - /// To set a property whose base data type is DEVPROP_TYPE_UINT32, call the corresponding SetupDiSetXxx property function - /// and set the function input parameters as follows: - /// - /// - [CorrespondingType(typeof(uint))] - DEVPROP_TYPE_UINT32 = 0x00000007, - - /// - /// In Windows Vista and later versions of Windows, the DEVPROP_TYPE_INT64 identifier represents the base-data-type identifier - /// that indicates that the data type is a LONG64-typed signed integer. - /// - /// - /// DEVPROP_TYPE_INT64 can be combined only with the DEVPROP_TYPEMOD_ARRAY property-data-type modifier. - /// Setting a Property of this Type - /// - /// To set a property whose base data type is DEVPROP_TYPE_INT64, call the corresponding SetupDiSetXxx property function - /// and set the function input parameters as follows: - /// - /// - [CorrespondingType(typeof(long))] - DEVPROP_TYPE_INT64 = 0x00000008, - - /// - /// In Windows Vista and later versions of Windows, the DEVPROP_TYPE_INT64 identifier represents the base-data-type identifier - /// that indicates that the data type is a ULONG64-typed unsigned integer. - /// - /// - /// DEVPROP_TYPE_UINT64 can be combined only with the DEVPROP_TYPEMOD_ARRAY property-data-type modifier. - /// Setting a Property of this Type - /// - /// To set a property whose base data type is DEVPROP_TYPE_UINT64, call the corresponding SetupDiSetXxx property function - /// and set the function input parameters as follows: - /// - /// - [CorrespondingType(typeof(ulong))] - DEVPROP_TYPE_UINT64 = 0x00000009, - - /// - /// In Windows Vista and later versions of Windows, the DEVPROP_TYPE_INT64 identifier represents the base-data-type identifier - /// that indicates that the data type is a FLOAT-typed IEEE floating-point number. - /// - /// - /// DEVPROP_TYPE_FLOAT can be combined only with the DEVPROP_TYPEMOD_ARRAY property-data-type modifier. - /// Setting a Property of this Type - /// - /// To set a property whose base data type is DEVPROP_TYPE_FLOAT, call the corresponding SetupDiSetXxx property function, - /// setting the function input parameters as follows: - /// - /// - [CorrespondingType(typeof(float))] - DEVPROP_TYPE_FLOAT = 0x0000000A, - - /// - /// In Windows Vista and later versions of Windows, the DEVPROP_TYPE_DOUBLE identifier represents the base-data-type identifier - /// that indicates that the data type is a DOUBLE-typed IEEE floating-point number. - /// - /// - /// DEVPROP_TYPE_DOUBLE can be combined only with the DEVPROP_TYPEMOD_ARRAY property-data-type modifier. - /// Setting a Property of this Type - /// - /// To set a property whose base data type is DEVPROP_TYPE_DOUBLE, call the corresponding SetupDiSetXxx property function and - /// set the function input parameters as follows: - /// - /// - [CorrespondingType(typeof(double))] - DEVPROP_TYPE_DOUBLE = 0x0000000B, - - /// - /// In Windows Vista and later versions of Windows, the DEVPROP_TYPE_INT64 identifier represents the base-data-type identifier - /// that indicates that the data type is a DECIMAL-typed value. - /// - /// - /// DEVPROP_TYPE_DECIMAL can be combined only with the DEVPROP_TYPEMOD_ARRAY property-data-type modifier. - /// Setting a Property of this Type - /// - /// To set a property whose data type is DEVPROP_TYPE_DECIMAL, call the corresponding SetupDiSetXxx property function and set - /// the function input parameters as follows: - /// - /// - [CorrespondingType(typeof(DECIMAL))] - DEVPROP_TYPE_DECIMAL = 0x0000000C, - - /// - /// In Windows Vista and later versions of Windows, the DEVPROP_TYPE_GUID identifier represents the base-data-type identifier - /// that indicates that the data type is a GUID-typed globally unique identifier (GUID). - /// - /// - /// DEVPROP_TYPE_GUID can be combined only with the DEVPROP_TYPEMOD_ARRAY property-data-type modifier. - /// Setting a Property of this Type - /// - /// To set a property whose base data type is DEVPROP_TYPE_GUID, call the corresponding SetupDiSetXxx property function and set - /// the function input parameters as follows: - /// - /// - [CorrespondingType(typeof(Guid))] - DEVPROP_TYPE_GUID = 0x0000000D, - - /// - /// In Windows Vista and later versions of Windows, the DEVPROP_TYPE_CURRENCY identifier represents the base-data-type - /// identifier that indicates that the data type is a CURRENCY-typed value. - /// - /// - /// DEVPROP_TYPE_CURRENCY can be combined only with the DEVPROP_TYPEMOD_ARRAY property-data-type modifier. - /// Setting a Property of This Type - /// - /// To set a property whose base data type is DEVPROP_TYPE_CURRENCY, call the corresponding SetupDiSetXxx property function and - /// set the function input parameters as follows: - /// - /// - [CorrespondingType(typeof(CY))] - DEVPROP_TYPE_CURRENCY = 0x0000000E, - - /// - /// In Windows Vista and later versions of Windows, the DEVPROP_TYPE_DATE property type represents the base-data-type identifier - /// that indicates that the data type is a DOUBLE-typed value that specifies the number of days since December 31, 1899. For - /// example, January 1, 1900, is 1.0; January 2, 1900, is 2.0; and so on. - /// - /// - /// DEVPROP_TYPE_DATE can be combined only with the DEVPROP_TYPEMOD_ARRAY property-data-type modifier. - /// Setting a Property of this Type - /// - /// To set a property whose base data type is DEVPROP_TYPE_DATE, call the corresponding SetupDiSetXxx property function and set - /// the function input parameters as follows: - /// - /// - [CorrespondingType(typeof(DATE))] - DEVPROP_TYPE_DATE = 0x0000000F, - - /// - /// In Windows Vista and later versions of Windows, the DEVPROP_TYPE_FILETIME property type represents the base-data-type - /// identifier that indicates that the data type is a FILETIME-typed value. - /// - /// - /// We recommend that all time values be represented in Coordinated Universal Time (UTC) units. - /// DEVPROP_TYPE_FILETIME can be combined only with the DEVPROP_TYPEMOD_ARRAY property-data-type modifier. - /// Setting a Property of this Type - /// - /// To set a property whose base data type is DEVPROP_TYPE_FILETIME, call the corresponding SetupDiSetXxx property function and - /// set the function input parameters as follows: - /// - /// - [CorrespondingType(typeof(FILETIME))] - DEVPROP_TYPE_FILETIME = 0x00000010, - - /// - /// In Windows Vista and later versions of Windows, the DEVPROP_TYPE_BOOLEAN property type represents the base-data-type - /// identifier that indicates that the data type is a DEVPROP_BOOLEAN-typed Boolean value. - /// - /// - /// The DEVPROP_BOOLEAN data type and valid Boolean values are defined as follows: - /// - /// typedef CHAR DEVPROP_BOOLEAN, *PDEVPROP_BOOLEAN; #define DEVPROP_TRUE ((DEVPROP_BOOLEAN)-1) #define DEVPROP_FALSE ((DEVPROP_BOOLEAN) 0) - /// - /// DEVPROP_TYPE_BOOLEAN can be combined only with the DEVPROP_TYPEMOD_ARRAY property-data-type modifier. - /// Setting a Property of this Type - /// - /// To set a property whose base data type is DEVPROP_TYPE_BOOLEAN, call the corresponding SetupDiSetXxx property function and - /// set the function input parameters as follows: - /// - /// - [CorrespondingType(typeof(BOOLEAN))] - DEVPROP_TYPE_BOOLEAN = 0x00000011, - - /// - /// In Windows Vista and later versions of Windows, the DEVPROP_TYPE_STRING property type represents the base-data-type - /// identifier that indicates that the data type is a NULL-terminated Unicode string. - /// - /// - /// DEVPROP_TYPE_STRING can be combined only with the DEVPROP_TYPEMOD_LIST property-data-type modifier. - /// Setting a Property of this Type - /// - /// To set a property whose base data type is DEVPROP_TYPE_STRING, call the corresponding SetupDiSetXxx property - /// function, setting the function input parameters as follows: - /// - /// - [CorrespondingType(typeof(string))] - DEVPROP_TYPE_STRING = 0x00000012, - - /// - /// In Windows Vista and later versions of Windows, the DEVPROP_TYPE_STRING_LIST property type represents the base-data-type - /// identifier that indicates that the data type is a REG_MULTI_SZ-typed list of Unicode strings. - /// - /// - /// DEVPROP_TYPE_STRING_LIST cannot be combined with the property-data-type modifiers. - /// Setting a Property of this Type - /// - /// To set a property whose base data type is DEVPROP_TYPE_STRING_LIST, call the corresponding SetupDiSetXxx property - /// function and set the function input parameters as follows: - /// - /// - [CorrespondingType(typeof(System.Collections.Generic.IEnumerable))] - DEVPROP_TYPE_STRING_LIST = DEVPROP_TYPE_STRING | DEVPROP_TYPEMOD_LIST, - - /// - /// In Windows Vista and later versions of Windows, the DEVPROP_TYPE_SECURITY_DESCRIPTOR identifier represents the - /// base-data-type identifier that indicates the data type is a variable-length, self-relative, SECURITY_DESCRIPTOR-typed, - /// security descriptor. - /// - /// - /// DEVPROP_TYPE_SECURITY_DESCRIPTOR cannot be combined with the property-data-type modifiers. - /// Setting a Property of this Type - /// - /// To set a property whose base data type is DEVPROP_TYPE_SECURITY_DESCRIPTOR, call the corresponding SetupDiSetXxx - /// property function and set the function input parameters as follows: - /// - /// - DEVPROP_TYPE_SECURITY_DESCRIPTOR = 0x00000013, - - /// - /// In Windows Vista and later versions of Windows, the DEVPROP_TYPE_SECURITY_DESCRIPTOR_STRING identifier represents the - /// base-data-type identifier that indicates the data type is a NULL-terminated Unicode string that contains a security - /// descriptor in the Security Descriptor Definition Language (SDDL) format. - /// - /// - /// - /// DEVPROP_TYPE_SECURITY_DESCRIPTOR_STRING can be combined only with the DEVPROP_TYPEMOD_LIST property-data-type modifier. - /// - /// Setting a Property of this Type - /// - /// To set a property whose base data type is DEVPROP_TYPE_SECURITY_DESCRIPTOR_STRING, call the corresponding - /// SetupDiSetXxx property function and set the function input parameters as follows: - /// - /// - [CorrespondingType(typeof(string))] - DEVPROP_TYPE_SECURITY_DESCRIPTOR_STRING = 0x00000014, - - /// - /// In Windows Vista and later versions of Windows, the DEVPROP_TYPE_DEVPROPKEY identifier represents the base-data-type - /// identifier that indicates the data type is a DEVPROPKEY-typed device property key. - /// - /// - /// - /// The DEVPROP_TYPE_DEVPROPKEY property type can be combined only with the DEVPROP_TYPEMOD_ARRAY property-data-type modifier. - /// - /// Setting a Property of this Type - /// - /// To set a property whose base data type is DEVPROP_TYPE_DEVPROPKEY, call the corresponding SetupDiSetXxx property function - /// and set the function input parameters as follows: - /// - /// - [CorrespondingType(typeof(DEVPROPKEY))] - DEVPROP_TYPE_DEVPROPKEY = 0x00000015, - - /// - /// In Windows Vista and later versions of Windows, the DEVPROP_TYPE_DEVPROPTYPE identifier represents the base-data-type - /// identifier that indicates the data type is a DEVPROPTYPE-typed value. - /// - /// - /// - /// The DEVPROP_TYPE_DEVPROPTYPE property type can be combined only with the DEVPROP_TYPEMOD_ARRAY property-data-type modifier. - /// - /// Setting a Property of this Type - /// - /// To set a property whose base data type is DEVPROP_TYPE_DEVPROPTYPE, call the corresponding SetupDiSetXxx property function, - /// setting the function input parameters as follows: - /// - /// - [CorrespondingType(typeof(DEVPROPTYPE))] - DEVPROP_TYPE_DEVPROPTYPE = 0x00000016, - - /// - /// In Windows Vista and later versions of Windows, the DEVPROP_TYPE_BINARY identifier represents the base-data-type identifier - /// that indicates that the data type is an array of BYTE-typed unsigned values. - /// - /// - /// The DEVPROP_TYPE_BINARY property type cannot be combined with the property-data-type modifiers. - /// Setting a Property of this Type - /// - /// To set a property whose base data type is DEVPROP_TYPE_BINARY, call the corresponding SetupDiSetXxx property function and - /// set the function input parameters as follows: - /// - /// - [CorrespondingType(typeof(byte[]))] - DEVPROP_TYPE_BINARY = DEVPROP_TYPE_BYTE | DEVPROP_TYPEMOD_ARRAY, - - /// - /// The DEVPROP_TYPE_ERROR identifier represents the base-data-type identifier for the Microsoft Win32 error code values that - /// are defined in WINERROR.H. - /// - /// - /// - /// In Windows Vista and later versions of Windows, the unified device property model also defines a - /// DEVPROP_TYPE_NTSTATUS base-data-type identifier for NTSTATUS error code values. - /// - /// You can combine DEVPROP_TYPE_ERROR only with the DEVPROP_TYPEMOD_ARRAY property-data-type modifier. - /// Setting a Property of This Type - /// - /// To set a property whose base data type is DEVPROP_TYPE_ERROR, call the corresponding SetupDiSetXxx property function and set - /// the function input parameters as follows: - /// - /// Retrieving the Descriptive Text for a Win32 Error Code Value - /// - /// To retrieve the descriptive text that is associated with a Win32 error code, call the FormatMessage function - /// (documented in the Windows SDK) as follows: - /// - /// - [CorrespondingType(typeof(Win32Error))] - DEVPROP_TYPE_ERROR = 0x00000017, - - /// - /// The DEVPROP_TYPE_NTSTATUS identifier represents the base-data-type identifier for the NTSTATUS status code values that are - /// defined in Ntstatus.h. - /// - /// - /// - /// In Windows Vista and later versions of Windows, the unified device property model also defines a DEVPROP_TYPE_ERROR - /// base-data-type identifier for Microsoft Win32 error code values. - /// - /// You can combine DEVPROP_TYPE_NTSTATUS only with the DEVPROP_TYPEMOD_ARRAY property-data-type modifier. - /// Setting a Property of This Type - /// - /// To set a property whose base data type is DEVPROP_TYPE_NTSTATUS, call the corresponding SetupDiSet Xxx property - /// function and set the function input parameters as follows: - /// - /// Retrieving the Descriptive Text for a NTSTATUS Error Code Value - /// - /// To retrieve the descriptive text that is associated with an NTSTATUS error code value, call the FormatMessage - /// function (documented in the Windows SDK) as follows: - /// - /// - [CorrespondingType(typeof(NTStatus))] - DEVPROP_TYPE_NTSTATUS = 0x00000018, - - /// - /// The DEVPROP_TYPE_STRING_INDIRECT identifier represents the base-data-type identifier for a NULL-terminated Unicode string - /// that contains an indirect string reference. - /// - /// - /// - /// An indirect string reference describes a string resource that contains the actual string. The indirect string reference can - /// appear in one of the following formats: - /// - /// - /// @[path \]FileName ,- ResourceID Windows extracts the string from the module that is specified by the - /// path and FileName entries, and the resource identifier of the string is supplied by the ResourceID entry (excluding the - /// required minus sign). The string resource is loaded from the module resource section that best matches one of the caller's - /// preferred UI languages. The path entry is optional. If you specify the path entry, the module must be located in a directory - /// that is in the system-defined search path. - /// - /// - /// @ InfName ,% strkey % Windows extracts the string from the INF Strings section of the INF file - /// in the %SystemRoot%\inf directory whose name is supplied by the InfName entry. The strkey token identifier should match the - /// key of a line in the Strings section that best matches one of the caller's preferred UI languages. If no - /// language-specific Strings sections exist, Windows uses the default Strings section. - /// - /// You cannot combine DEVPROP_TYPE_STRING_INDIRECT with any of the property-data-type modifiers. - /// Setting a Property of This Type - /// - /// To set a property whose base data type is DEVPROP_TYPE_STRING_INDIRECT, call the corresponding SetupDiSet Xxx - /// property function and set the function input parameters as follows: - /// - /// Retrieving the Value of This Property Type - /// - /// When an application calls a SetupDiGet Xxx property function to retrieve the value of a property of this base data - /// type, Windows tries to locate the actual string that the property references. If Windows can retrieve the actual string, it - /// returns the actual string to the caller and identifies the base data type of the retrieved property as - /// DEVPROP_TYPE_STRING. Otherwise, Windows returns the indirect string reference and identifies the base data type of - /// the retrieved property as DEVPROP_TYPE_STRING_INDIRECT. - /// - /// Localizing Static Text - /// - /// Starting with Windows Vista you can localize custom and standard string-type PnP static-text properties using resources from - /// a PE image's string or resource tables by setting static-text property types to DEVPROP_TYPE_STRING_INDIRECT. You can also - /// add non-localized replacement-string data that can be formatted into the static text. - /// - /// - /// Strings located in a PE image's STRINGTABLE resource (as typically performed by LoadString) should use the following format: - /// - /// "@"System32\mydll.dll,-21[;Fallback" String]" - /// "@System32\mydll.dll,-21[;Fallback String with %1, %2, … to %n[;(Arg1,Arg2,…,ArgN)]]" - /// - /// Strings located in a PE images's message-table resource (as typically performed by RtlFindMessage, more commonly used in - /// drivers) should use the following format: - /// - /// "@System32\drivers\mydriver.sys,#21[;Fallback String]" - /// "@System32\drivers\mydriver.sys,#21[;Fallback String with %1, %2, … to %n[;(Arg1,Arg2,…,ArgN)]]" - /// - /// A "Fallback String" is optional but useful because it can be returned if the resource can’t be found or loaded. The fallback - /// string is also returned to non-interactive system processes that are not impersonating a user, and as such cannot show - /// localized text to users anyways. - /// - /// - /// This technique enables you to localize static-text pulled from the string or message table resource that best matches the - /// caller’s locale. - /// - /// - /// Windows will format the trailing arguments into the string (or the fallback string) when they are retrieved from the - /// respective resource table, much as in the same manner as RtlFormatMessage does. - /// - /// - /// Custom and standard string-type PnP static-text is localized when you set the property by loading the resource from the - /// component performing the set operation, which typically happens under the system default locale for system-level components. - /// - /// Note: PE images can use either resource table type (STRINGTABLE resources, or message-table resources). - /// - [CorrespondingType(typeof(string))] - DEVPROP_TYPE_STRING_INDIRECT = 0x00000019, - - /// - /// In Windows Vista and later versions of Windows, the DEVPROP_MASK_TYPE mask can be combined in a bitwise AND with a - /// property-data-type identifier to extract the base-data-type identifier from a property-data-type identifier. - /// - /// - /// This mask cannot be used as a base-data-type identifier, a property-data-type modifier, or a property-data-type identifier. - /// - /// For information about how to extract the DEVPROP_TYPEMOD_Xxx property-data-type modifier from a property-data-type - /// identifier, see DEVPROP_MASK_TYPEMOD. - /// - /// - DEVPROP_MASK_TYPE = 0x00000FFF, - - /// - /// In Windows Vista and later versions of Windows, the DEVPROP_MASK_TYPEMOD mask can be combined in a bitwise AND with a - /// property-data-type identifier to extract the DEVPROP_TYPEMOD_Xxx property-data-type modifier from a - /// property-data-type identifier. - /// - /// - /// This mask cannot be used as a base-data-type identifier, a property-data-type modifier, or property-data-type identifier. - /// - /// For information about how to extract the base-data-type identifier from a property-data-type identifier, see DEVPROP_MASK_TYPE. - /// - /// - DEVPROP_MASK_TYPEMOD = 0x0000F000, - } - /// /// Flags that control installation and user interface operations. Some flags can be set before sending the device installation /// request while other flags are set automatically during the processing of some requests. @@ -2689,73 +2051,6 @@ namespace Vanara.PInvoke SRCLIST_NOSTRIPPLATFORM = 0x00000400, } - /// Extracts a value from memory of the type specified. - /// Type of the value to extract. - /// The memory handle holding the value. - /// An object of the specified type. - public static object GetObject(this DEVPROPTYPE pType, ISafeMemoryHandle mem) => GetObject(pType, mem.DangerousGetHandle(), mem.Size); - - /// Extracts a value from memory of the type specified. - /// Type of the value to extract. - /// The pointer to the memory holding the value. - /// Size of the allocated memory. - /// An object of the specified type. - public static object GetObject(this DEVPROPTYPE pType, IntPtr mem, SizeT memSize) - { - switch (pType) - { - case DEVPROPTYPE.DEVPROP_TYPE_EMPTY: - case DEVPROPTYPE.DEVPROP_TYPE_NULL: - return null; - case DEVPROPTYPE.DEVPROP_TYPE_SBYTE: - case DEVPROPTYPE.DEVPROP_TYPE_BYTE: - case DEVPROPTYPE.DEVPROP_TYPE_INT16: - case DEVPROPTYPE.DEVPROP_TYPE_UINT16: - case DEVPROPTYPE.DEVPROP_TYPE_INT32: - case DEVPROPTYPE.DEVPROP_TYPE_UINT32: - case DEVPROPTYPE.DEVPROP_TYPE_INT64: - case DEVPROPTYPE.DEVPROP_TYPE_UINT64: - case DEVPROPTYPE.DEVPROP_TYPE_FLOAT: - case DEVPROPTYPE.DEVPROP_TYPE_DOUBLE: - case DEVPROPTYPE.DEVPROP_TYPE_DECIMAL: - case DEVPROPTYPE.DEVPROP_TYPE_GUID: - case DEVPROPTYPE.DEVPROP_TYPE_FILETIME: - case DEVPROPTYPE.DEVPROP_TYPE_CURRENCY: - case DEVPROPTYPE.DEVPROP_TYPE_DATE: - case DEVPROPTYPE.DEVPROP_TYPE_STRING: - case DEVPROPTYPE.DEVPROP_TYPE_DEVPROPKEY: - case DEVPROPTYPE.DEVPROP_TYPE_DEVPROPTYPE: - case DEVPROPTYPE.DEVPROP_TYPE_ERROR: - case DEVPROPTYPE.DEVPROP_TYPE_NTSTATUS: - case DEVPROPTYPE.DEVPROP_TYPE_SECURITY_DESCRIPTOR_STRING: - case DEVPROPTYPE.DEVPROP_TYPE_BINARY: - return mem.Convert(memSize, CorrespondingTypeAttribute.GetCorrespondingTypes(pType).First()); - case DEVPROPTYPE.DEVPROP_TYPE_STRING_LIST: - case DEVPROPTYPE.DEVPROP_TYPEMOD_LIST | DEVPROPTYPE.DEVPROP_TYPE_SECURITY_DESCRIPTOR_STRING: - return mem.ToStringEnum(CharSet.Auto, 0, memSize).ToArray(); - case DEVPROPTYPE.DEVPROP_TYPE_BOOLEAN: - return mem.ToStructure(memSize).Value; - case DEVPROPTYPE.DEVPROP_TYPE_SECURITY_DESCRIPTOR: - return new System.Security.AccessControl.RawSecurityDescriptor(mem.ToArray(memSize, 0, memSize), 0); - case DEVPROPTYPE.DEVPROP_TYPE_STRING_INDIRECT: - return Environment.ExpandEnvironmentVariables(StringHelper.GetString(mem, CharSet.Auto, memSize)); - default: - if (pType.IsFlagSet(DEVPROPTYPE.DEVPROP_TYPEMOD_ARRAY)) - { - var elemtype = CorrespondingTypeAttribute.GetCorrespondingTypes(pType.ClearFlags(DEVPROPTYPE.DEVPROP_TYPEMOD_ARRAY)).First(); - var elemsz = Marshal.SizeOf(elemtype); - return mem.ToArray(elemtype, memSize / elemsz, 0, memSize); - } - break; - } - throw new ArgumentException($"Unable to convert to {pType}."); - } - - /// Splits the provided value into its parts. - /// The value. - /// The type and modifier. - public static (DEVPROPTYPE type, DEVPROPTYPE mod) Split(this DEVPROPTYPE value) => (value & DEVPROPTYPE.DEVPROP_MASK_TYPE, value & DEVPROPTYPE.DEVPROP_MASK_TYPEMOD); - /// /// The CABINET_INFO structure stores information about a cabinet file. The SetupIterateCabinet function specifies this /// structure as a parameter when it sends a SPFILENOTIFY_NEEDNEWCABINET notification to the cabinet callback routine.