1 // Licensed under the Apache License, Version 2.0
2 // <LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
3 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your option.
4 // All files in the project carrying such notice may not be copied, modified, or distributed
5 // except according to those terms
6 //! This file contains structures, function prototypes, and definitions for the NetService API
7 use ctypes::c_long;
8 use shared::lmcons::NET_API_STATUS;
9 use shared::minwindef::{DWORD, LPBYTE, LPDWORD};
10 use um::winnt::{LPCWSTR, LPWSTR};
11 STRUCT!{struct SERVICE_INFO_0 {
12     svci0_name: LPWSTR,
13 }}
14 pub type PSERVICE_INFO_0 = *mut SERVICE_INFO_0;
15 pub type LPSERVICE_INFO_0 = *mut SERVICE_INFO_0;
16 STRUCT!{struct SERVICE_INFO_1 {
17     svci1_name: LPWSTR,
18     svci1_status: DWORD,
19     svci1_code: DWORD,
20     svci1_pid: DWORD,
21 }}
22 pub type PSERVICE_INFO_1 = *mut SERVICE_INFO_1;
23 pub type LPSERVICE_INFO_1 = *mut SERVICE_INFO_1;
24 STRUCT!{struct SERVICE_INFO_2 {
25     svci2_name: LPWSTR,
26     svci2_status: DWORD,
27     svci2_code: DWORD,
28     svci2_pid: DWORD,
29     svci2_text: LPWSTR,
30     svci2_specific_error: DWORD,
31     svci2_display_name: LPWSTR,
32 }}
33 pub type PSERVICE_INFO_2 = *mut SERVICE_INFO_2;
34 pub type LPSERVICE_INFO_2 = *mut SERVICE_INFO_2;
35 extern "system" {
NetServiceControl( servername: LPCWSTR, service: LPCWSTR, opcode: DWORD, arg: DWORD, bufptr: *mut LPBYTE, ) -> NET_API_STATUS36     pub fn NetServiceControl(
37         servername: LPCWSTR,
38         service: LPCWSTR,
39         opcode: DWORD,
40         arg: DWORD,
41         bufptr: *mut LPBYTE,
42     ) -> NET_API_STATUS;
NetServiceEnum( servername: LPCWSTR, level: DWORD, bufptr: *mut LPBYTE, prefmaxlen: DWORD, entriesread: LPDWORD, totalentries: LPDWORD, resumehandle: LPDWORD, ) -> NET_API_STATUS43     pub fn NetServiceEnum(
44         servername: LPCWSTR,
45         level: DWORD,
46         bufptr: *mut LPBYTE,
47         prefmaxlen: DWORD,
48         entriesread: LPDWORD,
49         totalentries: LPDWORD,
50         resumehandle: LPDWORD,
51     ) -> NET_API_STATUS;
NetServiceGetInfo( servername: LPCWSTR, service: LPCWSTR, level: DWORD, bufptr: *mut LPBYTE, ) -> NET_API_STATUS52     pub fn NetServiceGetInfo(
53         servername: LPCWSTR,
54         service: LPCWSTR,
55         level: DWORD,
56         bufptr: *mut LPBYTE,
57     ) -> NET_API_STATUS;
NetServiceInstall( servername: LPCWSTR, service: LPCWSTR, argc: DWORD, argv: *mut LPCWSTR, bufptr: *mut LPBYTE, ) -> NET_API_STATUS58     pub fn NetServiceInstall(
59         servername: LPCWSTR,
60         service: LPCWSTR,
61         argc: DWORD,
62         argv: *mut LPCWSTR,
63         bufptr: *mut LPBYTE,
64     ) -> NET_API_STATUS;
65 }
66 pub const SERVICE_INSTALL_STATE: DWORD = 0x03;
67 pub const SERVICE_UNINSTALLED: DWORD = 0x00;
68 pub const SERVICE_INSTALL_PENDING: DWORD = 0x01;
69 pub const SERVICE_UNINSTALL_PENDING: DWORD = 0x02;
70 pub const SERVICE_INSTALLED: DWORD = 0x03;
71 pub const SERVICE_PAUSE_STATE: DWORD = 0x0C;
72 pub const LM20_SERVICE_ACTIVE: DWORD = 0x00;
73 pub const LM20_SERVICE_CONTINUE_PENDING: DWORD = 0x04;
74 pub const LM20_SERVICE_PAUSE_PENDING: DWORD = 0x08;
75 pub const LM20_SERVICE_PAUSED: DWORD = 0x0C;
76 pub const SERVICE_NOT_UNINSTALLABLE: DWORD = 0x00;
77 pub const SERVICE_UNINSTALLABLE: DWORD = 0x10;
78 pub const SERVICE_NOT_PAUSABLE: DWORD = 0x00;
79 pub const SERVICE_PAUSABLE: DWORD = 0x20;
80 pub const SERVICE_REDIR_PAUSED: DWORD = 0x700;
81 pub const SERVICE_REDIR_DISK_PAUSED: DWORD = 0x100;
82 pub const SERVICE_REDIR_PRINT_PAUSED: DWORD = 0x200;
83 pub const SERVICE_REDIR_COMM_PAUSED: DWORD = 0x400;
84 pub const SERVICE_DOS_ENCRYPTION: &'static str = "ENCRYPT";
85 pub const SERVICE_CTRL_INTERROGATE: DWORD = 0;
86 pub const SERVICE_CTRL_PAUSE: DWORD = 1;
87 pub const SERVICE_CTRL_CONTINUE: DWORD = 2;
88 pub const SERVICE_CTRL_UNINSTALL: DWORD = 3;
89 pub const SERVICE_CTRL_REDIR_DISK: DWORD = 0x1;
90 pub const SERVICE_CTRL_REDIR_PRINT: DWORD = 0x2;
91 pub const SERVICE_CTRL_REDIR_COMM: DWORD = 0x4;
92 pub const SERVICE_IP_NO_HINT: DWORD = 0x0;
93 pub const SERVICE_CCP_NO_HINT: DWORD = 0x0;
94 pub const SERVICE_IP_QUERY_HINT: DWORD = 0x10000;
95 pub const SERVICE_CCP_QUERY_HINT: DWORD = 0x10000;
96 pub const SERVICE_IP_CHKPT_NUM: DWORD = 0x0FF;
97 pub const SERVICE_CCP_CHKPT_NUM: DWORD = 0x0FF;
98 pub const SERVICE_IP_WAIT_TIME: DWORD = 0x0FF00;
99 pub const SERVICE_CCP_WAIT_TIME: DWORD = 0x0FF00;
100 pub const SERVICE_IP_WAITTIME_SHIFT: DWORD = 8;
101 pub const SERVICE_NTIP_WAITTIME_SHIFT: DWORD = 12;
102 pub const UPPER_HINT_MASK: DWORD = 0x0000FF00;
103 pub const LOWER_HINT_MASK: DWORD = 0x000000FF;
104 pub const UPPER_GET_HINT_MASK: DWORD = 0x0FF00000;
105 pub const LOWER_GET_HINT_MASK: DWORD = 0x0000FF00;
106 pub const SERVICE_NT_MAXTIME: DWORD = 0x0000FFFF;
107 pub const SERVICE_RESRV_MASK: DWORD = 0x0001FFFF;
108 pub const SERVICE_MAXTIME: DWORD = 0x000000FF;
109 pub const SERVICE_BASE: DWORD = 3050;
110 pub const SERVICE_UIC_NORMAL: DWORD = 0;
111 pub const SERVICE_UIC_BADPARMVAL: DWORD = SERVICE_BASE + 1;
112 pub const SERVICE_UIC_MISSPARM: DWORD = SERVICE_BASE + 2;
113 pub const SERVICE_UIC_UNKPARM: DWORD = SERVICE_BASE + 3;
114 pub const SERVICE_UIC_RESOURCE: DWORD = SERVICE_BASE + 4;
115 pub const SERVICE_UIC_CONFIG: DWORD = SERVICE_BASE + 5;
116 pub const SERVICE_UIC_SYSTEM: DWORD = SERVICE_BASE + 6;
117 pub const SERVICE_UIC_INTERNAL: DWORD = SERVICE_BASE + 7;
118 pub const SERVICE_UIC_AMBIGPARM: DWORD = SERVICE_BASE + 8;
119 pub const SERVICE_UIC_DUPPARM: DWORD = SERVICE_BASE + 9;
120 pub const SERVICE_UIC_KILL: DWORD = SERVICE_BASE + 10;
121 pub const SERVICE_UIC_EXEC: DWORD = SERVICE_BASE + 11;
122 pub const SERVICE_UIC_SUBSERV: DWORD = SERVICE_BASE + 12;
123 pub const SERVICE_UIC_CONFLPARM: DWORD = SERVICE_BASE + 13;
124 pub const SERVICE_UIC_FILE: DWORD = SERVICE_BASE + 14;
125 pub const SERVICE_UIC_M_NULL: DWORD = 0;
126 pub const SERVICE_UIC_M_MEMORY: DWORD = SERVICE_BASE + 20;
127 pub const SERVICE_UIC_M_DISK: DWORD = SERVICE_BASE + 21;
128 pub const SERVICE_UIC_M_THREADS: DWORD = SERVICE_BASE + 22;
129 pub const SERVICE_UIC_M_PROCESSES: DWORD = SERVICE_BASE + 23;
130 pub const SERVICE_UIC_M_SECURITY: DWORD = SERVICE_BASE + 24;
131 pub const SERVICE_UIC_M_LANROOT: DWORD = SERVICE_BASE + 25;
132 pub const SERVICE_UIC_M_REDIR: DWORD = SERVICE_BASE + 26;
133 pub const SERVICE_UIC_M_SERVER: DWORD = SERVICE_BASE + 27;
134 pub const SERVICE_UIC_M_SEC_FILE_ERR: DWORD = SERVICE_BASE + 28;
135 pub const SERVICE_UIC_M_FILES: DWORD = SERVICE_BASE + 29;
136 pub const SERVICE_UIC_M_LOGS: DWORD = SERVICE_BASE + 30;
137 pub const SERVICE_UIC_M_LANGROUP: DWORD = SERVICE_BASE + 31;
138 pub const SERVICE_UIC_M_MSGNAME: DWORD = SERVICE_BASE + 32;
139 pub const SERVICE_UIC_M_ANNOUNCE: DWORD = SERVICE_BASE + 33;
140 pub const SERVICE_UIC_M_UAS: DWORD = SERVICE_BASE + 34;
141 pub const SERVICE_UIC_M_SERVER_SEC_ERR: DWORD = SERVICE_BASE + 35;
142 pub const SERVICE_UIC_M_WKSTA: DWORD = SERVICE_BASE + 37;
143 pub const SERVICE_UIC_M_ERRLOG: DWORD = SERVICE_BASE + 38;
144 pub const SERVICE_UIC_M_FILE_UW: DWORD = SERVICE_BASE + 39;
145 pub const SERVICE_UIC_M_ADDPAK: DWORD = SERVICE_BASE + 40;
146 pub const SERVICE_UIC_M_LAZY: DWORD = SERVICE_BASE + 41;
147 pub const SERVICE_UIC_M_UAS_MACHINE_ACCT: DWORD = SERVICE_BASE + 42;
148 pub const SERVICE_UIC_M_UAS_SERVERS_NMEMB: DWORD = SERVICE_BASE + 43;
149 pub const SERVICE_UIC_M_UAS_SERVERS_NOGRP: DWORD = SERVICE_BASE + 44;
150 pub const SERVICE_UIC_M_UAS_INVALID_ROLE: DWORD = SERVICE_BASE + 45;
151 pub const SERVICE_UIC_M_NETLOGON_NO_DC: DWORD = SERVICE_BASE + 46;
152 pub const SERVICE_UIC_M_NETLOGON_DC_CFLCT: DWORD = SERVICE_BASE + 47;
153 pub const SERVICE_UIC_M_NETLOGON_AUTH: DWORD = SERVICE_BASE + 48;
154 pub const SERVICE_UIC_M_UAS_PROLOG: DWORD = SERVICE_BASE + 49;
155 pub const SERVICE2_BASE: DWORD = 5600;
156 pub const SERVICE_UIC_M_NETLOGON_MPATH: DWORD = SERVICE2_BASE + 0;
157 pub const SERVICE_UIC_M_LSA_MACHINE_ACCT: DWORD = SERVICE2_BASE + 1;
158 pub const SERVICE_UIC_M_DATABASE_ERROR: DWORD = SERVICE2_BASE + 2;
159 #[inline]
SERVICE_IP_CODE(tt: DWORD, nn: DWORD) -> c_long160 pub fn SERVICE_IP_CODE(tt: DWORD, nn: DWORD) -> c_long {
161     (SERVICE_IP_QUERY_HINT | (nn | (tt << SERVICE_IP_WAITTIME_SHIFT))) as c_long
162 }
163 #[inline]
SERVICE_CCP_CODE(tt: DWORD, nn: DWORD) -> c_long164 pub fn SERVICE_CCP_CODE(tt: DWORD, nn: DWORD) -> c_long {
165     (SERVICE_CCP_QUERY_HINT | (nn | (tt << SERVICE_IP_WAITTIME_SHIFT))) as c_long
166 }
167 #[inline]
SERVICE_UIC_CODE(cc: DWORD, mm: DWORD) -> c_long168 pub fn SERVICE_UIC_CODE(cc: DWORD, mm: DWORD) -> c_long {
169     ((cc << 16) | mm) as c_long
170 }
171 #[inline]
SERVICE_NT_CCP_CODE(tt: DWORD, nn: DWORD) -> c_long172 pub fn SERVICE_NT_CCP_CODE(tt: DWORD, nn: DWORD) -> c_long {
173     (SERVICE_CCP_QUERY_HINT | nn | ((tt & LOWER_HINT_MASK) << SERVICE_IP_WAITTIME_SHIFT)
174     | ((tt & UPPER_HINT_MASK) << SERVICE_NTIP_WAITTIME_SHIFT)) as c_long
175 }
176 #[inline]
SERVICE_NT_WAIT_GET(code: DWORD) -> DWORD177 pub fn SERVICE_NT_WAIT_GET(code: DWORD) -> DWORD {
178     ((code & UPPER_GET_HINT_MASK) >> SERVICE_NTIP_WAITTIME_SHIFT)
179     | ((code & LOWER_GET_HINT_MASK) >> SERVICE_IP_WAITTIME_SHIFT)
180 }
181