|
|
1.1 root 1: /*++ BUILD Version: 0009 // Increment this if a change has global effects
2:
3: Copyright (c) 1992 Microsoft Corporation
4:
5: Module Name:
6:
7: winsvc.h
8:
9: Abstract:
10:
11: Header file for the Service Control Manager
12:
13: Author:
14:
15: Dan Lafferty (danl) 19-Jan-1992
16:
17: Environment:
18:
19: User Mode - Win32
20:
21: Revision History:
22:
23: 19-Jan-1992 danl
24: Created
25:
26: --*/
27: #ifndef _WINSVC_
28: #define _WINSVC_
29:
30: //
31: // Constants
32: //
33:
34: //
35: // Service database names
36: //
37:
38: #define SERVICES_ACTIVE_DATABASEW L"ServicesActive"
39: #define SERVICES_FAILED_DATABASEW L"ServicesFailed"
40:
41: #define SERVICES_ACTIVE_DATABASEA "ServicesActive"
42: #define SERVICES_FAILED_DATABASEA "ServicesFailed"
43:
1.1.1.2 ! root 44: //
! 45: // Character to designate that a name is a group
! 46: //
! 47:
! 48: #define SC_GROUP_IDENTIFIERW L'+'
! 49: #define SC_GROUP_IDENTIFIERA '+'
! 50:
1.1 root 51: #ifdef UNICODE
52:
53: #define SERVICES_ACTIVE_DATABASE SERVICES_ACTIVE_DATABASEW
54: #define SERVICES_FAILED_DATABASE SERVICES_FAILED_DATABASEW
55:
1.1.1.2 ! root 56:
! 57: #define SC_GROUP_IDENTIFIER SC_GROUP_IDENTIFIERW
! 58:
1.1 root 59: #else // ndef UNICODE
60:
61: #define SERVICES_ACTIVE_DATABASE SERVICES_ACTIVE_DATABASEA
62: #define SERVICES_FAILED_DATABASE SERVICES_FAILED_DATABASEA
63:
1.1.1.2 ! root 64: #define SC_GROUP_IDENTIFIER SC_GROUP_IDENTIFIERA
1.1 root 65: #endif // ndef UNICODE
66:
1.1.1.2 ! root 67:
1.1 root 68: //
69: // Value to indicate no change to an optional parameter
70: //
71: #define SERVICE_NO_CHANGE 0xffffffff
72:
73: //
74: // Service State -- for Enum Requests (Bit Mask)
75: //
76: #define SERVICE_ACTIVE 0x00000001
77: #define SERVICE_INACTIVE 0x00000002
78: #define SERVICE_STATE_ALL (SERVICE_ACTIVE | \
79: SERVICE_INACTIVE)
80:
81: //
82: // Controls
83: //
84: #define SERVICE_CONTROL_STOP 0x00000001
85: #define SERVICE_CONTROL_PAUSE 0x00000002
86: #define SERVICE_CONTROL_CONTINUE 0x00000003
87: #define SERVICE_CONTROL_INTERROGATE 0x00000004
1.1.1.2 ! root 88: #define SERVICE_CONTROL_SHUTDOWN 0x00000005
1.1 root 89:
90: //
91: // Service State -- for CurrentState
92: //
93: #define SERVICE_STOPPED 0x00000001
94: #define SERVICE_START_PENDING 0x00000002
95: #define SERVICE_STOP_PENDING 0x00000003
96: #define SERVICE_RUNNING 0x00000004
97: #define SERVICE_CONTINUE_PENDING 0x00000005
98: #define SERVICE_PAUSE_PENDING 0x00000006
99: #define SERVICE_PAUSED 0x00000007
100:
101: //
102: // Controls Accepted (Bit Mask)
103: //
104: #define SERVICE_ACCEPT_STOP 0x00000001
105: #define SERVICE_ACCEPT_PAUSE_CONTINUE 0x00000002
1.1.1.2 ! root 106: #define SERVICE_ACCEPT_SHUTDOWN 0x00000004
1.1 root 107:
108: //
109: // Service Control Manager object specific access types
110: //
111: #define SC_MANAGER_CONNECT 0x0001
112: #define SC_MANAGER_CREATE_SERVICE 0x0002
113: #define SC_MANAGER_ENUMERATE_SERVICE 0x0004
114: #define SC_MANAGER_LOCK 0x0008
115: #define SC_MANAGER_QUERY_LOCK_STATUS 0x0010
116: #define SC_MANAGER_MODIFY_BOOT_CONFIG 0x0020
117:
118: #define SC_MANAGER_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | \
119: SC_MANAGER_CONNECT | \
120: SC_MANAGER_CREATE_SERVICE | \
121: SC_MANAGER_ENUMERATE_SERVICE | \
122: SC_MANAGER_LOCK | \
123: SC_MANAGER_QUERY_LOCK_STATUS | \
124: SC_MANAGER_MODIFY_BOOT_CONFIG)
125:
126:
127:
128: //
129: // Service object specific access type
130: //
131: #define SERVICE_QUERY_CONFIG 0x0001
132: #define SERVICE_CHANGE_CONFIG 0x0002
133: #define SERVICE_QUERY_STATUS 0x0004
134: #define SERVICE_ENUMERATE_DEPENDENTS 0x0008
135: #define SERVICE_START 0x0010
136: #define SERVICE_STOP 0x0020
137: #define SERVICE_PAUSE_CONTINUE 0x0040
138: #define SERVICE_INTERROGATE 0x0080
1.1.1.2 ! root 139: #define SERVICE_USER_DEFINED_CONTROL 0x0100
1.1 root 140:
141: #define SERVICE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | \
142: SERVICE_QUERY_CONFIG | \
143: SERVICE_CHANGE_CONFIG | \
144: SERVICE_QUERY_STATUS | \
145: SERVICE_ENUMERATE_DEPENDENTS | \
146: SERVICE_START | \
147: SERVICE_STOP | \
148: SERVICE_PAUSE_CONTINUE | \
1.1.1.2 ! root 149: SERVICE_INTERROGATE | \
! 150: SERVICE_USER_DEFINED_CONTROL)
1.1 root 151:
152:
153: //
154: // Handle Types
155: //
156:
157: typedef HANDLE SC_HANDLE;
158: typedef SC_HANDLE *LPSC_HANDLE;
159:
160: typedef DWORD SERVICE_STATUS_HANDLE;
161:
162: //
163: // Service Status Structure
164: //
165:
166: typedef struct _SERVICE_STATUS {
167: DWORD dwServiceType;
168: DWORD dwCurrentState;
169: DWORD dwControlsAccepted;
170: DWORD dwWin32ExitCode;
171: DWORD dwServiceSpecificExitCode;
172: DWORD dwCheckPoint;
173: DWORD dwWaitHint;
174: } SERVICE_STATUS, *LPSERVICE_STATUS;
175:
176:
177:
178: //
179: // Service Status Enumeration Structure
180: //
181:
182: typedef struct _ENUM_SERVICE_STATUSA {
183: LPSTR lpServiceName;
184: SERVICE_STATUS ServiceStatus;
185: } ENUM_SERVICE_STATUSA, *LPENUM_SERVICE_STATUSA;
186: typedef struct _ENUM_SERVICE_STATUSW {
187: LPWSTR lpServiceName;
188: SERVICE_STATUS ServiceStatus;
189: } ENUM_SERVICE_STATUSW, *LPENUM_SERVICE_STATUSW;
190: #ifdef UNICODE
191: #define ENUM_SERVICE_STATUS ENUM_SERVICE_STATUSW
192: #define LPENUM_SERVICE_STATUS LPENUM_SERVICE_STATUSW
193: #else
194: #define ENUM_SERVICE_STATUS ENUM_SERVICE_STATUSA
195: #define LPENUM_SERVICE_STATUS LPENUM_SERVICE_STATUSA
196: #endif // UNICODE
197:
198:
199: //
200: // Structures for the Lock API functions
201: //
202:
203: typedef LPVOID SC_LOCK;
204:
205: typedef struct _QUERY_SERVICE_LOCK_STATUSA {
206: DWORD fIsLocked;
207: LPSTR lpLockOwner;
208: DWORD dwLockDuration;
209: } QUERY_SERVICE_LOCK_STATUSA, *LPQUERY_SERVICE_LOCK_STATUSA;
210: typedef struct _QUERY_SERVICE_LOCK_STATUSW {
211: DWORD fIsLocked;
212: LPWSTR lpLockOwner;
213: DWORD dwLockDuration;
214: } QUERY_SERVICE_LOCK_STATUSW, *LPQUERY_SERVICE_LOCK_STATUSW;
215: #ifdef UNICODE
216: #define QUERY_SERVICE_LOCK_STATUS QUERY_SERVICE_LOCK_STATUSW
217: #define LPQUERY_SERVICE_LOCK_STATUS LPQUERY_SERVICE_LOCK_STATUSW
218: #else
219: #define QUERY_SERVICE_LOCK_STATUS QUERY_SERVICE_LOCK_STATUSA
220: #define LPQUERY_SERVICE_LOCK_STATUS LPQUERY_SERVICE_LOCK_STATUSA
221: #endif // UNICODE
222:
223:
224:
225: //
226: // Query Service Configuration Structure
227: //
228:
229: typedef struct _QUERY_SERVICE_CONFIGA {
230: DWORD dwServiceType;
231: DWORD dwStartType;
232: DWORD dwErrorControl;
233: LPSTR lpBinaryPathName;
234: LPSTR lpLoadOrderGroup;
1.1.1.2 ! root 235: DWORD dwTagId;
1.1 root 236: LPSTR lpDependencies;
237: LPSTR lpServiceStartName;
238: } QUERY_SERVICE_CONFIGA, *LPQUERY_SERVICE_CONFIGA;
239: typedef struct _QUERY_SERVICE_CONFIGW {
240: DWORD dwServiceType;
241: DWORD dwStartType;
242: DWORD dwErrorControl;
243: LPWSTR lpBinaryPathName;
244: LPWSTR lpLoadOrderGroup;
1.1.1.2 ! root 245: DWORD dwTagId;
1.1 root 246: LPWSTR lpDependencies;
247: LPWSTR lpServiceStartName;
248: } QUERY_SERVICE_CONFIGW, *LPQUERY_SERVICE_CONFIGW;
249: #ifdef UNICODE
250: #define QUERY_SERVICE_CONFIG QUERY_SERVICE_CONFIGW
251: #define LPQUERY_SERVICE_CONFIG LPQUERY_SERVICE_CONFIGW
252: #else
253: #define QUERY_SERVICE_CONFIG QUERY_SERVICE_CONFIGA
254: #define LPQUERY_SERVICE_CONFIG LPQUERY_SERVICE_CONFIGA
255: #endif // UNICODE
256:
257:
258:
259: //
260: // Function Prototype for the Service Main Function
261: //
262:
263: typedef VOID (*LPSERVICE_MAIN_FUNCTIONW)(
264: DWORD dwNumServicesArgs,
265: LPWSTR *lpServiceArgVectors
266: );
267:
268: typedef VOID (*LPSERVICE_MAIN_FUNCTIONA)(
269: DWORD dwNumServicesArgs,
270: LPSTR *lpServiceArgVectors
271: );
272:
273: #ifdef UNICODE
274: #define LPSERVICE_MAIN_FUNCTION LPSERVICE_MAIN_FUNCTIONW
275: #else
276: #define LPSERVICE_MAIN_FUNCTION LPSERVICE_MAIN_FUNCTIONA
277: #endif //UNICODE
278:
279:
280: //
281: // Service Start Table
282: //
283:
284: typedef struct _SERVICE_TABLE_ENTRYA {
285: LPSTR lpServiceName;
286: LPSERVICE_MAIN_FUNCTIONA lpServiceProc;
287: }SERVICE_TABLE_ENTRYA, *LPSERVICE_TABLE_ENTRYA;
288: typedef struct _SERVICE_TABLE_ENTRYW {
289: LPWSTR lpServiceName;
290: LPSERVICE_MAIN_FUNCTIONW lpServiceProc;
291: }SERVICE_TABLE_ENTRYW, *LPSERVICE_TABLE_ENTRYW;
292: #ifdef UNICODE
293: #define SERVICE_TABLE_ENTRY SERVICE_TABLE_ENTRYW
294: #define LPSERVICE_TABLE_ENTRY LPSERVICE_TABLE_ENTRYW
295: #else
296: #define SERVICE_TABLE_ENTRY SERVICE_TABLE_ENTRYA
297: #define LPSERVICE_TABLE_ENTRY LPSERVICE_TABLE_ENTRYA
298: #endif // UNICODE
299:
300: //
301: // Prototype for the Service Control Handler Function
302: //
303:
304: typedef VOID (*LPHANDLER_FUNCTION)(
305: DWORD dwControl
306: );
307:
308:
309:
310: ///////////////////////////////////////////////////////////////////////////
311: // API Function Prototypes
312: ///////////////////////////////////////////////////////////////////////////
313:
314: BOOL
315: WINAPI
316: ChangeServiceConfigA(
317: SC_HANDLE hService,
318: DWORD dwServiceType,
319: DWORD dwStartType,
320: DWORD dwErrorControl,
321: LPCSTR lpBinaryPathName,
322: LPCSTR lpLoadOrderGroup,
1.1.1.2 ! root 323: LPDWORD lpdwTagId,
1.1 root 324: LPCSTR lpDependencies,
325: LPCSTR lpServiceStartName,
326: LPCSTR lpPassword
327: );
328: BOOL
329: WINAPI
330: ChangeServiceConfigW(
331: SC_HANDLE hService,
332: DWORD dwServiceType,
333: DWORD dwStartType,
334: DWORD dwErrorControl,
335: LPCWSTR lpBinaryPathName,
336: LPCWSTR lpLoadOrderGroup,
1.1.1.2 ! root 337: LPDWORD lpdwTagId,
1.1 root 338: LPCWSTR lpDependencies,
339: LPCWSTR lpServiceStartName,
340: LPCWSTR lpPassword
341: );
342: #ifdef UNICODE
343: #define ChangeServiceConfig ChangeServiceConfigW
344: #else
345: #define ChangeServiceConfig ChangeServiceConfigA
346: #endif // !UNICODE
347:
348: BOOL
349: WINAPI
350: CloseServiceHandle(
351: SC_HANDLE hSCObject
352: );
353:
354: BOOL
355: WINAPI
356: ControlService(
357: SC_HANDLE hService,
358: DWORD dwControl,
359: LPSERVICE_STATUS lpServiceStatus
360: );
361:
362: SC_HANDLE
363: WINAPI
364: CreateServiceA(
365: SC_HANDLE hSCManager,
366: LPCSTR lpServiceName,
367: DWORD dwDesiredAccess,
368: DWORD dwServiceType,
369: DWORD dwStartType,
370: DWORD dwErrorControl,
371: LPCSTR lpBinaryPathName,
372: LPCSTR lpLoadOrderGroup,
1.1.1.2 ! root 373: LPDWORD lpdwTagId,
1.1 root 374: LPCSTR lpDependencies,
375: LPCSTR lpServiceStartName,
376: LPCSTR lpPassword
377: );
378: SC_HANDLE
379: WINAPI
380: CreateServiceW(
381: SC_HANDLE hSCManager,
382: LPCWSTR lpServiceName,
383: DWORD dwDesiredAccess,
384: DWORD dwServiceType,
385: DWORD dwStartType,
386: DWORD dwErrorControl,
387: LPCWSTR lpBinaryPathName,
388: LPCWSTR lpLoadOrderGroup,
1.1.1.2 ! root 389: LPDWORD lpdwTagId,
1.1 root 390: LPCWSTR lpDependencies,
391: LPCWSTR lpServiceStartName,
392: LPCWSTR lpPassword
393: );
394: #ifdef UNICODE
395: #define CreateService CreateServiceW
396: #else
397: #define CreateService CreateServiceA
398: #endif // !UNICODE
399:
400: BOOL
401: WINAPI
402: DeleteService(
403: SC_HANDLE hService
404: );
405:
406: BOOL
407: WINAPI
408: EnumDependentServicesA(
409: SC_HANDLE hService,
410: DWORD dwServiceState,
411: LPENUM_SERVICE_STATUSA lpServices,
412: DWORD cbBufSize,
413: LPDWORD pcbBytesNeeded,
414: LPDWORD lpServicesReturned
415: );
416: BOOL
417: WINAPI
418: EnumDependentServicesW(
419: SC_HANDLE hService,
420: DWORD dwServiceState,
421: LPENUM_SERVICE_STATUSW lpServices,
422: DWORD cbBufSize,
423: LPDWORD pcbBytesNeeded,
424: LPDWORD lpServicesReturned
425: );
426: #ifdef UNICODE
427: #define EnumDependentServices EnumDependentServicesW
428: #else
429: #define EnumDependentServices EnumDependentServicesA
430: #endif // !UNICODE
431:
432: BOOL
433: WINAPI
434: EnumServicesStatusA(
435: SC_HANDLE hSCManager,
436: DWORD dwServiceType,
437: DWORD dwServiceState,
438: LPENUM_SERVICE_STATUSA lpServices,
439: DWORD cbBufSize,
440: LPDWORD pcbBytesNeeded,
441: LPDWORD lpServicesReturned,
442: LPDWORD lpResumeHandle
443: );
444: BOOL
445: WINAPI
446: EnumServicesStatusW(
447: SC_HANDLE hSCManager,
448: DWORD dwServiceType,
449: DWORD dwServiceState,
450: LPENUM_SERVICE_STATUSW lpServices,
451: DWORD cbBufSize,
452: LPDWORD pcbBytesNeeded,
453: LPDWORD lpServicesReturned,
454: LPDWORD lpResumeHandle
455: );
456: #ifdef UNICODE
457: #define EnumServicesStatus EnumServicesStatusW
458: #else
459: #define EnumServicesStatus EnumServicesStatusA
460: #endif // !UNICODE
461:
462: SC_LOCK
463: WINAPI
464: LockServiceDatabase(
465: SC_HANDLE hSCManager
466: );
467:
468: BOOL
469: WINAPI
470: NotifyBootConfigStatus(
471: BOOL BootAcceptable
472: );
473:
474: SC_HANDLE
475: WINAPI
476: OpenSCManagerA(
477: LPCSTR lpMachineName,
478: LPCSTR lpDatabaseName,
479: DWORD dwDesiredAccess
480: );
481: SC_HANDLE
482: WINAPI
483: OpenSCManagerW(
484: LPCWSTR lpMachineName,
485: LPCWSTR lpDatabaseName,
486: DWORD dwDesiredAccess
487: );
488: #ifdef UNICODE
489: #define OpenSCManager OpenSCManagerW
490: #else
491: #define OpenSCManager OpenSCManagerA
492: #endif // !UNICODE
493:
494: SC_HANDLE
495: WINAPI
496: OpenServiceA(
497: SC_HANDLE hSCManager,
498: LPCSTR lpServiceName,
499: DWORD dwDesiredAccess
500: );
501: SC_HANDLE
502: WINAPI
503: OpenServiceW(
504: SC_HANDLE hSCManager,
505: LPCWSTR lpServiceName,
506: DWORD dwDesiredAccess
507: );
508: #ifdef UNICODE
509: #define OpenService OpenServiceW
510: #else
511: #define OpenService OpenServiceA
512: #endif // !UNICODE
513:
514: BOOL
515: WINAPI
516: QueryServiceConfigA(
517: SC_HANDLE hService,
518: LPQUERY_SERVICE_CONFIGA lpServiceConfig,
519: DWORD cbBufSize,
520: LPDWORD pcbBytesNeeded
521: );
522: BOOL
523: WINAPI
524: QueryServiceConfigW(
525: SC_HANDLE hService,
526: LPQUERY_SERVICE_CONFIGW lpServiceConfig,
527: DWORD cbBufSize,
528: LPDWORD pcbBytesNeeded
529: );
530: #ifdef UNICODE
531: #define QueryServiceConfig QueryServiceConfigW
532: #else
533: #define QueryServiceConfig QueryServiceConfigA
534: #endif // !UNICODE
535:
536: BOOL
537: WINAPI
538: QueryServiceLockStatusA(
539: SC_HANDLE hSCManager,
540: LPQUERY_SERVICE_LOCK_STATUSA lpLockStatus,
541: DWORD cbBufSize,
542: LPDWORD pcbBytesNeeded
543: );
544: BOOL
545: WINAPI
546: QueryServiceLockStatusW(
547: SC_HANDLE hSCManager,
548: LPQUERY_SERVICE_LOCK_STATUSW lpLockStatus,
549: DWORD cbBufSize,
550: LPDWORD pcbBytesNeeded
551: );
552: #ifdef UNICODE
553: #define QueryServiceLockStatus QueryServiceLockStatusW
554: #else
555: #define QueryServiceLockStatus QueryServiceLockStatusA
556: #endif // !UNICODE
557:
558: BOOL
559: WINAPI
560: QueryServiceObjectSecurity(
561: SC_HANDLE hService,
562: SECURITY_INFORMATION dwSecurityInformation,
563: PSECURITY_DESCRIPTOR lpSecurityDescriptor,
564: DWORD cbBufSize,
565: LPDWORD pcbBytesNeeded
566: );
567:
568: BOOL
569: WINAPI
570: QueryServiceStatus(
571: SC_HANDLE hService,
572: LPSERVICE_STATUS lpServiceStatus
573: );
574:
575: SERVICE_STATUS_HANDLE
576: WINAPI
577: RegisterServiceCtrlHandlerA(
578: LPCSTR lpServiceName,
579: LPHANDLER_FUNCTION lpHandlerProc
580: );
581: SERVICE_STATUS_HANDLE
582: WINAPI
583: RegisterServiceCtrlHandlerW(
584: LPCWSTR lpServiceName,
585: LPHANDLER_FUNCTION lpHandlerProc
586: );
587: #ifdef UNICODE
588: #define RegisterServiceCtrlHandler RegisterServiceCtrlHandlerW
589: #else
590: #define RegisterServiceCtrlHandler RegisterServiceCtrlHandlerA
591: #endif // !UNICODE
592:
593: BOOL
594: WINAPI
595: SetServiceObjectSecurity(
596: SC_HANDLE hService,
597: SECURITY_INFORMATION dwSecurityInformation,
598: PSECURITY_DESCRIPTOR lpSecurityDescriptor
599: );
600:
601: BOOL
602: WINAPI
603: SetServiceStatus(
604: SERVICE_STATUS_HANDLE hServiceStatus,
605: LPSERVICE_STATUS lpServiceStatus
606: );
607:
608: BOOL
609: WINAPI
610: StartServiceCtrlDispatcherA(
611: LPSERVICE_TABLE_ENTRYA lpServiceStartTable
612: );
613: BOOL
614: WINAPI
615: StartServiceCtrlDispatcherW(
616: LPSERVICE_TABLE_ENTRYW lpServiceStartTable
617: );
618: #ifdef UNICODE
619: #define StartServiceCtrlDispatcher StartServiceCtrlDispatcherW
620: #else
621: #define StartServiceCtrlDispatcher StartServiceCtrlDispatcherA
622: #endif // !UNICODE
623:
624:
625: BOOL
626: WINAPI
627: StartServiceA(
628: SC_HANDLE hService,
629: DWORD dwNumServiceArgs,
630: LPCSTR *lpServiceArgVectors
631: );
632: BOOL
633: WINAPI
634: StartServiceW(
635: SC_HANDLE hService,
636: DWORD dwNumServiceArgs,
637: LPCWSTR *lpServiceArgVectors
638: );
639: #ifdef UNICODE
640: #define StartService StartServiceW
641: #else
642: #define StartService StartServiceA
643: #endif // !UNICODE
644:
645: BOOL
646: WINAPI
647: UnlockServiceDatabase(
648: SC_LOCK ScLock
649: );
650:
651:
652:
653:
654: #endif // _WINSVC_
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.