-Add QueryServiceConfig2A stub.

-Implement QueryServiceObjectSecurity and SetServiceObjectSecurity.

svn path=/trunk/; revision=20311
This commit is contained in:
Eric Kohl 2005-12-23 15:56:51 +00:00
parent e0189ae169
commit d40178810d
5 changed files with 227 additions and 33 deletions

View file

@ -10,6 +10,7 @@
#define BOOL unsigned long #define BOOL unsigned long
#define SC_HANDLE unsigned int #define SC_HANDLE unsigned int
#define SC_LOCK unsigned int #define SC_LOCK unsigned int
#define SERVICE_STATUS_HANDLE unsigned long
#define LPSTR char* #define LPSTR char*
#define LPCSTR char* #define LPCSTR char*
#define LPWSTR wchar_t* #define LPWSTR wchar_t*
@ -57,10 +58,19 @@ cpp_quote("#endif")
[out] SC_LOCK *hLock); [out] SC_LOCK *hLock);
/* Function 4 */ /* Function 4 */
DWORD ScmrQueryServiceObjectSecurity([in] handle_t BindingHandle); /* FIXME */ DWORD ScmrQueryServiceObjectSecurity([in] handle_t BindingHandle,
[in] SC_HANDLE hService,
[in] DWORD dwSecurityInformation,
[out, size_is(dwSecuityDescriptorSize)] unsigned char *lpSecurityDescriptor,
[in] DWORD dwSecuityDescriptorSize,
[out] LPDWORD pcbBytesNeeded);
/* Function 5 */ /* Function 5 */
DWORD ScmrSetServiceObjectSecurity([in] handle_t BindingHandle); /* FIXME */ DWORD ScmrSetServiceObjectSecurity([in] handle_t BindingHandle,
[in] SC_HANDLE hService,
[in] DWORD dwSecurityInformation,
[in, size_is(dwSecuityDescriptorSize)] unsigned char *lpSecurityDescriptor,
[in] DWORD dwSecuityDescriptorSize);
/* Function 6 */ /* Function 6 */
DWORD ScmrQueryServiceStatus([in] handle_t BindingHandle, DWORD ScmrQueryServiceStatus([in] handle_t BindingHandle,
@ -68,7 +78,8 @@ cpp_quote("#endif")
[out] LPSERVICE_STATUS lpServiceStatus); [out] LPSERVICE_STATUS lpServiceStatus);
/* Function 7 */ /* Function 7 */
DWORD ScmrSetServiceStatus([in] handle_t BindingHandle); /* FIXME */ DWORD ScmrSetServiceStatus([in] handle_t BindingHandle,
[in] SERVICE_STATUS_HANDLE hServiceStatus); /* FIXME */
/* Function 8 */ /* Function 8 */
DWORD ScmrUnlockServiceDatabase([in] handle_t BindingHandle, DWORD ScmrUnlockServiceDatabase([in] handle_t BindingHandle,
@ -78,6 +89,13 @@ cpp_quote("#endif")
DWORD ScmrNotifyBootConfigStatus([in] handle_t BindingHandle, DWORD ScmrNotifyBootConfigStatus([in] handle_t BindingHandle,
[in] BOOL BootAcceptable); [in] BOOL BootAcceptable);
/* Function 10 */
DWORD ScmrI_ScSetServiceBitsW([in] handle_t BindingHandle,
[in] SERVICE_STATUS_HANDLE hServiceStatus,
[in] DWORD dwServiceBits,
[in] BOOL bSetBitsOn,
[in] BOOL bUpdateImmediately,
[in, string, unique] LPWSTR lpString);
/* Function 11 */ /* Function 11 */
DWORD ScmrChangeServiceConfigW([in] handle_t BindingHandle, DWORD ScmrChangeServiceConfigW([in] handle_t BindingHandle,
@ -132,7 +150,7 @@ cpp_quote("#endif")
[in] DWORD dwBufSize, [in] DWORD dwBufSize,
[out] LPDWORD pcbBytesNeeded, [out] LPDWORD pcbBytesNeeded,
[out] LPDWORD lpServicesReturned, [out] LPDWORD lpServicesReturned,
[in, out] LPDWORD lpResumeHandle); /* FIXME: unique */ [in, out, unique] LPDWORD lpResumeHandle);
/* Function 15 */ /* Function 15 */
DWORD ScmrOpenSCManagerW([in] handle_t BindingHandle, DWORD ScmrOpenSCManagerW([in] handle_t BindingHandle,

View file

@ -449,7 +449,7 @@ PrivilegedServiceAuditAlarmW@20
;QueryAllTracesA ;QueryAllTracesA
;QueryAllTracesW ;QueryAllTracesW
QueryRecoveryAgentsOnEncryptedFile@8 QueryRecoveryAgentsOnEncryptedFile@8
;QueryServiceConfig2A@20 QueryServiceConfig2A@20
QueryServiceConfig2W@20 QueryServiceConfig2W@20
QueryServiceConfigA@16 QueryServiceConfigA@16
QueryServiceConfigW@16 QueryServiceConfigW@16

View file

@ -1035,8 +1035,7 @@ QueryServiceConfigA(
* *
* @implemented * @implemented
*/ */
BOOL BOOL STDCALL
STDCALL
QueryServiceConfigW(SC_HANDLE hService, QueryServiceConfigW(SC_HANDLE hService,
LPQUERY_SERVICE_CONFIGW lpServiceConfig, LPQUERY_SERVICE_CONFIGW lpServiceConfig,
DWORD cbBufSize, DWORD cbBufSize,
@ -1095,21 +1094,39 @@ QueryServiceConfigW(SC_HANDLE hService,
/********************************************************************** /**********************************************************************
* QueryServiceConfig2W * QueryServiceConfig2A
* *
* @unimplemented * @unimplemented
*/ */
BOOL BOOL
STDCALL STDCALL
QueryServiceConfig2W QueryServiceConfig2A(
(
SC_HANDLE hService, SC_HANDLE hService,
DWORD dwInfo, DWORD dwInfo,
LPBYTE lpBuffer, LPBYTE lpBuffer,
DWORD cbBufSize, DWORD cbBufSize,
LPDWORD pcbBytesNeeded) LPDWORD pcbBytesNeeded)
{ {
DPRINT1("QueryServiceConfigW2 is unimplemented\n"); DPRINT1("QueryServiceConfig2A is unimplemented\n");
return FALSE;
}
/**********************************************************************
* QueryServiceConfig2W
*
* @unimplemented
*/
BOOL
STDCALL
QueryServiceConfig2W(
SC_HANDLE hService,
DWORD dwInfo,
LPBYTE lpBuffer,
DWORD cbBufSize,
LPDWORD pcbBytesNeeded)
{
DPRINT1("QueryServiceConfig2W is unimplemented\n");
return FALSE; return FALSE;
} }
@ -1155,20 +1172,37 @@ QueryServiceLockStatusW(
/********************************************************************** /**********************************************************************
* QueryServiceObjectSecurity * QueryServiceObjectSecurity
* *
* @unimplemented * @implemented
*/ */
BOOL BOOL STDCALL
STDCALL QueryServiceObjectSecurity(SC_HANDLE hService,
QueryServiceObjectSecurity( SECURITY_INFORMATION dwSecurityInformation,
SC_HANDLE hService, PSECURITY_DESCRIPTOR lpSecurityDescriptor,
SECURITY_INFORMATION dwSecurityInformation, DWORD cbBufSize,
PSECURITY_DESCRIPTOR lpSecurityDescriptor, LPDWORD pcbBytesNeeded)
DWORD cbBufSize,
LPDWORD pcbBytesNeeded)
{ {
DPRINT1("QueryServiceObjectSecurity is unimplemented\n"); DWORD dwError;
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return FALSE; DPRINT("QueryServiceObjectSecurity(%p, %lu, %p)\n",
hService, dwSecurityInformation, lpSecurityDescriptor);
HandleBind();
/* Call to services.exe using RPC */
dwError = ScmrQueryServiceObjectSecurity(BindingHandle,
(unsigned int)hService,
dwSecurityInformation,
(unsigned char *)lpSecurityDescriptor,
cbBufSize,
pcbBytesNeeded);
if (dwError != ERROR_SUCCESS)
{
DPRINT1("QueryServiceObjectSecurity() failed (Error %lu)\n", dwError);
SetLastError(dwError);
return FALSE;
}
return TRUE;
} }
@ -1225,15 +1259,64 @@ QueryServiceStatusEx(SC_HANDLE hService,
/********************************************************************** /**********************************************************************
* SetServiceObjectSecurity * SetServiceObjectSecurity
* *
* @unimplemented * @implemented
*/ */
BOOL STDCALL BOOL STDCALL
SetServiceObjectSecurity(SC_HANDLE hService, SetServiceObjectSecurity(SC_HANDLE hService,
SECURITY_INFORMATION dwSecurityInformation, SECURITY_INFORMATION dwSecurityInformation,
PSECURITY_DESCRIPTOR lpSecurityDescriptor) PSECURITY_DESCRIPTOR lpSecurityDescriptor)
{ {
SetLastError(ERROR_CALL_NOT_IMPLEMENTED); PSECURITY_DESCRIPTOR SelfRelativeSD = NULL;
return FALSE; ULONG Length;
NTSTATUS Status;
DWORD dwError;
Length = 0;
Status = RtlMakeSelfRelativeSD(lpSecurityDescriptor,
SelfRelativeSD,
&Length);
if (Status != STATUS_BUFFER_TOO_SMALL)
{
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
SelfRelativeSD = HeapAlloc(GetProcessHeap(), 0, Length);
if (SelfRelativeSD == NULL)
{
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
return FALSE;
}
Status = RtlMakeSelfRelativeSD(lpSecurityDescriptor,
SelfRelativeSD,
&Length);
if (!NT_SUCCESS(Status))
{
HeapFree(GetProcessHeap(), 0, SelfRelativeSD);
SetLastError(RtlNtStatusToDosError(Status));
return FALSE;
}
HandleBind();
/* Call to services.exe using RPC */
dwError = ScmrSetServiceObjectSecurity(BindingHandle,
(unsigned int)hService,
dwSecurityInformation,
(unsigned char *)SelfRelativeSD,
Length);
HeapFree(GetProcessHeap(), 0, SelfRelativeSD);
if (dwError != ERROR_SUCCESS)
{
DPRINT1("ScmrServiceObjectSecurity() failed (Error %lu)\n", dwError);
SetLastError(dwError);
return FALSE;
}
return TRUE;
} }

View file

@ -453,16 +453,91 @@ ScmrLockServiceDatabase(handle_t BindingHandle,
/* Function 4 */ /* Function 4 */
unsigned long unsigned long
ScmrQueryServiceObjectSecurity(handle_t BindingHandle) ScmrQueryServiceObjectSecurity(handle_t BindingHandle,
unsigned int hService,
unsigned long dwSecurityInformation,
unsigned char *lpSecurityDescriptor,
unsigned long dwSecuityDescriptorSize,
unsigned long *pcbBytesNeeded)
{ {
DPRINT1("ScmrQueryServiceSecurity() is unimplemented\n"); PSERVICE_HANDLE hSvc;
return ERROR_CALL_NOT_IMPLEMENTED; PSERVICE lpService;
ULONG DesiredAccess = 0;
NTSTATUS Status;
DWORD dwBytesNeeded;
DWORD dwError;
DPRINT("ScmrQueryServiceSecurity() called\n");
hSvc = (PSERVICE_HANDLE)hService;
if (hSvc->Handle.Tag != SERVICE_TAG)
{
DPRINT1("Invalid handle tag!\n");
return ERROR_INVALID_HANDLE;
}
if (dwSecurityInformation & (DACL_SECURITY_INFORMATION ||
GROUP_SECURITY_INFORMATION ||
OWNER_SECURITY_INFORMATION))
DesiredAccess |= READ_CONTROL;
if (dwSecurityInformation & SACL_SECURITY_INFORMATION)
DesiredAccess |= ACCESS_SYSTEM_SECURITY;
if (!RtlAreAllAccessesGranted(hSvc->Handle.DesiredAccess,
DesiredAccess))
{
DPRINT1("Insufficient access rights! 0x%lx\n", hSvc->Handle.DesiredAccess);
return ERROR_ACCESS_DENIED;
}
lpService = hSvc->ServiceEntry;
if (lpService == NULL)
{
DPRINT1("lpService == NULL!\n");
return ERROR_INVALID_HANDLE;
}
/* FIXME: Lock the service list */
Status = RtlQuerySecurityObject(lpService->lpSecurityDescriptor,
dwSecurityInformation,
(PSECURITY_DESCRIPTOR)lpSecurityDescriptor,
dwSecuityDescriptorSize,
&dwBytesNeeded);
/* FIXME: Unlock the service list */
if (NT_SUCCESS(Status))
{
*pcbBytesNeeded = dwBytesNeeded;
dwError = STATUS_SUCCESS;
}
else if (Status == STATUS_BUFFER_TOO_SMALL)
{
*pcbBytesNeeded = dwBytesNeeded;
dwError = ERROR_INSUFFICIENT_BUFFER;
}
else if (Status == STATUS_BAD_DESCRIPTOR_FORMAT)
{
dwError = ERROR_GEN_FAILURE;
}
else
{
dwError = RtlNtStatusToDosError(Status);
}
return dwError;
} }
/* Function 5 */ /* Function 5 */
unsigned long unsigned long
ScmrSetServiceObjectSecurity(handle_t BindingHandle) ScmrSetServiceObjectSecurity(handle_t BindingHandle,
unsigned int hService,
unsigned long dwSecurityInformation,
unsigned char *lpSecurityDescriptor,
unsigned long dwSecuityDescriptorSize)
{ {
DPRINT1("ScmrSetServiceSecurity() is unimplemented\n"); DPRINT1("ScmrSetServiceSecurity() is unimplemented\n");
return ERROR_CALL_NOT_IMPLEMENTED; return ERROR_CALL_NOT_IMPLEMENTED;
@ -515,7 +590,8 @@ ScmrQueryServiceStatus(handle_t BindingHandle,
/* Function 7 */ /* Function 7 */
unsigned long unsigned long
ScmrSetServiceStatus(handle_t BindingHandle) ScmrSetServiceStatus(handle_t BindingHandle,
unsigned long hServiceStatus) /* FIXME */
{ {
DPRINT1("ScmrSetServiceStatus() is unimplemented\n"); DPRINT1("ScmrSetServiceStatus() is unimplemented\n");
/* FIXME */ /* FIXME */
@ -545,6 +621,21 @@ ScmrNotifyBootConfigStatus(handle_t BindingHandle,
} }
/* Function 10 */
unsigned long
ScmrI_ScSetServiceBitsW(handle_t BindingHandle,
unsigned long hServiceStatus,
unsigned long dwServiceBits,
unsigned long bSetBitsOn,
unsigned long bUpdateImmediately,
wchar_t *lpString)
{
DPRINT1("ScmrI_ScSetServiceBitsW() called\n");
/* FIXME */
return ERROR_SUCCESS;
}
/* Function 11 */ /* Function 11 */
unsigned long unsigned long
ScmrChangeServiceConfigW(handle_t BiningHandle, ScmrChangeServiceConfigW(handle_t BiningHandle,

View file

@ -25,6 +25,8 @@ typedef struct _SERVICE
ULONG Flags; ULONG Flags;
PSECURITY_DESCRIPTOR lpSecurityDescriptor;
BOOLEAN ServiceVisited; BOOLEAN ServiceVisited;
HANDLE ControlPipeHandle; HANDLE ControlPipeHandle;