/* FUNCTIONS *****************************************************************/
-handle_t BindingHandle = NULL;
+handle_t __RPC_USER
+SVCCTL_HANDLEA_bind(SVCCTL_HANDLEA szMachineName)
+{
+ handle_t hBinding = NULL;
+ UCHAR *pszStringBinding;
+ RPC_STATUS status;
+
+ TRACE("SVCCTL_HANDLEA_bind() called\n");
+
+ status = RpcStringBindingComposeA((UCHAR *)szMachineName,
+ (UCHAR *)"ncacn_np",
+ NULL,
+ (UCHAR *)"\\pipe\\ntsvcs",
+ NULL,
+ (UCHAR **)&pszStringBinding);
+ if (status)
+ {
+ ERR("RpcStringBindingCompose returned 0x%x\n", status);
+ return NULL;
+ }
+
+ /* Set the binding handle that will be used to bind to the server. */
+ status = RpcBindingFromStringBindingA(pszStringBinding,
+ &hBinding);
+ if (status)
+ {
+ ERR("RpcBindingFromStringBinding returned 0x%x\n", status);
+ }
+
+ status = RpcStringFreeA(&pszStringBinding);
+ if (status)
+ {
+ ERR("RpcStringFree returned 0x%x\n", status);
+ }
+
+ return hBinding;
+}
-VOID
-HandleBind(VOID)
+
+void __RPC_USER
+SVCCTL_HANDLEA_unbind(SVCCTL_HANDLEA szMachineName,
+ handle_t hBinding)
+{
+ RPC_STATUS status;
+
+ TRACE("SVCCTL_HANDLEA_unbind() called\n");
+
+ status = RpcBindingFree(&hBinding);
+ if (status)
+ {
+ ERR("RpcBindingFree returned 0x%x\n", status);
+ }
+}
+
+
+handle_t __RPC_USER
+SVCCTL_HANDLEW_bind(SVCCTL_HANDLEW szMachineName)
{
+ handle_t hBinding = NULL;
LPWSTR pszStringBinding;
RPC_STATUS status;
- if (BindingHandle != NULL)
- return;
+ TRACE("SVCCTL_HANDLEW_bind() called\n");
+
+ status = RpcStringBindingComposeW(szMachineName,
+ L"ncacn_np",
+ NULL,
+ L"\\pipe\\ntsvcs",
+ NULL,
+ &pszStringBinding);
+ if (status)
+ {
+ ERR("RpcStringBindingCompose returned 0x%x\n", status);
+ return NULL;
+ }
+
+ /* Set the binding handle that will be used to bind to the server. */
+ status = RpcBindingFromStringBindingW(pszStringBinding,
+ &hBinding);
+ if (status)
+ {
+ ERR("RpcBindingFromStringBinding returned 0x%x\n", status);
+ }
+
+ status = RpcStringFreeW(&pszStringBinding);
+ if (status)
+ {
+ ERR("RpcStringFree returned 0x%x\n", status);
+ }
+
+ return hBinding;
+}
+
+
+void __RPC_USER
+SVCCTL_HANDLEW_unbind(SVCCTL_HANDLEW szMachineName,
+ handle_t hBinding)
+{
+ RPC_STATUS status;
+
+ TRACE("SVCCTL_HANDLEW_unbind() called\n");
+
+ status = RpcBindingFree(&hBinding);
+ if (status)
+ {
+ ERR("RpcBindingFree returned 0x%x\n", status);
+ }
+}
+
+
+handle_t __RPC_USER
+RPC_SERVICE_STATUS_HANDLE_bind(RPC_SERVICE_STATUS_HANDLE hServiceStatus)
+{
+ handle_t hBinding = NULL;
+ LPWSTR pszStringBinding;
+ RPC_STATUS status;
+
+ TRACE("RPC_SERVICE_STATUS_HANDLE_bind() called\n");
status = RpcStringBindingComposeW(NULL,
L"ncacn_np",
&pszStringBinding);
if (status)
{
- TRACE("RpcStringBindingCompose returned 0x%x\n", status);
- return;
+ ERR("RpcStringBindingCompose returned 0x%x\n", status);
+ return NULL;
}
/* Set the binding handle that will be used to bind to the server. */
status = RpcBindingFromStringBindingW(pszStringBinding,
- &BindingHandle);
+ &hBinding);
if (status)
{
- TRACE("RpcBindingFromStringBinding returned 0x%x\n", status);
+ ERR("RpcBindingFromStringBinding returned 0x%x\n", status);
}
status = RpcStringFreeW(&pszStringBinding);
if (status)
{
- TRACE("RpcStringFree returned 0x%x\n", status);
+ ERR("RpcStringFree returned 0x%x\n", status);
}
+
+ return hBinding;
}
-#if 0
-static VOID
-HandleUnbind(VOID)
+void __RPC_USER
+RPC_SERVICE_STATUS_HANDLE_unbind(RPC_SERVICE_STATUS_HANDLE hServiceStatus,
+ handle_t hBinding)
{
RPC_STATUS status;
- if (BindingHandle == NULL)
- return;
+ TRACE("RPC_SERVICE_STATUS_HANDLE_unbind() called\n");
- status = RpcBindingFree(&BindingHandle);
+ status = RpcBindingFree(&hBinding);
if (status)
{
- TRACE("RpcBindingFree returned 0x%x\n", status);
+ ERR("RpcBindingFree returned 0x%x\n", status);
}
}
-#endif
-static DWORD
+DWORD
ScmRpcStatusToWinError(RPC_STATUS Status)
{
switch (Status)
if (lpInfo == NULL)
return TRUE;
- HandleBind();
-
_SEH_TRY
{
- dwError = RChangeServiceConfig2A(BindingHandle,
- (SC_RPC_HANDLE)hService,
+ dwError = RChangeServiceConfig2A((SC_RPC_HANDLE)hService,
Info);
}
_SEH_HANDLE
if (lpInfo == NULL)
return TRUE;
- HandleBind();
-
_SEH_TRY
{
- dwError = RChangeServiceConfig2W(BindingHandle,
- (SC_RPC_HANDLE)hService,
+ dwError = RChangeServiceConfig2W((SC_RPC_HANDLE)hService,
Info);
}
_SEH_HANDLE
/* FIXME: Encrypt the password */
- HandleBind();
-
_SEH_TRY
{
/* Call to services.exe using RPC */
- dwError = RChangeServiceConfigA(BindingHandle,
- (SC_RPC_HANDLE)hService,
+ dwError = RChangeServiceConfigA((SC_RPC_HANDLE)hService,
dwServiceType,
dwStartType,
dwErrorControl,
/* FIXME: Encrypt the password */
- HandleBind();
-
_SEH_TRY
{
/* Call to services.exe using RPC */
- dwError = RChangeServiceConfigW(BindingHandle,
- (SC_RPC_HANDLE)hService,
+ dwError = RChangeServiceConfigW((SC_RPC_HANDLE)hService,
dwServiceType,
dwStartType,
dwErrorControl,
TRACE("CloseServiceHandle() called\n");
- HandleBind();
-
_SEH_TRY
{
/* Call to services.exe using RPC */
- dwError = RCloseServiceHandle(BindingHandle,
- (LPSC_RPC_HANDLE)&hSCObject);
+ dwError = RCloseServiceHandle((LPSC_RPC_HANDLE)&hSCObject);
}
_SEH_HANDLE
{
TRACE("ControlService(%x, %x, %p)\n",
hService, dwControl, lpServiceStatus);
- HandleBind();
-
_SEH_TRY
{
/* Call to services.exe using RPC */
- dwError = RControlService(BindingHandle,
- (SC_RPC_HANDLE)hService,
+ dwError = RControlService((SC_RPC_HANDLE)hService,
dwControl,
lpServiceStatus);
}
/* FIXME: Encrypt the password */
- HandleBind();
-
_SEH_TRY
{
/* Call to services.exe using RPC */
- dwError = RCreateServiceW(BindingHandle,
- (SC_RPC_HANDLE)hSCManager,
+ dwError = RCreateServiceW((SC_RPC_HANDLE)hSCManager,
(LPWSTR)lpServiceName,
(LPWSTR)lpDisplayName,
dwDesiredAccess,
TRACE("DeleteService(%x)\n", hService);
- HandleBind();
-
_SEH_TRY
{
/* Call to services.exe using RPC */
- dwError = RDeleteService(BindingHandle,
- (SC_RPC_HANDLE)hService);
+ dwError = RDeleteService((SC_RPC_HANDLE)hService);
}
_SEH_HANDLE
{
TRACE("EnumServicesStatusA() called\n");
- HandleBind();
-
_SEH_TRY
{
- dwError = REnumDependentServicesA(BindingHandle,
- (SC_RPC_HANDLE)hService,
+ dwError = REnumDependentServicesA((SC_RPC_HANDLE)hService,
dwServiceState,
(LPBYTE)lpServices,
cbBufSize,
}
_SEH_END;
+ if (dwError != ERROR_SUCCESS)
+ {
+ ERR("REnumDependentServicesA() failed (Error %lu)\n", dwError);
+ SetLastError(dwError);
+ return FALSE;
+ }
+
lpStatusPtr = (LPENUM_SERVICE_STATUSA)lpServices;
for (dwCount = 0; dwCount < *lpServicesReturned; dwCount++)
{
lpStatusPtr++;
}
- if (dwError != ERROR_SUCCESS)
- {
- ERR("REnumDependentServicesA() failed (Error %lu)\n", dwError);
- SetLastError(dwError);
- return FALSE;
- }
-
TRACE("EnumDependentServicesA() done\n");
return TRUE;
TRACE("EnumServicesStatusW() called\n");
- HandleBind();
-
_SEH_TRY
{
- dwError = REnumDependentServicesW(BindingHandle,
- (SC_RPC_HANDLE)hService,
+ dwError = REnumDependentServicesW((SC_RPC_HANDLE)hService,
dwServiceState,
(LPBYTE)lpServices,
cbBufSize,
}
_SEH_END;
+ if (dwError != ERROR_SUCCESS)
+ {
+ ERR("REnumDependentServicesW() failed (Error %lu)\n", dwError);
+ SetLastError(dwError);
+ return FALSE;
+ }
+
lpStatusPtr = (LPENUM_SERVICE_STATUSW)lpServices;
for (dwCount = 0; dwCount < *lpServicesReturned; dwCount++)
{
lpStatusPtr++;
}
- if (dwError != ERROR_SUCCESS)
- {
- ERR("REnumDependentServicesW() failed (Error %lu)\n", dwError);
- SetLastError(dwError);
- return FALSE;
- }
-
TRACE("EnumDependentServicesW() done\n");
return TRUE;
TRACE("EnumServicesStatusA() called\n");
- HandleBind();
-
_SEH_TRY
{
- dwError = REnumServicesStatusA(BindingHandle,
- (SC_RPC_HANDLE)hSCManager,
+ dwError = REnumServicesStatusA((SC_RPC_HANDLE)hSCManager,
dwServiceType,
dwServiceState,
(LPBYTE)lpServices,
}
_SEH_END;
+ if (dwError != ERROR_SUCCESS)
+ {
+ ERR("REnumServicesStatusA() failed (Error %lu)\n", dwError);
+ SetLastError(dwError);
+ return FALSE;
+ }
+
lpStatusPtr = (LPENUM_SERVICE_STATUSA)lpServices;
for (dwCount = 0; dwCount < *lpServicesReturned; dwCount++)
{
lpStatusPtr++;
}
- if (dwError != ERROR_SUCCESS)
- {
- ERR("REnumServicesStatusA() failed (Error %lu)\n", dwError);
- SetLastError(dwError);
- return FALSE;
- }
-
TRACE("EnumServicesStatusA() done\n");
return TRUE;
TRACE("EnumServicesStatusW() called\n");
- HandleBind();
-
_SEH_TRY
{
- dwError = REnumServicesStatusW(BindingHandle,
- (SC_RPC_HANDLE)hSCManager,
+ dwError = REnumServicesStatusW((SC_RPC_HANDLE)hSCManager,
dwServiceType,
dwServiceState,
(LPBYTE)lpServices,
}
_SEH_END;
+ if (dwError != ERROR_SUCCESS)
+ {
+ ERR("REnumServicesStatusW() failed (Error %lu)\n", dwError);
+ SetLastError(dwError);
+ return FALSE;
+ }
+
lpStatusPtr = (LPENUM_SERVICE_STATUSW)lpServices;
for (dwCount = 0; dwCount < *lpServicesReturned; dwCount++)
{
lpStatusPtr++;
}
- if (dwError != ERROR_SUCCESS)
- {
- ERR("REnumServicesStatusW() failed (Error %lu)\n", dwError);
- SetLastError(dwError);
- return FALSE;
- }
-
TRACE("EnumServicesStatusW() done\n");
return TRUE;
TRACE("EnumServicesStatusExA() called\n");
- HandleBind();
-
_SEH_TRY
{
- dwError = REnumServicesStatusExA(BindingHandle,
- (SC_RPC_HANDLE)hSCManager,
+ dwError = REnumServicesStatusExA((SC_RPC_HANDLE)hSCManager,
InfoLevel,
dwServiceType,
dwServiceState,
TRACE("EnumServicesStatusExW() called\n");
- HandleBind();
-
_SEH_TRY
{
- dwError = REnumServicesStatusExW(BindingHandle,
- (SC_RPC_HANDLE)hSCManager,
+ dwError = REnumServicesStatusExW((SC_RPC_HANDLE)hSCManager,
InfoLevel,
dwServiceType,
dwServiceState,
if (!lpDisplayName)
*lpcchBuffer = 0;
- HandleBind();
-
_SEH_TRY
{
- dwError = RGetServiceDisplayNameA(BindingHandle,
- (SC_RPC_HANDLE)hSCManager,
+ dwError = RGetServiceDisplayNameA((SC_RPC_HANDLE)hSCManager,
(LPSTR)lpServiceName,
lpDisplayName,
lpcchBuffer);
if (!lpDisplayName)
*lpcchBuffer = 0;
- HandleBind();
-
_SEH_TRY
{
- dwError = RGetServiceDisplayNameW(BindingHandle,
- (SC_RPC_HANDLE)hSCManager,
+ dwError = RGetServiceDisplayNameW((SC_RPC_HANDLE)hSCManager,
(LPWSTR)lpServiceName,
lpDisplayName,
lpcchBuffer);
if (!lpServiceName)
*lpcchBuffer = 0;
- HandleBind();
-
_SEH_TRY
{
- dwError = RGetServiceKeyNameA(BindingHandle,
- (SC_RPC_HANDLE)hSCManager,
+ dwError = RGetServiceKeyNameA((SC_RPC_HANDLE)hSCManager,
(LPSTR)lpDisplayName,
lpServiceName,
lpcchBuffer);
if (!lpDisplayName)
*lpcchBuffer = 0;
- HandleBind();
-
_SEH_TRY
{
- dwError = RGetServiceKeyNameW(BindingHandle,
- (SC_RPC_HANDLE)hSCManager,
+ dwError = RGetServiceKeyNameW((SC_RPC_HANDLE)hSCManager,
(LPWSTR)lpDisplayName,
lpServiceName,
lpcchBuffer);
TRACE("LockServiceDatabase(%x)\n", hSCManager);
- HandleBind();
-
_SEH_TRY
{
/* Call to services.exe using RPC */
- dwError = RLockServiceDatabase(BindingHandle,
- (SC_RPC_HANDLE)hSCManager,
+ dwError = RLockServiceDatabase((SC_RPC_HANDLE)hSCManager,
(SC_RPC_LOCK *)&hLock);
}
_SEH_HANDLE
WaitForSCManager();
- HandleBind();
-
_SEH_TRY
{
/* Call to services.exe using RPC */
- dwError = ROpenSCManagerA(BindingHandle,
- (LPSTR)lpMachineName,
+ dwError = ROpenSCManagerA((LPSTR)lpMachineName,
(LPSTR)lpDatabaseName,
dwDesiredAccess,
(SC_RPC_HANDLE *)&hScm);
WaitForSCManager();
- HandleBind();
-
_SEH_TRY
{
/* Call to services.exe using RPC */
- dwError = ROpenSCManagerW(BindingHandle,
- (LPWSTR)lpMachineName,
+ dwError = ROpenSCManagerW((LPWSTR)lpMachineName,
(LPWSTR)lpDatabaseName,
dwDesiredAccess,
(SC_RPC_HANDLE *)&hScm);
TRACE("OpenServiceA(%p, %s, %lx)\n",
hSCManager, lpServiceName, dwDesiredAccess);
- HandleBind();
-
_SEH_TRY
{
/* Call to services.exe using RPC */
- dwError = ROpenServiceA(BindingHandle,
- (SC_RPC_HANDLE)hSCManager,
+ dwError = ROpenServiceA((SC_RPC_HANDLE)hSCManager,
(LPSTR)lpServiceName,
dwDesiredAccess,
(SC_RPC_HANDLE *)&hService);
TRACE("OpenServiceW(%p, %S, %lx)\n",
hSCManager, lpServiceName, dwDesiredAccess);
- HandleBind();
-
_SEH_TRY
{
/* Call to services.exe using RPC */
- dwError = ROpenServiceW(BindingHandle,
- (SC_RPC_HANDLE)hSCManager,
+ dwError = ROpenServiceW((SC_RPC_HANDLE)hSCManager,
(LPWSTR)lpServiceName,
dwDesiredAccess,
(SC_RPC_HANDLE *)&hService);
TRACE("QueryServiceConfigA(%p, %p, %lu, %p)\n",
hService, lpServiceConfig, cbBufSize, pcbBytesNeeded);
- HandleBind();
-
_SEH_TRY
{
/* Call to services.exe using RPC */
- dwError = RQueryServiceConfigA(BindingHandle,
- (SC_RPC_HANDLE)hService,
+ dwError = RQueryServiceConfigA((SC_RPC_HANDLE)hService,
(LPBYTE)lpServiceConfig,
cbBufSize,
pcbBytesNeeded);
TRACE("QueryServiceConfigW(%p, %p, %lu, %p)\n",
hService, lpServiceConfig, cbBufSize, pcbBytesNeeded);
- HandleBind();
-
_SEH_TRY
{
/* Call to services.exe using RPC */
- dwError = RQueryServiceConfigW(BindingHandle,
- (SC_RPC_HANDLE)hService,
+ dwError = RQueryServiceConfigW((SC_RPC_HANDLE)hService,
(LPBYTE)lpServiceConfig,
cbBufSize,
pcbBytesNeeded);
return FALSE;
}
- HandleBind();
-
_SEH_TRY
{
/* Call to services.exe using RPC */
- dwError = RQueryServiceConfig2A(BindingHandle,
- (SC_RPC_HANDLE)hService,
+ dwError = RQueryServiceConfig2A((SC_RPC_HANDLE)hService,
dwInfoLevel,
lpBuffer,
cbBufSize,
return FALSE;
}
- HandleBind();
-
_SEH_TRY
{
/* Call to services.exe using RPC */
- dwError = RQueryServiceConfig2W(BindingHandle,
- (SC_RPC_HANDLE)hService,
+ dwError = RQueryServiceConfig2W((SC_RPC_HANDLE)hService,
dwInfoLevel,
lpBuffer,
cbBufSize,
TRACE("QueryServiceLockStatusA() called\n");
- HandleBind();
-
_SEH_TRY
{
/* Call to services.exe using RPC */
- dwError = RQueryServiceLockStatusA(BindingHandle,
- (SC_RPC_HANDLE)hSCManager,
+ dwError = RQueryServiceLockStatusA((SC_RPC_HANDLE)hSCManager,
lpLockStatus,
cbBufSize,
pcbBytesNeeded);
TRACE("QueryServiceLockStatusW() called\n");
- HandleBind();
-
_SEH_TRY
{
/* Call to services.exe using RPC */
- dwError = RQueryServiceLockStatusW(BindingHandle,
- (SC_RPC_HANDLE)hSCManager,
+ dwError = RQueryServiceLockStatusW((SC_RPC_HANDLE)hSCManager,
lpLockStatus,
cbBufSize,
pcbBytesNeeded);
TRACE("QueryServiceObjectSecurity(%p, %lu, %p)\n",
hService, dwSecurityInformation, lpSecurityDescriptor);
- HandleBind();
-
_SEH_TRY
{
/* Call to services.exe using RPC */
- dwError = RQueryServiceObjectSecurity(BindingHandle,
- (SC_RPC_HANDLE)hService,
+ dwError = RQueryServiceObjectSecurity((SC_RPC_HANDLE)hService,
dwSecurityInformation,
(LPBYTE)lpSecurityDescriptor,
cbBufSize,
return FALSE;
}
- HandleBind();
-
_SEH_TRY
{
/* Call to services.exe using RPC */
- dwError = RSetServiceObjectSecurity(BindingHandle,
- (SC_RPC_HANDLE)hService,
+ dwError = RSetServiceObjectSecurity((SC_RPC_HANDLE)hService,
dwSecurityInformation,
(LPBYTE)SelfRelativeSD,
Length);
TRACE("QueryServiceStatus(%p, %p)\n",
hService, lpServiceStatus);
- HandleBind();
-
_SEH_TRY
{
/* Call to services.exe using RPC */
- dwError = RQueryServiceStatus(BindingHandle,
- (SC_RPC_HANDLE)hService,
+ dwError = RQueryServiceStatus((SC_RPC_HANDLE)hService,
lpServiceStatus);
}
_SEH_HANDLE
TRACE("QueryServiceStatusEx() called\n");
- HandleBind();
-
_SEH_TRY
{
/* Call to services.exe using RPC */
- dwError = RQueryServiceStatusEx(BindingHandle,
- (SC_RPC_HANDLE)hService,
+ dwError = RQueryServiceStatusEx((SC_RPC_HANDLE)hService,
InfoLevel,
lpBuffer,
cbBufSize,
_SEH_TRY
{
- dwError = RStartServiceA(BindingHandle,
- (SC_RPC_HANDLE)hService,
+ dwError = RStartServiceA((SC_RPC_HANDLE)hService,
dwNumServiceArgs,
(LPSTRING_PTRSA)lpServiceArgVectors);
}
_SEH_TRY
{
- dwError = RStartServiceW(BindingHandle,
- (SC_RPC_HANDLE)hService,
+ dwError = RStartServiceW((SC_RPC_HANDLE)hService,
dwNumServiceArgs,
(LPSTRING_PTRSW)lpServiceArgVectors);
}
TRACE("UnlockServiceDatabase(%x)\n", ScLock);
- HandleBind();
-
_SEH_TRY
{
/* Call to services.exe using RPC */
- dwError = RUnlockServiceDatabase(BindingHandle,
- (SC_RPC_LOCK)ScLock);
+ dwError = RUnlockServiceDatabase((LPSC_RPC_LOCK)&ScLock);
}
_SEH_HANDLE
{
TRACE("NotifyBootConfigStatus()\n");
- HandleBind();
-
_SEH_TRY
{
/* Call to services.exe using RPC */
- dwError = RNotifyBootConfigStatus(BindingHandle,
- NULL,
+ dwError = RNotifyBootConfigStatus(NULL,
BootAcceptable);
}
_SEH_HANDLE