ReactOS  0.4.15-dev-5488-ge316d61
install.c
Go to the documentation of this file.
1 /*
2  * ReactOS kernel
3  * Copyright (C) 2005 ReactOS Team
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License along
16  * with this program; if not, write to the Free Software Foundation, Inc.,
17  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18  */
19 /*
20  * COPYRIGHT: See COPYING in the top level directory
21  * PROJECT: ReactOS kernel
22  * FILE: base/services/umpnpmgr/install.c
23  * PURPOSE: Device installer
24  * PROGRAMMER: Eric Kohl (eric.kohl@reactos.org)
25  * HervĂ© Poussineau (hpoussin@reactos.org)
26  * Colin Finck (colin@reactos.org)
27  */
28 
29 /* INCLUDES *****************************************************************/
30 
31 #include "precomp.h"
32 
33 #define NDEBUG
34 #include <debug.h>
35 
36 
37 /* GLOBALS ******************************************************************/
38 
42 
43 /* Device-install event list */
47 
48 DWORD
50  _Out_ PSECURITY_DESCRIPTOR *EventSd);
51 
52 /* FUNCTIONS *****************************************************************/
53 
54 static BOOL
56 {
57  BOOL DeviceInstalled = FALSE;
59  DWORD Value;
60  DWORD ErrCode;
64  PROCESS_INFORMATION ProcessInfo;
65  STARTUPINFOW StartupInfo;
66  UUID RandomUuid;
67  HKEY DeviceKey;
68  SECURITY_ATTRIBUTES EventAttrs;
69  PSECURITY_DESCRIPTOR EventSd;
70 
71  /* The following lengths are constant (see below), they cannot overflow */
72  WCHAR CommandLine[116];
73  WCHAR InstallEventName[73];
74  WCHAR PipeName[74];
75  WCHAR UuidString[39];
76 
77  DPRINT("InstallDevice(%S, %d)\n", DeviceInstance, ShowWizard);
78 
79  ZeroMemory(&ProcessInfo, sizeof(ProcessInfo));
80 
83  0,
85  &DeviceKey) == ERROR_SUCCESS)
86  {
87  if (RegQueryValueExW(DeviceKey,
88  L"Class",
89  NULL,
90  NULL,
91  NULL,
92  NULL) == ERROR_SUCCESS)
93  {
94  DPRINT("No need to install: %S\n", DeviceInstance);
95  RegCloseKey(DeviceKey);
96  return TRUE;
97  }
98 
99  BytesWritten = sizeof(DWORD);
100  if (RegQueryValueExW(DeviceKey,
101  L"ConfigFlags",
102  NULL,
103  NULL,
104  (PBYTE)&Value,
106  {
108  {
109  DPRINT("No need to install: %S\n", DeviceInstance);
110  RegCloseKey(DeviceKey);
111  return TRUE;
112  }
113  }
114 
115  RegCloseKey(DeviceKey);
116  }
117 
118  DPRINT1("Installing: %S\n", DeviceInstance);
119 
120  /* Create a random UUID for the named pipe & event*/
121  UuidCreate(&RandomUuid);
122  swprintf(UuidString, L"{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}",
123  RandomUuid.Data1, RandomUuid.Data2, RandomUuid.Data3,
124  RandomUuid.Data4[0], RandomUuid.Data4[1], RandomUuid.Data4[2],
125  RandomUuid.Data4[3], RandomUuid.Data4[4], RandomUuid.Data4[5],
126  RandomUuid.Data4[6], RandomUuid.Data4[7]);
127 
128  ErrCode = CreatePnpInstallEventSecurity(&EventSd);
129  if (ErrCode != ERROR_SUCCESS)
130  {
131  DPRINT1("CreatePnpInstallEventSecurity failed with error %u\n", GetLastError());
132  return FALSE;
133  }
134 
135  /* Set up the security attributes for the event */
136  EventAttrs.nLength = sizeof(SECURITY_ATTRIBUTES);
137  EventAttrs.lpSecurityDescriptor = EventSd;
138  EventAttrs.bInheritHandle = FALSE;
139 
140  /* Create the event */
141  wcscpy(InstallEventName, L"Global\\PNP_Device_Install_Event_0.");
142  wcscat(InstallEventName, UuidString);
143  hInstallEvent = CreateEventW(&EventAttrs, TRUE, FALSE, InstallEventName);
144  HeapFree(GetProcessHeap(), 0, EventSd);
145  if (!hInstallEvent)
146  {
147  DPRINT1("CreateEventW('%ls') failed with error %lu\n", InstallEventName, GetLastError());
148  goto cleanup;
149  }
150 
151  /* Create the named pipe */
152  wcscpy(PipeName, L"\\\\.\\pipe\\PNP_Device_Install_Pipe_0.");
153  wcscat(PipeName, UuidString);
154  hPipe = CreateNamedPipeW(PipeName, PIPE_ACCESS_OUTBOUND, PIPE_TYPE_BYTE, 1, 512, 512, 0, NULL);
155  if (hPipe == INVALID_HANDLE_VALUE)
156  {
157  DPRINT1("CreateNamedPipeW failed with error %u\n", GetLastError());
158  goto cleanup;
159  }
160 
161  /* Launch rundll32 to call ClientSideInstallW */
162  wcscpy(CommandLine, L"rundll32.exe newdev.dll,ClientSideInstall ");
163  wcscat(CommandLine, PipeName);
164 
165  ZeroMemory(&StartupInfo, sizeof(StartupInfo));
166  StartupInfo.cb = sizeof(StartupInfo);
167 
168  if (hUserToken)
169  {
170  /* newdev has to run under the environment of the current user */
172  {
173  DPRINT1("CreateEnvironmentBlock failed with error %d\n", GetLastError());
174  goto cleanup;
175  }
176 
177  if (!CreateProcessAsUserW(hUserToken, NULL, CommandLine, NULL, NULL, FALSE, CREATE_UNICODE_ENVIRONMENT, Environment, NULL, &StartupInfo, &ProcessInfo))
178  {
179  DPRINT1("CreateProcessAsUserW failed with error %u\n", GetLastError());
180  goto cleanup;
181  }
182  }
183  else
184  {
185  /* FIXME: This is probably not correct, I guess newdev should never be run with SYSTEM privileges.
186 
187  Still, we currently do that in 2nd stage setup and probably Console mode as well, so allow it here.
188  (ShowWizard is only set to FALSE for these two modes) */
189  ASSERT(!ShowWizard);
190 
191  if (!CreateProcessW(NULL, CommandLine, NULL, NULL, FALSE, 0, NULL, NULL, &StartupInfo, &ProcessInfo))
192  {
193  DPRINT1("CreateProcessW failed with error %u\n", GetLastError());
194  goto cleanup;
195  }
196  }
197 
198  /* Wait for the function to connect to our pipe */
199  if (!ConnectNamedPipe(hPipe, NULL))
200  {
202  {
203  DPRINT1("ConnectNamedPipe failed with error %u\n", GetLastError());
204  goto cleanup;
205  }
206  }
207 
208  /* Pass the data. The following output is partly compatible to Windows XP SP2 (researched using a modified newdev.dll to log this stuff) */
209  Value = sizeof(InstallEventName);
210  WriteFile(hPipe, &Value, sizeof(Value), &BytesWritten, NULL);
211  WriteFile(hPipe, InstallEventName, Value, &BytesWritten, NULL);
212 
213  /* I couldn't figure out what the following value means under WinXP. It's usually 0 in my tests, but was also 5 once.
214  Therefore the following line is entirely ReactOS-specific. We use the value here to pass the ShowWizard variable. */
215  WriteFile(hPipe, &ShowWizard, sizeof(ShowWizard), &BytesWritten, NULL);
216 
217  Value = (wcslen(DeviceInstance) + 1) * sizeof(WCHAR);
218  WriteFile(hPipe, &Value, sizeof(Value), &BytesWritten, NULL);
220 
221  /* Wait for newdev.dll to finish processing */
222  WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
223 
224  /* If the event got signalled, this is success */
225  DeviceInstalled = WaitForSingleObject(hInstallEvent, 0) == WAIT_OBJECT_0;
226 
227 cleanup:
228  if (hInstallEvent)
230 
231  if (hPipe != INVALID_HANDLE_VALUE)
232  CloseHandle(hPipe);
233 
234  if (Environment)
236 
237  if (ProcessInfo.hProcess)
238  CloseHandle(ProcessInfo.hProcess);
239 
240  if (ProcessInfo.hThread)
241  CloseHandle(ProcessInfo.hThread);
242 
243  if (!DeviceInstalled)
244  {
245  DPRINT1("InstallDevice failed for DeviceInstance '%ws'\n", DeviceInstance);
246  }
247 
248  return DeviceInstalled;
249 }
250 
251 
252 static LONG
254  IN HKEY hKey,
255  IN LPCWSTR pszKey,
256  OUT LPWSTR* pValue)
257 {
258  LONG rc;
259  DWORD dwType;
260  DWORD cbData = 0;
261  LPWSTR Value;
262 
263  if (!pValue)
265 
266  *pValue = NULL;
267  rc = RegQueryValueExW(hKey, pszKey, NULL, &dwType, NULL, &cbData);
268  if (rc != ERROR_SUCCESS)
269  return rc;
270  if (dwType != REG_SZ)
271  return ERROR_FILE_NOT_FOUND;
272  Value = HeapAlloc(GetProcessHeap(), 0, cbData + sizeof(WCHAR));
273  if (!Value)
275  rc = RegQueryValueExW(hKey, pszKey, NULL, NULL, (LPBYTE)Value, &cbData);
276  if (rc != ERROR_SUCCESS)
277  {
279  return rc;
280  }
281  /* NULL-terminate the string */
282  Value[cbData / sizeof(WCHAR)] = '\0';
283 
284  *pValue = Value;
285  return ERROR_SUCCESS;
286 }
287 
288 
289 BOOL
291 {
292  HKEY hKey = NULL;
293  DWORD regType, active, size;
294  LONG rc;
295  BOOL ret = FALSE;
296 
297  rc = RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SYSTEM\\Setup", 0, KEY_QUERY_VALUE, &hKey);
298  if (rc != ERROR_SUCCESS)
299  goto cleanup;
300 
301  size = sizeof(DWORD);
302  rc = RegQueryValueExW(hKey, L"SystemSetupInProgress", NULL, &regType, (LPBYTE)&active, &size);
303  if (rc != ERROR_SUCCESS)
304  goto cleanup;
305  if (regType != REG_DWORD || size != sizeof(DWORD))
306  goto cleanup;
307 
308  ret = (active != 0);
309 
310 cleanup:
311  if (hKey != NULL)
312  RegCloseKey(hKey);
313 
314  DPRINT("System setup in progress? %S\n", ret ? L"YES" : L"NO");
315 
316  return ret;
317 }
318 
319 
339 DWORD
341  _Out_ PSECURITY_DESCRIPTOR *EventSd)
342 {
343  DWORD ErrCode;
344  PACL Dacl;
345  ULONG DaclSize;
346  SECURITY_DESCRIPTOR AbsoluteSd;
347  ULONG Size = 0;
348  PSECURITY_DESCRIPTOR RelativeSd = NULL;
349  PSID SystemSid = NULL, AdminsSid = NULL;
351 
353  1,
355  0, 0, 0, 0, 0, 0, 0,
356  &SystemSid))
357  {
358  return GetLastError();
359  }
360 
362  2,
365  0, 0, 0, 0, 0, 0,
366  &AdminsSid))
367  {
368  ErrCode = GetLastError();
369  goto Quit;
370  }
371 
372  DaclSize = sizeof(ACL) +
373  sizeof(ACCESS_ALLOWED_ACE) + GetLengthSid(SystemSid) +
374  sizeof(ACCESS_ALLOWED_ACE) + GetLengthSid(AdminsSid);
375 
377  if (!Dacl)
378  {
379  ErrCode = ERROR_OUTOFMEMORY;
380  goto Quit;
381  }
382 
384  {
385  ErrCode = GetLastError();
386  goto Quit;
387  }
388 
390  ACL_REVISION,
392  SystemSid))
393  {
394  ErrCode = GetLastError();
395  goto Quit;
396  }
397 
399  ACL_REVISION,
401  AdminsSid))
402  {
403  ErrCode = GetLastError();
404  goto Quit;
405  }
406 
408  {
409  ErrCode = GetLastError();
410  goto Quit;
411  }
412 
413  if (!SetSecurityDescriptorDacl(&AbsoluteSd, TRUE, Dacl, FALSE))
414  {
415  ErrCode = GetLastError();
416  goto Quit;
417  }
418 
419  if (!SetSecurityDescriptorOwner(&AbsoluteSd, SystemSid, FALSE))
420  {
421  ErrCode = GetLastError();
422  goto Quit;
423  }
424 
425  if (!SetSecurityDescriptorGroup(&AbsoluteSd, AdminsSid, FALSE))
426  {
427  ErrCode = GetLastError();
428  goto Quit;
429  }
430 
432  {
433  RelativeSd = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, Size);
434  if (RelativeSd == NULL)
435  {
436  ErrCode = ERROR_OUTOFMEMORY;
437  goto Quit;
438  }
439 
440  if (!MakeSelfRelativeSD(&AbsoluteSd, RelativeSd, &Size))
441  {
442  ErrCode = GetLastError();
443  goto Quit;
444  }
445  }
446 
447  *EventSd = RelativeSd;
448  ErrCode = ERROR_SUCCESS;
449 
450 Quit:
451  if (SystemSid)
452  {
453  FreeSid(SystemSid);
454  }
455 
456  if (AdminsSid)
457  {
458  FreeSid(AdminsSid);
459  }
460 
461  if (Dacl)
462  {
464  }
465 
466  if (ErrCode != ERROR_SUCCESS)
467  {
468  if (RelativeSd)
469  {
470  HeapFree(GetProcessHeap(), 0, RelativeSd);
471  }
472  }
473 
474  return ErrCode;
475 }
476 
477 
478 static BOOL
480 {
481  HKEY ControlKey = NULL;
482  LPWSTR SystemStartOptions = NULL;
483  LPWSTR CurrentOption, NextOption; /* Pointers into SystemStartOptions */
484  BOOL ConsoleBoot = FALSE;
485  LONG rc;
486 
487  rc = RegOpenKeyExW(
489  L"SYSTEM\\CurrentControlSet\\Control",
490  0,
492  &ControlKey);
493 
494  rc = ReadRegSzKey(ControlKey, L"SystemStartOptions", &SystemStartOptions);
495  if (rc != ERROR_SUCCESS)
496  goto cleanup;
497 
498  /* Check for CONSOLE switch in SystemStartOptions */
499  CurrentOption = SystemStartOptions;
500  while (CurrentOption)
501  {
502  NextOption = wcschr(CurrentOption, L' ');
503  if (NextOption)
504  *NextOption = L'\0';
505  if (_wcsicmp(CurrentOption, L"CONSOLE") == 0)
506  {
507  DPRINT("Found %S. Switching to console boot\n", CurrentOption);
508  ConsoleBoot = TRUE;
509  goto cleanup;
510  }
511  CurrentOption = NextOption ? NextOption + 1 : NULL;
512  }
513 
514 cleanup:
515  if (ControlKey != NULL)
516  RegCloseKey(ControlKey);
517  HeapFree(GetProcessHeap(), 0, SystemStartOptions);
518  return ConsoleBoot;
519 }
520 
521 
523 BOOL
525 {
526  /* Display the newdev.dll wizard UI only if it's allowed */
528 }
529 
530 
531 /* Loop to install all queued devices installations */
532 DWORD
533 WINAPI
535 {
536  PLIST_ENTRY ListEntry;
538 
539  UNREFERENCED_PARAMETER(lpParameter);
540 
541  // Step 1: install all drivers which were configured during the boot
542 
543  DPRINT("Step 1: Installing devices configured during the boot\n");
544 
545  PWSTR deviceList;
546 
547  while (TRUE)
548  {
549  ULONG devListSize;
550  DWORD status = PNP_GetDeviceListSize(NULL, NULL, &devListSize, 0);
551  if (status != CR_SUCCESS)
552  {
553  goto Step2;
554  }
555 
556  deviceList = HeapAlloc(GetProcessHeap(), 0, devListSize * sizeof(WCHAR));
557  if (!deviceList)
558  {
559  goto Step2;
560  }
561 
562  status = PNP_GetDeviceList(NULL, NULL, deviceList, &devListSize, 0);
563  if (status == CR_BUFFER_SMALL)
564  {
565  HeapFree(GetProcessHeap(), 0, deviceList);
566  }
567  else if (status != CR_SUCCESS)
568  {
569  DPRINT1("PNP_GetDeviceList failed with error %u\n", status);
570  goto Cleanup;
571  }
572  else // status == CR_SUCCESS
573  {
574  break;
575  }
576  }
577 
578  for (PWSTR currentDev = deviceList;
579  currentDev[0] != UNICODE_NULL;
580  currentDev += lstrlenW(currentDev) + 1)
581  {
582  InstallDevice(currentDev, FALSE);
583  }
584 
585 Cleanup:
586  HeapFree(GetProcessHeap(), 0, deviceList);
587 
588  // Step 2: start the wait-loop for newly added devices
589 Step2:
590 
591  DPRINT("Step 2: Starting the wait-loop\n");
592 
594 
595  BOOL showWizard = !SetupIsActive() && !IsConsoleBoot();
596 
597  while (TRUE)
598  {
599  /* Dequeue the next oldest device-install event */
601  ListEntry = (IsListEmpty(&DeviceInstallListHead)
604 
605  if (ListEntry == NULL)
606  {
609  }
610  else
611  {
613  Params = CONTAINING_RECORD(ListEntry, DeviceInstallParams, ListEntry);
614  InstallDevice(Params->DeviceIds, showWizard && !IsUISuppressionAllowed());
616  }
617  }
618 
619  return 0;
620 }
static HANDLE DWORD
Definition: install.c:28
_Must_inspect_result_ _In_ WDFIOTARGET _In_opt_ WDFREQUEST _In_opt_ PWDF_MEMORY_DESCRIPTOR _In_opt_ PLONGLONG _In_opt_ PWDF_REQUEST_SEND_OPTIONS _Out_opt_ PULONG_PTR BytesWritten
Definition: wdfiotarget.h:949
#define ERROR_INVALID_PARAMETER
Definition: compat.h:101
DWORD size
Definition: install.c:3757
BOOL WINAPI WriteFile(IN HANDLE hFile, IN LPCVOID lpBuffer, IN DWORD nNumberOfBytesToWrite OPTIONAL, OUT LPDWORD lpNumberOfBytesWritten, IN LPOVERLAPPED lpOverlapped OPTIONAL)
Definition: rw.c:24
const uint16_t * PCWSTR
Definition: typedefs.h:57
PVOID PVOID PWCHAR PVOID Environment
Definition: env.c:47
#define IN
Definition: typedefs.h:39
#define SECURITY_LOCAL_SYSTEM_RID
Definition: setypes.h:574
#define CloseHandle
Definition: compat.h:739
BOOL WINAPI MakeSelfRelativeSD(PSECURITY_DESCRIPTOR pAbsoluteSecurityDescriptor, PSECURITY_DESCRIPTOR pSelfRelativeSecurityDescriptor, LPDWORD lpdwBufferLength)
Definition: sec.c:214
BOOL WINAPI SetSecurityDescriptorDacl(PSECURITY_DESCRIPTOR pSecurityDescriptor, BOOL bDaclPresent, PACL pDacl, BOOL bDaclDefaulted)
Definition: sec.c:262
#define ERROR_SUCCESS
Definition: deptool.c:10
_In_ WDFIOTARGET _In_ PWDF_REQUEST_COMPLETION_PARAMS Params
Definition: wdfrequest.h:306
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
BOOL WINAPI InitializeAcl(PACL pAcl, DWORD nAclLength, DWORD dwAclRevision)
Definition: security.c:1008
#define CREATE_UNICODE_ENVIRONMENT
Definition: winbase.h:186
#define _Out_
Definition: ms_sal.h:345
#define TRUE
Definition: types.h:120
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:317
uint16_t * PWSTR
Definition: typedefs.h:56
HANDLE hInstallEvent
Definition: install.c:40
BOOL WINAPI InitializeSecurityDescriptor(PSECURITY_DESCRIPTOR pSecurityDescriptor, DWORD dwRevision)
Definition: security.c:931
PWCHAR pValue
BOOL WINAPI AddAccessAllowedAce(PACL pAcl, DWORD dwAceRevision, DWORD AccessMask, PSID pSid)
Definition: security.c:1041
#define ERROR_NOT_ENOUGH_MEMORY
Definition: dderror.h:7
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
IN PVOID IN PVOID IN USHORT IN USHORT Size
Definition: pci.h:361
BOOL WINAPI DECLSPEC_HOTPATCH SetEvent(IN HANDLE hEvent)
Definition: synch.c:733
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1040
#define ZeroMemory
Definition: winbase.h:1670
struct _ACCESS_ALLOWED_ACE ACCESS_ALLOWED_ACE
LIST_ENTRY DeviceInstallListHead
Definition: install.c:45
static BOOL InstallDevice(PCWSTR DeviceInstance, BOOL ShowWizard)
Definition: install.c:55
BOOL WINAPI CreateEnvironmentBlock(OUT LPVOID *lpEnvironment, IN HANDLE hToken, IN BOOL bInherit)
Definition: environment.c:505
#define lstrlenW
Definition: compat.h:750
_Must_inspect_result_ FORCEINLINE BOOLEAN IsListEmpty(_In_ const LIST_ENTRY *ListHead)
Definition: rtlfuncs.h:57
FORCEINLINE BOOL IsUISuppressionAllowed(VOID)
Definition: install.c:524
HANDLE WINAPI DECLSPEC_HOTPATCH CreateEventW(IN LPSECURITY_ATTRIBUTES lpEventAttributes OPTIONAL, IN BOOL bManualReset, IN BOOL bInitialState, IN LPCWSTR lpName OPTIONAL)
Definition: synch.c:651
BOOL WINAPI SetSecurityDescriptorOwner(PSECURITY_DESCRIPTOR pSecurityDescriptor, PSID pOwner, BOOL bOwnerDefaulted)
Definition: sec.c:312
static BOOL IsConsoleBoot(VOID)
Definition: install.c:479
#define SECURITY_DESCRIPTOR_REVISION
Definition: setypes.h:58
static LONG ReadRegSzKey(IN HKEY hKey, IN LPCWSTR pszKey, OUT LPWSTR *pValue)
Definition: install.c:253
DWORD WINAPI WaitForSingleObject(IN HANDLE hHandle, IN DWORD dwMilliseconds)
Definition: synch.c:82
#define L(x)
Definition: ntvdm.h:50
unsigned char * LPBYTE
Definition: typedefs.h:53
#define FALSE
Definition: types.h:117
#define UNICODE_NULL
unsigned int BOOL
Definition: ntddk_ex.h:94
long LONG
Definition: pedump.c:60
#define EVENT_ALL_ACCESS
Definition: isotest.c:82
PVOID WINAPI FreeSid(PSID pSid)
Definition: security.c:700
#define PIPE_TYPE_BYTE
Definition: winbase.h:167
#define CR_SUCCESS
Definition: cfgmgr32.h:842
BOOL WINAPI SetSecurityDescriptorGroup(PSECURITY_DESCRIPTOR pSecurityDescriptor, PSID pGroup, BOOL bGroupDefaulted)
Definition: sec.c:288
struct _ACL ACL
FORCEINLINE PLIST_ENTRY RemoveHeadList(_Inout_ PLIST_ENTRY ListHead)
Definition: rtlfuncs.h:128
HANDLE hNoPendingInstalls
Definition: install.c:41
#define ERROR_FILE_NOT_FOUND
Definition: disk.h:79
#define SECURITY_NT_AUTHORITY
Definition: setypes.h:554
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
Definition: Messaging.c:560
BOOL WINAPI DECLSPEC_HOTPATCH CreateProcessW(LPCWSTR lpApplicationName, LPWSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes, LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, DWORD dwCreationFlags, LPVOID lpEnvironment, LPCWSTR lpCurrentDirectory, LPSTARTUPINFOW lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation)
Definition: proc.c:4594
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _Out_opt_ PUSHORT _Inout_opt_ PUNICODE_STRING Value
Definition: wdfregistry.h:406
HANDLE hUserToken
Definition: install.c:39
#define WAIT_OBJECT_0
Definition: winbase.h:406
GLsizeiptr size
Definition: glext.h:5919
#define GetProcessHeap()
Definition: compat.h:736
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
DWORD cb
Definition: winbase.h:852
#define SECURITY_BUILTIN_DOMAIN_RID
Definition: setypes.h:581
_CONST_RETURN wchar_t *__cdecl wcschr(_In_z_ const wchar_t *_Str, wchar_t _Ch)
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
Definition: reg.c:4120
#define ASSERT(a)
Definition: mode.c:44
BOOL SetupIsActive(VOID)
Definition: install.c:290
__wchar_t WCHAR
Definition: xmlstorage.h:180
DWORD WINAPI GetLengthSid(PSID pSid)
Definition: security.c:921
#define CR_BUFFER_SMALL
Definition: cfgmgr32.h:872
#define WINAPI
Definition: msvc.h:6
unsigned long DWORD
Definition: ntddk_ex.h:95
#define PIPE_ACCESS_OUTBOUND
Definition: winbase.h:166
HKEY hEnumKey
Definition: umpnpmgr.c:44
BOOL WINAPI DECLSPEC_HOTPATCH ReleaseMutex(IN HANDLE hMutex)
Definition: synch.c:618
_Out_writes_bytes_to_opt_ AbsoluteSecurityDescriptorSize PSECURITY_DESCRIPTOR _Inout_ PULONG _Out_writes_bytes_to_opt_ DaclSize PACL Dacl
Definition: rtlfuncs.h:1593
int ret
_CRTIMP wchar_t *__cdecl wcscpy(_Out_writes_z_(_String_length_(_Source)+1) wchar_t *_Dest, _In_z_ const wchar_t *_Source)
static SID_IDENTIFIER_AUTHORITY NtAuthority
Definition: security.c:40
BOOL WINAPI DestroyEnvironmentBlock(IN LPVOID lpEnvironment)
Definition: environment.c:727
#define ERROR_PIPE_CONNECTED
Definition: winerror.h:352
BOOL g_IsUISuppressed
Definition: umpnpmgr.c:46
_In_ PNDIS_STRING DeviceInstance
Definition: ndis.h:5202
Definition: typedefs.h:119
static const WCHAR Cleanup[]
Definition: register.c:80
int _cdecl swprintf(const WCHAR *,...)
HANDLE hDeviceInstallListNotEmpty
Definition: install.c:46
BOOL WINAPI DECLSPEC_HOTPATCH CreateProcessAsUserW(_In_opt_ HANDLE hToken, _In_opt_ LPCWSTR lpApplicationName, _Inout_opt_ LPWSTR lpCommandLine, _In_opt_ LPSECURITY_ATTRIBUTES lpProcessAttributes, _In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes, _In_ BOOL bInheritHandles, _In_ DWORD dwCreationFlags, _In_opt_ LPVOID lpEnvironment, _In_opt_ LPCWSTR lpCurrentDirectory, _In_ LPSTARTUPINFOW lpStartupInfo, _Out_ LPPROCESS_INFORMATION lpProcessInformation)
Definition: logon.c:993
DWORD WINAPI PNP_GetDeviceList(handle_t hBinding, LPWSTR pszFilter, LPWSTR Buffer, PNP_RPC_STRING_LEN *pulLength, DWORD ulFlags)
Definition: rpcserver.c:1272
DWORD WINAPI PNP_GetDeviceListSize(handle_t hBinding, LPWSTR pszFilter, PNP_RPC_BUFFER_SIZE *pulLength, DWORD ulFlags)
Definition: rpcserver.c:1643
RPC_STATUS WINAPI UuidCreate(UUID *Uuid)
Definition: rpcrt4_main.c:303
LPVOID lpSecurityDescriptor
Definition: compat.h:193
FxAutoRegKey hKey
DWORD CreatePnpInstallEventSecurity(_Out_ PSECURITY_DESCRIPTOR *EventSd)
Creates a security descriptor for the PnP event installation.
Definition: install.c:340
#define KEY_QUERY_VALUE
Definition: nt_native.h:1016
#define FORCEINLINE
Definition: wdftypes.h:67
_CRTIMP wchar_t *__cdecl wcscat(_Inout_updates_z_(_String_length_(_Dest)+_String_length_(_Source)+1) wchar_t *_Dest, _In_z_ const wchar_t *_Source)
#define NULL
Definition: types.h:112
#define HEAP_ZERO_MEMORY
Definition: compat.h:134
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
BOOL WINAPI DECLSPEC_HOTPATCH ResetEvent(IN HANDLE hEvent)
Definition: synch.c:714
#define DPRINT1
Definition: precomp.h:8
BOOL GetSuppressNewUIValue(VOID)
Definition: umpnpmgr.c:338
_Out_writes_bytes_to_opt_ AbsoluteSecurityDescriptorSize PSECURITY_DESCRIPTOR _Inout_ PULONG _Out_writes_bytes_to_opt_ DaclSize PACL _Inout_ PULONG DaclSize
Definition: rtlfuncs.h:1593
#define ACL_REVISION
Definition: setypes.h:39
#define OUT
Definition: typedefs.h:40
unsigned int ULONG
Definition: retypes.h:1
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
Definition: reg.c:3356
char * cleanup(char *str)
Definition: wpickclick.c:99
#define DPRINT
Definition: sndvol32.h:71
WCHAR * LPWSTR
Definition: xmlstorage.h:184
HANDLE WINAPI CreateNamedPipeW(LPCWSTR lpName, DWORD dwOpenMode, DWORD dwPipeMode, DWORD nMaxInstances, DWORD nOutBufferSize, DWORD nInBufferSize, DWORD nDefaultTimeOut, LPSECURITY_ATTRIBUTES lpSecurityAttributes)
Definition: npipe.c:246
HANDLE hDeviceInstallListMutex
Definition: install.c:44
#define INFINITE
Definition: serial.h:102
#define REG_DWORD
Definition: sdbapi.c:596
DWORD WINAPI DeviceInstallThread(LPVOID lpParameter)
Definition: install.c:534
#define DOMAIN_ALIAS_RID_ADMINS
Definition: setypes.h:652
BOOL WINAPI ConnectNamedPipe(IN HANDLE hNamedPipe, IN LPOVERLAPPED lpOverlapped)
Definition: npipe.c:701
BYTE * PBYTE
Definition: pedump.c:66
#define HeapFree(x, y, z)
Definition: compat.h:735
#define RegCloseKey(hKey)
Definition: registry.h:47
_Check_return_ _CRTIMP int __cdecl _wcsicmp(_In_z_ const wchar_t *_Str1, _In_z_ const wchar_t *_Str2)
#define CONFIGFLAG_FAILEDINSTALL
Definition: regstr.h:396
static char * NextOption(const char *const ostr)
Definition: getopt.c:31
#define ERROR_OUTOFMEMORY
Definition: deptool.c:13
struct _SECURITY_ATTRIBUTES SECURITY_ATTRIBUTES
BOOL WINAPI AllocateAndInitializeSid(PSID_IDENTIFIER_AUTHORITY pIdentifierAuthority, BYTE nSubAuthorityCount, DWORD nSubAuthority0, DWORD nSubAuthority1, DWORD nSubAuthority2, DWORD nSubAuthority3, DWORD nSubAuthority4, DWORD nSubAuthority5, DWORD nSubAuthority6, DWORD nSubAuthority7, PSID *pSid)
Definition: security.c:676
#define HKEY_LOCAL_MACHINE
Definition: winreg.h:12
#define ERROR_INSUFFICIENT_BUFFER
Definition: dderror.h:10
#define REG_SZ
Definition: layer.c:22
Definition: ps.c:97