[COM_APITEST] Add a test for CLSID_ActiveDesktop
[reactos.git] / modules / rostests / apitests / psapi / psapi.c
1 /*
2 * PROJECT: ReactOS api tests
3 * LICENSE: GPLv2+ - See COPYING in the top level directory
4 * PURPOSE: Test for GetDeviceDriverFileName & GetDeviceDriverBaseName
5 * PROGRAMMER: Pierre Schweitzer
6 */
7
8 #include <apitest.h>
9 #include <psapi.h>
10 #include <tlhelp32.h>
11 #include <stdio.h>
12
13 typedef struct
14 {
15 LPVOID ImageBase;
16 CHAR Path[255];
17 DWORD Len;
18 } TEST_MODULE_INFO;
19
20 static LPVOID IntGetImageBase(LPCSTR Image)
21 {
22 HANDLE Snap;
23 MODULEENTRY32 Module;
24
25 Snap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, 0);
26 if (Snap == INVALID_HANDLE_VALUE)
27 {
28 return NULL;
29 }
30
31 Module.dwSize = sizeof(MODULEENTRY32);
32 if(!Module32First(Snap, &Module))
33 {
34 CloseHandle(Snap);
35 return NULL;
36 }
37
38 do
39 {
40 if (lstrcmpiA(Module.szExePath, Image) == 0)
41 {
42 CloseHandle(Snap);
43 return (LPVOID)Module.modBaseAddr;
44 }
45 } while(Module32Next(Snap, &Module));
46
47 CloseHandle(Snap);
48 return NULL;
49 }
50
51 static BOOLEAN IntGetModuleInformation(LPCSTR Module, BOOLEAN IsDriver, BOOLEAN IsProcMod, BOOLEAN BaseName, TEST_MODULE_INFO * Info)
52 {
53 CHAR System[255];
54 UINT Len;
55
56 memset(Info, 0, sizeof(TEST_MODULE_INFO));
57
58 /* Get system path */
59 Len = GetSystemWindowsDirectory(System, 255);
60 if (Len > 255 || Len == 0)
61 {
62 printf("GetSystemWindowsDirectory failed\n");
63 return FALSE;
64 }
65
66 /* Make path to module */
67 strcat(System, "\\system32\\");
68 if (IsDriver) strcat(System, "drivers\\");
69 strcat(System, Module);
70
71 /* Get base address */
72 if (IsProcMod)
73 {
74 Info->ImageBase = IntGetImageBase(System);
75 if (!Info->ImageBase)
76 {
77 printf("IntGetImageBase failed\n");
78 return FALSE;
79 }
80 }
81 else
82 {
83 /* FIXME */
84 printf("Not supported yet!\n");
85 return FALSE;
86 }
87
88 if (BaseName)
89 {
90 strcpy(Info->Path, Module);
91 Info->Len = strlen(Info->Path);
92 }
93 else
94 {
95 /* Skip disk */
96 strcpy(Info->Path, System + 2);
97 Info->Len = strlen(Info->Path);
98 }
99
100 return TRUE;
101 }
102
103 START_TEST(GetDeviceDriverFileName)
104 {
105 DWORD Len;
106 CHAR FileName[255];
107 TEST_MODULE_INFO ModInfo;
108
109 SetLastError(0xDEADBEEF);
110 Len = GetDeviceDriverFileNameA(0, FileName, 255);
111 ok(Len == 0, "Len: %lu\n", Len);
112 ok(GetLastError() == ERROR_INVALID_HANDLE, "Error: %lx\n", GetLastError());
113
114 if (IntGetModuleInformation("ntdll.dll", FALSE, TRUE, FALSE, &ModInfo))
115 {
116 SetLastError(0xDEADBEEF);
117 Len = GetDeviceDriverFileNameA(ModInfo.ImageBase, FileName, 255);
118 ok(Len == ModInfo.Len, "Len: %lu\n", Len);
119 ok(GetLastError() == 0xDEADBEEF, "Error: %lx\n", GetLastError());
120 ok(lstrcmpiA(ModInfo.Path, FileName) == 0, "File name: %s\n", FileName);
121
122 /* Test with too small buffer */
123 SetLastError(0xDEADBEEF);
124 ModInfo.Len--;
125 ModInfo.Path[ModInfo.Len] = 0;
126 FileName[ModInfo.Len] = 0;
127 Len = GetDeviceDriverFileNameA(ModInfo.ImageBase, FileName, ModInfo.Len);
128 ok(Len == ModInfo.Len, "Len: %lu\n", Len);
129 ok(GetLastError() == 0xDEADBEEF, "Error: %lx\n", GetLastError());
130 ok(lstrcmpiA(ModInfo.Path, FileName) == 0, "File name: %s\n", FileName);
131 }
132 else
133 {
134 skip("Couldn't find info about ntdll.dll\n");
135 }
136
137 if (IntGetModuleInformation("msvcrt.dll", FALSE, TRUE, FALSE, &ModInfo))
138 {
139 SetLastError(0xDEADBEEF);
140 Len = GetDeviceDriverFileNameA(ModInfo.ImageBase, FileName, 255);
141 ok(Len == 0, "Len: %lu\n", Len);
142 ok(GetLastError() == ERROR_INVALID_HANDLE, "Error: %lx\n", GetLastError());
143 }
144 else
145 {
146 skip("Couldn't find info about msvcrt.dll\n");
147 }
148
149 if (IntGetModuleInformation("psapi.dll", FALSE, TRUE, FALSE, &ModInfo))
150 {
151 SetLastError(0xDEADBEEF);
152 Len = GetDeviceDriverFileNameA(ModInfo.ImageBase, FileName, 255);
153 ok(Len == 0, "Len: %lu\n", Len);
154 ok(GetLastError() == ERROR_INVALID_HANDLE, "Error: %lx\n", GetLastError());
155 }
156 else
157 {
158 skip("Couldn't find info about psapi.dll\n");
159 }
160 }
161
162 START_TEST(GetDeviceDriverBaseName)
163 {
164 DWORD Len;
165 CHAR FileName[255];
166 TEST_MODULE_INFO ModInfo;
167
168 SetLastError(0xDEADBEEF);
169 Len = GetDeviceDriverBaseNameA(0, FileName, 255);
170 ok(Len == 0, "Len: %lu\n", Len);
171 ok(GetLastError() == ERROR_INVALID_HANDLE, "Error: %lx\n", GetLastError());
172
173 if (IntGetModuleInformation("ntdll.dll", FALSE, TRUE, TRUE, &ModInfo))
174 {
175 SetLastError(0xDEADBEEF);
176 Len = GetDeviceDriverBaseNameA(ModInfo.ImageBase, FileName, 255);
177 ok(Len == ModInfo.Len, "Len: %lu\n", Len);
178 ok(GetLastError() == 0xDEADBEEF, "Error: %lx\n", GetLastError());
179 ok(lstrcmpiA(ModInfo.Path, FileName) == 0, "File name: %s\n", FileName);
180
181 /* Test with too small buffer */
182 SetLastError(0xDEADBEEF);
183 ModInfo.Len--;
184 ModInfo.Path[ModInfo.Len] = 0;
185 FileName[ModInfo.Len] = 0;
186 Len = GetDeviceDriverBaseNameA(ModInfo.ImageBase, FileName, ModInfo.Len);
187 ok(Len == ModInfo.Len, "Len: %lu\n", Len);
188 ok(GetLastError() == 0xDEADBEEF, "Error: %lx\n", GetLastError());
189 ok(lstrcmpiA(ModInfo.Path, FileName) == 0, "File name: %s\n", FileName);
190 }
191 else
192 {
193 skip("Couldn't find info about ntdll.dll\n");
194 }
195
196 if (IntGetModuleInformation("msvcrt.dll", FALSE, TRUE, TRUE, &ModInfo))
197 {
198 SetLastError(0xDEADBEEF);
199 Len = GetDeviceDriverBaseNameA(ModInfo.ImageBase, FileName, 255);
200 ok(Len == 0, "Len: %lu\n", Len);
201 ok(GetLastError() == ERROR_INVALID_HANDLE, "Error: %lx\n", GetLastError());
202 }
203 else
204 {
205 skip("Couldn't find info about msvcrt.dll\n");
206 }
207
208 if (IntGetModuleInformation("psapi.dll", FALSE, TRUE, TRUE, &ModInfo))
209 {
210 SetLastError(0xDEADBEEF);
211 Len = GetDeviceDriverBaseNameA(ModInfo.ImageBase, FileName, 255);
212 ok(Len == 0, "Len: %lu\n", Len);
213 ok(GetLastError() == ERROR_INVALID_HANDLE, "Error: %lx\n", GetLastError());
214 }
215 else
216 {
217 skip("Couldn't find info about psapi.dll\n");
218 }
219 }