annotate vendor/golang.org/x/sys/windows/setupapi_windows.go @ 66:787b5ee0289d draft

Use vendored modules Signed-off-by: Izuru Yakumo <yakumo.izuru@chaotic.ninja>
author yakumo.izuru
date Sun, 23 Jul 2023 13:18:53 +0000
parents
children 4b79810863f6
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
66
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1 // Copyright 2021 The Go Authors. All rights reserved.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
2 // Use of this source code is governed by a BSD-style
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
3 // license that can be found in the LICENSE file.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
4
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
5 package windows
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
6
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
7 import (
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
8 "encoding/binary"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
9 "errors"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
10 "fmt"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
11 "runtime"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
12 "strings"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
13 "syscall"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
14 "unsafe"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
15 )
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
16
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
17 // This file contains functions that wrap SetupAPI.dll and CfgMgr32.dll,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
18 // core system functions for managing hardware devices, drivers, and the PnP tree.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
19 // Information about these APIs can be found at:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
20 // https://docs.microsoft.com/en-us/windows-hardware/drivers/install/setupapi
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
21 // https://docs.microsoft.com/en-us/windows/win32/devinst/cfgmgr32-
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
22
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
23 const (
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
24 ERROR_EXPECTED_SECTION_NAME Errno = 0x20000000 | 0xC0000000 | 0
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
25 ERROR_BAD_SECTION_NAME_LINE Errno = 0x20000000 | 0xC0000000 | 1
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
26 ERROR_SECTION_NAME_TOO_LONG Errno = 0x20000000 | 0xC0000000 | 2
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
27 ERROR_GENERAL_SYNTAX Errno = 0x20000000 | 0xC0000000 | 3
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
28 ERROR_WRONG_INF_STYLE Errno = 0x20000000 | 0xC0000000 | 0x100
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
29 ERROR_SECTION_NOT_FOUND Errno = 0x20000000 | 0xC0000000 | 0x101
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
30 ERROR_LINE_NOT_FOUND Errno = 0x20000000 | 0xC0000000 | 0x102
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
31 ERROR_NO_BACKUP Errno = 0x20000000 | 0xC0000000 | 0x103
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
32 ERROR_NO_ASSOCIATED_CLASS Errno = 0x20000000 | 0xC0000000 | 0x200
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
33 ERROR_CLASS_MISMATCH Errno = 0x20000000 | 0xC0000000 | 0x201
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
34 ERROR_DUPLICATE_FOUND Errno = 0x20000000 | 0xC0000000 | 0x202
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
35 ERROR_NO_DRIVER_SELECTED Errno = 0x20000000 | 0xC0000000 | 0x203
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
36 ERROR_KEY_DOES_NOT_EXIST Errno = 0x20000000 | 0xC0000000 | 0x204
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
37 ERROR_INVALID_DEVINST_NAME Errno = 0x20000000 | 0xC0000000 | 0x205
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
38 ERROR_INVALID_CLASS Errno = 0x20000000 | 0xC0000000 | 0x206
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
39 ERROR_DEVINST_ALREADY_EXISTS Errno = 0x20000000 | 0xC0000000 | 0x207
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
40 ERROR_DEVINFO_NOT_REGISTERED Errno = 0x20000000 | 0xC0000000 | 0x208
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
41 ERROR_INVALID_REG_PROPERTY Errno = 0x20000000 | 0xC0000000 | 0x209
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
42 ERROR_NO_INF Errno = 0x20000000 | 0xC0000000 | 0x20A
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
43 ERROR_NO_SUCH_DEVINST Errno = 0x20000000 | 0xC0000000 | 0x20B
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
44 ERROR_CANT_LOAD_CLASS_ICON Errno = 0x20000000 | 0xC0000000 | 0x20C
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
45 ERROR_INVALID_CLASS_INSTALLER Errno = 0x20000000 | 0xC0000000 | 0x20D
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
46 ERROR_DI_DO_DEFAULT Errno = 0x20000000 | 0xC0000000 | 0x20E
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
47 ERROR_DI_NOFILECOPY Errno = 0x20000000 | 0xC0000000 | 0x20F
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
48 ERROR_INVALID_HWPROFILE Errno = 0x20000000 | 0xC0000000 | 0x210
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
49 ERROR_NO_DEVICE_SELECTED Errno = 0x20000000 | 0xC0000000 | 0x211
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
50 ERROR_DEVINFO_LIST_LOCKED Errno = 0x20000000 | 0xC0000000 | 0x212
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
51 ERROR_DEVINFO_DATA_LOCKED Errno = 0x20000000 | 0xC0000000 | 0x213
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
52 ERROR_DI_BAD_PATH Errno = 0x20000000 | 0xC0000000 | 0x214
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
53 ERROR_NO_CLASSINSTALL_PARAMS Errno = 0x20000000 | 0xC0000000 | 0x215
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
54 ERROR_FILEQUEUE_LOCKED Errno = 0x20000000 | 0xC0000000 | 0x216
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
55 ERROR_BAD_SERVICE_INSTALLSECT Errno = 0x20000000 | 0xC0000000 | 0x217
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
56 ERROR_NO_CLASS_DRIVER_LIST Errno = 0x20000000 | 0xC0000000 | 0x218
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
57 ERROR_NO_ASSOCIATED_SERVICE Errno = 0x20000000 | 0xC0000000 | 0x219
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
58 ERROR_NO_DEFAULT_DEVICE_INTERFACE Errno = 0x20000000 | 0xC0000000 | 0x21A
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
59 ERROR_DEVICE_INTERFACE_ACTIVE Errno = 0x20000000 | 0xC0000000 | 0x21B
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
60 ERROR_DEVICE_INTERFACE_REMOVED Errno = 0x20000000 | 0xC0000000 | 0x21C
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
61 ERROR_BAD_INTERFACE_INSTALLSECT Errno = 0x20000000 | 0xC0000000 | 0x21D
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
62 ERROR_NO_SUCH_INTERFACE_CLASS Errno = 0x20000000 | 0xC0000000 | 0x21E
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
63 ERROR_INVALID_REFERENCE_STRING Errno = 0x20000000 | 0xC0000000 | 0x21F
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
64 ERROR_INVALID_MACHINENAME Errno = 0x20000000 | 0xC0000000 | 0x220
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
65 ERROR_REMOTE_COMM_FAILURE Errno = 0x20000000 | 0xC0000000 | 0x221
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
66 ERROR_MACHINE_UNAVAILABLE Errno = 0x20000000 | 0xC0000000 | 0x222
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
67 ERROR_NO_CONFIGMGR_SERVICES Errno = 0x20000000 | 0xC0000000 | 0x223
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
68 ERROR_INVALID_PROPPAGE_PROVIDER Errno = 0x20000000 | 0xC0000000 | 0x224
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
69 ERROR_NO_SUCH_DEVICE_INTERFACE Errno = 0x20000000 | 0xC0000000 | 0x225
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
70 ERROR_DI_POSTPROCESSING_REQUIRED Errno = 0x20000000 | 0xC0000000 | 0x226
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
71 ERROR_INVALID_COINSTALLER Errno = 0x20000000 | 0xC0000000 | 0x227
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
72 ERROR_NO_COMPAT_DRIVERS Errno = 0x20000000 | 0xC0000000 | 0x228
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
73 ERROR_NO_DEVICE_ICON Errno = 0x20000000 | 0xC0000000 | 0x229
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
74 ERROR_INVALID_INF_LOGCONFIG Errno = 0x20000000 | 0xC0000000 | 0x22A
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
75 ERROR_DI_DONT_INSTALL Errno = 0x20000000 | 0xC0000000 | 0x22B
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
76 ERROR_INVALID_FILTER_DRIVER Errno = 0x20000000 | 0xC0000000 | 0x22C
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
77 ERROR_NON_WINDOWS_NT_DRIVER Errno = 0x20000000 | 0xC0000000 | 0x22D
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
78 ERROR_NON_WINDOWS_DRIVER Errno = 0x20000000 | 0xC0000000 | 0x22E
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
79 ERROR_NO_CATALOG_FOR_OEM_INF Errno = 0x20000000 | 0xC0000000 | 0x22F
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
80 ERROR_DEVINSTALL_QUEUE_NONNATIVE Errno = 0x20000000 | 0xC0000000 | 0x230
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
81 ERROR_NOT_DISABLEABLE Errno = 0x20000000 | 0xC0000000 | 0x231
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
82 ERROR_CANT_REMOVE_DEVINST Errno = 0x20000000 | 0xC0000000 | 0x232
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
83 ERROR_INVALID_TARGET Errno = 0x20000000 | 0xC0000000 | 0x233
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
84 ERROR_DRIVER_NONNATIVE Errno = 0x20000000 | 0xC0000000 | 0x234
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
85 ERROR_IN_WOW64 Errno = 0x20000000 | 0xC0000000 | 0x235
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
86 ERROR_SET_SYSTEM_RESTORE_POINT Errno = 0x20000000 | 0xC0000000 | 0x236
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
87 ERROR_SCE_DISABLED Errno = 0x20000000 | 0xC0000000 | 0x238
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
88 ERROR_UNKNOWN_EXCEPTION Errno = 0x20000000 | 0xC0000000 | 0x239
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
89 ERROR_PNP_REGISTRY_ERROR Errno = 0x20000000 | 0xC0000000 | 0x23A
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
90 ERROR_REMOTE_REQUEST_UNSUPPORTED Errno = 0x20000000 | 0xC0000000 | 0x23B
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
91 ERROR_NOT_AN_INSTALLED_OEM_INF Errno = 0x20000000 | 0xC0000000 | 0x23C
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
92 ERROR_INF_IN_USE_BY_DEVICES Errno = 0x20000000 | 0xC0000000 | 0x23D
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
93 ERROR_DI_FUNCTION_OBSOLETE Errno = 0x20000000 | 0xC0000000 | 0x23E
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
94 ERROR_NO_AUTHENTICODE_CATALOG Errno = 0x20000000 | 0xC0000000 | 0x23F
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
95 ERROR_AUTHENTICODE_DISALLOWED Errno = 0x20000000 | 0xC0000000 | 0x240
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
96 ERROR_AUTHENTICODE_TRUSTED_PUBLISHER Errno = 0x20000000 | 0xC0000000 | 0x241
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
97 ERROR_AUTHENTICODE_TRUST_NOT_ESTABLISHED Errno = 0x20000000 | 0xC0000000 | 0x242
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
98 ERROR_AUTHENTICODE_PUBLISHER_NOT_TRUSTED Errno = 0x20000000 | 0xC0000000 | 0x243
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
99 ERROR_SIGNATURE_OSATTRIBUTE_MISMATCH Errno = 0x20000000 | 0xC0000000 | 0x244
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
100 ERROR_ONLY_VALIDATE_VIA_AUTHENTICODE Errno = 0x20000000 | 0xC0000000 | 0x245
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
101 ERROR_DEVICE_INSTALLER_NOT_READY Errno = 0x20000000 | 0xC0000000 | 0x246
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
102 ERROR_DRIVER_STORE_ADD_FAILED Errno = 0x20000000 | 0xC0000000 | 0x247
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
103 ERROR_DEVICE_INSTALL_BLOCKED Errno = 0x20000000 | 0xC0000000 | 0x248
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
104 ERROR_DRIVER_INSTALL_BLOCKED Errno = 0x20000000 | 0xC0000000 | 0x249
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
105 ERROR_WRONG_INF_TYPE Errno = 0x20000000 | 0xC0000000 | 0x24A
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
106 ERROR_FILE_HASH_NOT_IN_CATALOG Errno = 0x20000000 | 0xC0000000 | 0x24B
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
107 ERROR_DRIVER_STORE_DELETE_FAILED Errno = 0x20000000 | 0xC0000000 | 0x24C
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
108 ERROR_UNRECOVERABLE_STACK_OVERFLOW Errno = 0x20000000 | 0xC0000000 | 0x300
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
109 EXCEPTION_SPAPI_UNRECOVERABLE_STACK_OVERFLOW Errno = ERROR_UNRECOVERABLE_STACK_OVERFLOW
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
110 ERROR_NO_DEFAULT_INTERFACE_DEVICE Errno = ERROR_NO_DEFAULT_DEVICE_INTERFACE
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
111 ERROR_INTERFACE_DEVICE_ACTIVE Errno = ERROR_DEVICE_INTERFACE_ACTIVE
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
112 ERROR_INTERFACE_DEVICE_REMOVED Errno = ERROR_DEVICE_INTERFACE_REMOVED
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
113 ERROR_NO_SUCH_INTERFACE_DEVICE Errno = ERROR_NO_SUCH_DEVICE_INTERFACE
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
114 )
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
115
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
116 const (
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
117 MAX_DEVICE_ID_LEN = 200
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
118 MAX_DEVNODE_ID_LEN = MAX_DEVICE_ID_LEN
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
119 MAX_GUID_STRING_LEN = 39 // 38 chars + terminator null
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
120 MAX_CLASS_NAME_LEN = 32
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
121 MAX_PROFILE_LEN = 80
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
122 MAX_CONFIG_VALUE = 9999
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
123 MAX_INSTANCE_VALUE = 9999
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
124 CONFIGMG_VERSION = 0x0400
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
125 )
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
126
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
127 // Maximum string length constants
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
128 const (
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
129 LINE_LEN = 256 // Windows 9x-compatible maximum for displayable strings coming from a device INF.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
130 MAX_INF_STRING_LENGTH = 4096 // Actual maximum size of an INF string (including string substitutions).
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
131 MAX_INF_SECTION_NAME_LENGTH = 255 // For Windows 9x compatibility, INF section names should be constrained to 32 characters.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
132 MAX_TITLE_LEN = 60
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
133 MAX_INSTRUCTION_LEN = 256
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
134 MAX_LABEL_LEN = 30
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
135 MAX_SERVICE_NAME_LEN = 256
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
136 MAX_SUBTITLE_LEN = 256
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
137 )
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
138
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
139 const (
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
140 // SP_MAX_MACHINENAME_LENGTH defines maximum length of a machine name in the format expected by ConfigMgr32 CM_Connect_Machine (i.e., "\\\\MachineName\0").
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
141 SP_MAX_MACHINENAME_LENGTH = MAX_PATH + 3
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
142 )
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
143
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
144 // HSPFILEQ is type for setup file queue
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
145 type HSPFILEQ uintptr
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
146
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
147 // DevInfo holds reference to device information set
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
148 type DevInfo Handle
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
149
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
150 // DEVINST is a handle usually recognized by cfgmgr32 APIs
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
151 type DEVINST uint32
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
152
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
153 // DevInfoData is a device information structure (references a device instance that is a member of a device information set)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
154 type DevInfoData struct {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
155 size uint32
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
156 ClassGUID GUID
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
157 DevInst DEVINST
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
158 _ uintptr
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
159 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
160
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
161 // DevInfoListDetailData is a structure for detailed information on a device information set (used for SetupDiGetDeviceInfoListDetail which supersedes the functionality of SetupDiGetDeviceInfoListClass).
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
162 type DevInfoListDetailData struct {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
163 size uint32 // Use unsafeSizeOf method
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
164 ClassGUID GUID
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
165 RemoteMachineHandle Handle
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
166 remoteMachineName [SP_MAX_MACHINENAME_LENGTH]uint16
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
167 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
168
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
169 func (*DevInfoListDetailData) unsafeSizeOf() uint32 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
170 if unsafe.Sizeof(uintptr(0)) == 4 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
171 // Windows declares this with pshpack1.h
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
172 return uint32(unsafe.Offsetof(DevInfoListDetailData{}.remoteMachineName) + unsafe.Sizeof(DevInfoListDetailData{}.remoteMachineName))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
173 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
174 return uint32(unsafe.Sizeof(DevInfoListDetailData{}))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
175 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
176
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
177 func (data *DevInfoListDetailData) RemoteMachineName() string {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
178 return UTF16ToString(data.remoteMachineName[:])
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
179 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
180
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
181 func (data *DevInfoListDetailData) SetRemoteMachineName(remoteMachineName string) error {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
182 str, err := UTF16FromString(remoteMachineName)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
183 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
184 return err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
185 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
186 copy(data.remoteMachineName[:], str)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
187 return nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
188 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
189
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
190 // DI_FUNCTION is function type for device installer
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
191 type DI_FUNCTION uint32
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
192
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
193 const (
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
194 DIF_SELECTDEVICE DI_FUNCTION = 0x00000001
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
195 DIF_INSTALLDEVICE DI_FUNCTION = 0x00000002
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
196 DIF_ASSIGNRESOURCES DI_FUNCTION = 0x00000003
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
197 DIF_PROPERTIES DI_FUNCTION = 0x00000004
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
198 DIF_REMOVE DI_FUNCTION = 0x00000005
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
199 DIF_FIRSTTIMESETUP DI_FUNCTION = 0x00000006
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
200 DIF_FOUNDDEVICE DI_FUNCTION = 0x00000007
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
201 DIF_SELECTCLASSDRIVERS DI_FUNCTION = 0x00000008
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
202 DIF_VALIDATECLASSDRIVERS DI_FUNCTION = 0x00000009
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
203 DIF_INSTALLCLASSDRIVERS DI_FUNCTION = 0x0000000A
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
204 DIF_CALCDISKSPACE DI_FUNCTION = 0x0000000B
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
205 DIF_DESTROYPRIVATEDATA DI_FUNCTION = 0x0000000C
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
206 DIF_VALIDATEDRIVER DI_FUNCTION = 0x0000000D
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
207 DIF_DETECT DI_FUNCTION = 0x0000000F
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
208 DIF_INSTALLWIZARD DI_FUNCTION = 0x00000010
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
209 DIF_DESTROYWIZARDDATA DI_FUNCTION = 0x00000011
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
210 DIF_PROPERTYCHANGE DI_FUNCTION = 0x00000012
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
211 DIF_ENABLECLASS DI_FUNCTION = 0x00000013
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
212 DIF_DETECTVERIFY DI_FUNCTION = 0x00000014
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
213 DIF_INSTALLDEVICEFILES DI_FUNCTION = 0x00000015
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
214 DIF_UNREMOVE DI_FUNCTION = 0x00000016
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
215 DIF_SELECTBESTCOMPATDRV DI_FUNCTION = 0x00000017
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
216 DIF_ALLOW_INSTALL DI_FUNCTION = 0x00000018
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
217 DIF_REGISTERDEVICE DI_FUNCTION = 0x00000019
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
218 DIF_NEWDEVICEWIZARD_PRESELECT DI_FUNCTION = 0x0000001A
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
219 DIF_NEWDEVICEWIZARD_SELECT DI_FUNCTION = 0x0000001B
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
220 DIF_NEWDEVICEWIZARD_PREANALYZE DI_FUNCTION = 0x0000001C
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
221 DIF_NEWDEVICEWIZARD_POSTANALYZE DI_FUNCTION = 0x0000001D
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
222 DIF_NEWDEVICEWIZARD_FINISHINSTALL DI_FUNCTION = 0x0000001E
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
223 DIF_INSTALLINTERFACES DI_FUNCTION = 0x00000020
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
224 DIF_DETECTCANCEL DI_FUNCTION = 0x00000021
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
225 DIF_REGISTER_COINSTALLERS DI_FUNCTION = 0x00000022
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
226 DIF_ADDPROPERTYPAGE_ADVANCED DI_FUNCTION = 0x00000023
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
227 DIF_ADDPROPERTYPAGE_BASIC DI_FUNCTION = 0x00000024
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
228 DIF_TROUBLESHOOTER DI_FUNCTION = 0x00000026
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
229 DIF_POWERMESSAGEWAKE DI_FUNCTION = 0x00000027
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
230 DIF_ADDREMOTEPROPERTYPAGE_ADVANCED DI_FUNCTION = 0x00000028
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
231 DIF_UPDATEDRIVER_UI DI_FUNCTION = 0x00000029
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
232 DIF_FINISHINSTALL_ACTION DI_FUNCTION = 0x0000002A
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
233 )
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
234
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
235 // DevInstallParams is device installation parameters structure (associated with a particular device information element, or globally with a device information set)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
236 type DevInstallParams struct {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
237 size uint32
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
238 Flags DI_FLAGS
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
239 FlagsEx DI_FLAGSEX
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
240 hwndParent uintptr
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
241 InstallMsgHandler uintptr
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
242 InstallMsgHandlerContext uintptr
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
243 FileQueue HSPFILEQ
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
244 _ uintptr
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
245 _ uint32
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
246 driverPath [MAX_PATH]uint16
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
247 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
248
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
249 func (params *DevInstallParams) DriverPath() string {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
250 return UTF16ToString(params.driverPath[:])
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
251 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
252
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
253 func (params *DevInstallParams) SetDriverPath(driverPath string) error {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
254 str, err := UTF16FromString(driverPath)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
255 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
256 return err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
257 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
258 copy(params.driverPath[:], str)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
259 return nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
260 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
261
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
262 // DI_FLAGS is SP_DEVINSTALL_PARAMS.Flags values
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
263 type DI_FLAGS uint32
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
264
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
265 const (
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
266 // Flags for choosing a device
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
267 DI_SHOWOEM DI_FLAGS = 0x00000001 // support Other... button
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
268 DI_SHOWCOMPAT DI_FLAGS = 0x00000002 // show compatibility list
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
269 DI_SHOWCLASS DI_FLAGS = 0x00000004 // show class list
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
270 DI_SHOWALL DI_FLAGS = 0x00000007 // both class & compat list shown
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
271 DI_NOVCP DI_FLAGS = 0x00000008 // don't create a new copy queue--use caller-supplied FileQueue
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
272 DI_DIDCOMPAT DI_FLAGS = 0x00000010 // Searched for compatible devices
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
273 DI_DIDCLASS DI_FLAGS = 0x00000020 // Searched for class devices
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
274 DI_AUTOASSIGNRES DI_FLAGS = 0x00000040 // No UI for resources if possible
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
275
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
276 // Flags returned by DiInstallDevice to indicate need to reboot/restart
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
277 DI_NEEDRESTART DI_FLAGS = 0x00000080 // Reboot required to take effect
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
278 DI_NEEDREBOOT DI_FLAGS = 0x00000100 // ""
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
279
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
280 // Flags for device installation
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
281 DI_NOBROWSE DI_FLAGS = 0x00000200 // no Browse... in InsertDisk
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
282
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
283 // Flags set by DiBuildDriverInfoList
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
284 DI_MULTMFGS DI_FLAGS = 0x00000400 // Set if multiple manufacturers in class driver list
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
285
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
286 // Flag indicates that device is disabled
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
287 DI_DISABLED DI_FLAGS = 0x00000800 // Set if device disabled
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
288
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
289 // Flags for Device/Class Properties
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
290 DI_GENERALPAGE_ADDED DI_FLAGS = 0x00001000
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
291 DI_RESOURCEPAGE_ADDED DI_FLAGS = 0x00002000
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
292
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
293 // Flag to indicate the setting properties for this Device (or class) caused a change so the Dev Mgr UI probably needs to be updated.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
294 DI_PROPERTIES_CHANGE DI_FLAGS = 0x00004000
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
295
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
296 // Flag to indicate that the sorting from the INF file should be used.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
297 DI_INF_IS_SORTED DI_FLAGS = 0x00008000
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
298
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
299 // Flag to indicate that only the the INF specified by SP_DEVINSTALL_PARAMS.DriverPath should be searched.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
300 DI_ENUMSINGLEINF DI_FLAGS = 0x00010000
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
301
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
302 // Flag that prevents ConfigMgr from removing/re-enumerating devices during device
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
303 // registration, installation, and deletion.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
304 DI_DONOTCALLCONFIGMG DI_FLAGS = 0x00020000
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
305
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
306 // The following flag can be used to install a device disabled
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
307 DI_INSTALLDISABLED DI_FLAGS = 0x00040000
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
308
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
309 // Flag that causes SetupDiBuildDriverInfoList to build a device's compatible driver
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
310 // list from its existing class driver list, instead of the normal INF search.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
311 DI_COMPAT_FROM_CLASS DI_FLAGS = 0x00080000
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
312
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
313 // This flag is set if the Class Install params should be used.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
314 DI_CLASSINSTALLPARAMS DI_FLAGS = 0x00100000
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
315
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
316 // This flag is set if the caller of DiCallClassInstaller does NOT want the internal default action performed if the Class installer returns ERROR_DI_DO_DEFAULT.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
317 DI_NODI_DEFAULTACTION DI_FLAGS = 0x00200000
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
318
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
319 // Flags for device installation
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
320 DI_QUIETINSTALL DI_FLAGS = 0x00800000 // don't confuse the user with questions or excess info
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
321 DI_NOFILECOPY DI_FLAGS = 0x01000000 // No file Copy necessary
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
322 DI_FORCECOPY DI_FLAGS = 0x02000000 // Force files to be copied from install path
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
323 DI_DRIVERPAGE_ADDED DI_FLAGS = 0x04000000 // Prop provider added Driver page.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
324 DI_USECI_SELECTSTRINGS DI_FLAGS = 0x08000000 // Use Class Installer Provided strings in the Select Device Dlg
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
325 DI_OVERRIDE_INFFLAGS DI_FLAGS = 0x10000000 // Override INF flags
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
326 DI_PROPS_NOCHANGEUSAGE DI_FLAGS = 0x20000000 // No Enable/Disable in General Props
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
327
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
328 DI_NOSELECTICONS DI_FLAGS = 0x40000000 // No small icons in select device dialogs
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
329
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
330 DI_NOWRITE_IDS DI_FLAGS = 0x80000000 // Don't write HW & Compat IDs on install
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
331 )
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
332
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
333 // DI_FLAGSEX is SP_DEVINSTALL_PARAMS.FlagsEx values
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
334 type DI_FLAGSEX uint32
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
335
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
336 const (
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
337 DI_FLAGSEX_CI_FAILED DI_FLAGSEX = 0x00000004 // Failed to Load/Call class installer
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
338 DI_FLAGSEX_FINISHINSTALL_ACTION DI_FLAGSEX = 0x00000008 // Class/co-installer wants to get a DIF_FINISH_INSTALL action in client context.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
339 DI_FLAGSEX_DIDINFOLIST DI_FLAGSEX = 0x00000010 // Did the Class Info List
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
340 DI_FLAGSEX_DIDCOMPATINFO DI_FLAGSEX = 0x00000020 // Did the Compat Info List
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
341 DI_FLAGSEX_FILTERCLASSES DI_FLAGSEX = 0x00000040
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
342 DI_FLAGSEX_SETFAILEDINSTALL DI_FLAGSEX = 0x00000080
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
343 DI_FLAGSEX_DEVICECHANGE DI_FLAGSEX = 0x00000100
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
344 DI_FLAGSEX_ALWAYSWRITEIDS DI_FLAGSEX = 0x00000200
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
345 DI_FLAGSEX_PROPCHANGE_PENDING DI_FLAGSEX = 0x00000400 // One or more device property sheets have had changes made to them, and need to have a DIF_PROPERTYCHANGE occur.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
346 DI_FLAGSEX_ALLOWEXCLUDEDDRVS DI_FLAGSEX = 0x00000800
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
347 DI_FLAGSEX_NOUIONQUERYREMOVE DI_FLAGSEX = 0x00001000
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
348 DI_FLAGSEX_USECLASSFORCOMPAT DI_FLAGSEX = 0x00002000 // Use the device's class when building compat drv list. (Ignored if DI_COMPAT_FROM_CLASS flag is specified.)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
349 DI_FLAGSEX_NO_DRVREG_MODIFY DI_FLAGSEX = 0x00008000 // Don't run AddReg and DelReg for device's software (driver) key.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
350 DI_FLAGSEX_IN_SYSTEM_SETUP DI_FLAGSEX = 0x00010000 // Installation is occurring during initial system setup.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
351 DI_FLAGSEX_INET_DRIVER DI_FLAGSEX = 0x00020000 // Driver came from Windows Update
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
352 DI_FLAGSEX_APPENDDRIVERLIST DI_FLAGSEX = 0x00040000 // Cause SetupDiBuildDriverInfoList to append a new driver list to an existing list.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
353 DI_FLAGSEX_PREINSTALLBACKUP DI_FLAGSEX = 0x00080000 // not used
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
354 DI_FLAGSEX_BACKUPONREPLACE DI_FLAGSEX = 0x00100000 // not used
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
355 DI_FLAGSEX_DRIVERLIST_FROM_URL DI_FLAGSEX = 0x00200000 // build driver list from INF(s) retrieved from URL specified in SP_DEVINSTALL_PARAMS.DriverPath (empty string means Windows Update website)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
356 DI_FLAGSEX_EXCLUDE_OLD_INET_DRIVERS DI_FLAGSEX = 0x00800000 // Don't include old Internet drivers when building a driver list. Ignored on Windows Vista and later.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
357 DI_FLAGSEX_POWERPAGE_ADDED DI_FLAGSEX = 0x01000000 // class installer added their own power page
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
358 DI_FLAGSEX_FILTERSIMILARDRIVERS DI_FLAGSEX = 0x02000000 // only include similar drivers in class list
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
359 DI_FLAGSEX_INSTALLEDDRIVER DI_FLAGSEX = 0x04000000 // only add the installed driver to the class or compat driver list. Used in calls to SetupDiBuildDriverInfoList
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
360 DI_FLAGSEX_NO_CLASSLIST_NODE_MERGE DI_FLAGSEX = 0x08000000 // Don't remove identical driver nodes from the class list
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
361 DI_FLAGSEX_ALTPLATFORM_DRVSEARCH DI_FLAGSEX = 0x10000000 // Build driver list based on alternate platform information specified in associated file queue
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
362 DI_FLAGSEX_RESTART_DEVICE_ONLY DI_FLAGSEX = 0x20000000 // only restart the device drivers are being installed on as opposed to restarting all devices using those drivers.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
363 DI_FLAGSEX_RECURSIVESEARCH DI_FLAGSEX = 0x40000000 // Tell SetupDiBuildDriverInfoList to do a recursive search
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
364 DI_FLAGSEX_SEARCH_PUBLISHED_INFS DI_FLAGSEX = 0x80000000 // Tell SetupDiBuildDriverInfoList to do a "published INF" search
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
365 )
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
366
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
367 // ClassInstallHeader is the first member of any class install parameters structure. It contains the device installation request code that defines the format of the rest of the install parameters structure.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
368 type ClassInstallHeader struct {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
369 size uint32
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
370 InstallFunction DI_FUNCTION
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
371 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
372
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
373 func MakeClassInstallHeader(installFunction DI_FUNCTION) *ClassInstallHeader {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
374 hdr := &ClassInstallHeader{InstallFunction: installFunction}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
375 hdr.size = uint32(unsafe.Sizeof(*hdr))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
376 return hdr
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
377 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
378
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
379 // DICS_STATE specifies values indicating a change in a device's state
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
380 type DICS_STATE uint32
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
381
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
382 const (
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
383 DICS_ENABLE DICS_STATE = 0x00000001 // The device is being enabled.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
384 DICS_DISABLE DICS_STATE = 0x00000002 // The device is being disabled.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
385 DICS_PROPCHANGE DICS_STATE = 0x00000003 // The properties of the device have changed.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
386 DICS_START DICS_STATE = 0x00000004 // The device is being started (if the request is for the currently active hardware profile).
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
387 DICS_STOP DICS_STATE = 0x00000005 // The device is being stopped. The driver stack will be unloaded and the CSCONFIGFLAG_DO_NOT_START flag will be set for the device.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
388 )
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
389
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
390 // DICS_FLAG specifies the scope of a device property change
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
391 type DICS_FLAG uint32
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
392
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
393 const (
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
394 DICS_FLAG_GLOBAL DICS_FLAG = 0x00000001 // make change in all hardware profiles
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
395 DICS_FLAG_CONFIGSPECIFIC DICS_FLAG = 0x00000002 // make change in specified profile only
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
396 DICS_FLAG_CONFIGGENERAL DICS_FLAG = 0x00000004 // 1 or more hardware profile-specific changes to follow (obsolete)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
397 )
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
398
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
399 // PropChangeParams is a structure corresponding to a DIF_PROPERTYCHANGE install function.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
400 type PropChangeParams struct {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
401 ClassInstallHeader ClassInstallHeader
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
402 StateChange DICS_STATE
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
403 Scope DICS_FLAG
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
404 HwProfile uint32
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
405 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
406
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
407 // DI_REMOVEDEVICE specifies the scope of the device removal
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
408 type DI_REMOVEDEVICE uint32
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
409
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
410 const (
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
411 DI_REMOVEDEVICE_GLOBAL DI_REMOVEDEVICE = 0x00000001 // Make this change in all hardware profiles. Remove information about the device from the registry.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
412 DI_REMOVEDEVICE_CONFIGSPECIFIC DI_REMOVEDEVICE = 0x00000002 // Make this change to only the hardware profile specified by HwProfile. this flag only applies to root-enumerated devices. When Windows removes the device from the last hardware profile in which it was configured, Windows performs a global removal.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
413 )
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
414
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
415 // RemoveDeviceParams is a structure corresponding to a DIF_REMOVE install function.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
416 type RemoveDeviceParams struct {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
417 ClassInstallHeader ClassInstallHeader
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
418 Scope DI_REMOVEDEVICE
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
419 HwProfile uint32
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
420 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
421
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
422 // DrvInfoData is driver information structure (member of a driver info list that may be associated with a particular device instance, or (globally) with a device information set)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
423 type DrvInfoData struct {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
424 size uint32
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
425 DriverType uint32
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
426 _ uintptr
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
427 description [LINE_LEN]uint16
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
428 mfgName [LINE_LEN]uint16
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
429 providerName [LINE_LEN]uint16
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
430 DriverDate Filetime
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
431 DriverVersion uint64
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
432 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
433
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
434 func (data *DrvInfoData) Description() string {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
435 return UTF16ToString(data.description[:])
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
436 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
437
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
438 func (data *DrvInfoData) SetDescription(description string) error {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
439 str, err := UTF16FromString(description)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
440 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
441 return err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
442 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
443 copy(data.description[:], str)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
444 return nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
445 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
446
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
447 func (data *DrvInfoData) MfgName() string {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
448 return UTF16ToString(data.mfgName[:])
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
449 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
450
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
451 func (data *DrvInfoData) SetMfgName(mfgName string) error {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
452 str, err := UTF16FromString(mfgName)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
453 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
454 return err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
455 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
456 copy(data.mfgName[:], str)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
457 return nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
458 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
459
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
460 func (data *DrvInfoData) ProviderName() string {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
461 return UTF16ToString(data.providerName[:])
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
462 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
463
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
464 func (data *DrvInfoData) SetProviderName(providerName string) error {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
465 str, err := UTF16FromString(providerName)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
466 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
467 return err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
468 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
469 copy(data.providerName[:], str)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
470 return nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
471 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
472
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
473 // IsNewer method returns true if DrvInfoData date and version is newer than supplied parameters.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
474 func (data *DrvInfoData) IsNewer(driverDate Filetime, driverVersion uint64) bool {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
475 if data.DriverDate.HighDateTime > driverDate.HighDateTime {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
476 return true
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
477 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
478 if data.DriverDate.HighDateTime < driverDate.HighDateTime {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
479 return false
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
480 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
481
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
482 if data.DriverDate.LowDateTime > driverDate.LowDateTime {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
483 return true
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
484 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
485 if data.DriverDate.LowDateTime < driverDate.LowDateTime {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
486 return false
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
487 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
488
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
489 if data.DriverVersion > driverVersion {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
490 return true
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
491 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
492 if data.DriverVersion < driverVersion {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
493 return false
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
494 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
495
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
496 return false
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
497 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
498
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
499 // DrvInfoDetailData is driver information details structure (provides detailed information about a particular driver information structure)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
500 type DrvInfoDetailData struct {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
501 size uint32 // Use unsafeSizeOf method
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
502 InfDate Filetime
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
503 compatIDsOffset uint32
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
504 compatIDsLength uint32
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
505 _ uintptr
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
506 sectionName [LINE_LEN]uint16
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
507 infFileName [MAX_PATH]uint16
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
508 drvDescription [LINE_LEN]uint16
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
509 hardwareID [1]uint16
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
510 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
511
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
512 func (*DrvInfoDetailData) unsafeSizeOf() uint32 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
513 if unsafe.Sizeof(uintptr(0)) == 4 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
514 // Windows declares this with pshpack1.h
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
515 return uint32(unsafe.Offsetof(DrvInfoDetailData{}.hardwareID) + unsafe.Sizeof(DrvInfoDetailData{}.hardwareID))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
516 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
517 return uint32(unsafe.Sizeof(DrvInfoDetailData{}))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
518 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
519
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
520 func (data *DrvInfoDetailData) SectionName() string {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
521 return UTF16ToString(data.sectionName[:])
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
522 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
523
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
524 func (data *DrvInfoDetailData) InfFileName() string {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
525 return UTF16ToString(data.infFileName[:])
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
526 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
527
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
528 func (data *DrvInfoDetailData) DrvDescription() string {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
529 return UTF16ToString(data.drvDescription[:])
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
530 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
531
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
532 func (data *DrvInfoDetailData) HardwareID() string {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
533 if data.compatIDsOffset > 1 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
534 bufW := data.getBuf()
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
535 return UTF16ToString(bufW[:wcslen(bufW)])
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
536 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
537
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
538 return ""
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
539 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
540
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
541 func (data *DrvInfoDetailData) CompatIDs() []string {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
542 a := make([]string, 0)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
543
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
544 if data.compatIDsLength > 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
545 bufW := data.getBuf()
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
546 bufW = bufW[data.compatIDsOffset : data.compatIDsOffset+data.compatIDsLength]
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
547 for i := 0; i < len(bufW); {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
548 j := i + wcslen(bufW[i:])
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
549 if i < j {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
550 a = append(a, UTF16ToString(bufW[i:j]))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
551 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
552 i = j + 1
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
553 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
554 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
555
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
556 return a
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
557 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
558
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
559 func (data *DrvInfoDetailData) getBuf() []uint16 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
560 len := (data.size - uint32(unsafe.Offsetof(data.hardwareID))) / 2
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
561 sl := struct {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
562 addr *uint16
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
563 len int
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
564 cap int
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
565 }{&data.hardwareID[0], int(len), int(len)}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
566 return *(*[]uint16)(unsafe.Pointer(&sl))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
567 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
568
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
569 // IsCompatible method tests if given hardware ID matches the driver or is listed on the compatible ID list.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
570 func (data *DrvInfoDetailData) IsCompatible(hwid string) bool {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
571 hwidLC := strings.ToLower(hwid)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
572 if strings.ToLower(data.HardwareID()) == hwidLC {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
573 return true
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
574 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
575 a := data.CompatIDs()
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
576 for i := range a {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
577 if strings.ToLower(a[i]) == hwidLC {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
578 return true
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
579 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
580 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
581
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
582 return false
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
583 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
584
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
585 // DICD flags control SetupDiCreateDeviceInfo
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
586 type DICD uint32
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
587
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
588 const (
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
589 DICD_GENERATE_ID DICD = 0x00000001
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
590 DICD_INHERIT_CLASSDRVS DICD = 0x00000002
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
591 )
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
592
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
593 // SUOI flags control SetupUninstallOEMInf
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
594 type SUOI uint32
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
595
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
596 const (
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
597 SUOI_FORCEDELETE SUOI = 0x0001
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
598 )
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
599
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
600 // SPDIT flags to distinguish between class drivers and
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
601 // device drivers. (Passed in 'DriverType' parameter of
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
602 // driver information list APIs)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
603 type SPDIT uint32
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
604
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
605 const (
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
606 SPDIT_NODRIVER SPDIT = 0x00000000
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
607 SPDIT_CLASSDRIVER SPDIT = 0x00000001
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
608 SPDIT_COMPATDRIVER SPDIT = 0x00000002
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
609 )
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
610
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
611 // DIGCF flags control what is included in the device information set built by SetupDiGetClassDevs
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
612 type DIGCF uint32
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
613
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
614 const (
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
615 DIGCF_DEFAULT DIGCF = 0x00000001 // only valid with DIGCF_DEVICEINTERFACE
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
616 DIGCF_PRESENT DIGCF = 0x00000002
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
617 DIGCF_ALLCLASSES DIGCF = 0x00000004
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
618 DIGCF_PROFILE DIGCF = 0x00000008
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
619 DIGCF_DEVICEINTERFACE DIGCF = 0x00000010
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
620 )
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
621
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
622 // DIREG specifies values for SetupDiCreateDevRegKey, SetupDiOpenDevRegKey, and SetupDiDeleteDevRegKey.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
623 type DIREG uint32
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
624
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
625 const (
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
626 DIREG_DEV DIREG = 0x00000001 // Open/Create/Delete device key
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
627 DIREG_DRV DIREG = 0x00000002 // Open/Create/Delete driver key
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
628 DIREG_BOTH DIREG = 0x00000004 // Delete both driver and Device key
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
629 )
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
630
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
631 // SPDRP specifies device registry property codes
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
632 // (Codes marked as read-only (R) may only be used for
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
633 // SetupDiGetDeviceRegistryProperty)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
634 //
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
635 // These values should cover the same set of registry properties
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
636 // as defined by the CM_DRP codes in cfgmgr32.h.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
637 //
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
638 // Note that SPDRP codes are zero based while CM_DRP codes are one based!
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
639 type SPDRP uint32
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
640
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
641 const (
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
642 SPDRP_DEVICEDESC SPDRP = 0x00000000 // DeviceDesc (R/W)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
643 SPDRP_HARDWAREID SPDRP = 0x00000001 // HardwareID (R/W)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
644 SPDRP_COMPATIBLEIDS SPDRP = 0x00000002 // CompatibleIDs (R/W)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
645 SPDRP_SERVICE SPDRP = 0x00000004 // Service (R/W)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
646 SPDRP_CLASS SPDRP = 0x00000007 // Class (R--tied to ClassGUID)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
647 SPDRP_CLASSGUID SPDRP = 0x00000008 // ClassGUID (R/W)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
648 SPDRP_DRIVER SPDRP = 0x00000009 // Driver (R/W)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
649 SPDRP_CONFIGFLAGS SPDRP = 0x0000000A // ConfigFlags (R/W)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
650 SPDRP_MFG SPDRP = 0x0000000B // Mfg (R/W)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
651 SPDRP_FRIENDLYNAME SPDRP = 0x0000000C // FriendlyName (R/W)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
652 SPDRP_LOCATION_INFORMATION SPDRP = 0x0000000D // LocationInformation (R/W)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
653 SPDRP_PHYSICAL_DEVICE_OBJECT_NAME SPDRP = 0x0000000E // PhysicalDeviceObjectName (R)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
654 SPDRP_CAPABILITIES SPDRP = 0x0000000F // Capabilities (R)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
655 SPDRP_UI_NUMBER SPDRP = 0x00000010 // UiNumber (R)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
656 SPDRP_UPPERFILTERS SPDRP = 0x00000011 // UpperFilters (R/W)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
657 SPDRP_LOWERFILTERS SPDRP = 0x00000012 // LowerFilters (R/W)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
658 SPDRP_BUSTYPEGUID SPDRP = 0x00000013 // BusTypeGUID (R)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
659 SPDRP_LEGACYBUSTYPE SPDRP = 0x00000014 // LegacyBusType (R)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
660 SPDRP_BUSNUMBER SPDRP = 0x00000015 // BusNumber (R)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
661 SPDRP_ENUMERATOR_NAME SPDRP = 0x00000016 // Enumerator Name (R)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
662 SPDRP_SECURITY SPDRP = 0x00000017 // Security (R/W, binary form)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
663 SPDRP_SECURITY_SDS SPDRP = 0x00000018 // Security (W, SDS form)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
664 SPDRP_DEVTYPE SPDRP = 0x00000019 // Device Type (R/W)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
665 SPDRP_EXCLUSIVE SPDRP = 0x0000001A // Device is exclusive-access (R/W)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
666 SPDRP_CHARACTERISTICS SPDRP = 0x0000001B // Device Characteristics (R/W)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
667 SPDRP_ADDRESS SPDRP = 0x0000001C // Device Address (R)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
668 SPDRP_UI_NUMBER_DESC_FORMAT SPDRP = 0x0000001D // UiNumberDescFormat (R/W)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
669 SPDRP_DEVICE_POWER_DATA SPDRP = 0x0000001E // Device Power Data (R)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
670 SPDRP_REMOVAL_POLICY SPDRP = 0x0000001F // Removal Policy (R)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
671 SPDRP_REMOVAL_POLICY_HW_DEFAULT SPDRP = 0x00000020 // Hardware Removal Policy (R)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
672 SPDRP_REMOVAL_POLICY_OVERRIDE SPDRP = 0x00000021 // Removal Policy Override (RW)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
673 SPDRP_INSTALL_STATE SPDRP = 0x00000022 // Device Install State (R)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
674 SPDRP_LOCATION_PATHS SPDRP = 0x00000023 // Device Location Paths (R)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
675 SPDRP_BASE_CONTAINERID SPDRP = 0x00000024 // Base ContainerID (R)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
676
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
677 SPDRP_MAXIMUM_PROPERTY SPDRP = 0x00000025 // Upper bound on ordinals
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
678 )
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
679
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
680 // DEVPROPTYPE represents the property-data-type identifier that specifies the
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
681 // data type of a device property value in the unified device property model.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
682 type DEVPROPTYPE uint32
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
683
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
684 const (
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
685 DEVPROP_TYPEMOD_ARRAY DEVPROPTYPE = 0x00001000
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
686 DEVPROP_TYPEMOD_LIST DEVPROPTYPE = 0x00002000
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
687
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
688 DEVPROP_TYPE_EMPTY DEVPROPTYPE = 0x00000000
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
689 DEVPROP_TYPE_NULL DEVPROPTYPE = 0x00000001
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
690 DEVPROP_TYPE_SBYTE DEVPROPTYPE = 0x00000002
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
691 DEVPROP_TYPE_BYTE DEVPROPTYPE = 0x00000003
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
692 DEVPROP_TYPE_INT16 DEVPROPTYPE = 0x00000004
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
693 DEVPROP_TYPE_UINT16 DEVPROPTYPE = 0x00000005
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
694 DEVPROP_TYPE_INT32 DEVPROPTYPE = 0x00000006
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
695 DEVPROP_TYPE_UINT32 DEVPROPTYPE = 0x00000007
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
696 DEVPROP_TYPE_INT64 DEVPROPTYPE = 0x00000008
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
697 DEVPROP_TYPE_UINT64 DEVPROPTYPE = 0x00000009
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
698 DEVPROP_TYPE_FLOAT DEVPROPTYPE = 0x0000000A
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
699 DEVPROP_TYPE_DOUBLE DEVPROPTYPE = 0x0000000B
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
700 DEVPROP_TYPE_DECIMAL DEVPROPTYPE = 0x0000000C
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
701 DEVPROP_TYPE_GUID DEVPROPTYPE = 0x0000000D
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
702 DEVPROP_TYPE_CURRENCY DEVPROPTYPE = 0x0000000E
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
703 DEVPROP_TYPE_DATE DEVPROPTYPE = 0x0000000F
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
704 DEVPROP_TYPE_FILETIME DEVPROPTYPE = 0x00000010
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
705 DEVPROP_TYPE_BOOLEAN DEVPROPTYPE = 0x00000011
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
706 DEVPROP_TYPE_STRING DEVPROPTYPE = 0x00000012
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
707 DEVPROP_TYPE_STRING_LIST DEVPROPTYPE = DEVPROP_TYPE_STRING | DEVPROP_TYPEMOD_LIST
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
708 DEVPROP_TYPE_SECURITY_DESCRIPTOR DEVPROPTYPE = 0x00000013
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
709 DEVPROP_TYPE_SECURITY_DESCRIPTOR_STRING DEVPROPTYPE = 0x00000014
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
710 DEVPROP_TYPE_DEVPROPKEY DEVPROPTYPE = 0x00000015
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
711 DEVPROP_TYPE_DEVPROPTYPE DEVPROPTYPE = 0x00000016
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
712 DEVPROP_TYPE_BINARY DEVPROPTYPE = DEVPROP_TYPE_BYTE | DEVPROP_TYPEMOD_ARRAY
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
713 DEVPROP_TYPE_ERROR DEVPROPTYPE = 0x00000017
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
714 DEVPROP_TYPE_NTSTATUS DEVPROPTYPE = 0x00000018
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
715 DEVPROP_TYPE_STRING_INDIRECT DEVPROPTYPE = 0x00000019
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
716
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
717 MAX_DEVPROP_TYPE DEVPROPTYPE = 0x00000019
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
718 MAX_DEVPROP_TYPEMOD DEVPROPTYPE = 0x00002000
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
719
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
720 DEVPROP_MASK_TYPE DEVPROPTYPE = 0x00000FFF
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
721 DEVPROP_MASK_TYPEMOD DEVPROPTYPE = 0x0000F000
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
722 )
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
723
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
724 // DEVPROPGUID specifies a property category.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
725 type DEVPROPGUID GUID
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
726
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
727 // DEVPROPID uniquely identifies the property within the property category.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
728 type DEVPROPID uint32
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
729
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
730 const DEVPROPID_FIRST_USABLE DEVPROPID = 2
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
731
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
732 // DEVPROPKEY represents a device property key for a device property in the
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
733 // unified device property model.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
734 type DEVPROPKEY struct {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
735 FmtID DEVPROPGUID
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
736 PID DEVPROPID
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
737 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
738
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
739 // CONFIGRET is a return value or error code from cfgmgr32 APIs
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
740 type CONFIGRET uint32
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
741
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
742 func (ret CONFIGRET) Error() string {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
743 if win32Error, ok := ret.Unwrap().(Errno); ok {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
744 return fmt.Sprintf("%s (CfgMgr error: 0x%08x)", win32Error.Error(), uint32(ret))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
745 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
746 return fmt.Sprintf("CfgMgr error: 0x%08x", uint32(ret))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
747 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
748
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
749 func (ret CONFIGRET) Win32Error(defaultError Errno) Errno {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
750 return cm_MapCrToWin32Err(ret, defaultError)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
751 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
752
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
753 func (ret CONFIGRET) Unwrap() error {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
754 const noMatch = Errno(^uintptr(0))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
755 win32Error := ret.Win32Error(noMatch)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
756 if win32Error == noMatch {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
757 return nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
758 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
759 return win32Error
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
760 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
761
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
762 const (
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
763 CR_SUCCESS CONFIGRET = 0x00000000
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
764 CR_DEFAULT CONFIGRET = 0x00000001
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
765 CR_OUT_OF_MEMORY CONFIGRET = 0x00000002
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
766 CR_INVALID_POINTER CONFIGRET = 0x00000003
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
767 CR_INVALID_FLAG CONFIGRET = 0x00000004
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
768 CR_INVALID_DEVNODE CONFIGRET = 0x00000005
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
769 CR_INVALID_DEVINST = CR_INVALID_DEVNODE
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
770 CR_INVALID_RES_DES CONFIGRET = 0x00000006
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
771 CR_INVALID_LOG_CONF CONFIGRET = 0x00000007
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
772 CR_INVALID_ARBITRATOR CONFIGRET = 0x00000008
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
773 CR_INVALID_NODELIST CONFIGRET = 0x00000009
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
774 CR_DEVNODE_HAS_REQS CONFIGRET = 0x0000000A
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
775 CR_DEVINST_HAS_REQS = CR_DEVNODE_HAS_REQS
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
776 CR_INVALID_RESOURCEID CONFIGRET = 0x0000000B
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
777 CR_DLVXD_NOT_FOUND CONFIGRET = 0x0000000C
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
778 CR_NO_SUCH_DEVNODE CONFIGRET = 0x0000000D
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
779 CR_NO_SUCH_DEVINST = CR_NO_SUCH_DEVNODE
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
780 CR_NO_MORE_LOG_CONF CONFIGRET = 0x0000000E
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
781 CR_NO_MORE_RES_DES CONFIGRET = 0x0000000F
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
782 CR_ALREADY_SUCH_DEVNODE CONFIGRET = 0x00000010
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
783 CR_ALREADY_SUCH_DEVINST = CR_ALREADY_SUCH_DEVNODE
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
784 CR_INVALID_RANGE_LIST CONFIGRET = 0x00000011
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
785 CR_INVALID_RANGE CONFIGRET = 0x00000012
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
786 CR_FAILURE CONFIGRET = 0x00000013
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
787 CR_NO_SUCH_LOGICAL_DEV CONFIGRET = 0x00000014
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
788 CR_CREATE_BLOCKED CONFIGRET = 0x00000015
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
789 CR_NOT_SYSTEM_VM CONFIGRET = 0x00000016
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
790 CR_REMOVE_VETOED CONFIGRET = 0x00000017
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
791 CR_APM_VETOED CONFIGRET = 0x00000018
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
792 CR_INVALID_LOAD_TYPE CONFIGRET = 0x00000019
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
793 CR_BUFFER_SMALL CONFIGRET = 0x0000001A
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
794 CR_NO_ARBITRATOR CONFIGRET = 0x0000001B
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
795 CR_NO_REGISTRY_HANDLE CONFIGRET = 0x0000001C
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
796 CR_REGISTRY_ERROR CONFIGRET = 0x0000001D
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
797 CR_INVALID_DEVICE_ID CONFIGRET = 0x0000001E
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
798 CR_INVALID_DATA CONFIGRET = 0x0000001F
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
799 CR_INVALID_API CONFIGRET = 0x00000020
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
800 CR_DEVLOADER_NOT_READY CONFIGRET = 0x00000021
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
801 CR_NEED_RESTART CONFIGRET = 0x00000022
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
802 CR_NO_MORE_HW_PROFILES CONFIGRET = 0x00000023
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
803 CR_DEVICE_NOT_THERE CONFIGRET = 0x00000024
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
804 CR_NO_SUCH_VALUE CONFIGRET = 0x00000025
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
805 CR_WRONG_TYPE CONFIGRET = 0x00000026
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
806 CR_INVALID_PRIORITY CONFIGRET = 0x00000027
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
807 CR_NOT_DISABLEABLE CONFIGRET = 0x00000028
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
808 CR_FREE_RESOURCES CONFIGRET = 0x00000029
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
809 CR_QUERY_VETOED CONFIGRET = 0x0000002A
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
810 CR_CANT_SHARE_IRQ CONFIGRET = 0x0000002B
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
811 CR_NO_DEPENDENT CONFIGRET = 0x0000002C
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
812 CR_SAME_RESOURCES CONFIGRET = 0x0000002D
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
813 CR_NO_SUCH_REGISTRY_KEY CONFIGRET = 0x0000002E
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
814 CR_INVALID_MACHINENAME CONFIGRET = 0x0000002F
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
815 CR_REMOTE_COMM_FAILURE CONFIGRET = 0x00000030
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
816 CR_MACHINE_UNAVAILABLE CONFIGRET = 0x00000031
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
817 CR_NO_CM_SERVICES CONFIGRET = 0x00000032
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
818 CR_ACCESS_DENIED CONFIGRET = 0x00000033
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
819 CR_CALL_NOT_IMPLEMENTED CONFIGRET = 0x00000034
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
820 CR_INVALID_PROPERTY CONFIGRET = 0x00000035
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
821 CR_DEVICE_INTERFACE_ACTIVE CONFIGRET = 0x00000036
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
822 CR_NO_SUCH_DEVICE_INTERFACE CONFIGRET = 0x00000037
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
823 CR_INVALID_REFERENCE_STRING CONFIGRET = 0x00000038
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
824 CR_INVALID_CONFLICT_LIST CONFIGRET = 0x00000039
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
825 CR_INVALID_INDEX CONFIGRET = 0x0000003A
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
826 CR_INVALID_STRUCTURE_SIZE CONFIGRET = 0x0000003B
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
827 NUM_CR_RESULTS CONFIGRET = 0x0000003C
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
828 )
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
829
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
830 const (
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
831 CM_GET_DEVICE_INTERFACE_LIST_PRESENT = 0 // only currently 'live' device interfaces
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
832 CM_GET_DEVICE_INTERFACE_LIST_ALL_DEVICES = 1 // all registered device interfaces, live or not
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
833 )
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
834
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
835 const (
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
836 DN_ROOT_ENUMERATED = 0x00000001 // Was enumerated by ROOT
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
837 DN_DRIVER_LOADED = 0x00000002 // Has Register_Device_Driver
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
838 DN_ENUM_LOADED = 0x00000004 // Has Register_Enumerator
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
839 DN_STARTED = 0x00000008 // Is currently configured
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
840 DN_MANUAL = 0x00000010 // Manually installed
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
841 DN_NEED_TO_ENUM = 0x00000020 // May need reenumeration
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
842 DN_NOT_FIRST_TIME = 0x00000040 // Has received a config
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
843 DN_HARDWARE_ENUM = 0x00000080 // Enum generates hardware ID
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
844 DN_LIAR = 0x00000100 // Lied about can reconfig once
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
845 DN_HAS_MARK = 0x00000200 // Not CM_Create_DevInst lately
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
846 DN_HAS_PROBLEM = 0x00000400 // Need device installer
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
847 DN_FILTERED = 0x00000800 // Is filtered
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
848 DN_MOVED = 0x00001000 // Has been moved
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
849 DN_DISABLEABLE = 0x00002000 // Can be disabled
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
850 DN_REMOVABLE = 0x00004000 // Can be removed
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
851 DN_PRIVATE_PROBLEM = 0x00008000 // Has a private problem
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
852 DN_MF_PARENT = 0x00010000 // Multi function parent
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
853 DN_MF_CHILD = 0x00020000 // Multi function child
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
854 DN_WILL_BE_REMOVED = 0x00040000 // DevInst is being removed
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
855 DN_NOT_FIRST_TIMEE = 0x00080000 // Has received a config enumerate
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
856 DN_STOP_FREE_RES = 0x00100000 // When child is stopped, free resources
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
857 DN_REBAL_CANDIDATE = 0x00200000 // Don't skip during rebalance
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
858 DN_BAD_PARTIAL = 0x00400000 // This devnode's log_confs do not have same resources
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
859 DN_NT_ENUMERATOR = 0x00800000 // This devnode's is an NT enumerator
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
860 DN_NT_DRIVER = 0x01000000 // This devnode's is an NT driver
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
861 DN_NEEDS_LOCKING = 0x02000000 // Devnode need lock resume processing
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
862 DN_ARM_WAKEUP = 0x04000000 // Devnode can be the wakeup device
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
863 DN_APM_ENUMERATOR = 0x08000000 // APM aware enumerator
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
864 DN_APM_DRIVER = 0x10000000 // APM aware driver
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
865 DN_SILENT_INSTALL = 0x20000000 // Silent install
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
866 DN_NO_SHOW_IN_DM = 0x40000000 // No show in device manager
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
867 DN_BOOT_LOG_PROB = 0x80000000 // Had a problem during preassignment of boot log conf
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
868 DN_NEED_RESTART = DN_LIAR // System needs to be restarted for this Devnode to work properly
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
869 DN_DRIVER_BLOCKED = DN_NOT_FIRST_TIME // One or more drivers are blocked from loading for this Devnode
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
870 DN_LEGACY_DRIVER = DN_MOVED // This device is using a legacy driver
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
871 DN_CHILD_WITH_INVALID_ID = DN_HAS_MARK // One or more children have invalid IDs
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
872 DN_DEVICE_DISCONNECTED = DN_NEEDS_LOCKING // The function driver for a device reported that the device is not connected. Typically this means a wireless device is out of range.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
873 DN_QUERY_REMOVE_PENDING = DN_MF_PARENT // Device is part of a set of related devices collectively pending query-removal
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
874 DN_QUERY_REMOVE_ACTIVE = DN_MF_CHILD // Device is actively engaged in a query-remove IRP
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
875 DN_CHANGEABLE_FLAGS = DN_NOT_FIRST_TIME | DN_HARDWARE_ENUM | DN_HAS_MARK | DN_DISABLEABLE | DN_REMOVABLE | DN_MF_CHILD | DN_MF_PARENT | DN_NOT_FIRST_TIMEE | DN_STOP_FREE_RES | DN_REBAL_CANDIDATE | DN_NT_ENUMERATOR | DN_NT_DRIVER | DN_SILENT_INSTALL | DN_NO_SHOW_IN_DM
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
876 )
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
877
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
878 //sys setupDiCreateDeviceInfoListEx(classGUID *GUID, hwndParent uintptr, machineName *uint16, reserved uintptr) (handle DevInfo, err error) [failretval==DevInfo(InvalidHandle)] = setupapi.SetupDiCreateDeviceInfoListExW
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
879
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
880 // SetupDiCreateDeviceInfoListEx function creates an empty device information set on a remote or a local computer and optionally associates the set with a device setup class.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
881 func SetupDiCreateDeviceInfoListEx(classGUID *GUID, hwndParent uintptr, machineName string) (deviceInfoSet DevInfo, err error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
882 var machineNameUTF16 *uint16
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
883 if machineName != "" {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
884 machineNameUTF16, err = UTF16PtrFromString(machineName)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
885 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
886 return
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
887 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
888 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
889 return setupDiCreateDeviceInfoListEx(classGUID, hwndParent, machineNameUTF16, 0)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
890 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
891
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
892 //sys setupDiGetDeviceInfoListDetail(deviceInfoSet DevInfo, deviceInfoSetDetailData *DevInfoListDetailData) (err error) = setupapi.SetupDiGetDeviceInfoListDetailW
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
893
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
894 // SetupDiGetDeviceInfoListDetail function retrieves information associated with a device information set including the class GUID, remote computer handle, and remote computer name.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
895 func SetupDiGetDeviceInfoListDetail(deviceInfoSet DevInfo) (deviceInfoSetDetailData *DevInfoListDetailData, err error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
896 data := &DevInfoListDetailData{}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
897 data.size = data.unsafeSizeOf()
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
898
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
899 return data, setupDiGetDeviceInfoListDetail(deviceInfoSet, data)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
900 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
901
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
902 // DeviceInfoListDetail method retrieves information associated with a device information set including the class GUID, remote computer handle, and remote computer name.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
903 func (deviceInfoSet DevInfo) DeviceInfoListDetail() (*DevInfoListDetailData, error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
904 return SetupDiGetDeviceInfoListDetail(deviceInfoSet)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
905 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
906
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
907 //sys setupDiCreateDeviceInfo(deviceInfoSet DevInfo, DeviceName *uint16, classGUID *GUID, DeviceDescription *uint16, hwndParent uintptr, CreationFlags DICD, deviceInfoData *DevInfoData) (err error) = setupapi.SetupDiCreateDeviceInfoW
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
908
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
909 // SetupDiCreateDeviceInfo function creates a new device information element and adds it as a new member to the specified device information set.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
910 func SetupDiCreateDeviceInfo(deviceInfoSet DevInfo, deviceName string, classGUID *GUID, deviceDescription string, hwndParent uintptr, creationFlags DICD) (deviceInfoData *DevInfoData, err error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
911 deviceNameUTF16, err := UTF16PtrFromString(deviceName)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
912 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
913 return
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
914 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
915
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
916 var deviceDescriptionUTF16 *uint16
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
917 if deviceDescription != "" {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
918 deviceDescriptionUTF16, err = UTF16PtrFromString(deviceDescription)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
919 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
920 return
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
921 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
922 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
923
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
924 data := &DevInfoData{}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
925 data.size = uint32(unsafe.Sizeof(*data))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
926
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
927 return data, setupDiCreateDeviceInfo(deviceInfoSet, deviceNameUTF16, classGUID, deviceDescriptionUTF16, hwndParent, creationFlags, data)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
928 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
929
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
930 // CreateDeviceInfo method creates a new device information element and adds it as a new member to the specified device information set.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
931 func (deviceInfoSet DevInfo) CreateDeviceInfo(deviceName string, classGUID *GUID, deviceDescription string, hwndParent uintptr, creationFlags DICD) (*DevInfoData, error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
932 return SetupDiCreateDeviceInfo(deviceInfoSet, deviceName, classGUID, deviceDescription, hwndParent, creationFlags)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
933 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
934
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
935 //sys setupDiEnumDeviceInfo(deviceInfoSet DevInfo, memberIndex uint32, deviceInfoData *DevInfoData) (err error) = setupapi.SetupDiEnumDeviceInfo
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
936
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
937 // SetupDiEnumDeviceInfo function returns a DevInfoData structure that specifies a device information element in a device information set.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
938 func SetupDiEnumDeviceInfo(deviceInfoSet DevInfo, memberIndex int) (*DevInfoData, error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
939 data := &DevInfoData{}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
940 data.size = uint32(unsafe.Sizeof(*data))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
941
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
942 return data, setupDiEnumDeviceInfo(deviceInfoSet, uint32(memberIndex), data)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
943 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
944
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
945 // EnumDeviceInfo method returns a DevInfoData structure that specifies a device information element in a device information set.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
946 func (deviceInfoSet DevInfo) EnumDeviceInfo(memberIndex int) (*DevInfoData, error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
947 return SetupDiEnumDeviceInfo(deviceInfoSet, memberIndex)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
948 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
949
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
950 // SetupDiDestroyDeviceInfoList function deletes a device information set and frees all associated memory.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
951 //sys SetupDiDestroyDeviceInfoList(deviceInfoSet DevInfo) (err error) = setupapi.SetupDiDestroyDeviceInfoList
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
952
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
953 // Close method deletes a device information set and frees all associated memory.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
954 func (deviceInfoSet DevInfo) Close() error {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
955 return SetupDiDestroyDeviceInfoList(deviceInfoSet)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
956 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
957
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
958 //sys SetupDiBuildDriverInfoList(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, driverType SPDIT) (err error) = setupapi.SetupDiBuildDriverInfoList
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
959
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
960 // BuildDriverInfoList method builds a list of drivers that is associated with a specific device or with the global class driver list for a device information set.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
961 func (deviceInfoSet DevInfo) BuildDriverInfoList(deviceInfoData *DevInfoData, driverType SPDIT) error {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
962 return SetupDiBuildDriverInfoList(deviceInfoSet, deviceInfoData, driverType)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
963 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
964
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
965 //sys SetupDiCancelDriverInfoSearch(deviceInfoSet DevInfo) (err error) = setupapi.SetupDiCancelDriverInfoSearch
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
966
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
967 // CancelDriverInfoSearch method cancels a driver list search that is currently in progress in a different thread.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
968 func (deviceInfoSet DevInfo) CancelDriverInfoSearch() error {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
969 return SetupDiCancelDriverInfoSearch(deviceInfoSet)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
970 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
971
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
972 //sys setupDiEnumDriverInfo(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, driverType SPDIT, memberIndex uint32, driverInfoData *DrvInfoData) (err error) = setupapi.SetupDiEnumDriverInfoW
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
973
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
974 // SetupDiEnumDriverInfo function enumerates the members of a driver list.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
975 func SetupDiEnumDriverInfo(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, driverType SPDIT, memberIndex int) (*DrvInfoData, error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
976 data := &DrvInfoData{}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
977 data.size = uint32(unsafe.Sizeof(*data))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
978
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
979 return data, setupDiEnumDriverInfo(deviceInfoSet, deviceInfoData, driverType, uint32(memberIndex), data)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
980 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
981
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
982 // EnumDriverInfo method enumerates the members of a driver list.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
983 func (deviceInfoSet DevInfo) EnumDriverInfo(deviceInfoData *DevInfoData, driverType SPDIT, memberIndex int) (*DrvInfoData, error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
984 return SetupDiEnumDriverInfo(deviceInfoSet, deviceInfoData, driverType, memberIndex)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
985 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
986
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
987 //sys setupDiGetSelectedDriver(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, driverInfoData *DrvInfoData) (err error) = setupapi.SetupDiGetSelectedDriverW
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
988
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
989 // SetupDiGetSelectedDriver function retrieves the selected driver for a device information set or a particular device information element.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
990 func SetupDiGetSelectedDriver(deviceInfoSet DevInfo, deviceInfoData *DevInfoData) (*DrvInfoData, error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
991 data := &DrvInfoData{}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
992 data.size = uint32(unsafe.Sizeof(*data))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
993
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
994 return data, setupDiGetSelectedDriver(deviceInfoSet, deviceInfoData, data)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
995 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
996
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
997 // SelectedDriver method retrieves the selected driver for a device information set or a particular device information element.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
998 func (deviceInfoSet DevInfo) SelectedDriver(deviceInfoData *DevInfoData) (*DrvInfoData, error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
999 return SetupDiGetSelectedDriver(deviceInfoSet, deviceInfoData)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1000 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1001
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1002 //sys SetupDiSetSelectedDriver(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, driverInfoData *DrvInfoData) (err error) = setupapi.SetupDiSetSelectedDriverW
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1003
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1004 // SetSelectedDriver method sets, or resets, the selected driver for a device information element or the selected class driver for a device information set.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1005 func (deviceInfoSet DevInfo) SetSelectedDriver(deviceInfoData *DevInfoData, driverInfoData *DrvInfoData) error {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1006 return SetupDiSetSelectedDriver(deviceInfoSet, deviceInfoData, driverInfoData)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1007 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1008
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1009 //sys setupDiGetDriverInfoDetail(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, driverInfoData *DrvInfoData, driverInfoDetailData *DrvInfoDetailData, driverInfoDetailDataSize uint32, requiredSize *uint32) (err error) = setupapi.SetupDiGetDriverInfoDetailW
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1010
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1011 // SetupDiGetDriverInfoDetail function retrieves driver information detail for a device information set or a particular device information element in the device information set.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1012 func SetupDiGetDriverInfoDetail(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, driverInfoData *DrvInfoData) (*DrvInfoDetailData, error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1013 reqSize := uint32(2048)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1014 for {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1015 buf := make([]byte, reqSize)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1016 data := (*DrvInfoDetailData)(unsafe.Pointer(&buf[0]))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1017 data.size = data.unsafeSizeOf()
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1018 err := setupDiGetDriverInfoDetail(deviceInfoSet, deviceInfoData, driverInfoData, data, uint32(len(buf)), &reqSize)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1019 if err == ERROR_INSUFFICIENT_BUFFER {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1020 continue
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1021 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1022 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1023 return nil, err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1024 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1025 data.size = reqSize
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1026 return data, nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1027 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1028 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1029
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1030 // DriverInfoDetail method retrieves driver information detail for a device information set or a particular device information element in the device information set.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1031 func (deviceInfoSet DevInfo) DriverInfoDetail(deviceInfoData *DevInfoData, driverInfoData *DrvInfoData) (*DrvInfoDetailData, error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1032 return SetupDiGetDriverInfoDetail(deviceInfoSet, deviceInfoData, driverInfoData)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1033 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1034
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1035 //sys SetupDiDestroyDriverInfoList(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, driverType SPDIT) (err error) = setupapi.SetupDiDestroyDriverInfoList
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1036
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1037 // DestroyDriverInfoList method deletes a driver list.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1038 func (deviceInfoSet DevInfo) DestroyDriverInfoList(deviceInfoData *DevInfoData, driverType SPDIT) error {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1039 return SetupDiDestroyDriverInfoList(deviceInfoSet, deviceInfoData, driverType)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1040 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1041
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1042 //sys setupDiGetClassDevsEx(classGUID *GUID, Enumerator *uint16, hwndParent uintptr, Flags DIGCF, deviceInfoSet DevInfo, machineName *uint16, reserved uintptr) (handle DevInfo, err error) [failretval==DevInfo(InvalidHandle)] = setupapi.SetupDiGetClassDevsExW
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1043
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1044 // SetupDiGetClassDevsEx function returns a handle to a device information set that contains requested device information elements for a local or a remote computer.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1045 func SetupDiGetClassDevsEx(classGUID *GUID, enumerator string, hwndParent uintptr, flags DIGCF, deviceInfoSet DevInfo, machineName string) (handle DevInfo, err error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1046 var enumeratorUTF16 *uint16
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1047 if enumerator != "" {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1048 enumeratorUTF16, err = UTF16PtrFromString(enumerator)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1049 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1050 return
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1051 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1052 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1053 var machineNameUTF16 *uint16
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1054 if machineName != "" {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1055 machineNameUTF16, err = UTF16PtrFromString(machineName)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1056 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1057 return
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1058 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1059 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1060 return setupDiGetClassDevsEx(classGUID, enumeratorUTF16, hwndParent, flags, deviceInfoSet, machineNameUTF16, 0)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1061 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1062
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1063 // SetupDiCallClassInstaller function calls the appropriate class installer, and any registered co-installers, with the specified installation request (DIF code).
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1064 //sys SetupDiCallClassInstaller(installFunction DI_FUNCTION, deviceInfoSet DevInfo, deviceInfoData *DevInfoData) (err error) = setupapi.SetupDiCallClassInstaller
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1065
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1066 // CallClassInstaller member calls the appropriate class installer, and any registered co-installers, with the specified installation request (DIF code).
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1067 func (deviceInfoSet DevInfo) CallClassInstaller(installFunction DI_FUNCTION, deviceInfoData *DevInfoData) error {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1068 return SetupDiCallClassInstaller(installFunction, deviceInfoSet, deviceInfoData)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1069 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1070
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1071 // SetupDiOpenDevRegKey function opens a registry key for device-specific configuration information.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1072 //sys SetupDiOpenDevRegKey(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, Scope DICS_FLAG, HwProfile uint32, KeyType DIREG, samDesired uint32) (key Handle, err error) [failretval==InvalidHandle] = setupapi.SetupDiOpenDevRegKey
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1073
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1074 // OpenDevRegKey method opens a registry key for device-specific configuration information.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1075 func (deviceInfoSet DevInfo) OpenDevRegKey(DeviceInfoData *DevInfoData, Scope DICS_FLAG, HwProfile uint32, KeyType DIREG, samDesired uint32) (Handle, error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1076 return SetupDiOpenDevRegKey(deviceInfoSet, DeviceInfoData, Scope, HwProfile, KeyType, samDesired)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1077 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1078
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1079 //sys setupDiGetDeviceProperty(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, propertyKey *DEVPROPKEY, propertyType *DEVPROPTYPE, propertyBuffer *byte, propertyBufferSize uint32, requiredSize *uint32, flags uint32) (err error) = setupapi.SetupDiGetDevicePropertyW
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1080
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1081 // SetupDiGetDeviceProperty function retrieves a specified device instance property.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1082 func SetupDiGetDeviceProperty(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, propertyKey *DEVPROPKEY) (value interface{}, err error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1083 reqSize := uint32(256)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1084 for {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1085 var dataType DEVPROPTYPE
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1086 buf := make([]byte, reqSize)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1087 err = setupDiGetDeviceProperty(deviceInfoSet, deviceInfoData, propertyKey, &dataType, &buf[0], uint32(len(buf)), &reqSize, 0)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1088 if err == ERROR_INSUFFICIENT_BUFFER {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1089 continue
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1090 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1091 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1092 return
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1093 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1094 switch dataType {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1095 case DEVPROP_TYPE_STRING:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1096 ret := UTF16ToString(bufToUTF16(buf))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1097 runtime.KeepAlive(buf)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1098 return ret, nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1099 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1100 return nil, errors.New("unimplemented property type")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1101 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1102 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1103
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1104 //sys setupDiGetDeviceRegistryProperty(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, property SPDRP, propertyRegDataType *uint32, propertyBuffer *byte, propertyBufferSize uint32, requiredSize *uint32) (err error) = setupapi.SetupDiGetDeviceRegistryPropertyW
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1105
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1106 // SetupDiGetDeviceRegistryProperty function retrieves a specified Plug and Play device property.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1107 func SetupDiGetDeviceRegistryProperty(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, property SPDRP) (value interface{}, err error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1108 reqSize := uint32(256)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1109 for {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1110 var dataType uint32
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1111 buf := make([]byte, reqSize)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1112 err = setupDiGetDeviceRegistryProperty(deviceInfoSet, deviceInfoData, property, &dataType, &buf[0], uint32(len(buf)), &reqSize)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1113 if err == ERROR_INSUFFICIENT_BUFFER {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1114 continue
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1115 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1116 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1117 return
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1118 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1119 return getRegistryValue(buf[:reqSize], dataType)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1120 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1121 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1122
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1123 func getRegistryValue(buf []byte, dataType uint32) (interface{}, error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1124 switch dataType {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1125 case REG_SZ:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1126 ret := UTF16ToString(bufToUTF16(buf))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1127 runtime.KeepAlive(buf)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1128 return ret, nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1129 case REG_EXPAND_SZ:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1130 value := UTF16ToString(bufToUTF16(buf))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1131 if value == "" {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1132 return "", nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1133 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1134 p, err := syscall.UTF16PtrFromString(value)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1135 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1136 return "", err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1137 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1138 ret := make([]uint16, 100)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1139 for {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1140 n, err := ExpandEnvironmentStrings(p, &ret[0], uint32(len(ret)))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1141 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1142 return "", err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1143 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1144 if n <= uint32(len(ret)) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1145 return UTF16ToString(ret[:n]), nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1146 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1147 ret = make([]uint16, n)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1148 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1149 case REG_BINARY:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1150 return buf, nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1151 case REG_DWORD_LITTLE_ENDIAN:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1152 return binary.LittleEndian.Uint32(buf), nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1153 case REG_DWORD_BIG_ENDIAN:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1154 return binary.BigEndian.Uint32(buf), nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1155 case REG_MULTI_SZ:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1156 bufW := bufToUTF16(buf)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1157 a := []string{}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1158 for i := 0; i < len(bufW); {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1159 j := i + wcslen(bufW[i:])
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1160 if i < j {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1161 a = append(a, UTF16ToString(bufW[i:j]))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1162 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1163 i = j + 1
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1164 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1165 runtime.KeepAlive(buf)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1166 return a, nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1167 case REG_QWORD_LITTLE_ENDIAN:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1168 return binary.LittleEndian.Uint64(buf), nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1169 default:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1170 return nil, fmt.Errorf("Unsupported registry value type: %v", dataType)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1171 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1172 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1173
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1174 // bufToUTF16 function reinterprets []byte buffer as []uint16
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1175 func bufToUTF16(buf []byte) []uint16 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1176 sl := struct {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1177 addr *uint16
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1178 len int
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1179 cap int
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1180 }{(*uint16)(unsafe.Pointer(&buf[0])), len(buf) / 2, cap(buf) / 2}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1181 return *(*[]uint16)(unsafe.Pointer(&sl))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1182 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1183
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1184 // utf16ToBuf function reinterprets []uint16 as []byte
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1185 func utf16ToBuf(buf []uint16) []byte {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1186 sl := struct {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1187 addr *byte
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1188 len int
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1189 cap int
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1190 }{(*byte)(unsafe.Pointer(&buf[0])), len(buf) * 2, cap(buf) * 2}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1191 return *(*[]byte)(unsafe.Pointer(&sl))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1192 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1193
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1194 func wcslen(str []uint16) int {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1195 for i := 0; i < len(str); i++ {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1196 if str[i] == 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1197 return i
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1198 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1199 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1200 return len(str)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1201 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1202
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1203 // DeviceRegistryProperty method retrieves a specified Plug and Play device property.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1204 func (deviceInfoSet DevInfo) DeviceRegistryProperty(deviceInfoData *DevInfoData, property SPDRP) (interface{}, error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1205 return SetupDiGetDeviceRegistryProperty(deviceInfoSet, deviceInfoData, property)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1206 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1207
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1208 //sys setupDiSetDeviceRegistryProperty(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, property SPDRP, propertyBuffer *byte, propertyBufferSize uint32) (err error) = setupapi.SetupDiSetDeviceRegistryPropertyW
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1209
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1210 // SetupDiSetDeviceRegistryProperty function sets a Plug and Play device property for a device.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1211 func SetupDiSetDeviceRegistryProperty(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, property SPDRP, propertyBuffers []byte) error {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1212 return setupDiSetDeviceRegistryProperty(deviceInfoSet, deviceInfoData, property, &propertyBuffers[0], uint32(len(propertyBuffers)))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1213 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1214
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1215 // SetDeviceRegistryProperty function sets a Plug and Play device property for a device.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1216 func (deviceInfoSet DevInfo) SetDeviceRegistryProperty(deviceInfoData *DevInfoData, property SPDRP, propertyBuffers []byte) error {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1217 return SetupDiSetDeviceRegistryProperty(deviceInfoSet, deviceInfoData, property, propertyBuffers)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1218 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1219
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1220 // SetDeviceRegistryPropertyString method sets a Plug and Play device property string for a device.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1221 func (deviceInfoSet DevInfo) SetDeviceRegistryPropertyString(deviceInfoData *DevInfoData, property SPDRP, str string) error {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1222 str16, err := UTF16FromString(str)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1223 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1224 return err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1225 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1226 err = SetupDiSetDeviceRegistryProperty(deviceInfoSet, deviceInfoData, property, utf16ToBuf(append(str16, 0)))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1227 runtime.KeepAlive(str16)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1228 return err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1229 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1230
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1231 //sys setupDiGetDeviceInstallParams(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, deviceInstallParams *DevInstallParams) (err error) = setupapi.SetupDiGetDeviceInstallParamsW
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1232
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1233 // SetupDiGetDeviceInstallParams function retrieves device installation parameters for a device information set or a particular device information element.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1234 func SetupDiGetDeviceInstallParams(deviceInfoSet DevInfo, deviceInfoData *DevInfoData) (*DevInstallParams, error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1235 params := &DevInstallParams{}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1236 params.size = uint32(unsafe.Sizeof(*params))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1237
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1238 return params, setupDiGetDeviceInstallParams(deviceInfoSet, deviceInfoData, params)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1239 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1240
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1241 // DeviceInstallParams method retrieves device installation parameters for a device information set or a particular device information element.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1242 func (deviceInfoSet DevInfo) DeviceInstallParams(deviceInfoData *DevInfoData) (*DevInstallParams, error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1243 return SetupDiGetDeviceInstallParams(deviceInfoSet, deviceInfoData)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1244 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1245
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1246 //sys setupDiGetDeviceInstanceId(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, instanceId *uint16, instanceIdSize uint32, instanceIdRequiredSize *uint32) (err error) = setupapi.SetupDiGetDeviceInstanceIdW
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1247
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1248 // SetupDiGetDeviceInstanceId function retrieves the instance ID of the device.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1249 func SetupDiGetDeviceInstanceId(deviceInfoSet DevInfo, deviceInfoData *DevInfoData) (string, error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1250 reqSize := uint32(1024)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1251 for {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1252 buf := make([]uint16, reqSize)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1253 err := setupDiGetDeviceInstanceId(deviceInfoSet, deviceInfoData, &buf[0], uint32(len(buf)), &reqSize)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1254 if err == ERROR_INSUFFICIENT_BUFFER {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1255 continue
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1256 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1257 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1258 return "", err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1259 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1260 return UTF16ToString(buf), nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1261 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1262 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1263
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1264 // DeviceInstanceID method retrieves the instance ID of the device.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1265 func (deviceInfoSet DevInfo) DeviceInstanceID(deviceInfoData *DevInfoData) (string, error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1266 return SetupDiGetDeviceInstanceId(deviceInfoSet, deviceInfoData)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1267 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1268
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1269 // SetupDiGetClassInstallParams function retrieves class installation parameters for a device information set or a particular device information element.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1270 //sys SetupDiGetClassInstallParams(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, classInstallParams *ClassInstallHeader, classInstallParamsSize uint32, requiredSize *uint32) (err error) = setupapi.SetupDiGetClassInstallParamsW
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1271
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1272 // ClassInstallParams method retrieves class installation parameters for a device information set or a particular device information element.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1273 func (deviceInfoSet DevInfo) ClassInstallParams(deviceInfoData *DevInfoData, classInstallParams *ClassInstallHeader, classInstallParamsSize uint32, requiredSize *uint32) error {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1274 return SetupDiGetClassInstallParams(deviceInfoSet, deviceInfoData, classInstallParams, classInstallParamsSize, requiredSize)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1275 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1276
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1277 //sys SetupDiSetDeviceInstallParams(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, deviceInstallParams *DevInstallParams) (err error) = setupapi.SetupDiSetDeviceInstallParamsW
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1278
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1279 // SetDeviceInstallParams member sets device installation parameters for a device information set or a particular device information element.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1280 func (deviceInfoSet DevInfo) SetDeviceInstallParams(deviceInfoData *DevInfoData, deviceInstallParams *DevInstallParams) error {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1281 return SetupDiSetDeviceInstallParams(deviceInfoSet, deviceInfoData, deviceInstallParams)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1282 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1283
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1284 // SetupDiSetClassInstallParams function sets or clears class install parameters for a device information set or a particular device information element.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1285 //sys SetupDiSetClassInstallParams(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, classInstallParams *ClassInstallHeader, classInstallParamsSize uint32) (err error) = setupapi.SetupDiSetClassInstallParamsW
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1286
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1287 // SetClassInstallParams method sets or clears class install parameters for a device information set or a particular device information element.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1288 func (deviceInfoSet DevInfo) SetClassInstallParams(deviceInfoData *DevInfoData, classInstallParams *ClassInstallHeader, classInstallParamsSize uint32) error {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1289 return SetupDiSetClassInstallParams(deviceInfoSet, deviceInfoData, classInstallParams, classInstallParamsSize)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1290 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1291
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1292 //sys setupDiClassNameFromGuidEx(classGUID *GUID, className *uint16, classNameSize uint32, requiredSize *uint32, machineName *uint16, reserved uintptr) (err error) = setupapi.SetupDiClassNameFromGuidExW
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1293
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1294 // SetupDiClassNameFromGuidEx function retrieves the class name associated with a class GUID. The class can be installed on a local or remote computer.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1295 func SetupDiClassNameFromGuidEx(classGUID *GUID, machineName string) (className string, err error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1296 var classNameUTF16 [MAX_CLASS_NAME_LEN]uint16
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1297
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1298 var machineNameUTF16 *uint16
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1299 if machineName != "" {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1300 machineNameUTF16, err = UTF16PtrFromString(machineName)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1301 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1302 return
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1303 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1304 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1305
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1306 err = setupDiClassNameFromGuidEx(classGUID, &classNameUTF16[0], MAX_CLASS_NAME_LEN, nil, machineNameUTF16, 0)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1307 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1308 return
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1309 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1310
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1311 className = UTF16ToString(classNameUTF16[:])
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1312 return
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1313 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1314
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1315 //sys setupDiClassGuidsFromNameEx(className *uint16, classGuidList *GUID, classGuidListSize uint32, requiredSize *uint32, machineName *uint16, reserved uintptr) (err error) = setupapi.SetupDiClassGuidsFromNameExW
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1316
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1317 // SetupDiClassGuidsFromNameEx function retrieves the GUIDs associated with the specified class name. This resulting list contains the classes currently installed on a local or remote computer.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1318 func SetupDiClassGuidsFromNameEx(className string, machineName string) ([]GUID, error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1319 classNameUTF16, err := UTF16PtrFromString(className)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1320 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1321 return nil, err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1322 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1323
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1324 var machineNameUTF16 *uint16
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1325 if machineName != "" {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1326 machineNameUTF16, err = UTF16PtrFromString(machineName)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1327 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1328 return nil, err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1329 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1330 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1331
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1332 reqSize := uint32(4)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1333 for {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1334 buf := make([]GUID, reqSize)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1335 err = setupDiClassGuidsFromNameEx(classNameUTF16, &buf[0], uint32(len(buf)), &reqSize, machineNameUTF16, 0)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1336 if err == ERROR_INSUFFICIENT_BUFFER {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1337 continue
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1338 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1339 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1340 return nil, err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1341 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1342 return buf[:reqSize], nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1343 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1344 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1345
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1346 //sys setupDiGetSelectedDevice(deviceInfoSet DevInfo, deviceInfoData *DevInfoData) (err error) = setupapi.SetupDiGetSelectedDevice
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1347
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1348 // SetupDiGetSelectedDevice function retrieves the selected device information element in a device information set.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1349 func SetupDiGetSelectedDevice(deviceInfoSet DevInfo) (*DevInfoData, error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1350 data := &DevInfoData{}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1351 data.size = uint32(unsafe.Sizeof(*data))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1352
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1353 return data, setupDiGetSelectedDevice(deviceInfoSet, data)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1354 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1355
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1356 // SelectedDevice method retrieves the selected device information element in a device information set.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1357 func (deviceInfoSet DevInfo) SelectedDevice() (*DevInfoData, error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1358 return SetupDiGetSelectedDevice(deviceInfoSet)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1359 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1360
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1361 // SetupDiSetSelectedDevice function sets a device information element as the selected member of a device information set. This function is typically used by an installation wizard.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1362 //sys SetupDiSetSelectedDevice(deviceInfoSet DevInfo, deviceInfoData *DevInfoData) (err error) = setupapi.SetupDiSetSelectedDevice
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1363
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1364 // SetSelectedDevice method sets a device information element as the selected member of a device information set. This function is typically used by an installation wizard.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1365 func (deviceInfoSet DevInfo) SetSelectedDevice(deviceInfoData *DevInfoData) error {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1366 return SetupDiSetSelectedDevice(deviceInfoSet, deviceInfoData)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1367 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1368
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1369 //sys setupUninstallOEMInf(infFileName *uint16, flags SUOI, reserved uintptr) (err error) = setupapi.SetupUninstallOEMInfW
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1370
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1371 // SetupUninstallOEMInf uninstalls the specified driver.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1372 func SetupUninstallOEMInf(infFileName string, flags SUOI) error {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1373 infFileName16, err := UTF16PtrFromString(infFileName)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1374 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1375 return err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1376 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1377 return setupUninstallOEMInf(infFileName16, flags, 0)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1378 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1379
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1380 //sys cm_MapCrToWin32Err(configRet CONFIGRET, defaultWin32Error Errno) (ret Errno) = CfgMgr32.CM_MapCrToWin32Err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1381
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1382 //sys cm_Get_Device_Interface_List_Size(len *uint32, interfaceClass *GUID, deviceID *uint16, flags uint32) (ret CONFIGRET) = CfgMgr32.CM_Get_Device_Interface_List_SizeW
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1383 //sys cm_Get_Device_Interface_List(interfaceClass *GUID, deviceID *uint16, buffer *uint16, bufferLen uint32, flags uint32) (ret CONFIGRET) = CfgMgr32.CM_Get_Device_Interface_ListW
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1384
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1385 func CM_Get_Device_Interface_List(deviceID string, interfaceClass *GUID, flags uint32) ([]string, error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1386 deviceID16, err := UTF16PtrFromString(deviceID)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1387 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1388 return nil, err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1389 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1390 var buf []uint16
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1391 var buflen uint32
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1392 for {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1393 if ret := cm_Get_Device_Interface_List_Size(&buflen, interfaceClass, deviceID16, flags); ret != CR_SUCCESS {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1394 return nil, ret
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1395 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1396 buf = make([]uint16, buflen)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1397 if ret := cm_Get_Device_Interface_List(interfaceClass, deviceID16, &buf[0], buflen, flags); ret == CR_SUCCESS {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1398 break
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1399 } else if ret != CR_BUFFER_SMALL {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1400 return nil, ret
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1401 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1402 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1403 var interfaces []string
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1404 for i := 0; i < len(buf); {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1405 j := i + wcslen(buf[i:])
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1406 if i < j {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1407 interfaces = append(interfaces, UTF16ToString(buf[i:j]))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1408 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1409 i = j + 1
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1410 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1411 if interfaces == nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1412 return nil, ERROR_NO_SUCH_DEVICE_INTERFACE
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1413 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1414 return interfaces, nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1415 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1416
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1417 //sys cm_Get_DevNode_Status(status *uint32, problemNumber *uint32, devInst DEVINST, flags uint32) (ret CONFIGRET) = CfgMgr32.CM_Get_DevNode_Status
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1418
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1419 func CM_Get_DevNode_Status(status *uint32, problemNumber *uint32, devInst DEVINST, flags uint32) error {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1420 ret := cm_Get_DevNode_Status(status, problemNumber, devInst, flags)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1421 if ret == CR_SUCCESS {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1422 return nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1423 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1424 return ret
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1425 }