mirror of
https://github.com/reactos/reactos.git
synced 2024-12-26 00:54:40 +00:00
- Implement GetServiceKeyNameW (untested).
- Mark deleted service in the service list. - Some SCM-Calls fail if the has been marked for delete. svn path=/trunk/; revision=18894
This commit is contained in:
parent
839760d8b4
commit
fc8df70d3c
4 changed files with 78 additions and 6 deletions
|
@ -136,6 +136,13 @@ cpp_quote("#endif")
|
|||
[out, size_is(*lpcchBuffer), unique] LPWSTR lpDisplayName,
|
||||
[in, out, ref] LPDWORD lpcchBuffer);
|
||||
|
||||
/* Function 21 */
|
||||
DWORD ScmrGetServiceKeyNameW([in] handle_t BindingHandle,
|
||||
[in] SC_HANDLE hSCManager,
|
||||
[in, string, ref] LPCWSTR lpDisplayName,
|
||||
[out, size_is(*lpcchBuffer), unique] LPWSTR lpServiceName,
|
||||
[in, out, ref] LPDWORD lpcchBuffer);
|
||||
|
||||
|
||||
/* Function 27 */
|
||||
DWORD ScmrOpenSCManagerA([in] handle_t BindingHandle,
|
||||
|
|
|
@ -618,7 +618,7 @@ GetServiceKeyNameA(
|
|||
/**********************************************************************
|
||||
* GetServiceKeyNameW
|
||||
*
|
||||
* @unimplemented
|
||||
* @implemented
|
||||
*/
|
||||
BOOL STDCALL
|
||||
GetServiceKeyNameW(SC_HANDLE hSCManager,
|
||||
|
@ -626,7 +626,6 @@ GetServiceKeyNameW(SC_HANDLE hSCManager,
|
|||
LPWSTR lpServiceName,
|
||||
LPDWORD lpcchBuffer)
|
||||
{
|
||||
#if 0
|
||||
DWORD dwError;
|
||||
|
||||
DPRINT("GetServiceKeyNameW() called\n");
|
||||
|
@ -646,10 +645,6 @@ GetServiceKeyNameW(SC_HANDLE hSCManager,
|
|||
}
|
||||
|
||||
return TRUE;
|
||||
#endif
|
||||
DPRINT1("GetServiceKeyNameW is unimplemented\n");
|
||||
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -348,7 +348,15 @@ ScmrDeleteService(handle_t BindingHandle,
|
|||
|
||||
/* FIXME: Acquire service database lock exclusively */
|
||||
|
||||
if (lpService->bDeleted)
|
||||
{
|
||||
DPRINT1("The service has already been marked for delete!\n");
|
||||
return ERROR_SERVICE_MARKED_FOR_DELETE;
|
||||
}
|
||||
|
||||
/* Mark service for delete */
|
||||
lpService->bDeleted = TRUE;
|
||||
|
||||
dwError = ScmMarkServiceForDelete(lpService);
|
||||
|
||||
/* FIXME: Release service database lock */
|
||||
|
@ -533,8 +541,19 @@ ScmrChangeServiceConfigW(handle_t BiningHandle,
|
|||
return ERROR_INVALID_HANDLE;
|
||||
}
|
||||
|
||||
/* FIXME: Lock database exclusively */
|
||||
|
||||
if (lpService->bDeleted)
|
||||
{
|
||||
/* FIXME: Unlock database */
|
||||
DPRINT1("The service has already been marked for delete!\n");
|
||||
return ERROR_SERVICE_MARKED_FOR_DELETE;
|
||||
}
|
||||
|
||||
/* FIXME: ... */
|
||||
|
||||
/* FIXME: Unlock database */
|
||||
|
||||
DPRINT1("ScmrChangeServiceConfigW() done (Error %lu)\n", dwError);
|
||||
|
||||
return dwError;
|
||||
|
@ -1007,6 +1026,56 @@ ScmrGetServiceDisplayNameW(handle_t BindingHandle,
|
|||
}
|
||||
|
||||
|
||||
/* Function 21 */
|
||||
unsigned long
|
||||
ScmrGetServiceKeyNameW(handle_t BindingHandle,
|
||||
unsigned int hSCManager,
|
||||
wchar_t *lpDisplayName,
|
||||
wchar_t *lpServiceName, /* [out, unique] */
|
||||
unsigned long *lpcchBuffer)
|
||||
{
|
||||
// PMANAGER_HANDLE hManager;
|
||||
PSERVICE lpService;
|
||||
DWORD dwLength;
|
||||
DWORD dwError;
|
||||
|
||||
DPRINT1("ScmrGetServiceKeyNameW() called\n");
|
||||
DPRINT1("hSCManager = %x\n", hSCManager);
|
||||
DPRINT1("lpDisplayName: %S\n", lpDisplayName);
|
||||
DPRINT1("lpServiceName: %p\n", lpServiceName);
|
||||
DPRINT1("*lpcchBuffer: %lu\n", *lpcchBuffer);
|
||||
|
||||
// hManager = (PMANAGER_HANDLE)hSCManager;
|
||||
// if (hManager->Handle.Tag != MANAGER_TAG)
|
||||
// {
|
||||
// DPRINT1("Invalid manager handle!\n");
|
||||
// return ERROR_INVALID_HANDLE;
|
||||
// }
|
||||
|
||||
/* Get service database entry */
|
||||
lpService = ScmGetServiceEntryByDisplayName(lpDisplayName);
|
||||
if (lpService == NULL)
|
||||
{
|
||||
DPRINT1("Could not find a service!\n");
|
||||
return ERROR_SERVICE_DOES_NOT_EXIST;
|
||||
}
|
||||
|
||||
dwLength = wcslen(lpService->lpServiceName);
|
||||
|
||||
if (lpServiceName != NULL &&
|
||||
*lpcchBuffer > dwLength)
|
||||
{
|
||||
wcscpy(lpServiceName, lpService->lpServiceName);
|
||||
}
|
||||
|
||||
dwError = (*lpcchBuffer > dwLength) ? ERROR_SUCCESS : ERROR_INSUFFICIENT_BUFFER;
|
||||
|
||||
*lpcchBuffer = dwLength;
|
||||
|
||||
return dwError;
|
||||
}
|
||||
|
||||
|
||||
/* Function 27 */
|
||||
unsigned long
|
||||
ScmrOpenSCManagerA(handle_t BindingHandle,
|
||||
|
|
|
@ -15,6 +15,7 @@ typedef struct _SERVICE
|
|||
LPWSTR lpServiceName;
|
||||
LPWSTR lpDisplayName;
|
||||
UNICODE_STRING ServiceGroup;
|
||||
BOOL bDeleted;
|
||||
|
||||
SERVICE_STATUS Status;
|
||||
DWORD dwStartType;
|
||||
|
|
Loading…
Reference in a new issue