xref: /reactos/base/setup/lib/utils/arcname_tests.c (revision 58588b76)
1 /*
2  * PROJECT:     ReactOS Setup Library
3  * LICENSE:     GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
4  * PURPOSE:     Tests for the arcname.c functions:
5  *              ArcPathNormalize(), ArcPathToNtPath().
6  * COPYRIGHT:   Copyright 2017-2018 Hermes Belusca-Maito
7  *
8  * You may need to fix the included headers before being able to
9  * compile this file (this file has only been compiled under VS).
10  */
11 
12 #include <stdio.h>
13 #include <tchar.h>
14 #include <conio.h>
15 
16 #define WIN32_NO_STATUS
17 #include <windows.h>
18 #include <winternl.h>
19 #undef WIN32_NO_STATUS
20 
21 #include <ntstatus.h>
22 
23 #include "arcname.h"
24 
25 #define OBJ_NAME_PATH_SEPARATOR ((WCHAR)L'\\')
26 
27 int _tmain(int argc, _TCHAR* argv[])
28 {
29     WCHAR ArcPath[MAX_PATH] = L"multi(5)disk()rdisk(1)partition()\\ReactOS";
30     WCHAR NormalizedArcPathBuffer[MAX_PATH];
31     UNICODE_STRING NormalizedArcPath;
32     WCHAR NtPathBuffer[MAX_PATH];
33     UNICODE_STRING NtPath;
34 
35     NormalizedArcPath.Buffer = NormalizedArcPathBuffer;
36     NormalizedArcPath.Length = 0;
37     NormalizedArcPath.MaximumLength = sizeof(NormalizedArcPathBuffer);
38 
39     ArcPathNormalize(&NormalizedArcPath, ArcPath);
40     wprintf(L"ArcPath = '%s' ; Normalized = '%wZ'\n", ArcPath, &NormalizedArcPath);
41 
42     NtPath.Buffer = NtPathBuffer;
43     NtPath.Length = 0;
44     NtPath.MaximumLength = sizeof(NtPathBuffer);
45 
46     ArcPathToNtPath(&NtPath, NormalizedArcPath.Buffer);
47     // wprintf(L"ArcPath = '%s' ; NtPath = '%wZ'\n", ArcPath, &NtPath);
48     wprintf(L"NtPath = '%wZ'\n", &NtPath);
49     ArcPathToNtPath(&NtPath, L"ramdisk(0)");                // OK
50     wprintf(L"NtPath = '%wZ'\n", &NtPath);
51     ArcPathToNtPath(&NtPath, L"ramdisk(0)\\ReactOS\\system32\\ntoskrnl.exe");   // OK
52     wprintf(L"NtPath = '%wZ'\n", &NtPath);
53     ArcPathToNtPath(&NtPath, L"net(0)\\Foobar");            // OK but not supported
54     wprintf(L"NtPath = '%wZ'\n", &NtPath);
55     ArcPathToNtPath(&NtPath, L"net(0)disk(1)\\Foobar");     // Bad
56     wprintf(L"NtPath = '%wZ'\n", &NtPath);
57     ArcPathToNtPath(&NtPath, L"scsi(2)disk(1)rdisk(3)");    // OK
58     wprintf(L"NtPath = '%wZ'\n", &NtPath);
59     ArcPathToNtPath(&NtPath, L"scsi(2)disk(1)fdisk(3)");    // OK
60     wprintf(L"NtPath = '%wZ'\n", &NtPath);
61     ArcPathToNtPath(&NtPath, L"scsi(2)cdrom(1)");           // Bad: missing fdisk
62     wprintf(L"NtPath = '%wZ'\n", &NtPath);
63     ArcPathToNtPath(&NtPath, L"scsi(2)cdrom(1)cdrom(0)");   // Bad: twice cdrom
64     wprintf(L"NtPath = '%wZ'\n", &NtPath);
65     ArcPathToNtPath(&NtPath, L"scsi(2)cdrom(1)fdisk(0)");   // OK
66     wprintf(L"NtPath = '%wZ'\n", &NtPath);
67     ArcPathToNtPath(&NtPath, L"scsi(2)cdrom(1)rdisk(0)");   // Bad; cdrom controller and rdisk peripheral
68     wprintf(L"NtPath = '%wZ'\n", &NtPath);
69     ArcPathToNtPath(&NtPath, L"multi(2)cdrom(1)fdisk(0)");  // Bad: multi adapter cannot have cdrom controller
70     wprintf(L"NtPath = '%wZ'\n", &NtPath);
71     ArcPathToNtPath(&NtPath, L"multi(2)rdisk(1)cdrom(1)fdisk(0)");  // Bad: rdisk is not a controller
72     wprintf(L"NtPath = '%wZ'\n", &NtPath);
73     ArcPathToNtPath(&NtPath, L"multi(2)disk(1)cdrom(1)fdisk(0)");   // OK (disk(1) ignored)
74     wprintf(L"NtPath = '%wZ'\n", &NtPath);
75     ArcPathToNtPath(&NtPath, L"multi(2)disk(1)rdisk(1)fdisk(0)");   // Same (and also fdisk is not considered as part of ARC path)
76     wprintf(L"NtPath = '%wZ'\n", &NtPath);
77     ArcPathToNtPath(&NtPath, L"multi(2)disk(1)rdisk(1)partition(3)");   // OK (disk(1) ignored)
78     wprintf(L"NtPath = '%wZ'\n", &NtPath);
79 
80     _getch();
81 
82     /* All these are OK */
83     ArcPathToNtPath(&NtPath, L"scsi(0)disk(3)rdisk(0)partition(1)\\OS.DIR");
84     wprintf(L"NtPath = '%wZ'\n", &NtPath);
85     ArcPathToNtPath(&NtPath, L"scsi(1)disk(3)rdisk(3)partition(2)\\OS\\ARCOS\\LOADER");
86     wprintf(L"NtPath = '%wZ'\n", &NtPath);
87 
88     _getch();
89 
90     /* All these are OK */
91     ArcPathToNtPath(&NtPath, L"multi(0)disk(0)rdisk(0)partition(1)");
92     wprintf(L"NtPath = '%wZ'\n", &NtPath);
93     ArcPathToNtPath(&NtPath, L"multi(0)disk(0)rdisk(0)partition(0)");
94     wprintf(L"NtPath = '%wZ'\n", &NtPath);
95     ArcPathToNtPath(&NtPath, L"multi(0)disk(0)cdrom(3)");
96     wprintf(L"NtPath = '%wZ'\n", &NtPath);
97     ArcPathToNtPath(&NtPath, L"ramdisk(0)");
98     wprintf(L"NtPath = '%wZ'\n", &NtPath);
99     ArcPathToNtPath(&NtPath, L"net(0)");
100     wprintf(L"NtPath = '%wZ'\n", &NtPath);
101     ArcPathToNtPath(&NtPath, L"multi(0)disk(0)fdisk(0)");
102     wprintf(L"NtPath = '%wZ'\n", &NtPath);
103     ArcPathToNtPath(&NtPath, L"multi(0)disk(0)rdisk(1)partition(0)");
104     wprintf(L"NtPath = '%wZ'\n", &NtPath);
105     ArcPathToNtPath(&NtPath, L"multi(0)disk(0)rdisk(1)partition(3)");
106     wprintf(L"NtPath = '%wZ'\n", &NtPath);
107     ArcPathToNtPath(&NtPath, L"multi(0)disk(0)rdisk(1)partition(1)");
108     wprintf(L"NtPath = '%wZ'\n", &NtPath);
109     ArcPathToNtPath(&NtPath, L"multi(0)disk(0)rdisk(0)partition(3)");
110     wprintf(L"NtPath = '%wZ'\n", &NtPath);
111     ArcPathToNtPath(&NtPath, L"multi(0)disk(0)fdisk(1)partition(0)");
112     wprintf(L"NtPath = '%wZ'\n", &NtPath);
113     ArcPathToNtPath(&NtPath, L"multi(0)disk(0)fdisk(0)partition(0)");
114     wprintf(L"NtPath = '%wZ'\n", &NtPath);
115     ArcPathToNtPath(&NtPath, L"multi(0)disk(0)fdisk(1)");
116     wprintf(L"NtPath = '%wZ'\n", &NtPath);
117     ArcPathToNtPath(&NtPath, L"eisa(0)disk(0)fdisk(0)");
118     wprintf(L"NtPath = '%wZ'\n", &NtPath);
119     ArcPathToNtPath(&NtPath, L"eisa(0)disk(0)fdisk(1)partition(0)");
120     wprintf(L"NtPath = '%wZ'\n", &NtPath);
121     ArcPathToNtPath(&NtPath, L"eisa(0)disk(0)fdisk(0)partition(0)");
122     wprintf(L"NtPath = '%wZ'\n", &NtPath);
123 
124     /* These are invalid storage ARC paths (but otherwise are valid ARC names) */
125     ArcPathToNtPath(&NtPath, L"multi(0)video(0)monitor(0)");
126     wprintf(L"NtPath = '%wZ'\n", &NtPath);
127     ArcPathToNtPath(&NtPath, L"multi(0)key(0)keyboard(0)");
128     wprintf(L"NtPath = '%wZ'\n", &NtPath);
129 
130     _getch();
131     return 0;
132 }
133