21#define GUID_STRING_CHARS 38
22#define GUID_STRING_BYTES (GUID_STRING_CHARS * sizeof(WCHAR))
84 DPRINT1(
"RtlDuplicateUnicodeString() failed, Status 0x%08lx\n",
Status);
91 if (MungedDeviceString.
Buffer[
i] ==
L'\\')
97 + MungedDeviceString.
Length
108 DPRINT1(
"ExAllocatePoolWithTag() failed\n");
114 UserModePrefixFormat ?
115 &UserModePrefix : &KernelModePrefix,
172 UNICODE_STRING MungedStringReal, GuidStringReal, ReferenceStringReal;
174 USHORT i, ReferenceStringOffset;
197 DPRINT(
"Symbolic link without prefix is %wZ\n", &LinkNameNoPrefix);
202 if (LinkNameNoPrefix.
Buffer[
i] ==
L'\\')
205 ReferenceStringOffset =
i *
sizeof(
WCHAR);
208 ASSERT(LinkNameNoPrefix.
Length >= ReferenceStringOffset);
216 ReferenceStringReal.
Buffer = LinkNameNoPrefix.
Buffer + ReferenceStringOffset /
sizeof(
WCHAR);
217 ReferenceStringReal.
Length = LinkNameNoPrefix.
Length - ReferenceStringOffset;
220 DPRINT(
"Reference string is %wZ\n", &ReferenceStringReal);
227 DPRINT(
"GUID string is %wZ\n", &GuidStringReal);
246 DPRINT(
"Munged string is %wZ\n", &MungedStringReal);
253 PrefixString->Length = KernelModePrefix.
Length;
254 PrefixString->MaximumLength = PrefixString->Length;
256 DPRINT(
"Prefix string is %wZ\n", PrefixString);
260 *MungedString = MungedStringReal;
273 if (ReferenceStringPresent)
274 *ReferenceStringPresent = ReferenceStringReal.
Length >
sizeof(
WCHAR);
282 DPRINT1(
"RtlGUIDFromString() failed, Status 0x%08lx\n",
Status);
309 HANDLE DeviceKeyHandle, InstanceKeyHandle;
310 ULONG DeviceKeyDisposition, InstanceKeyDisposition;
315 DeviceKeyHandle = InstanceKeyHandle =
NULL;
321 DPRINT1(
"RtlDuplicateUnicodeString() failed, Status 0x%08lx\n",
Status);
331 &ReferenceStringPresent,
340 if (ReferenceStringPresent)
374 &DeviceKeyDisposition);
400 &InstanceKeyDisposition);
426 if (DeviceDisposition)
427 *DeviceDisposition = DeviceKeyDisposition;
430 *InstanceHandle = InstanceKeyHandle;
434 if (InstanceDisposition)
435 *InstanceDisposition = InstanceKeyDisposition;
439 if (InstanceKeyHandle)
443 ZwDeleteKey(DeviceKeyHandle);
472 HANDLE GuidKeyReal, DeviceKeyReal, InstanceKeyReal;
475 ClassesKey = GuidKeyReal = DeviceKeyReal = InstanceKeyReal =
NULL;
489 DPRINT1(
"Failed to parse symbolic link %wZ, Status 0x%08lx\n",
501 DPRINT1(
"Failed to open %wZ, Status 0x%08lx\n", &BaseKeyU,
Status);
537 *GuidKey = GuidKeyReal;
542 *DeviceKey = DeviceKeyReal;
547 *InstanceKey = InstanceKeyReal;
599 HANDLE InstanceKey, DeviceParametersKey;
617 Status = ZwCreateKey(&DeviceParametersKey,
668 DPRINT(
"RtlStringFromGUID() failed with status 0x%08lx\n",
Status);
677 DPRINT(
"ExAllocatePool() failed\n");
685 DPRINT(
"RtlAppendUnicodeStringToString() failed with status 0x%08lx\n",
Status);
691 DPRINT(
"RtlAppendUnicodeToString() failed with status 0x%08lx\n",
Status);
697 DPRINT(
"RtlAppendUnicodeToString() failed with status 0x%08lx\n",
Status);
703 DPRINT(
"RtlAppendUnicodeStringToString() failed with status 0x%08lx\n",
Status);
719 DPRINT(
"ZwOpenKey() failed with status 0x%08lx\n",
Status);
723 *pInterfaceKey = InterfaceKey;
729 if (InterfaceKey !=
NULL)
769 HANDLE DeviceKey, AliasInstanceKey;
780 DPRINT1(
"IoGetDeviceInterfaceAlias() invalid symbolic link or alias class GUID\n");
788 DPRINT1(
"RtlStringFromGUID() failed, Status 0x%08lx\n",
Status);
792 DPRINT(
"Alias GUID is %wZ\n", &AliasGuidString);
810 DPRINT1(
"Failed get device instance value, Status 0x%08lx\n",
Status);
816 DPRINT1(
"Wrong or empty instance value\n");
841 &ReferenceStringPresent,
849 DPRINT(
"Device string is '%wZ'\n", &DeviceString);
858 UserModePrefixFormat,
862 DPRINT1(
"Failed to build alias symbolic link, Status 0x%08lx\n",
Status);
874 DPRINT1(
"Failed to open alias symbolic link key, Status 0x%08lx\n",
Status);
880 DPRINT(
"IoGetDeviceInterfaceAlias(): alias symbolic link %wZ\n", &AliasSymbolicLink);
881 *AliasSymbolicLinkName = AliasSymbolicLink;
887 if (AliasSymbolicLink.
Buffer)
891 if (AliasGuidString.
Buffer)
956 ULONG i = 0,
j,
Size, NeededLength, ActualLength, LinkedValue;
975 if (DeviceObjectExtension->
DeviceNode->InstancePath.Length == 0)
981 InstanceDevicePath = &DeviceObjectExtension->
DeviceNode->InstancePath;
988 DPRINT(
"IopOpenInterfaceKey() failed with status 0x%08lx\n",
Status);
1008 DPRINT(
"ZwEnumerateKey() failed with status 0x%08lx\n",
Status);
1015 DPRINT(
"ExAllocatePool() failed\n");
1028 DPRINT(
"ZwEnumerateKey() failed with status 0x%08lx\n",
Status);
1047 DPRINT(
"ZwOpenKey() failed with status 0x%08lx\n",
Status);
1060 ActualLength = NeededLength;
1080 FoundRightPDO =
TRUE;
1115 DPRINT(
"ZwEnumerateKey() failed with status 0x%08lx\n",
Status);
1122 DPRINT(
"ExAllocatePool() failed\n");
1135 DPRINT(
"ZwEnumerateKey() failed with status 0x%08lx\n",
Status);
1144 goto NextReferenceString;
1160 DPRINT(
"ZwOpenKey() failed with status 0x%08lx\n",
Status);
1184 goto NextReferenceString;
1188 DPRINT1(
"ZwOpenKey() failed with status 0x%08lx\n",
Status);
1193 Status = ZwQueryValueKey(ControlKey,
1201 ActualLength = NeededLength;
1209 Status = ZwQueryValueKey(ControlKey,
1224 DPRINT1(
"Bad registry read\n");
1234 if (LinkedValue == 0)
1237 goto NextReferenceString;
1248 Status = ZwQueryValueKey(
1257 DPRINT(
"ZwQueryValueKey() failed with status 0x%08lx\n",
Status);
1263 DPRINT(
"ExAllocatePool() failed\n");
1267 Status = ZwQueryValueKey(
1276 DPRINT(
"ZwQueryValueKey() failed with status 0x%08lx\n",
Status);
1281 DPRINT(
"Unexpected registry type 0x%lx (expected 0x%lx)\n", bip->
Type,
REG_SZ);
1287 DPRINT(
"Registry string too short (length %lu, expected %lu at least)\n", bip->
DataLength, 5 *
sizeof(
WCHAR));
1304 2 *
sizeof(
WCHAR)));
1308 DPRINT(
"ExAllocatePool() failed\n");
1317 ReturnBuffer.
Buffer = NewBuffer;
1323 DPRINT(
"RtlAppendUnicodeStringToString() failed with status 0x%08lx\n",
Status);
1338 if (ReferenceKey !=
NULL)
1341 ReferenceKey =
NULL;
1343 if (ControlKey !=
NULL)
1370 DPRINT(
"ExAllocatePool() failed\n");
1379 ReturnBuffer.
Buffer = NewBuffer;
1388 if (InterfaceKey !=
NULL)
1390 if (DeviceKey !=
NULL)
1392 if (ReferenceKey !=
NULL)
1394 if (ControlKey !=
NULL)
1462 DPRINT(
"IoRegisterDeviceInterface(): PDO %p, RefString: %wZ\n",
1476 if (DeviceObjectExtension->
DeviceNode->InstancePath.Length == 0)
1497 DPRINT(
"RtlStringFromGUID() failed with status 0x%08lx\n",
Status);
1505 sizeof(PdoNameInfoBuffer),
1509 DPRINT(
"ObQueryNameString() failed with status 0x%08lx\n",
Status);
1512 ASSERT(PdoNameInfo->Name.Length);
1525 DPRINT(
"ExAllocatePool() failed\n");
1550 DPRINT(
"ZwCreateKey() failed with status 0x%08lx\n",
Status);
1556 InterfaceKeyName.
Length = 0;
1565 if (!InterfaceKeyName.
Buffer)
1567 DPRINT(
"ExAllocatePool() failed\n");
1572 StartIndex = InterfaceKeyName.
Length /
sizeof(
WCHAR);
1576 if (InterfaceKeyName.
Buffer[StartIndex +
i] ==
'\\')
1577 InterfaceKeyName.
Buffer[StartIndex +
i] =
'#';
1601 DPRINT(
"ZwCreateKey() failed with status 0x%08lx\n",
Status);
1617 DPRINT(
"ZwSetValueKey() failed with status 0x%08lx\n",
Status);
1635 DPRINT(
"ExAllocatePool() failed\n");
1665 DPRINT(
"ZwCreateKey() failed with status 0x%08lx\n",
Status);
1688 DPRINT(
"ExAllocatePool() failed\n");
1710 DPRINT(
"IoRegisterDeviceInterface(): creating symbolic link %wZ -> %wZ\n",
SymbolicLinkName, &PdoNameInfo->Name);
1724 DPRINT1(
"IoCreateSymbolicLink() failed with status 0x%08lx\n", SymLinkStatus);
1732 return SymLinkStatus;
1753 DPRINT1(
"ZwSetValueKey() failed with status 0x%08lx\n",
Status);
1800 HANDLE InstanceHandle, ControlHandle;
1809 USHORT ReferenceStringOffset;
1837 if (LinkNameNoPrefix.
Buffer[
i] ==
L'\\')
1842 ReferenceStringOffset =
i *
sizeof(
WCHAR);
1845 ASSERT(LinkNameNoPrefix.
Length >= ReferenceStringOffset);
1877 Status = ZwCreateKey(&ControlHandle,
1887 DPRINT1(
"Failed to create the Control subkey\n");
1891 LinkedValue = (
Enable ? 1 : 0);
1894 Status = ZwSetValueKey(ControlHandle,
1903 DPRINT1(
"Failed to write the Linked value\n");
1940 DPRINT1(
"IopGetDeviceObjectFromDeviceInstance failed to find device object for %wZ\n", &
DeviceInstance);
PDEVICE_OBJECT PhysicalDeviceObject
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
#define NT_SUCCESS(StatCode)
static void cleanup(void)
static const WCHAR SymbolicLink[]
static const WCHAR DeviceInstance[]
#define ASSERT_IRQL_EQUAL(x)
const GUID GUID_DEVICE_INTERFACE_ARRIVAL
const GUID GUID_DEVICE_INTERFACE_REMOVAL
#define ExAllocatePoolWithTag(hernya, size, tag)
#define RtlCompareMemory(s1, s2, l)
NTSTATUS RtlAppendUnicodeToString(IN PUNICODE_STRING Str1, IN PWSTR Str2)
#define ExAllocatePool(type, size)
_Must_inspect_result_ _In_ WDFDEVICE _In_ REFGUID EventGuid
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
_Inout_ PUSB_DEVICE_HANDLE DeviceHandle
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
#define OBJ_KERNEL_HANDLE
#define OBJ_CASE_INSENSITIVE
NTSYSAPI NTSTATUS WINAPI RtlGUIDFromString(PUNICODE_STRING, GUID *)
NTSYSAPI NTSTATUS WINAPI RtlStringFromGUID(REFGUID, PUNICODE_STRING)
NTSYSAPI NTSTATUS WINAPI RtlDuplicateUnicodeString(int, const UNICODE_STRING *, UNICODE_STRING *)
#define ExFreePoolWithTag(_P, _T)
#define InitializeObjectAttributes(p, n, a, r, s)
_Must_inspect_result_ _Out_ PNDIS_STATUS _In_ NDIS_HANDLE _In_ PNDIS_STRING SubKeyName
struct _EXTENDED_DEVOBJ_EXTENSION * PEXTENDED_DEVOBJ_EXTENSION
NTSYSAPI NTSTATUS NTAPI ZwClose(_In_ HANDLE Handle)
@ KeyValuePartialInformation
NTSYSAPI NTSTATUS NTAPI RtlAppendUnicodeStringToString(PUNICODE_STRING Destination, PUNICODE_STRING Source)
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define KEY_CREATE_SUB_KEY
NTSYSAPI BOOLEAN NTAPI RtlEqualUnicodeString(PUNICODE_STRING String1, PUNICODE_STRING String2, BOOLEAN CaseInSensitive)
#define REG_OPTION_NON_VOLATILE
struct _OBJECT_NAME_INFORMATION OBJECT_NAME_INFORMATION
struct _OBJECT_NAME_INFORMATION * POBJECT_NAME_INFORMATION
#define KEY_ENUMERATE_SUB_KEYS
NTSYSAPI VOID NTAPI RtlFreeUnicodeString(PUNICODE_STRING UnicodeString)
NTSYSAPI BOOLEAN NTAPI RtlPrefixUnicodeString(IN PUNICODE_STRING String1, IN PUNICODE_STRING String2, IN BOOLEAN CaseInSensitive)
#define REG_OPTION_VOLATILE
_In_ ULONG _In_ ULONG _In_ ULONG Length
_In_ ULONGLONG _In_ ULONGLONG _In_ BOOLEAN Enable
NTSTATUS NTAPI IopOpenRegistryKeyEx(PHANDLE KeyHandle, HANDLE ParentKey, PUNICODE_STRING Name, ACCESS_MASK DesiredAccess)
BOOLEAN NTAPI PnpRegSzToString(IN PWCHAR RegSzData, IN ULONG RegSzLength, OUT PUSHORT StringLength OPTIONAL)
NTSTATUS NTAPI IopGetRegistryValue(IN HANDLE Handle, IN PWSTR ValueName, OUT PKEY_VALUE_FULL_INFORMATION *Information)
NTSTATUS IopQueueDeviceChangeEvent(_In_ const GUID *EventGuid, _In_ const GUID *InterfaceClassGuid, _In_ PUNICODE_STRING SymbolicLinkName)
VOID PiNotifyDeviceInterfaceChange(_In_ LPCGUID Event, _In_ LPCGUID InterfaceClassGuid, _In_ PUNICODE_STRING SymbolicLinkName)
Delivers the event to all drivers subscribed to EventCategoryDeviceInterfaceChange.
NTSTATUS NTAPI IopCreateRegistryKeyEx(OUT PHANDLE Handle, IN HANDLE BaseHandle OPTIONAL, IN PUNICODE_STRING KeyName, IN ACCESS_MASK DesiredAccess, IN ULONG CreateOptions, OUT PULONG Disposition OPTIONAL)
static NTSTATUS IopSeparateSymbolicLink(_In_ PCUNICODE_STRING SymbolicLinkName, _Out_opt_ PUNICODE_STRING PrefixString, _Out_opt_ PUNICODE_STRING MungedString, _Out_opt_ PUNICODE_STRING GuidString, _Out_opt_ PUNICODE_STRING ReferenceString, _Out_opt_ PBOOLEAN ReferenceStringPresent, _Out_opt_ LPGUID InterfaceClassGuid)
Parses the specified symbolic link onto the 4 parts: prefix, device string, class GUID and reference ...
PDEVICE_OBJECT IopGetDeviceObjectFromDeviceInstance(PUNICODE_STRING DeviceInstance)
static NTSTATUS IopOpenInterfaceKey(IN CONST GUID *InterfaceClassGuid, IN ACCESS_MASK DesiredAccess, OUT HANDLE *pInterfaceKey)
#define GUID_STRING_CHARS
static NTSTATUS IopOpenOrCreateSymbolicLinkSubKeys(_Out_opt_ PHANDLE DeviceHandle, _Out_opt_ PULONG DeviceDisposition, _Out_opt_ PHANDLE InstanceHandle, _Out_opt_ PULONG InstanceDisposition, _In_ HANDLE ClassHandle, _In_ PCUNICODE_STRING SymbolicLinkName, _In_ ACCESS_MASK DesiredAccess, _In_ BOOLEAN Create)
Retrieves a handles to the device and instance registry keys for the previously opened registry key h...
static PCWSTR BaseKeyString
NTSTATUS NTAPI IoOpenDeviceInterfaceRegistryKey(IN PUNICODE_STRING SymbolicLinkName, IN ACCESS_MASK DesiredAccess, OUT PHANDLE DeviceInterfaceKey)
static NTSTATUS IopBuildSymbolicLink(_In_ PCUNICODE_STRING DeviceString, _In_ PCUNICODE_STRING GuidString, _In_opt_ PCUNICODE_STRING ReferenceString, _In_ BOOLEAN UserModePrefixFormat, _Out_ PUNICODE_STRING SymbolicLinkName)
Creates a new symbolic link from the specified format of the prefix, device string,...
NTSTATUS NTAPI IoGetDeviceInterfaces(IN CONST GUID *InterfaceClassGuid, IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL, IN ULONG Flags, OUT PWSTR *SymbolicLinkList)
static NTSTATUS OpenRegistryHandlesFromSymbolicLink(_In_ PCUNICODE_STRING SymbolicLinkName, _In_ ACCESS_MASK DesiredAccess, _Out_opt_ PHANDLE GuidKey, _Out_opt_ PHANDLE DeviceKey, _Out_opt_ PHANDLE InstanceKey)
Retrieves a handles to the GUID, device and instance registry keys for the specified symbolic link.
NTSTATUS NTAPI IoRegisterDeviceInterface(IN PDEVICE_OBJECT PhysicalDeviceObject, IN CONST GUID *InterfaceClassGuid, IN PUNICODE_STRING ReferenceString OPTIONAL, OUT PUNICODE_STRING SymbolicLinkName)
NTSTATUS NTAPI IoSetDeviceInterfaceState(IN PUNICODE_STRING SymbolicLinkName, IN BOOLEAN Enable)
NTSTATUS NTAPI IoGetDeviceInterfaceAlias(_In_ PUNICODE_STRING SymbolicLinkName, _In_ CONST GUID *AliasInterfaceClassGuid, _Out_ PUNICODE_STRING AliasSymbolicLinkName)
Returns the alias device interface of the specified device interface instance, if the alias exists.
#define GUID_STRING_BYTES
NTSTATUS NTAPI IoCreateSymbolicLink(IN PUNICODE_STRING SymbolicLinkName, IN PUNICODE_STRING DeviceName)
NTSTATUS NTAPI IoDeleteSymbolicLink(IN PUNICODE_STRING SymbolicLinkName)
#define STATUS_OBJECT_NAME_EXISTS
#define STATUS_NO_MORE_ENTRIES
NTSTRSAFEVAPI RtlUnicodeStringPrintf(_In_ PUNICODE_STRING DestinationString, _In_ NTSTRSAFE_PCWSTR pszFormat,...)
NTSTATUS NTAPI ObQueryNameString(IN PVOID Object, OUT POBJECT_NAME_INFORMATION ObjectNameInfo, IN ULONG Length, OUT PULONG ReturnLength)
#define REGSTR_PATH_DEVICE_CLASSES
#define STATUS_BUFFER_TOO_SMALL
PULONG MinorVersion OPTIONAL
struct _DEVICE_NODE * DeviceNode
#define RTL_CONSTANT_STRING(s)
#define RtlCopyMemory(Destination, Source, Length)
#define STATUS_INVALID_DEVICE_REQUEST
#define STATUS_INVALID_PARAMETER
#define STATUS_UNSUCCESSFUL
#define STATUS_OBJECT_NAME_COLLISION
#define STATUS_INSUFFICIENT_RESOURCES
#define STATUS_OBJECT_NAME_NOT_FOUND
_In_ WDFCOLLECTION _In_ ULONG Index
_Must_inspect_result_ _In_ WDFDEVICE _In_ CONST GUID _In_opt_ PCUNICODE_STRING ReferenceString
_Must_inspect_result_ _In_ WDFDEVICE _In_ ULONG _In_ ACCESS_MASK DesiredAccess
_Must_inspect_result_ _In_ WDFDEVICE _In_ PCUNICODE_STRING SymbolicLinkName
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
_Must_inspect_result_ _In_ WDFDEVICE _In_ PCUNICODE_STRING KeyName
_In_ WDF_WMI_PROVIDER_CONTROL Control
_Must_inspect_result_ _In_ ULONG Flags
_In_opt_ PDEVICE_OBJECT _In_ ULONG _Outptr_result_nullonfailure_ _At_ * SymbolicLinkList(return==0, __drv_allocatesMem(Mem))) PZZWSTR *SymbolicLinkList
_In_ CONST GUID * AliasInterfaceClassGuid
_In_ ACCESS_MASK _Out_ PHANDLE DeviceInterfaceKey
_In_ CONST GUID * InterfaceClassGuid
#define DEVICE_INTERFACE_INCLUDE_NONACTIVE
#define ObDereferenceObject