[CMLIB]
[reactos.git] / rostests / kmtests / ntos_io / IoDeviceInterface.c
1 /*
2 * PROJECT: ReactOS kernel-mode tests
3 * LICENSE: LGPLv2+ - See COPYING.LIB in the top level directory
4 * PURPOSE: Kernel-Mode Test Suite Device Interface functions test
5 * PROGRAMMER: Filip Navara <xnavara@volny.cz>
6 */
7
8 /* TODO: what's with the prototypes at the top, what's with the if-ed out part? Doesn't process most results */
9
10 #include <kmt_test.h>
11
12 #define NDEBUG
13 #include <debug.h>
14
15 #if 0
16 NTSTATUS
17 (NTAPI *IoGetDeviceInterfaces_Func)(
18 IN CONST GUID *InterfaceClassGuid,
19 IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL,
20 IN ULONG Flags,
21 OUT PWSTR *SymbolicLinkList);
22
23 NTSTATUS NTAPI
24 ReactOS_IoGetDeviceInterfaces(
25 IN CONST GUID *InterfaceClassGuid,
26 IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL,
27 IN ULONG Flags,
28 OUT PWSTR *SymbolicLinkList);
29 #endif /* 0 */
30
31 static VOID DeviceInterfaceTest_Func()
32 {
33 NTSTATUS Status;
34 PWSTR SymbolicLinkList;
35 PWSTR SymbolicLinkListPtr;
36 GUID Guid = {0x378de44c, 0x56ef, 0x11d1, {0xbc, 0x8c, 0x00, 0xa0, 0xc9, 0x14, 0x05, 0xdd}};
37
38 Status = IoGetDeviceInterfaces(
39 &Guid,
40 NULL,
41 0,
42 &SymbolicLinkList);
43
44 ok(NT_SUCCESS(Status),
45 "IoGetDeviceInterfaces failed with status 0x%X\n",
46 (unsigned int)Status);
47 if (!NT_SUCCESS(Status))
48 {
49 return;
50 }
51
52 DPRINT("IoGetDeviceInterfaces results:\n");
53 for (SymbolicLinkListPtr = SymbolicLinkList;
54 SymbolicLinkListPtr[0] != 0 && SymbolicLinkListPtr[1] != 0;
55 SymbolicLinkListPtr += wcslen(SymbolicLinkListPtr) + 1)
56 {
57 DPRINT1("Symbolic Link: %S\n", SymbolicLinkListPtr);
58 }
59
60 #if 0
61 DPRINT("[PnP Test] Trying to get aliases\n");
62
63 for (SymbolicLinkListPtr = SymbolicLinkList;
64 SymbolicLinkListPtr[0] != 0 && SymbolicLinkListPtr[1] != 0;
65 SymbolicLinkListPtr += wcslen(SymbolicLinkListPtr) + 1)
66 {
67 UNICODE_STRING SymbolicLink;
68 UNICODE_STRING AliasSymbolicLink;
69
70 SymbolicLink.Buffer = SymbolicLinkListPtr;
71 SymbolicLink.Length = SymbolicLink.MaximumLength = wcslen(SymbolicLinkListPtr);
72 RtlInitUnicodeString(&AliasSymbolicLink, NULL);
73 IoGetDeviceInterfaceAlias(
74 &SymbolicLink,
75 &AliasGuid,
76 &AliasSymbolicLink);
77 if (AliasSymbolicLink.Buffer != NULL)
78 {
79 DPRINT("[PnP Test] Original: %S\n", SymbolicLinkListPtr);
80 DPRINT("[PnP Test] Alias: %S\n", AliasSymbolicLink.Buffer);
81 }
82 }
83 #endif
84
85 ExFreePool(SymbolicLinkList);
86 }
87
88 START_TEST(IoDeviceInterface)
89 {
90 GUID Guid = {0x378de44c, 0x56ef, 0x11d1, {0xbc, 0x8c, 0x00, 0xa0, 0xc9, 0x14, 0x05, 0xdd}};
91 DEVICE_OBJECT DeviceObject;
92 EXTENDED_DEVOBJ_EXTENSION DeviceObjectExtension;
93 DEVICE_NODE DeviceNode;
94 UNICODE_STRING SymbolicLinkName;
95 NTSTATUS Status;
96
97 RtlInitUnicodeString(&SymbolicLinkName, L"");
98
99 // Prepare our surrogate of a Device Object
100 DeviceObject.DeviceObjectExtension = (PDEVOBJ_EXTENSION)&DeviceObjectExtension;
101
102 // 1. DeviceNode = NULL
103 DeviceObjectExtension.DeviceNode = NULL;
104 Status = IoRegisterDeviceInterface(&DeviceObject, &Guid, NULL,
105 &SymbolicLinkName);
106
107 ok(Status == STATUS_INVALID_DEVICE_REQUEST,
108 "IoRegisterDeviceInterface returned 0x%08lX\n", Status);
109
110 // 2. DeviceNode->InstancePath is of a null length
111 DeviceObjectExtension.DeviceNode = &DeviceNode;
112 DeviceNode.InstancePath.Length = 0;
113 Status = IoRegisterDeviceInterface(&DeviceObject, &Guid, NULL,
114 &SymbolicLinkName);
115
116 ok(Status == STATUS_INVALID_DEVICE_REQUEST,
117 "IoRegisterDeviceInterface returned 0x%08lX\n", Status);
118
119 DeviceInterfaceTest_Func();
120 }