xref: /reactos/base/services/audiosrv/services.c (revision 98e8827a)
1 /*
2  * PROJECT:          ReactOS
3  * LICENSE:          GPL - See COPYING in the top level directory
4  * FILE:             base/services/audiosrv/services.c
5  * PURPOSE:          Audio Service Plug and Play
6  * COPYRIGHT:        Copyright 2009 Johannes Anderwald
7  */
8 
9 #include "audiosrv.h"
10 
11 BOOL
12 WaitForService(
13     SC_HANDLE hService,
14     ULONG RetryCount)
15 {
16     ULONG Index = 0;
17     DWORD dwSize;
18     SERVICE_STATUS_PROCESS Info;
19 
20     do
21     {
22         if (!QueryServiceStatusEx(hService, SC_STATUS_PROCESS_INFO, (LPBYTE)&Info, sizeof(SERVICE_STATUS_PROCESS), &dwSize))
23         {
24             logmsg("QueryServiceStatusEx failed %x\n", GetLastError());
25             break;
26         }
27 
28         if (Info.dwCurrentState == SERVICE_RUNNING)
29             return TRUE;
30 
31         Sleep(1000);
32 
33     } while (Index++ < RetryCount);
34 
35     logmsg("Timeout while waiting for service to become ready %p\n", hService);
36 
37     return FALSE;
38 }
39 
40 BOOL
41 StartAudioService(
42     SC_HANDLE hSCManager,
43     LPWSTR ServiceName,
44     ULONG RetryCount)
45 {
46     SC_HANDLE hService;
47     BOOL ret;
48 
49     hService = OpenService(hSCManager, ServiceName, SERVICE_ALL_ACCESS);
50     if (!hService)
51     {
52         logmsg("Failed to open service %S %x\n", ServiceName, GetLastError());
53         return FALSE;
54     }
55 
56     if (!StartService(hService, 0, NULL))
57     {
58         logmsg("Failed to start service %S %x\n", ServiceName, GetLastError());
59         CloseServiceHandle(hService);
60         return FALSE;
61     }
62 
63     ret = WaitForService(hService, RetryCount);
64 
65     CloseServiceHandle(hService);
66     return ret;
67 }
68 
69 BOOL
70 StartSystemAudioServices(VOID)
71 {
72     SC_HANDLE hSCManager;
73 
74     logmsg("Starting system audio services\n");
75 
76     hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_CONNECT);
77     if (!hSCManager)
78     {
79         logmsg("Failed to open service manager %x\n", GetLastError());
80         return FALSE;
81     }
82 
83     logmsg("Starting sysaudio service\n");
84     StartAudioService(hSCManager, L"sysaudio", 20);
85     logmsg("Starting wdmaud service\n");
86     StartAudioService(hSCManager, L"wdmaud", 20);
87 
88     CloseServiceHandle(hSCManager);
89     return TRUE;
90 }
91