X-Git-Url: https://git.reactos.org/?p=reactos.git;a=blobdiff_plain;f=reactos%2Fbase%2Fsystem%2Fservices%2Fconfig.c;h=c3310cdccec23eca3fd7bf24e2a1fb378c1b6b9d;hp=4a529c171d60ccb103b36fafe66b0f0b6b9e75cc;hb=197eafa50e81c6671e75546c474a8d452d8a08d2;hpb=1dc0ccde6a0212822fe32fdf80c7d7f32d04fbe2 diff --git a/reactos/base/system/services/config.c b/reactos/base/system/services/config.c index 4a529c171d6..c3310cdccec 100644 --- a/reactos/base/system/services/config.c +++ b/reactos/base/system/services/config.c @@ -10,6 +10,7 @@ /* INCLUDES *****************************************************************/ #include "services.h" +#include #define NDEBUG #include @@ -443,4 +444,58 @@ ScmReadDependencies(HKEY hServiceKey, return ERROR_SUCCESS; } + +DWORD +ScmSetServicePassword( + IN PCWSTR pszServiceName, + IN PCWSTR pszPassword) +{ + OBJECT_ATTRIBUTES ObjectAttributes; + LSA_HANDLE PolicyHandle = NULL; + UNICODE_STRING ServiceName = {0, 0, NULL}; + UNICODE_STRING Password; + NTSTATUS Status; + DWORD dwError = ERROR_SUCCESS; + + RtlZeroMemory(&ObjectAttributes, sizeof(OBJECT_ATTRIBUTES)); + + Status = LsaOpenPolicy(NULL, + &ObjectAttributes, + POLICY_CREATE_SECRET, + &PolicyHandle); + if (!NT_SUCCESS(Status)) + return RtlNtStatusToDosError(Status); + + ServiceName.Length = (wcslen(pszServiceName) + 4) * sizeof(WCHAR); + ServiceName.MaximumLength = ServiceName.Length + sizeof(WCHAR); + ServiceName.Buffer = HeapAlloc(GetProcessHeap(), + HEAP_ZERO_MEMORY, + ServiceName.MaximumLength); + if (ServiceName.Buffer == NULL) + return ERROR_NOT_ENOUGH_MEMORY; + + wcscpy(ServiceName.Buffer, L"_SC_"); + wcscat(ServiceName.Buffer, pszServiceName); + + RtlInitUnicodeString(&Password, pszPassword); + + Status = LsaStorePrivateData(PolicyHandle, + &ServiceName, + &Password); + if (!NT_SUCCESS(Status)) + { + dwError = RtlNtStatusToDosError(Status); + goto done; + } + +done: + if (ServiceName.Buffer != NULL) + HeapFree(GetProcessHeap(), 0, ServiceName.Buffer); + + if (PolicyHandle != NULL) + LsaClose(PolicyHandle); + + return dwError; +} + /* EOF */