📄 ntse.c
字号:
{
rv = ERROR_NOT_ENOUGH_MEMORY;
break;
}
scfg = (QUERY_SERVICE_CONFIG*)buf;
if (QueryServiceConfig(svc, scfg, bufsize, &bsize))
{
rv = 0;
break;
}
else
{
rv = GetLastError();
// if (!rv) rv = -1;
UL_DEBUG((NSLOG, "ntseQueryConfig(%s): failed on %d, suggested: %d",
name, bufsize, bsize));
if (bufsize < bsize) bufsize = bsize;
else break;
}
}
while(rv == ERROR_INSUFFICIENT_BUFFER);
}
CloseServiceHandle(svc);
CloseServiceHandle(scm);
if (rv)
{
ntseFree(nc, scfg);
UL_INFO((NSLOG, "%!l ntseQueryConfig(%s) FAILED", rv, name));
}
else
{
if (cfg) *cfg = scfg;
UL_TRACE((NSLOG, "%!l ntseQueryConfig(%s) Finished", rv, name));
}
return rv;
}
//ERROR_SERVICE_EXISTS
int ntseCreate(ntseContext *nc,
const char *serviceName, /* name of service */
const char *displayName, /* display name */
int serviceType, /* type of service:
SERVICE_{WIN32_{OWN|SHARE}|INTERACTIVE}_PROCESS */
int startType, /* when to start service:
SERVICE_{DISABLED|{{AUTO|DEMAND|[BOOT|SYSTEM]}_START}} */
int errorControl, /* severity of service failure
SERVICE_ERROR_{IGNORE|NORMAL|[SEVERE|CRITICAL]} */
const char *commandline, /* name of binary file */
const char *loadOrderGroup, /* name of load ordering group */
unsigned *lpdwTagId, /* tag identifier */
const char *dependencies, /* array of dependency names */
const char *accountName, /* account name */
const char *password) /* account password */
{
int rv = 0;
SC_HANDLE scm = 0, svc = 0;
if (!nc) nc = &ntse_null_context;
if (0 > nc->ncNT95)
return ntseCreate95(nc, serviceName, serviceType, startType, commandline);
scm = OpenSCManager(nc->ncHostname, nc->ncDatabase, SC_MANAGER_CREATE_SERVICE);
if (!scm)
{
rv = GetLastError();
if (0 > ntseSwitch95(nc, rv))
{
return ntseCreate95(nc, serviceName, serviceType, startType, commandline);
}
UL_INFO((NSLOG, "%!l ntseCreate(%s):OpenSCManager() FAILED",
rv, serviceName));
return rv? rv: -1;
}
// if (!accountName) accountName = ".\\LocalSystem";
svc = CreateService(scm, serviceName, displayName,
STANDARD_RIGHTS_REQUIRED,
serviceType, startType, errorControl,
commandline,
loadOrderGroup, lpdwTagId,
dependencies,
accountName, password);
if (!svc)
{
rv = GetLastError();
if (!rv) rv = -1;
}
else CloseServiceHandle(svc);
CloseServiceHandle(scm);
if (rv)
UL_INFO((NSLOG, "%!l ntseCreate(%s) FAILED", rv, serviceName));
else UL_TRACE((NSLOG, "%!l ntseCreate(%s) Finished", rv, serviceName));
return rv;
}
int ntseChangeConfig(ntseContext *nc,
const char *serviceName, /* name of service */
const char *displayName, /* display name */
int serviceType, /* type of service:
SERVICE_{WIN32_{OWN|SHARE}|INTERACTIVE}_PROCESS */
int startType, /* when to start service:
SERVICE_{DISABLED|{{AUTO|DEMAND|[BOOT|SYSTEM]}_START}} */
int errorControl, /* severity of service failure
SERVICE_ERROR_{IGNORE|NORMAL|[SEVERE|CRITICAL]} */
const char *commandline, /* name of binary file */
const char *loadOrderGroup, /* name of load ordering group */
unsigned *lpdwTagId, /* tag identifier */
const char *dependencies, /* array of dependency names */
const char *accountName, /* account name */
const char *password) /* account password */
{
int rv = 0, rvl = 0;
SC_HANDLE scm, svc;
SC_LOCK scl = 0;
BOOL rvb;
#if 0
QUERY_SERVICE_CONFIG sc;
sc.dwServiceType = serviceType;
sc.dwStartType = startType;
sc.dwErrorControl = errorControl;
sc.lpBinaryPathName= commandline;
sc.lpLoadOrderGroup= loadOrderGroup;
sc.dwTagId = lpdwTagId? *lpdwTagId: 0;
sc.lpDependencies = dependencies;
sc.lpServiceStartName= accountName;
sc.lpDisplayName = displayName;
// missing: passwd & serviceName;
#endif
if (!nc) nc = &ntse_null_context;
if (0 > nc->ncNT95)
return ntseChange95(nc, serviceName, serviceType, startType, commandline);
scm = OpenSCManager(nc->ncHostname, nc->ncDatabase,
SC_MANAGER_CONNECT|SC_MANAGER_LOCK);
if (!scm)
scm = OpenSCManager(nc->ncHostname, nc->ncDatabase,
SC_MANAGER_CONNECT);
if (!scm)
{
rv = GetLastError();
if (0 > ntseSwitch95(nc, rv))
{
return ntseChange95(nc, serviceName, serviceType, startType, commandline);
}
UL_INFO((NSLOG, "%!l ntseChangeConfig(%s):OpenSCManager() FAILED",
rv, serviceName));
return rv? rv: -1;
}
#if 1
scl = LockServiceDatabase(scm);
if (!scl)
{
rvl = GetLastError();
UL_INFO((NSLOG, "%!l ntseChangeConfig(%s):LockServiceDatabase() FAILED",
rvl, serviceName));
}
#endif
svc = OpenService(scm, serviceName, SERVICE_CHANGE_CONFIG);
if (!svc)
{
rv = GetLastError();
UL_INFO((NSLOG, "%!l ntseChangeConfig(%s):OpenService() FAILED",
rv, serviceName));
if (!rv) rv = -1;
goto Exit;
}
rvb = ChangeServiceConfig(svc,
serviceType, startType, errorControl,
commandline,
loadOrderGroup, lpdwTagId,
dependencies,
accountName, password,
displayName);
if (rvb) rv = 0;
else if (!(rv = GetLastError())) rv = -1;
CloseServiceHandle(svc);
Exit:
if (scl) UnlockServiceDatabase(scl);
if (rv == -1 && rvl) rv = rvl;
CloseServiceHandle(scm);
if (rv)
UL_INFO((NSLOG, "%!l ntseChangeConfig(%s) FAILED", rv, serviceName));
else UL_TRACE((NSLOG, "%!l ntseChangeConfig(%s) Finished", rv, serviceName));
return rv;
}
int ntseCreateOrChange(ntseContext *nc,
const char *serviceName, /* name of service */
const char *displayName, /* display name */
int serviceType, /* type of service:
SERVICE_{WIN32_{OWN|SHARE}|INTERACTIVE}_PROCESS */
int startType, /* when to start service:
SERVICE_{DISABLED|{{AUTO|DEMAND|[BOOT|SYSTEM]}_START}} */
int errorControl, /* severity of service failure
SERVICE_ERROR_{IGNORE|NORMAL|[SEVERE|CRITICAL]} */
const char *commandline, /* name of binary file */
const char *loadOrderGroup, /* name of load ordering group */
unsigned *lpdwTagId, /* tag identifier */
const char *dependencies, /* array of dependency names */
const char *accountName, /* account name */
const char *password) /* account password */
{
int rv_cr;
if (!accountName) accountName = ".\\LocalSystem";
rv_cr = ntseCreate(nc, serviceName, displayName,
serviceType, startType, errorControl,
commandline, loadOrderGroup, lpdwTagId,
dependencies, accountName, password);
if (rv_cr)
{
int rv_ch;
rv_ch = ntseChangeConfig(nc, serviceName, displayName,
serviceType, startType, errorControl,
commandline, loadOrderGroup, lpdwTagId,
dependencies, accountName, password);
#if 1
if (rv_ch && rv_cr == ERROR_SERVICE_EXISTS)
{
if (0 == ntseCommand(nc, serviceName, ntseOP_DELETE))
rv_ch = ntseCreate(nc, serviceName, displayName,
serviceType, startType, errorControl,
commandline, loadOrderGroup, lpdwTagId,
dependencies, accountName, password);
}
#endif
if (rv_cr == ERROR_SERVICE_EXISTS ||
rv_ch == 0) rv_cr = rv_ch;
else if (rv_cr == -1 &&
rv_ch != ERROR_SERVICE_DOES_NOT_EXIST)
rv_cr = rv_ch;
}
return rv_cr;
}
/*
typedef struct _QUERY_SERVICE_CONFIG {
DWORD dwServiceType;
DWORD dwStartType;
DWORD dwErrorControl;
LPTSTR lpBinaryPathName;
LPTSTR lpLoadOrderGroup;
- DWORD dwTagId;
LPTSTR lpDependencies;
LPTSTR lpServiceStartName;
- LPTSTR lpDisplayName; */
/* end of ntse.c */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -