winpnp 0.0.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,284 @@
1
+ from more_itertools import one
2
+
3
+ from winpnp._setupapi import DEVPROP_TYPE, DEVPROP_TYPEMOD
4
+
5
+ from .decoding import (
6
+ decode_booleans,
7
+ decode_filetimes,
8
+ decode_floats,
9
+ decode_guids,
10
+ decode_integers,
11
+ decode_nt_statuses,
12
+ decode_property_keys,
13
+ decode_property_types,
14
+ decode_raw,
15
+ decode_string,
16
+ decode_strings,
17
+ decode_win32_errors,
18
+ )
19
+ from .pnp_property import PnpPropertyType
20
+
21
+ NULL = PnpPropertyType.register_new(int(DEVPROP_TYPE.NULL), "NULL", lambda _: None)
22
+ """The property exists, but it has no value."""
23
+
24
+ SBYTE = PnpPropertyType.register_new(
25
+ int(DEVPROP_TYPE.SBYTE), "SBYTE", lambda x: one(decode_integers(x, "b"))
26
+ )
27
+ """8-bit signed integer"""
28
+
29
+ SBYTE_ARRAY = PnpPropertyType.register_new(
30
+ int(DEVPROP_TYPE.SBYTE | DEVPROP_TYPEMOD.ARRAY),
31
+ "SBYTE_ARRAY",
32
+ lambda x: decode_integers(x, "b"),
33
+ )
34
+ """Array of 8-bit signed integers"""
35
+
36
+ BYTE = PnpPropertyType.register_new(
37
+ int(DEVPROP_TYPE.BYTE), "BYTE", lambda x: one(decode_integers(x, "B"))
38
+ )
39
+ """8-bit unsigned integer"""
40
+
41
+ BYTE_ARRAY = PnpPropertyType.register_new(
42
+ int(DEVPROP_TYPE.BYTE | DEVPROP_TYPEMOD.ARRAY),
43
+ "BYTE_ARRAY",
44
+ lambda x: decode_integers(x, "B"),
45
+ )
46
+ """Array of 8-bit unsigned integers (used for custom binary data)"""
47
+
48
+ INT16 = PnpPropertyType.register_new(
49
+ int(DEVPROP_TYPE.INT16), "INT16", lambda x: one(decode_integers(x, "h"))
50
+ )
51
+ """16-bit signed integer"""
52
+
53
+ INT16_ARRAY = PnpPropertyType.register_new(
54
+ int(DEVPROP_TYPE.INT16 | DEVPROP_TYPEMOD.ARRAY),
55
+ "INT16_ARRAY",
56
+ lambda x: decode_integers(x, "h"),
57
+ )
58
+ """Array of 16-bit signed integers"""
59
+
60
+ UINT16 = PnpPropertyType.register_new(
61
+ int(DEVPROP_TYPE.UINT16), "UINT16", lambda x: one(decode_integers(x, "H"))
62
+ )
63
+ """16-bit unsigned integer"""
64
+
65
+ UINT16_ARRAY = PnpPropertyType.register_new(
66
+ int(DEVPROP_TYPE.UINT16 | DEVPROP_TYPEMOD.ARRAY),
67
+ "UINT16_ARRAY",
68
+ lambda x: decode_integers(x, "H"),
69
+ )
70
+ """Array of 16-bit unsigned integers"""
71
+
72
+ INT32 = PnpPropertyType.register_new(
73
+ int(DEVPROP_TYPE.INT32), "INT32", lambda x: one(decode_integers(x, "l"))
74
+ )
75
+ """32-bit signed integer"""
76
+
77
+ INT32_ARRAY = PnpPropertyType.register_new(
78
+ int(DEVPROP_TYPE.INT32 | DEVPROP_TYPEMOD.ARRAY),
79
+ "INT32_ARRAY",
80
+ lambda x: decode_integers(x, "l"),
81
+ )
82
+ """Array of 32-bit signed integers"""
83
+
84
+ UINT32 = PnpPropertyType.register_new(
85
+ int(DEVPROP_TYPE.UINT32), "UINT32", lambda x: one(decode_integers(x, "L"))
86
+ )
87
+ """32-bit unsigned integer"""
88
+
89
+ UINT32_ARRAY = PnpPropertyType.register_new(
90
+ int(DEVPROP_TYPE.UINT32 | DEVPROP_TYPEMOD.ARRAY),
91
+ "UINT32_ARRAY",
92
+ lambda x: decode_integers(x, "L"),
93
+ )
94
+ """Array of 32-bit unsigned integers"""
95
+
96
+ INT64 = PnpPropertyType.register_new(
97
+ int(DEVPROP_TYPE.INT64), "INT64", lambda x: one(decode_integers(x, "q"))
98
+ )
99
+ """64-bit signed integer"""
100
+
101
+ INT64_ARRAY = PnpPropertyType.register_new(
102
+ int(DEVPROP_TYPE.INT64 | DEVPROP_TYPEMOD.ARRAY),
103
+ "INT64_ARRAY",
104
+ lambda x: decode_integers(x, "q"),
105
+ )
106
+ """Array of 64-bit signed integers"""
107
+
108
+ UINT64 = PnpPropertyType.register_new(
109
+ int(DEVPROP_TYPE.UINT64), "UINT64", lambda x: one(decode_integers(x, "Q"))
110
+ )
111
+ """64-bit unsigned integer"""
112
+
113
+ UINT64_ARRAY = PnpPropertyType.register_new(
114
+ int(DEVPROP_TYPE.UINT64 | DEVPROP_TYPEMOD.ARRAY),
115
+ "UINT64_ARRAY",
116
+ lambda x: decode_integers(x, "Q"),
117
+ )
118
+ """Array of 64-bit unsigned integers"""
119
+
120
+ FLOAT = PnpPropertyType.register_new(
121
+ int(DEVPROP_TYPE.FLOAT), "FLOAT", lambda x: one(decode_floats(x, "f"))
122
+ )
123
+ """32-bit floating-point number"""
124
+
125
+ FLOAT_ARRAY = PnpPropertyType.register_new(
126
+ int(DEVPROP_TYPE.FLOAT | DEVPROP_TYPEMOD.ARRAY),
127
+ "FLOAT_ARRAY",
128
+ lambda x: decode_floats(x, "f"),
129
+ )
130
+ """Array of 32-bit floating-point numbers"""
131
+
132
+ DOUBLE = PnpPropertyType.register_new(
133
+ int(DEVPROP_TYPE.DOUBLE), "DOUBLE", lambda x: one(decode_floats(x, "d"))
134
+ )
135
+ """64-bit floating-point number"""
136
+
137
+ DOUBLE_ARRAY = PnpPropertyType.register_new(
138
+ int(DEVPROP_TYPE.DOUBLE | DEVPROP_TYPEMOD.ARRAY),
139
+ "DOUBLE_ARRAY",
140
+ lambda x: decode_floats(x, "d"),
141
+ )
142
+ """Array of 64-bit floating-point numbers"""
143
+
144
+ DECIMAL = PnpPropertyType.register_new(int(DEVPROP_TYPE.DECIMAL), "DECIMAL", decode_raw)
145
+ """Windows DECIMAL structure. For now, decoded as raw bytes."""
146
+
147
+ DECIMAL_ARRAY = PnpPropertyType.register_new(
148
+ int(DEVPROP_TYPE.DECIMAL | DEVPROP_TYPEMOD.ARRAY),
149
+ "DECIMAL_ARRAY",
150
+ decode_raw,
151
+ )
152
+ """Array of Windows DECIMAL structures. For now, decoded as raw bytes."""
153
+
154
+ GUID = PnpPropertyType.register_new(
155
+ int(DEVPROP_TYPE.GUID), "GUID", lambda x: one(decode_guids(x))
156
+ )
157
+ """128-bit unique identifier"""
158
+
159
+ GUID_ARRAY = PnpPropertyType.register_new(
160
+ int(DEVPROP_TYPE.GUID | DEVPROP_TYPEMOD.ARRAY), "GUID_ARRAY", decode_guids
161
+ )
162
+ """Array of 128-bit unique identifiers"""
163
+
164
+ CURRENCY = PnpPropertyType.register_new(
165
+ int(DEVPROP_TYPE.CURRENCY), "CURRENCY", decode_raw
166
+ )
167
+ """Windows CURRENCY structure. For now, decoded as raw bytes."""
168
+
169
+ CURRENCY_ARRAY = PnpPropertyType.register_new(
170
+ int(DEVPROP_TYPE.CURRENCY | DEVPROP_TYPEMOD.ARRAY),
171
+ "CURRENCY_ARRAY",
172
+ decode_raw,
173
+ )
174
+ """Array of Windows CURRENCY structures. For now, decoded as raw bytes."""
175
+
176
+ DATE = PnpPropertyType.register_new(int(DEVPROP_TYPE.DATE), "DATE", decode_raw)
177
+ """64-bit floating-point number (double) that specifies the number of days since December 31, 1899. For now, decoded as raw bytes."""
178
+
179
+ DATE_ARRAY = PnpPropertyType.register_new(
180
+ int(DEVPROP_TYPE.DATE | DEVPROP_TYPEMOD.ARRAY), "DATE_ARRAY", decode_raw
181
+ )
182
+ """Array of doubles that specify the number of days since December 31, 1899. For now, decoded as raw bytes."""
183
+
184
+ FILETIME = PnpPropertyType.register_new(
185
+ int(DEVPROP_TYPE.FILETIME), "FILETIME", lambda x: one(decode_filetimes(x))
186
+ )
187
+ """Windows FILETIME structure."""
188
+
189
+ FILETIME_ARRAY = PnpPropertyType.register_new(
190
+ int(DEVPROP_TYPE.FILETIME | DEVPROP_TYPEMOD.ARRAY),
191
+ "FILETIME_ARRAY",
192
+ decode_filetimes,
193
+ )
194
+ """Array of Windows file time structures."""
195
+
196
+ BOOLEAN = PnpPropertyType.register_new(
197
+ int(DEVPROP_TYPE.BOOLEAN), "BOOLEAN", lambda x: one(decode_booleans(x))
198
+ )
199
+ """8-bit boolean"""
200
+
201
+ BOOLEAN_ARRAY = PnpPropertyType.register_new(
202
+ int(DEVPROP_TYPE.BOOLEAN | DEVPROP_TYPEMOD.ARRAY), "BOOLEAN_ARRAY", decode_booleans
203
+ )
204
+ """Array of 8-bit booleans"""
205
+
206
+ STRING = PnpPropertyType.register_new(int(DEVPROP_TYPE.STRING), "STRING", decode_string)
207
+ """Null-terminated UTF-16-LE string."""
208
+
209
+ STRING_LIST = PnpPropertyType.register_new(
210
+ int(DEVPROP_TYPE.STRING | DEVPROP_TYPEMOD.LIST), "STRING_LIST", decode_strings
211
+ )
212
+ """Multi-string: sequence of null-terminated UTF-16-LE string, followed by an empty string."""
213
+
214
+ SECURITY_DESCRIPTOR = PnpPropertyType.register_new(
215
+ int(DEVPROP_TYPE.SECURITY_DESCRIPTOR), "SECURITY_DESCRIPTOR", decode_raw
216
+ )
217
+ """Self-relative binary security descriptor. For now, decoded as raw bytes."""
218
+
219
+ SECURITY_DESCRIPTOR_STRING = PnpPropertyType.register_new(
220
+ int(DEVPROP_TYPE.SECURITY_DESCRIPTOR_STRING),
221
+ "SECURITY_DESCRIPTOR_STRING",
222
+ decode_string,
223
+ )
224
+ """Null-terminated UTF-16-LE string that contains a security descriptor in the Security Descriptor Definition Language (SDDL) format."""
225
+
226
+ SECURITY_DESCRIPTOR_STRING_LIST = PnpPropertyType.register_new(
227
+ int(DEVPROP_TYPE.SECURITY_DESCRIPTOR_STRING | DEVPROP_TYPEMOD.LIST),
228
+ "SECURITY_DESCRIPTOR_STRING_LIST",
229
+ decode_strings,
230
+ )
231
+ """Multi-string of strings that contain a security descriptor in the Security Descriptor Definition Language (SDDL) format."""
232
+
233
+ DEVPROPKEY = PnpPropertyType.register_new(
234
+ int(DEVPROP_TYPE.DEVPROPKEY), "DEVPROPKEY", lambda x: one(decode_property_keys(x))
235
+ )
236
+ """Device property key."""
237
+
238
+ DEVPROPKEY_ARRAY = PnpPropertyType.register_new(
239
+ int(DEVPROP_TYPE.DEVPROPKEY | DEVPROP_TYPEMOD.ARRAY),
240
+ "DEVPROPKEY_ARRAY",
241
+ decode_property_keys,
242
+ )
243
+ """Array of device property keys."""
244
+
245
+ DEVPROPTYPE = PnpPropertyType.register_new(
246
+ int(DEVPROP_TYPE.DEVPROPTYPE),
247
+ "DEVPROPTYPE",
248
+ lambda x: one(decode_property_types(x)),
249
+ )
250
+ """Device property type."""
251
+
252
+ DEVPROPTYPE_ARRAY = PnpPropertyType.register_new(
253
+ int(DEVPROP_TYPE.DEVPROPTYPE | DEVPROP_TYPEMOD.ARRAY),
254
+ "DEVPROPTYPE_ARRAY",
255
+ decode_property_types,
256
+ )
257
+ """Array of device property types."""
258
+
259
+ ERROR = PnpPropertyType.register_new(
260
+ int(DEVPROP_TYPE.ERROR), "ERROR", lambda x: one(decode_win32_errors(x))
261
+ )
262
+ """32-bit Win32 system error code."""
263
+
264
+ ERROR_ARRAY = PnpPropertyType.register_new(
265
+ int(DEVPROP_TYPE.ERROR | DEVPROP_TYPEMOD.ARRAY), "ERROR_ARRAY", decode_win32_errors
266
+ )
267
+ """Array of 32-bit Win32 system error codes."""
268
+
269
+ NTSTATUS = PnpPropertyType.register_new(
270
+ int(DEVPROP_TYPE.NTSTATUS), "NTSTATUS", lambda x: one(decode_nt_statuses(x))
271
+ )
272
+ """32-bit NTSTATUS code."""
273
+
274
+ NTSTATUS_ARRAY = PnpPropertyType.register_new(
275
+ int(DEVPROP_TYPE.NTSTATUS | DEVPROP_TYPEMOD.ARRAY),
276
+ "NTSTATUS_ARRAY",
277
+ decode_nt_statuses,
278
+ )
279
+ """Array of 32-bit NTSTATUS codes."""
280
+
281
+ STRING_INDIRECT = PnpPropertyType.register_new(
282
+ int(DEVPROP_TYPE.STRING_INDIRECT), "STRING_INDIRECT", decode_string
283
+ )
284
+ """Null-terminated UTF-16-LE string that contains an indirect string reference."""
@@ -0,0 +1,141 @@
1
+ from dataclasses import dataclass, field
2
+ from typing import Any, Callable, ClassVar, Generic, Iterable, Optional, TypeVar
3
+ from uuid import UUID
4
+
5
+ from .decoding import decode_raw
6
+
7
+ T = TypeVar("T")
8
+ U = TypeVar("U")
9
+
10
+
11
+ @dataclass(init=False)
12
+ class PnpPropertyType(Generic[T]):
13
+ """
14
+ Represents a type of PnP properties. This is an abstraction over the Windows DEVPROP_TYPE constants.
15
+ """
16
+
17
+ _DERIVED_DATA: ClassVar[dict[int, tuple[str, Callable[[bytes], Any]]]] = {}
18
+
19
+ type_id: int
20
+ name: Optional[str] = field(compare=False)
21
+ _decoder: Callable[[bytes], T] = field(repr=False, compare=False)
22
+
23
+ def __init__(
24
+ self,
25
+ type_id: int,
26
+ name: Optional[str] = None,
27
+ decoder: Optional[Callable[[bytes], T]] = None,
28
+ ) -> None:
29
+ derived_name, derived_decoder = self._DERIVED_DATA.get(
30
+ type_id, (None, decode_raw)
31
+ )
32
+
33
+ self.type_id = type_id
34
+ self.name = name if name is not None else derived_name
35
+ self._decoder = decoder if decoder is not None else derived_decoder
36
+
37
+ @staticmethod
38
+ def register(kind: "PnpPropertyType[U]") -> None:
39
+ """
40
+ Registers the name and decoder of the specified `PnpPropertyType` as the default name and decoder for other instances with the same `type_id`.
41
+ """
42
+ if kind.name is None:
43
+ raise ValueError(f"Cannot register {repr(kind)} because it is unnamed.")
44
+
45
+ if kind.type_id in PnpPropertyType._DERIVED_DATA:
46
+ raise ValueError(
47
+ f"Cannot register {repr(kind)} because its type_id is already registered with name {PnpPropertyType._DERIVED_DATA[kind.type_id][0]}"
48
+ )
49
+
50
+ PnpPropertyType._DERIVED_DATA[kind.type_id] = (kind.name, kind._decoder)
51
+
52
+ @staticmethod
53
+ def register_new(
54
+ type_id: int,
55
+ name: str,
56
+ decoder: Callable[[bytes], U],
57
+ ) -> "PnpPropertyType[U]":
58
+ """
59
+ Creates a new `PnpPropertyType`, registers it, and returns it.
60
+ """
61
+ kind = PnpPropertyType(type_id, name, decoder)
62
+ PnpPropertyType.register(kind)
63
+ return kind
64
+
65
+ def decode(self, data: bytes) -> T:
66
+ """
67
+ Decodes raw bytes to the actual python type that this `PnpPropertyType` represents.
68
+ """
69
+ return self._decoder(data)
70
+
71
+
72
+ @dataclass(init=False)
73
+ class PnpPropertyKey(Generic[T]):
74
+ """
75
+ A key that specifies a PnP property. This is an abstraction over the Windows DEVPROPKEY struct. Can be used as key for `__getitem__` of various winpnp classes.
76
+ """
77
+
78
+ _NAMES: ClassVar[dict[tuple[UUID, int], str]] = {}
79
+
80
+ category: UUID
81
+ property_id: int
82
+ name: Optional[str] = field(compare=False)
83
+ allowed_types: Optional[dict[int, PnpPropertyType[T]]] = field(compare=False)
84
+
85
+ def __init__(
86
+ self,
87
+ category: UUID,
88
+ property_id: int,
89
+ name: Optional[str] = None,
90
+ allowed_types: Optional[Iterable[PnpPropertyType[T]]] = None,
91
+ ) -> None:
92
+ self.category = category
93
+ self.property_id = property_id
94
+ self.name = (
95
+ name if name is not None else self._NAMES.get((category, property_id))
96
+ )
97
+ self.allowed_types = (
98
+ {kind.type_id: kind for kind in allowed_types}
99
+ if allowed_types is not None
100
+ else None
101
+ )
102
+
103
+ @staticmethod
104
+ def register(key: "PnpPropertyKey[U]") -> None:
105
+ """
106
+ Registers the name and of the specified `PnpPropertyKey` as the default name for other instances with the same `(category, property_id) pair`.
107
+ """
108
+ if key.name is None:
109
+ raise ValueError(f"Cannot register {repr(key)} because it is unnamed.")
110
+
111
+ _id = (key.category, key.property_id)
112
+ if _id in PnpPropertyKey._NAMES:
113
+ raise ValueError(
114
+ f"Cannot register {repr(key)} because its (category, property_id) pair is already registered with name {repr(PnpPropertyKey._NAMES[_id])}"
115
+ )
116
+
117
+ PnpPropertyKey._NAMES[_id] = key.name
118
+
119
+ @staticmethod
120
+ def register_new(
121
+ category: UUID,
122
+ property_id: int,
123
+ name: str,
124
+ allowed_types: Optional[Iterable[PnpPropertyType[U]]] = None,
125
+ ) -> "PnpPropertyKey[U]":
126
+ """
127
+ Creates a new `PnpPropertyKey`, registers it, and returns it.
128
+ """
129
+ key = PnpPropertyKey(category, property_id, name, allowed_types)
130
+ PnpPropertyKey.register(key)
131
+ return key
132
+
133
+
134
+ @dataclass()
135
+ class PnpProperty(Generic[T]):
136
+ """
137
+ Holds the value and type of a PnP property.
138
+ """
139
+
140
+ value: T
141
+ kind: PnpPropertyType[T]
@@ -0,0 +1,45 @@
1
+ Metadata-Version: 2.4
2
+ Name: winpnp
3
+ Version: 0.0.1
4
+ Summary: A package for interacting with Windows Plug and Play (PnP) entities
5
+ Project-URL: Homepage, https://github.com/SuperPudding98/winpnp
6
+ Project-URL: Issues, https://github.com/SuperPudding98/winpnp/issues
7
+ Author-email: Supper Pudding <31290828+SuperPudding98@users.noreply.github.com>
8
+ License-Expression: MIT
9
+ License-File: LICENSE
10
+ Keywords: Windows device,device manager,pnp,setupapi,setupdi
11
+ Classifier: Environment :: Win32 (MS Windows)
12
+ Classifier: Operating System :: Microsoft :: Windows
13
+ Classifier: Programming Language :: Python :: 3
14
+ Classifier: Topic :: System :: Hardware
15
+ Classifier: Typing :: Typed
16
+ Requires-Python: >=3.9
17
+ Requires-Dist: more-itertools<11,>=10.2.0
18
+ Provides-Extra: deploy
19
+ Requires-Dist: build<2,>=1.2.2; extra == 'deploy'
20
+ Requires-Dist: twine<7,>=6.1.0; extra == 'deploy'
21
+ Provides-Extra: dev
22
+ Requires-Dist: pytest-cases<4,>=3.8.6; extra == 'dev'
23
+ Requires-Dist: pytest<9,>=8.2.1; extra == 'dev'
24
+ Description-Content-Type: text/markdown
25
+
26
+ # winpnp
27
+
28
+ This is a package for interacting with Windows Plug and Play (PnP) entities (devices, setup classes, etc.)
29
+
30
+ It can be used to query properties of PnP devices using the `winpnp.info.device.DeviceInfo` class,<br/>
31
+ and to query properties of PnP setup classes using the `winpnp.info.setup_class.SetupClassInfo` class.<br/>
32
+ Instances of these classes can be used as mappings, with keys of type `winpnp.properties.pnp_property.PnpPropertyKey`.<br/>
33
+ For your convenience, commonly used property keys are defined in `winpnp.properties.keys`.
34
+
35
+ Here is an example usage:
36
+ ```python
37
+ from winpnp.info.device import DeviceInfo
38
+ from winpnp.properties.keys.device import INSTANCE_ID
39
+
40
+ with DeviceInfo.of_instance_id("HTREE\\ROOT\\0") as device:
41
+ instance_id = device[INSTANCE_ID]
42
+
43
+ instance_id
44
+ ```
45
+ Output: `PnpProperty(value='HTREE\\ROOT\\0', kind=PnpPropertyType(type_id=18, name='STRING'))`
@@ -0,0 +1,23 @@
1
+ winpnp/__init__.py,sha256=gvKkDfOakSAN-FStT7IlKk1UEZ7yO7LtXusSaQVkFD0,32
2
+ winpnp/_setupapi.py,sha256=nBkStynINzUDZSf2qSHajsIe2On6b7JpEAna9x87uOQ,7183
3
+ winpnp/info/__init__.py,sha256=zacQ9bQDNfWB1siz8T0C5MQGHJZ2DvJ4o6o_WhVj-QM,35
4
+ winpnp/info/_pnp_property_mapping.py,sha256=tyaPAXd36g_Wvs_-5ClRWAacenRPU4lx7ng-10sd-7w,3747
5
+ winpnp/info/device.py,sha256=GWWX-yaiFaVTKkOEZ7A0S9Q7viu_Rc3MLTplQib-A0I,6077
6
+ winpnp/info/setup_class.py,sha256=PaXmW4m2ycSFH6i88Wcxgdhr7y-33LuSDU_9V1iM0ZQ,3792
7
+ winpnp/properties/__init__.py,sha256=oqncCBWwr5EBZm2lHkRmds0fmWZ7G8stC0U_AS87JqY,41
8
+ winpnp/properties/decoding.py,sha256=0a8kM24Q4AoJ6GvHF0GXitS5OHa5q-VX_TeXtQPF5ek,4149
9
+ winpnp/properties/kinds.py,sha256=U6v-4kNeQabozUhsx39jQARO11S6sapdXxglcije6Jc,9314
10
+ winpnp/properties/pnp_property.py,sha256=nfHAhh4fxqFFDLkO2QIWlHZObVYxPc98cWwx7KFBjeo,4746
11
+ winpnp/properties/keys/__init__.py,sha256=UFNASfjn-h9isFvQAeXBeHa9IwIPuKSZPovac6WEyXY,409
12
+ winpnp/properties/keys/bluetooth.py,sha256=SRhz3sks6EESA01LCX4O4BQwoIm33_PyUlUSl1izJBw,2140
13
+ winpnp/properties/keys/dev_query.py,sha256=kwmXcUb7bEbhjXm4yTnL8lWJxcBej0ZUvjMmHB_Fj_0,280
14
+ winpnp/properties/keys/device.py,sha256=h8pjY7-PwpkY1Up_BhjPrXxygm5UFyMp-tvd_R0DoFY,18384
15
+ winpnp/properties/keys/device_class.py,sha256=CeXNv_3ncUNpPbUrU_UQO7-V4Cs4zFq8e6G0RfeOWYU,3490
16
+ winpnp/properties/keys/device_container.py,sha256=1cxKFYiRfFTQ6d_OjL8tr3nIuwuCHVvXcgt9OpcZHbg,9440
17
+ winpnp/properties/keys/device_interface.py,sha256=Fjaj8fJdtYKgcLsnolHBN4LorC1BRbCsV0gkys1VHtk,1333
18
+ winpnp/properties/keys/device_interface_class.py,sha256=ci80vR0Ue8lba5XBIqg-8VVa5CxvJNzJ9sVi4yr3JlU,462
19
+ winpnp/properties/keys/driver_package.py,sha256=YXMOA7PjsDEyu92tT7ppUpoY31UCMrRQmUqmrOGQLzU,1076
20
+ winpnp-0.0.1.dist-info/METADATA,sha256=YocswzrS9NSjc0G7rrxkgBtoIzY7omEjnhPepj8j6mU,1902
21
+ winpnp-0.0.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
22
+ winpnp-0.0.1.dist-info/licenses/LICENSE,sha256=kMhLdtRDEv5y1xkgn_gpWXxkNbjNeGdE0rIZoEWsx90,1070
23
+ winpnp-0.0.1.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: hatchling 1.27.0
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Super Pudding
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.