⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ntse.c

📁 OPC toolkit freeware to develop opc apps. Sorce code and bin. It s free.
💻 C
📖 第 1 页 / 共 2 页
字号:
           {
            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 + -