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;
613 HANDLE InstanceKey, DeviceParametersKey;
631 Status = ZwCreateKey(&DeviceParametersKey,
682 DPRINT(
"RtlStringFromGUID() failed with status 0x%08lx\n",
Status);
691 DPRINT(
"ExAllocatePool() failed\n");
699 DPRINT(
"RtlAppendUnicodeStringToString() failed with status 0x%08lx\n",
Status);
705 DPRINT(
"RtlAppendUnicodeToString() failed with status 0x%08lx\n",
Status);
711 DPRINT(
"RtlAppendUnicodeToString() failed with status 0x%08lx\n",
Status);
717 DPRINT(
"RtlAppendUnicodeStringToString() failed with status 0x%08lx\n",
Status);
733 DPRINT(
"ZwOpenKey() failed with status 0x%08lx\n",
Status);
737 *pInterfaceKey = InterfaceKey;
743 if (InterfaceKey !=
NULL)
783 HANDLE DeviceKey, AliasInstanceKey;
794 DPRINT1(
"IoGetDeviceInterfaceAlias() invalid symbolic link or alias class GUID\n");
802 DPRINT1(
"RtlStringFromGUID() failed, Status 0x%08lx\n",
Status);
806 DPRINT(
"Alias GUID is %wZ\n", &AliasGuidString);
824 DPRINT1(
"Failed get device instance value, Status 0x%08lx\n",
Status);
830 DPRINT1(
"Wrong or empty instance value\n");
855 &ReferenceStringPresent,
863 DPRINT(
"Device string is '%wZ'\n", &DeviceString);
872 UserModePrefixFormat,
876 DPRINT1(
"Failed to build alias symbolic link, Status 0x%08lx\n",
Status);
888 DPRINT1(
"Failed to open alias symbolic link key, Status 0x%08lx\n",
Status);
894 DPRINT(
"IoGetDeviceInterfaceAlias(): alias symbolic link %wZ\n", &AliasSymbolicLink);
895 *AliasSymbolicLinkName = AliasSymbolicLink;
901 if (AliasSymbolicLink.
Buffer)
905 if (AliasGuidString.
Buffer)
970 ULONG i = 0,
j,
Size, NeededLength, ActualLength, LinkedValue;
989 if (DeviceObjectExtension->
DeviceNode->InstancePath.Length == 0)
995 InstanceDevicePath = &DeviceObjectExtension->
DeviceNode->InstancePath;
1002 DPRINT(
"IopOpenInterfaceKey() failed with status 0x%08lx\n",
Status);
1022 DPRINT(
"ZwEnumerateKey() failed with status 0x%08lx\n",
Status);
1029 DPRINT(
"ExAllocatePool() failed\n");
1042 DPRINT(
"ZwEnumerateKey() failed with status 0x%08lx\n",
Status);
1061 DPRINT(
"ZwOpenKey() failed with status 0x%08lx\n",
Status);
1074 ActualLength = NeededLength;
1094 FoundRightPDO =
TRUE;
1129 DPRINT(
"ZwEnumerateKey() failed with status 0x%08lx\n",
Status);
1136 DPRINT(
"ExAllocatePool() failed\n");
1149 DPRINT(
"ZwEnumerateKey() failed with status 0x%08lx\n",
Status);
1158 goto NextReferenceString;
1174 DPRINT(
"ZwOpenKey() failed with status 0x%08lx\n",
Status);
1198 goto NextReferenceString;
1202 DPRINT1(
"ZwOpenKey() failed with status 0x%08lx\n",
Status);
1207 Status = ZwQueryValueKey(ControlKey,
1215 ActualLength = NeededLength;
1223 Status = ZwQueryValueKey(ControlKey,
1238 DPRINT1(
"Bad registry read\n");
1248 if (LinkedValue == 0)
1251 goto NextReferenceString;
1262 Status = ZwQueryValueKey(
1271 DPRINT(
"ZwQueryValueKey() failed with status 0x%08lx\n",
Status);
1277 DPRINT(
"ExAllocatePool() failed\n");
1281 Status = ZwQueryValueKey(
1290 DPRINT(
"ZwQueryValueKey() failed with status 0x%08lx\n",
Status);
1295 DPRINT(
"Unexpected registry type 0x%lx (expected 0x%lx)\n", bip->
Type,
REG_SZ);
1301 DPRINT(
"Registry string too short (length %lu, expected %lu at least)\n", bip->
DataLength, 5 *
sizeof(
WCHAR));
1318 2 *
sizeof(
WCHAR)));
1322 DPRINT(
"ExAllocatePool() failed\n");
1331 ReturnBuffer.
Buffer = NewBuffer;
1337 DPRINT(
"RtlAppendUnicodeStringToString() failed with status 0x%08lx\n",
Status);
1352 if (ReferenceKey !=
NULL)
1355 ReferenceKey =
NULL;
1357 if (ControlKey !=
NULL)
1384 DPRINT(
"ExAllocatePool() failed\n");
1393 ReturnBuffer.
Buffer = NewBuffer;
1402 if (InterfaceKey !=
NULL)
1404 if (DeviceKey !=
NULL)
1406 if (ReferenceKey !=
NULL)
1408 if (ControlKey !=
NULL)
1476 DPRINT(
"IoRegisterDeviceInterface(): PDO %p, RefString: %wZ\n",
1490 if (DeviceObjectExtension->
DeviceNode->InstancePath.Length == 0)
1511 DPRINT(
"RtlStringFromGUID() failed with status 0x%08lx\n",
Status);
1519 sizeof(PdoNameInfoBuffer),
1523 DPRINT(
"ObQueryNameString() failed with status 0x%08lx\n",
Status);
1526 ASSERT(PdoNameInfo->Name.Length);
1539 DPRINT(
"ExAllocatePool() failed\n");
1564 DPRINT(
"ZwCreateKey() failed with status 0x%08lx\n",
Status);
1570 InterfaceKeyName.
Length = 0;
1579 if (!InterfaceKeyName.
Buffer)
1581 DPRINT(
"ExAllocatePool() failed\n");
1586 StartIndex = InterfaceKeyName.
Length /
sizeof(
WCHAR);
1590 if (InterfaceKeyName.
Buffer[StartIndex +
i] ==
'\\')
1591 InterfaceKeyName.
Buffer[StartIndex +
i] =
'#';
1615 DPRINT(
"ZwCreateKey() failed with status 0x%08lx\n",
Status);
1631 DPRINT(
"ZwSetValueKey() failed with status 0x%08lx\n",
Status);
1649 DPRINT(
"ExAllocatePool() failed\n");
1679 DPRINT(
"ZwCreateKey() failed with status 0x%08lx\n",
Status);
1702 DPRINT(
"ExAllocatePool() failed\n");
1724 DPRINT(
"IoRegisterDeviceInterface(): creating symbolic link %wZ -> %wZ\n",
SymbolicLinkName, &PdoNameInfo->Name);
1738 DPRINT1(
"IoCreateSymbolicLink() failed with status 0x%08lx\n", SymLinkStatus);
1746 return SymLinkStatus;
1767 DPRINT1(
"ZwSetValueKey() failed with status 0x%08lx\n",
Status);
1814 HANDLE InstanceHandle, ControlHandle;
1823 USHORT ReferenceStringOffset;
1851 if (LinkNameNoPrefix.
Buffer[
i] ==
L'\\')
1856 ReferenceStringOffset =
i *
sizeof(
WCHAR);
1859 ASSERT(LinkNameNoPrefix.
Length >= ReferenceStringOffset);
1891 Status = ZwCreateKey(&ControlHandle,
1901 DPRINT1(
"Failed to create the Control subkey\n");
1905 LinkedValue = (
Enable ? 1 : 0);
1908 Status = ZwSetValueKey(ControlHandle,
1917 DPRINT1(
"Failed to write the Linked value\n");
1954 DPRINT1(
"IopGetDeviceObjectFromDeviceInstance failed to find device object for %wZ\n", &
DeviceInstance);
PDEVICE_OBJECT PhysicalDeviceObject
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
_In_ D3DDDI_VIDEO_PRESENT_TARGET_ID _In_ ULONG _In_ ULONG Flags
#define NT_SUCCESS(StatCode)
#define RTL_CONSTANT_STRING(s)
static void cleanup(void)
_ACRTIMP size_t __cdecl wcslen(const wchar_t *)
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
_In_ PUNICODE_STRING SymbolicLinkName
#define ExFreePoolWithTag(_P, _T)
#define InitializeObjectAttributes(p, n, a, r, s)
_Must_inspect_result_ _Out_ PNDIS_STATUS _In_ NDIS_HANDLE _In_ PNDIS_STRING SubKeyName
_In_ PIOMMU_DEVICE_PATH _In_ PIOMMU_SVM_CAPABILITIES _Out_ PVOID * DeviceHandle
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)
#define IoGetDevObjExtension(DeviceObject)
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...
NTSTATUS IopOpenDeviceInterfaceKeys(_In_ PCUNICODE_STRING SymbolicLinkName, _In_ ACCESS_MASK DesiredAccess, _Out_opt_ PHANDLE DeviceKey, _Out_opt_ PHANDLE InstanceKey)
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 OBJ_KERNEL_HANDLE
#define OBJ_CASE_INSENSITIVE
#define REGSTR_PATH_DEVICE_CLASSES
#define STATUS_BUFFER_TOO_SMALL
PULONG MinorVersion OPTIONAL
struct _DEVICE_NODE * DeviceNode
#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_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
_Must_inspect_result_ _In_ WDFDEVICE _In_ PCUNICODE_STRING KeyName
_In_ WDF_WMI_PROVIDER_CONTROL Control
NTSYSAPI NTSTATUS WINAPI RtlGUIDFromString(PUNICODE_STRING, GUID *)
NTSYSAPI NTSTATUS WINAPI RtlStringFromGUID(REFGUID, PUNICODE_STRING)
NTSYSAPI NTSTATUS WINAPI RtlDuplicateUnicodeString(int, const UNICODE_STRING *, UNICODE_STRING *)
_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