ReactOS 0.4.15-dev-8408-g466a198
SetupDiInstallClassExA.c
Go to the documentation of this file.
1/*
2 * SetupAPI device class-related functions tests
3 *
4 * Copyright 2015 Víctor Martínez (victor.martinez@reactos.org)
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public Licence as
8 * published by the Free Software Foundation; either version 2 of
9 * the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this library; if not, write to the Free Software Foundation,
18 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19 */
20
21#include <apitest.h>
22#include <stdio.h>
23#include <assert.h>
24#include <winuser.h>
25#include <winreg.h>
26#include <winsvc.h>
27#include <setupapi.h>
28#include <strsafe.h>
29
30static const char inffile[] = "test.inf";
31static char CURR_DIR[MAX_PATH];
32
33/* Helpers */
34
35static void create_inf_file(LPCSTR filename, const char *data)
36{
37 DWORD res;
38 BOOL ret;
43 assert(ret != 0);
45}
46
48{
49 char inf[2048];
50 char path[MAX_PATH];
51 BOOL ret;
52 ULONG del;
54 HINF infhandle;
55 SC_HANDLE scm_handle, svc_handle;
56
57 /* [Version]:Signature */
58 strcpy(inf, "[Version]\nSignature=\"$Chicago$\"\n");
60 StringCbPrintfA(path, sizeof(path), "%s\\%s", CURR_DIR, inffile);
61
62 SetLastError(0xdeadbeef);
64 ok(!ret, "Expected failure\n");
66 "Expected ERROR_INVALID_CLASS, got %08x\n", (int)GetLastError());
68
69 /* [Version]:Signature+Class */
70 strcat(inf, "Class=MySampleClass\n");
72 StringCbPrintfA(path, sizeof(path), "%s\\%s", CURR_DIR, inffile);
73
74 SetLastError(0xdeadbeef);
76 ok(!ret, "Expected failure\n");
78 "Expected ERROR_INVALID_CLASS, got %08x\n", (int)GetLastError());
80
81 /* [Version]:Signature+Class+ClassGUID */
82 strcat(inf, "ClassGuid={3b409830-5f9d-432a-abf5-7d2e4e102467}\n");
84 StringCbPrintfA(path, sizeof(path), "%s\\%s", CURR_DIR, inffile);
85
86 SetLastError(0xdeadbeef);
88 ok(!ret, "Expected failure\n");
90 "Expected ERROR_SECTION_NOT_FOUND, got %08x\n", (int)GetLastError());
92
93 /* [Version]Signature+Class+ClassGUID;[ClassInstall32.NT]Empty */
94 strcat(inf, "[ClassInstall32.NT]\n");
96 StringCbPrintfA(path, sizeof(path), "%s\\%s", CURR_DIR, inffile);
97
98 SetLastError(0xdeadbeef);
100 ok(ret, "Expected success\n");
101 ok(!GetLastError(),
102 "Expected no error, got %08x\n", (int)GetLastError());
104 if (ret == TRUE)
105 {
107 del = RegDeleteKeyW(RegHandle, L"CurrentControlSet\\Control\\Class\\{3B409830-5F9D-432A-ABF5-7D2E4E102467}");
108 ok(del == ERROR_SUCCESS, "Expected success\n");
109 }
110
111 /* [Version]Signature+Class+ClassGUID;[ClassInstall32.NT]AddReg */
112 strcat(inf, "AddReg=SampleClassAddReg\n");
114 StringCbPrintfA(path, sizeof(path), "%s\\%s", CURR_DIR, inffile);
115
116 SetLastError(0xdeadbeef);
118 ok(ret, "Expected success\n");
119 ok(!GetLastError(),
120 "Expected no error, got %08x\n", (int)GetLastError());
122 if (ret == TRUE)
123 {
125 del = RegDeleteKeyW(RegHandle, L"CurrentControlSet\\Control\\Class\\{3B409830-5F9D-432A-ABF5-7D2E4E102467}");
126 ok(del == ERROR_SUCCESS, "Expected success\n");
127 }
128
129 /* [Version]Signature+Class+ClassGUID;[ClassInstall32.NT]AddReg; [SampleClassAddReg];*/
130 strcat(inf, "[SampleClassAddReg]\n");
132 StringCbPrintfA(path, sizeof(path), "%s\\%s", CURR_DIR, inffile);
133
134 SetLastError(0xdeadbeef);
136 ok(ret, "Expected success\n");
137 ok(!GetLastError(),
138 "Expected no error, got %08x\n", (int)GetLastError());
140 if (ret == TRUE)
141 {
143 del = RegDeleteKeyW(RegHandle, L"CurrentControlSet\\Control\\Class\\{3B409830-5F9D-432A-ABF5-7D2E4E102467}");
144 ok(del == ERROR_SUCCESS, "Expected success\n");
145 }
146
147 /* [Version]Signature+Class+ClassGUID;[ClassInstall32.NT]AddReg; [SampleClassAddReg]HKR;*/
148 strcat(inf, "HKR,,,,\"ReactOS Test SetupDiInstallClassExA\"\n");
150 StringCbPrintfA(path, sizeof(path), "%s\\%s", CURR_DIR, inffile);
151
152 SetLastError(0xdeadbeef);
154 ok(ret, "Expected success\n");
155 ok(!GetLastError(),
156 "Expected no error, got %08x\n", (int)GetLastError());
158 if (ret == TRUE)
159 {
161 del = RegDeleteKeyW(RegHandle, L"CurrentControlSet\\Control\\Class\\{3B409830-5F9D-432A-ABF5-7D2E4E102467}");
162 ok(del == ERROR_SUCCESS, "Expected success\n");
163 }
164
165 /*[Version]Signature+Class+ClassGUID;[ClassInstall32.NT]AddReg;[SampleClassAddReg]HKR;[ClassInstall32.NT.Services]*/
166 strcat(inf, "[ClassInstall32.NT.Services]\n");
168 StringCbPrintfA(path, sizeof(path), "%s\\%s", CURR_DIR, inffile);
169
170 SetLastError(0xdeadbeef);
172 ok(ret, "Expected success\n");
173 ok(!GetLastError(),
174 "Expected no error, got %08x\n", (int)GetLastError());
176 if (ret == TRUE)
177 {
179 del = RegDeleteKeyW(RegHandle, L"CurrentControlSet\\Control\\Class\\{3B409830-5F9D-432A-ABF5-7D2E4E102467}");
180 ok(del == ERROR_SUCCESS, "Expected success\n");
181 }
182
183 /* Add a reference */
184 strcat(inf, "AddService=Reactostest,,Reactostest.Service\n");
187 SetLastError(0xdeadbeef);
189 ok(!ret, "Expected failure\n");
191 "Expected ERROR_BAD_SERVICE_INSTALLSECT, got %08x\n", (int)GetLastError());
192 SetupCloseInfFile(infhandle);
194
195 /* Add the section */
196 strcat(inf, "[Reactostest.Service]\n");
199 SetLastError(0xdeadbeef);
201 ok(!ret, "Expected failure\n");
203 "Expected ERROR_BAD_SERVICE_INSTALLSECT, got %08x\n", (int)GetLastError());
204 SetupCloseInfFile(infhandle);
206
207 /* Just the ServiceBinary */
208 strcat(inf, "ServiceBinary=%12%\\reactostest.sys\n");
211 SetLastError(0xdeadbeef);
213 ok(!ret, "Expected failure\n");
215 "Expected ERROR_BAD_SERVICE_INSTALLSECT, got %08x\n", (int)GetLastError());
216 SetupCloseInfFile(infhandle);
218
219 /* Add the ServiceType */
220 strcat(inf, "ServiceType=1\n");
223 SetLastError(0xdeadbeef);
225 ok(!ret, "Expected failure\n");
227 "Expected ERROR_BAD_SERVICE_INSTALLSECT, got %08x\n", (int)GetLastError());
228 SetupCloseInfFile(infhandle);
230
231 /* Add the StartType */
232 strcat(inf, "StartType=4\n");
235 SetLastError(0xdeadbeef);
237 ok(!ret, "Expected failure\n");
239 "Expected ERROR_BAD_SERVICE_INSTALLSECT, got %08x\n", (int)GetLastError());
240 SetupCloseInfFile(infhandle);
242
243 /* This should be it, the minimal entries to install a service */
244 strcat(inf, "ErrorControl=1");
247 SetLastError(0xdeadbeef);
250 {
251 skip("Not enough rights to install the service\n");
252 SetupCloseInfFile(infhandle);
254 return;
255 }
256 ok(ret, "Expected success\n");
258 "Expected ERROR_SUCCESS, got %08x\n", (int)GetLastError());
259 SetupCloseInfFile(infhandle);
261
263
264 /* Open the service to see if it's really there */
265 svc_handle = OpenServiceA(scm_handle, "Reactostest", DELETE);
266 ok(svc_handle != NULL, "Service was not created\n");
267
268 SetLastError(0xdeadbeef);
269 ret = DeleteService(svc_handle);
270 ok(ret, "Service could not be deleted : %d\n", (int)GetLastError());
271
272 CloseServiceHandle(svc_handle);
274}
275
276
278{
279 char temp_path[MAX_PATH], prev_path[MAX_PATH];
280 SIZE_T len;
281
282 GetCurrentDirectoryA(MAX_PATH, prev_path);
285
288 if (len && (CURR_DIR[len - 1] == '\\'))
289 CURR_DIR[len - 1] = 0;
290
292 SetCurrentDirectoryA(prev_path);
293
294}
static SC_HANDLE scm_handle
Definition: ServiceArgs.c:20
static char CURR_DIR[MAX_PATH]
static void test_SetupDiInstallClassExA(void)
static const char inffile[]
char * strcat(char *DstString, const char *SrcString)
Definition: utclib.c:568
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
char * strcpy(char *DstString, const char *SrcString)
Definition: utclib.c:388
#define ok(value,...)
Definition: atltest.h:57
#define skip(...)
Definition: atltest.h:64
#define START_TEST(x)
Definition: atltest.h:75
static VOID del(LPHIST_ENTRY item)
Definition: history.c:199
#define ERROR_SUCCESS
Definition: deptool.c:10
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
Definition: reg.c:3333
LONG WINAPI RegDeleteKeyW(_In_ HKEY hKey, _In_ LPCWSTR lpSubKey)
Definition: reg.c:1239
#define CloseHandle
Definition: compat.h:739
#define SetLastError(x)
Definition: compat.h:752
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
#define CreateFileA(a, b, c, d, e, f, g)
Definition: compat.h:740
#define MAX_PATH
Definition: compat.h:34
#define FILE_ATTRIBUTE_NORMAL
Definition: compat.h:137
#define ERROR_ACCESS_DENIED
Definition: compat.h:97
BOOL WINAPI DeleteFileA(IN LPCSTR lpFileName)
Definition: delete.c:24
BOOL WINAPI WriteFile(IN HANDLE hFile, IN LPCVOID lpBuffer, IN DWORD nNumberOfBytesToWrite OPTIONAL, OUT LPDWORD lpNumberOfBytesWritten, IN LPOVERLAPPED lpOverlapped OPTIONAL)
Definition: rw.c:24
DWORD WINAPI GetCurrentDirectoryA(IN DWORD nBufferLength, OUT LPSTR lpBuffer)
Definition: path.c:2146
BOOL WINAPI SetCurrentDirectoryA(IN LPCSTR lpPathName)
Definition: path.c:2206
DWORD WINAPI GetTempPathA(IN DWORD nBufferLength, OUT LPSTR lpBuffer)
Definition: path.c:2054
BOOL WINAPI SetupDiInstallClassExA(IN HWND hwndParent OPTIONAL, IN PCSTR InfFileName OPTIONAL, IN DWORD Flags, IN HSPFILEQ FileQueue OPTIONAL, IN CONST GUID *InterfaceClassGuid OPTIONAL, IN PVOID Reserved1, IN PVOID Reserved2)
Definition: devinst.c:3483
HINF WINAPI SetupOpenInfFileA(PCSTR name, PCSTR class, DWORD style, UINT *error)
Definition: parser.c:1139
#define assert(x)
Definition: debug.h:53
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
GLuint res
Definition: glext.h:9613
GLenum GLsizei len
Definition: glext.h:6722
#define INF_STYLE_WIN4
Definition: infsupp.h:41
const char * filename
Definition: ioapi.h:137
int WINAPI lstrlenA(LPCSTR lpString)
Definition: lstring.c:145
#define CREATE_ALWAYS
Definition: disk.h:72
static void create_inf_file(void)
Definition: advpack.c:202
char temp_path[MAX_PATH]
Definition: mspatcha.c:123
#define KEY_ALL_ACCESS
Definition: nt_native.h:1041
#define GENERIC_ALL
Definition: nt_native.h:92
#define DELETE
Definition: nt_native.h:57
#define GENERIC_WRITE
Definition: nt_native.h:90
#define L(x)
Definition: ntvdm.h:50
BOOL WINAPI DeleteService(SC_HANDLE hService)
Definition: scm.c:921
SC_HANDLE WINAPI OpenServiceA(SC_HANDLE hSCManager, LPCSTR lpServiceName, DWORD dwDesiredAccess)
Definition: scm.c:2112
SC_HANDLE WINAPI OpenSCManagerA(LPCSTR lpMachineName, LPCSTR lpDatabaseName, DWORD dwDesiredAccess)
Definition: scm.c:2024
BOOL WINAPI CloseServiceHandle(SC_HANDLE hSCObject)
Definition: scm.c:580
#define ERROR_INVALID_CLASS
Definition: setupapi.h:302
#define DI_QUIETINSTALL
Definition: setupapi.h:68
#define ERROR_BAD_SERVICE_INSTALLSECT
Definition: setupapi.h:319
#define ERROR_SECTION_NOT_FOUND
Definition: setupapi.h:293
STRSAFEAPI StringCbPrintfA(STRSAFE_LPSTR pszDest, size_t cbDest, STRSAFE_LPCSTR pszFormat,...)
Definition: strsafe.h:547
ULONG_PTR SIZE_T
Definition: typedefs.h:80
uint32_t ULONG
Definition: typedefs.h:59
VOID WINAPI SetupCloseInfFile(IN HINF InfHandle)
Definition: infsupp.c:45
int ret
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
#define HKEY_LOCAL_MACHINE
Definition: winreg.h:12
_In_opt_ PETWENABLECALLBACK _In_opt_ PVOID _Out_ PREGHANDLE RegHandle
Definition: wmifuncs.h:78
const char * LPCSTR
Definition: xmlstorage.h:183