ReactOS.org
Sign In
Sign Up
Sign In
Sign Up
Manage this list
×
Keyboard Shortcuts
Thread View
j
: Next unread message
k
: Previous unread message
j a
: Jump to all threads
j l
: Jump to MailingList overview
2024
December
November
October
September
August
July
June
May
April
March
February
January
2023
December
November
October
September
August
July
June
May
April
March
February
January
2022
December
November
October
September
August
July
June
May
April
March
February
January
2021
December
November
October
September
August
July
June
May
April
March
February
January
2020
December
November
October
September
August
July
June
May
April
March
February
January
2019
December
November
October
September
August
July
June
May
April
March
February
January
2018
December
November
October
September
August
July
June
May
April
March
February
January
2017
December
November
October
September
August
July
June
May
April
March
February
January
2016
December
November
October
September
August
July
June
May
April
March
February
January
2015
December
November
October
September
August
July
June
May
April
March
February
January
2014
December
November
October
September
August
July
June
May
April
March
February
January
2013
December
November
October
September
August
July
June
May
April
March
February
January
2012
December
November
October
September
August
July
June
May
April
March
February
January
2011
December
November
October
September
August
July
June
May
April
March
February
January
2010
December
November
October
September
August
July
June
May
April
March
February
January
2009
December
November
October
September
August
July
June
May
April
March
February
January
2008
December
November
October
September
August
July
June
May
April
March
February
January
2007
December
November
October
September
August
July
June
May
April
March
February
January
2006
December
November
October
September
August
July
June
May
April
March
February
January
2005
December
November
October
September
August
July
June
May
April
March
February
January
2004
December
November
October
September
August
July
June
May
April
March
February
List overview
Download
Ros-diffs
September 2018
----- 2024 -----
December 2024
November 2024
October 2024
September 2024
August 2024
July 2024
June 2024
May 2024
April 2024
March 2024
February 2024
January 2024
----- 2023 -----
December 2023
November 2023
October 2023
September 2023
August 2023
July 2023
June 2023
May 2023
April 2023
March 2023
February 2023
January 2023
----- 2022 -----
December 2022
November 2022
October 2022
September 2022
August 2022
July 2022
June 2022
May 2022
April 2022
March 2022
February 2022
January 2022
----- 2021 -----
December 2021
November 2021
October 2021
September 2021
August 2021
July 2021
June 2021
May 2021
April 2021
March 2021
February 2021
January 2021
----- 2020 -----
December 2020
November 2020
October 2020
September 2020
August 2020
July 2020
June 2020
May 2020
April 2020
March 2020
February 2020
January 2020
----- 2019 -----
December 2019
November 2019
October 2019
September 2019
August 2019
July 2019
June 2019
May 2019
April 2019
March 2019
February 2019
January 2019
----- 2018 -----
December 2018
November 2018
October 2018
September 2018
August 2018
July 2018
June 2018
May 2018
April 2018
March 2018
February 2018
January 2018
----- 2017 -----
December 2017
November 2017
October 2017
September 2017
August 2017
July 2017
June 2017
May 2017
April 2017
March 2017
February 2017
January 2017
----- 2016 -----
December 2016
November 2016
October 2016
September 2016
August 2016
July 2016
June 2016
May 2016
April 2016
March 2016
February 2016
January 2016
----- 2015 -----
December 2015
November 2015
October 2015
September 2015
August 2015
July 2015
June 2015
May 2015
April 2015
March 2015
February 2015
January 2015
----- 2014 -----
December 2014
November 2014
October 2014
September 2014
August 2014
July 2014
June 2014
May 2014
April 2014
March 2014
February 2014
January 2014
----- 2013 -----
December 2013
November 2013
October 2013
September 2013
August 2013
July 2013
June 2013
May 2013
April 2013
March 2013
February 2013
January 2013
----- 2012 -----
December 2012
November 2012
October 2012
September 2012
August 2012
July 2012
June 2012
May 2012
April 2012
March 2012
February 2012
January 2012
----- 2011 -----
December 2011
November 2011
October 2011
September 2011
August 2011
July 2011
June 2011
May 2011
April 2011
March 2011
February 2011
January 2011
----- 2010 -----
December 2010
November 2010
October 2010
September 2010
August 2010
July 2010
June 2010
May 2010
April 2010
March 2010
February 2010
January 2010
----- 2009 -----
December 2009
November 2009
October 2009
September 2009
August 2009
July 2009
June 2009
May 2009
April 2009
March 2009
February 2009
January 2009
----- 2008 -----
December 2008
November 2008
October 2008
September 2008
August 2008
July 2008
June 2008
May 2008
April 2008
March 2008
February 2008
January 2008
----- 2007 -----
December 2007
November 2007
October 2007
September 2007
August 2007
July 2007
June 2007
May 2007
April 2007
March 2007
February 2007
January 2007
----- 2006 -----
December 2006
November 2006
October 2006
September 2006
August 2006
July 2006
June 2006
May 2006
April 2006
March 2006
February 2006
January 2006
----- 2005 -----
December 2005
November 2005
October 2005
September 2005
August 2005
July 2005
June 2005
May 2005
April 2005
March 2005
February 2005
January 2005
----- 2004 -----
December 2004
November 2004
October 2004
September 2004
August 2004
July 2004
June 2004
May 2004
April 2004
March 2004
February 2004
ros-diffs@reactos.org
24 participants
223 discussions
Start a n
N
ew thread
01/01: [ADVAPI32_WINETEST] Fix the STATUS issues
by Eric Kohl
https://git.reactos.org/?p=reactos.git;a=commitdiff;h=47854962ac4d753f34088…
commit 47854962ac4d753f340884c7b56088079cd24e96 Author: Eric Kohl <eric.kohl(a)reactos.org> AuthorDate: Tue Sep 18 00:24:36 2018 +0200 Commit: Eric Kohl <eric.kohl(a)reactos.org> CommitDate: Tue Sep 18 00:24:36 2018 +0200 [ADVAPI32_WINETEST] Fix the STATUS issues --- modules/rostests/winetests/advapi32/crypt.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/rostests/winetests/advapi32/crypt.c b/modules/rostests/winetests/advapi32/crypt.c index a09e8db57d..48d08643a1 100644 --- a/modules/rostests/winetests/advapi32/crypt.c +++ b/modules/rostests/winetests/advapi32/crypt.c @@ -20,6 +20,8 @@ #include <stdarg.h> +#include "ntstatus.h" +#define WIN32_NO_STATUS #include "windef.h" #include "winbase.h" #include "wincrypt.h"
6 years, 3 months
1
0
0
0
01/01: [ADVAPI32] SystemFunction004 and SystemFunction005 must return the required output buffer size via out->Length when the buffer is too small.
by Eric Kohl
https://git.reactos.org/?p=reactos.git;a=commitdiff;h=6c0d9c01e20574c427a23…
commit 6c0d9c01e20574c427a23f005a8b878fc5a6c115 Author: Eric Kohl <eric.kohl(a)reactos.org> AuthorDate: Mon Sep 17 23:19:02 2018 +0200 Commit: Eric Kohl <eric.kohl(a)reactos.org> CommitDate: Mon Sep 17 23:19:02 2018 +0200 [ADVAPI32] SystemFunction004 and SystemFunction005 must return the required output buffer size via out->Length when the buffer is too small. --- dll/win32/advapi32/misc/sysfunc.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/dll/win32/advapi32/misc/sysfunc.c b/dll/win32/advapi32/misc/sysfunc.c index b0ed231faf..b6bee62248 100644 --- a/dll/win32/advapi32/misc/sysfunc.c +++ b/dll/win32/advapi32/misc/sysfunc.c @@ -1,7 +1,7 @@ /* * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries - * FILE: dll/win32/advapi32/misc/sysfun.c + * FILE: dll/win32/advapi32/misc/sysfunc.c * PURPOSE: advapi32.dll system functions (undocumented) * PROGRAMMER: Emanuele Aliberti * UPDATE HISTORY: @@ -130,7 +130,10 @@ WINAPI SystemFunction004(const struct ustring *in, crypt_len = ((in->Length+7)&~7); if (out->MaximumLength < (crypt_len+8)) + { + out->Length = crypt_len + 8; return STATUS_BUFFER_TOO_SMALL; + } data.ui[0] = in->Length; data.ui[1] = 1; @@ -203,7 +206,10 @@ WINAPI SystemFunction005(const struct ustring *in, crypt_len = data.ui[0]; if (crypt_len > out->MaximumLength) + { + out->Length = crypt_len; return STATUS_BUFFER_TOO_SMALL; + } for (ofs=0; (ofs+8)<crypt_len; ofs+=8) CRYPT_DESunhash(out->Buffer+ofs, deskey, in->Buffer+ofs+8);
6 years, 3 months
1
0
0
0
01/01: [ADVAPI32_WINETEST] Add tests for SystemFunction004 and SystemFunction005.
by Eric Kohl
https://git.reactos.org/?p=reactos.git;a=commitdiff;h=ffd1293f99a8796629f28…
commit ffd1293f99a8796629f283673edd16c81bf6a104 Author: Eric Kohl <eric.kohl(a)reactos.org> AuthorDate: Mon Sep 17 23:12:16 2018 +0200 Commit: Eric Kohl <eric.kohl(a)reactos.org> CommitDate: Mon Sep 17 23:12:16 2018 +0200 [ADVAPI32_WINETEST] Add tests for SystemFunction004 and SystemFunction005. These tests show that the required output buffer size it returned in out.Length field when STATUS_BUFFER_TOO_SMALL is returned. This patch will be sent upstream. --- modules/rostests/winetests/advapi32/crypt.c | 120 ++++++++++++++++++++++++++++ 1 file changed, 120 insertions(+) diff --git a/modules/rostests/winetests/advapi32/crypt.c b/modules/rostests/winetests/advapi32/crypt.c index 13671eb0c2..a09e8db57d 100644 --- a/modules/rostests/winetests/advapi32/crypt.c +++ b/modules/rostests/winetests/advapi32/crypt.c @@ -28,6 +28,12 @@ #include "wine/test.h" +struct ustring { + DWORD Length; + DWORD MaximumLength; + unsigned char *Buffer; +}; + static const char szRsaBaseProv[] = MS_DEF_PROV_A; static const char szNonExistentProv[] = "Wine Nonexistent Cryptographic Provider v11.2"; static const char szKeySet[] = "wine_test_keyset"; @@ -64,6 +70,8 @@ static BOOL (WINAPI *pCryptSetHashParam)(HCRYPTKEY, DWORD, BYTE*, DWORD); static BOOL (WINAPI *pCryptSetKeyParam)(HCRYPTKEY, DWORD, BYTE*, DWORD); static BOOL (WINAPI *pCryptSetProvParam)(HCRYPTPROV, DWORD, BYTE*, DWORD); static BOOL (WINAPI *pCryptVerifySignatureW)(HCRYPTHASH, BYTE*, DWORD, HCRYPTKEY, LPCWSTR, DWORD); +static NTSTATUS (WINAPI *pSystemFunction004)(struct ustring*,struct ustring*, struct ustring*); +static NTSTATUS (WINAPI *pSystemFunction005)(struct ustring*,struct ustring*, struct ustring*); static BOOLEAN (WINAPI *pSystemFunction036)(PVOID, ULONG); static void init_function_pointers(void) @@ -100,6 +108,8 @@ static void init_function_pointers(void) pCryptSetKeyParam = (void*)GetProcAddress(hadvapi32, "CryptSetKeyParam"); pCryptSetProvParam = (void*)GetProcAddress(hadvapi32, "CryptSetProvParam"); pCryptVerifySignatureW = (void*)GetProcAddress(hadvapi32, "CryptVerifySignatureW"); + pSystemFunction004 = (void*)GetProcAddress(hadvapi32, "SystemFunction004"); + pSystemFunction005 = (void*)GetProcAddress(hadvapi32, "SystemFunction005"); pSystemFunction036 = (void*)GetProcAddress(hadvapi32, "SystemFunction036"); } @@ -1120,6 +1130,114 @@ static void test_rc2_keylen(void) } } +static void test_SystemFunction004(void) +{ + struct ustring inData; + struct ustring keyData; + struct ustring outData; + char inString[] = "Testdata for encryption"; + char keyString[] = "EncryptionKey"; + unsigned char outBuffer[32]; + NTSTATUS Status; +#if 0 + int i; +#endif + + if (!pSystemFunction004) + { + win_skip("SystemFunction004 is not available\n"); + return; + } + + inData.Length = strlen(inString) + 1; + inData.MaximumLength = inData.Length; + inData.Buffer = (unsigned char *)inString; + + keyData.Length = strlen(keyString) + 1; + keyData.MaximumLength = keyData.Length; + keyData.Buffer = (unsigned char *)keyString; + + outData.Length = 0; + outData.MaximumLength = 0; + outData.Buffer = NULL; + + Status = pSystemFunction004(&inData, &keyData, &outData); + ok(Status == STATUS_BUFFER_TOO_SMALL, "Expected SystemFunction004 to return STATUS_BUFFER_TOO_SMALL, got 0x%08lx\n", Status); + ok(outData.Length == 32, "Expected outData.Length to be 32, got %lu\n", outData.Length); + ok(outData.MaximumLength == 0, "Expected outData.MaximumLength to be 0, got %lu\n", outData.MaximumLength); + ok(outData.Buffer == NULL, "Expected outData.Length to be NULL, got %p\n", outData.Buffer); + + outData.Length = sizeof(outBuffer); + outData.MaximumLength = outData.Length; + outData.Buffer = outBuffer; + + Status = pSystemFunction004(&inData, &keyData, &outData); + ok(Status == STATUS_SUCCESS, "Expected SystemFunction004 to return STATUS_SUCCESS, got 0x%08lx\n", Status); + ok(outData.Length == 32, "Expected outData.Length to be 32, got %lu\n", outData.Length); + ok(outData.MaximumLength == 32, "Expected outData.MaximumLength to be 32, got %lu\n", outData.MaximumLength); + ok(outData.Buffer != NULL, "Expected outData.Buffer not to be NULL, got %p\n", outData.Buffer); +#if 0 + if (Status == STATUS_SUCCESS) + { + printf("outData.Buffer:\n"); + for (i = 0; i < sizeof(outBuffer); i++) + printf("0x%02x ", outBuffer[i]); + printf("\n"); + } +#endif +} + +static void test_SystemFunction005(void) +{ + struct ustring inData; + struct ustring keyData; + struct ustring outData; + unsigned char inBuffer[32] = {0xdc, 0xff, 0x05, 0x8d, 0xaf, 0xb6, 0xe2, 0x8c, 0x4f, 0xee, 0x00, 0x06, 0xac, 0x1d, 0x56, 0xf1, + 0x24, 0xbd, 0x17, 0xe0, 0xf6, 0xb8, 0x6d, 0x3a, 0x69, 0x5d, 0x14, 0xf9, 0x5a, 0x54, 0x93, 0xd1}; + char keyString[] = "EncryptionKey"; + char outBuffer[24]; + NTSTATUS Status; + + if (!pSystemFunction005) + { + win_skip("SystemFunction005 is not available\n"); + return; + } + + inData.Length = sizeof(inBuffer); + inData.MaximumLength = inData.Length; + inData.Buffer = inBuffer; + + keyData.Length = strlen(keyString) + 1; + keyData.MaximumLength = keyData.Length; + keyData.Buffer = (unsigned char *)keyString; + + outData.Length = 0; + outData.MaximumLength = 0; + outData.Buffer = NULL; + + Status = pSystemFunction005(&inData, &keyData, &outData); + ok(Status == STATUS_BUFFER_TOO_SMALL, "Expected SystemFunction005 to return STATUS_BUFFER_TOO_SMALL, got 0x%08lx\n", Status); + ok(outData.Length == 24, "Expected outData.Length to be 24, got %lu\n", outData.Length); + ok(outData.MaximumLength == 0, "Expected outData.MaximumLength to be 0, got %lu\n", outData.MaximumLength); + ok(outData.Buffer == NULL, "Expected outData.Buffer to be NULL, got %p\n", outData.Buffer); + + outData.Length = sizeof(outBuffer); + outData.MaximumLength = outData.Length; + outData.Buffer = (unsigned char *)outBuffer; + + Status = pSystemFunction005(&inData, &keyData, &outData); + ok(Status == STATUS_SUCCESS, "Expected SystemFunction005 to return STATUS_SUCCESS, got 0x%08lx\n", Status); + ok(outData.Length == 24, "Expected outData.Length to be 24, got %lu\n", outData.Length); + ok(outData.MaximumLength == 24, "Expected outData.MaximumLength to be 24, got %lu\n", outData.MaximumLength); + ok(outData.Buffer != NULL, "Expected outData.Buffer not to be NULL, got %p\n", outData.Buffer); +#if 0 + if (Status == STATUS_SUCCESS) + printf("outData.Buffer: '%s'\n", outData.Buffer); +#endif +} + + static void test_SystemFunction036(void) { BOOL ret; @@ -1200,5 +1318,7 @@ START_TEST(crypt) test_enum_provider_types(); test_get_default_provider(); test_set_provider_ex(); + test_SystemFunction004(); + test_SystemFunction005(); test_SystemFunction036(); }
6 years, 3 months
1
0
0
0
01/01: [ADVAPI32][SERVICES] Add (dummy) password encryption/decryption functions to CreateServiceA/W and ChangeServiceConfigA/W in order to prepare to pass encrypted passwords to the service manager
by Eric Kohl
https://git.reactos.org/?p=reactos.git;a=commitdiff;h=5e2c4657ca10dea1154cb…
commit 5e2c4657ca10dea1154cb43f16ee6962999ac7a4 Author: Eric Kohl <eric.kohl(a)reactos.org> AuthorDate: Mon Sep 17 16:34:48 2018 +0200 Commit: Eric Kohl <eric.kohl(a)reactos.org> CommitDate: Mon Sep 17 16:34:48 2018 +0200 [ADVAPI32][SERVICES] Add (dummy) password encryption/decryption functions to CreateServiceA/W and ChangeServiceConfigA/W in order to prepare to pass encrypted passwords to the service manager --- base/system/services/config.c | 24 ++++++++ base/system/services/rpcserver.c | 49 ++++++++++++++-- base/system/services/services.h | 7 +++ dll/win32/advapi32/service/scm.c | 123 ++++++++++++++++++++++++++++++++------- 4 files changed, 177 insertions(+), 26 deletions(-) diff --git a/base/system/services/config.c b/base/system/services/config.c index 2099d64214..14af8e5b0f 100644 --- a/base/system/services/config.c +++ b/base/system/services/config.c @@ -677,4 +677,28 @@ done: return dwError; } + +DWORD +ScmDecryptPassword( + _In_ PBYTE pPassword, + _In_ DWORD dwPasswordSize, + _Out_ PWSTR *pClearTextPassword) +{ + PWSTR pBuffer; + + /* Allocate a buffer for the decrypted password */ + pBuffer = HeapAlloc(GetProcessHeap(), 0, dwPasswordSize); + if (pBuffer == NULL) + return ERROR_OUTOFMEMORY; + + /* Decrypt the password */ + CopyMemory(pBuffer, + pPassword, + dwPasswordSize); + + *pClearTextPassword = pBuffer; + + return ERROR_SUCCESS; +} + /* EOF */ diff --git a/base/system/services/rpcserver.c b/base/system/services/rpcserver.c index aa64233350..454181bb66 100644 --- a/base/system/services/rpcserver.c +++ b/base/system/services/rpcserver.c @@ -1934,6 +1934,7 @@ RChangeServiceConfigW( HKEY hServiceKey = NULL; LPWSTR lpDisplayNameW = NULL; LPWSTR lpImagePathW = NULL; + LPWSTR lpClearTextPassword = NULL; DPRINT("RChangeServiceConfigW() called\n"); DPRINT("dwServiceType = 0x%lx\n", dwServiceType); @@ -1941,6 +1942,9 @@ RChangeServiceConfigW( DPRINT("dwErrorControl = %lu\n", dwErrorControl); DPRINT("lpBinaryPathName = %S\n", lpBinaryPathName); DPRINT("lpLoadOrderGroup = %S\n", lpLoadOrderGroup); + DPRINT("lpServiceStartName = %S\n", lpServiceStartName); + DPRINT("lpPassword = %p\n", lpPassword); + DPRINT("dwPwSite = %lu\n", dwPwSize); DPRINT("lpDisplayName = %S\n", lpDisplayName); if (ScmShutdown) @@ -2199,13 +2203,25 @@ RChangeServiceConfigW( { if (*(LPWSTR)lpPassword != 0) { - /* FIXME: Decrypt the password */ + /* Decrypt the password */ + dwError = ScmDecryptPassword(lpPassword, + dwPwSize, + &lpClearTextPassword); + if (dwError != ERROR_SUCCESS) + { + DPRINT1("ScmDecryptPassword failed (Error %lu)\n", dwError); + goto done; + } + DPRINT1("Clear text password: %S\n", lpClearTextPassword); /* Write the password */ dwError = ScmSetServicePassword(lpService->szServiceName, - (LPCWSTR)lpPassword); + lpClearTextPassword); if (dwError != ERROR_SUCCESS) + { + DPRINT1("ScmSetServicePassword failed (Error %lu)\n", dwError); goto done; + } } else { @@ -2216,12 +2232,23 @@ RChangeServiceConfigW( dwError = ERROR_SUCCESS; if (dwError != ERROR_SUCCESS) + { + DPRINT1("ScmSetServicePassword failed (Error %lu)\n", dwError); goto done; + } } } } done: + if (lpClearTextPassword != NULL) + { + /* Wipe and release the password buffer */ + ZeroMemory(lpClearTextPassword, + (wcslen(lpClearTextPassword) + 1) * sizeof(WCHAR)); + HeapFree(GetProcessHeap(), 0, lpClearTextPassword); + } + if (hServiceKey != NULL) RegCloseKey(hServiceKey); @@ -2260,6 +2287,7 @@ RCreateServiceW( PSERVICE lpService = NULL; SC_HANDLE hServiceHandle = NULL; LPWSTR lpImagePath = NULL; + LPWSTR lpClearTextPassword = NULL; HKEY hServiceKey = NULL; LPWSTR lpObjectName; @@ -2576,11 +2604,16 @@ RCreateServiceW( if (lpPassword != NULL && *(LPWSTR)lpPassword != 0) { - /* FIXME: Decrypt the password */ + /* Decrypt the password */ + dwError = ScmDecryptPassword(lpPassword, + dwPwSize, + &lpClearTextPassword); + if (dwError != ERROR_SUCCESS) + goto done; /* Write the password */ dwError = ScmSetServicePassword(lpServiceName, - (LPCWSTR)lpPassword); + lpClearTextPassword); if (dwError != ERROR_SUCCESS) goto done; } @@ -2612,6 +2645,14 @@ done: if (hServiceKey != NULL) RegCloseKey(hServiceKey); + if (lpClearTextPassword != NULL) + { + /* Wipe and release the password buffer */ + ZeroMemory(lpClearTextPassword, + (wcslen(lpClearTextPassword) + 1) * sizeof(WCHAR)); + HeapFree(GetProcessHeap(), 0, lpClearTextPassword); + } + if (dwError == ERROR_SUCCESS) { DPRINT("hService %p\n", hServiceHandle); diff --git a/base/system/services/services.h b/base/system/services/services.h index b455bead0f..ce1b46eafa 100644 --- a/base/system/services/services.h +++ b/base/system/services/services.h @@ -150,6 +150,13 @@ ScmDeleteRegKey( _In_ HKEY hKey, _In_ PCWSTR pszSubKey); +DWORD +ScmDecryptPassword( + _In_ PBYTE pPassword, + _In_ DWORD dwPasswordSize, + _Out_ PWSTR *pDecryptedPassword); + + /* controlset.c */ BOOL ScmGetControlSetValues(VOID); diff --git a/dll/win32/advapi32/service/scm.c b/dll/win32/advapi32/service/scm.c index 92661c9581..022864bba9 100644 --- a/dll/win32/advapi32/service/scm.c +++ b/dll/win32/advapi32/service/scm.c @@ -155,6 +155,33 @@ ScmRpcStatusToWinError(RPC_STATUS Status) } +static +DWORD +ScmEncryptPassword( + _In_ PCWSTR pClearTextPassword, + _Out_ PBYTE *pEncryptedPassword, + _Out_ PDWORD pEncryptedPasswordSize) +{ + DWORD dwSize; + PBYTE pBuffer; + + dwSize = (wcslen(pClearTextPassword) + 1) * sizeof(WCHAR); + + pBuffer = HeapAlloc(GetProcessHeap(), 0, dwSize); + if (pBuffer == NULL) + return ERROR_OUTOFMEMORY; + + CopyMemory(pBuffer, + pClearTextPassword, + dwSize); + + *pEncryptedPassword = pBuffer; + *pEncryptedPasswordSize = dwSize; + + return ERROR_SUCCESS; +} + + /********************************************************************** * ChangeServiceConfig2A * @@ -293,12 +320,12 @@ ChangeServiceConfigA(SC_HANDLE hService, DWORD dwDependenciesLength = 0; SIZE_T cchLength; LPCSTR lpStr; - DWORD dwPasswordLength = 0; + DWORD dwPasswordSize = 0; LPWSTR lpPasswordW = NULL; LPBYTE lpEncryptedPassword = NULL; TRACE("ChangeServiceConfigA(%p %lu %lu %lu %s %s %p %s %s %s %s)\n", - dwServiceType, dwStartType, dwErrorControl, debugstr_a(lpBinaryPathName), + hService, dwServiceType, dwStartType, dwErrorControl, debugstr_a(lpBinaryPathName), debugstr_a(lpLoadOrderGroup), lpdwTagId, debugstr_a(lpDependencies), debugstr_a(lpServiceStartName), debugstr_a(lpPassword), debugstr_a(lpDisplayName)); @@ -334,9 +361,12 @@ ChangeServiceConfigA(SC_HANDLE hService, lpPasswordW, (int)(strlen(lpPassword) + 1)); - /* FIXME: Encrypt the password */ - lpEncryptedPassword = (LPBYTE)lpPasswordW; - dwPasswordLength = (wcslen(lpPasswordW) + 1) * sizeof(WCHAR); + /* Encrypt the unicode password */ + dwError = ScmEncryptPassword(lpPasswordW, + &lpEncryptedPassword, + &dwPasswordSize); + if (dwError != ERROR_SUCCESS) + goto done; } RpcTryExcept @@ -352,7 +382,7 @@ ChangeServiceConfigA(SC_HANDLE hService, dwDependenciesLength, (LPSTR)lpServiceStartName, lpEncryptedPassword, - dwPasswordLength, + dwPasswordSize, (LPSTR)lpDisplayName); } RpcExcept(EXCEPTION_EXECUTE_HANDLER) @@ -361,9 +391,20 @@ ChangeServiceConfigA(SC_HANDLE hService, } RpcEndExcept; +done: if (lpPasswordW != NULL) + { + /* Wipe and release the password buffers */ + ZeroMemory(lpPasswordW, (wcslen(lpPasswordW) + 1) * sizeof(WCHAR)); HeapFree(GetProcessHeap(), 0, lpPasswordW); + if (lpEncryptedPassword != NULL) + { + ZeroMemory(lpEncryptedPassword, dwPasswordSize); + HeapFree(GetProcessHeap(), 0, lpEncryptedPassword); + } + } + if (dwError != ERROR_SUCCESS) { TRACE("RChangeServiceConfigA() failed (Error %lu)\n", dwError); @@ -397,11 +438,11 @@ ChangeServiceConfigW(SC_HANDLE hService, DWORD dwDependenciesLength = 0; SIZE_T cchLength; LPCWSTR lpStr; - DWORD dwPasswordLength = 0; + DWORD dwPasswordSize = 0; LPBYTE lpEncryptedPassword = NULL; TRACE("ChangeServiceConfigW(%p %lu %lu %lu %s %s %p %s %s %s %s)\n", - dwServiceType, dwStartType, dwErrorControl, debugstr_w(lpBinaryPathName), + hService, dwServiceType, dwStartType, dwErrorControl, debugstr_w(lpBinaryPathName), debugstr_w(lpLoadOrderGroup), lpdwTagId, debugstr_w(lpDependencies), debugstr_w(lpServiceStartName), debugstr_w(lpPassword), debugstr_w(lpDisplayName)); @@ -421,9 +462,14 @@ ChangeServiceConfigW(SC_HANDLE hService, if (lpPassword != NULL) { - /* FIXME: Encrypt the password */ - lpEncryptedPassword = (LPBYTE)lpPassword; - dwPasswordLength = (wcslen(lpPassword) + 1) * sizeof(WCHAR); + dwError = ScmEncryptPassword(lpPassword, + &lpEncryptedPassword, + &dwPasswordSize); + if (dwError != ERROR_SUCCESS) + { + ERR("ScmEncryptPassword failed (Error %lu)\n", dwError); + goto done; + } } RpcTryExcept @@ -439,7 +485,7 @@ ChangeServiceConfigW(SC_HANDLE hService, dwDependenciesLength, (LPWSTR)lpServiceStartName, lpEncryptedPassword, - dwPasswordLength, + dwPasswordSize, (LPWSTR)lpDisplayName); } RpcExcept(EXCEPTION_EXECUTE_HANDLER) @@ -448,6 +494,14 @@ ChangeServiceConfigW(SC_HANDLE hService, } RpcEndExcept; +done: + if (lpEncryptedPassword != NULL) + { + /* Wipe and release the password buffer */ + ZeroMemory(lpEncryptedPassword, dwPasswordSize); + HeapFree(GetProcessHeap(), 0, lpEncryptedPassword); + } + if (dwError != ERROR_SUCCESS) { TRACE("RChangeServiceConfigW() failed (Error %lu)\n", dwError); @@ -584,7 +638,7 @@ CreateServiceA(SC_HANDLE hSCManager, DWORD dwError; SIZE_T cchLength; LPCSTR lpStr; - DWORD dwPasswordLength = 0; + DWORD dwPasswordSize = 0; LPWSTR lpPasswordW = NULL; LPBYTE lpEncryptedPassword = NULL; @@ -632,9 +686,12 @@ CreateServiceA(SC_HANDLE hSCManager, lpPasswordW, (int)(strlen(lpPassword) + 1)); - /* FIXME: Encrypt the password */ - lpEncryptedPassword = (LPBYTE)lpPasswordW; - dwPasswordLength = (wcslen(lpPasswordW) + 1) * sizeof(WCHAR); + /* Encrypt the password */ + dwError = ScmEncryptPassword(lpPasswordW, + &lpEncryptedPassword, + &dwPasswordSize); + if (dwError != ERROR_SUCCESS) + goto done; } RpcTryExcept @@ -653,7 +710,7 @@ CreateServiceA(SC_HANDLE hSCManager, dwDependenciesLength, (LPSTR)lpServiceStartName, lpEncryptedPassword, - dwPasswordLength, + dwPasswordSize, (SC_RPC_HANDLE *)&hService); } RpcExcept(EXCEPTION_EXECUTE_HANDLER) @@ -662,9 +719,20 @@ CreateServiceA(SC_HANDLE hSCManager, } RpcEndExcept; +done: if (lpPasswordW != NULL) + { + /* Wipe and release the password buffers */ + ZeroMemory(lpPasswordW, (wcslen(lpPasswordW) + 1) * sizeof(WCHAR)); HeapFree(GetProcessHeap(), 0, lpPasswordW); + if (lpEncryptedPassword != NULL) + { + ZeroMemory(lpEncryptedPassword, dwPasswordSize); + HeapFree(GetProcessHeap(), 0, lpEncryptedPassword); + } + } + SetLastError(dwError); if (dwError != ERROR_SUCCESS) { @@ -701,7 +769,7 @@ CreateServiceW(SC_HANDLE hSCManager, DWORD dwError; SIZE_T cchLength; LPCWSTR lpStr; - DWORD dwPasswordLength = 0; + DWORD dwPasswordSize = 0; LPBYTE lpEncryptedPassword = NULL; TRACE("CreateServiceW(%p %s %s %lx %lu %lu %lu %s %s %p %s %s %s)\n", @@ -732,9 +800,12 @@ CreateServiceW(SC_HANDLE hSCManager, if (lpPassword != NULL) { - /* FIXME: Encrypt the password */ - lpEncryptedPassword = (LPBYTE)lpPassword; - dwPasswordLength = (wcslen(lpPassword) + 1) * sizeof(WCHAR); + /* Encrypt the password */ + dwError = ScmEncryptPassword(lpPassword, + &lpEncryptedPassword, + &dwPasswordSize); + if (dwError != ERROR_SUCCESS) + goto done; } RpcTryExcept @@ -753,7 +824,7 @@ CreateServiceW(SC_HANDLE hSCManager, dwDependenciesLength, lpServiceStartName, lpEncryptedPassword, - dwPasswordLength, + dwPasswordSize, (SC_RPC_HANDLE *)&hService); } RpcExcept(EXCEPTION_EXECUTE_HANDLER) @@ -762,6 +833,14 @@ CreateServiceW(SC_HANDLE hSCManager, } RpcEndExcept; +done: + if (lpEncryptedPassword != NULL) + { + /* Wipe and release the password buffers */ + ZeroMemory(lpEncryptedPassword, dwPasswordSize); + HeapFree(GetProcessHeap(), 0, lpEncryptedPassword); + } + SetLastError(dwError); if (dwError != ERROR_SUCCESS) {
6 years, 3 months
1
0
0
0
03/03: [RPCSS] During the setup phase, the RPCSS service, initially running under the LocalSystem account, should re-configure itself to run under the NetworkService account.
by Hermès Bélusca-Maïto
https://git.reactos.org/?p=reactos.git;a=commitdiff;h=a631e31c86065aef57426…
commit a631e31c86065aef57426bc6af11d8c6ed0a1215 Author: Hermès Bélusca-Maïto <hermes.belusca-maito(a)reactos.org> AuthorDate: Sun Sep 16 23:56:59 2018 +0200 Commit: Hermès Bélusca-Maïto <hermes.belusca-maito(a)reactos.org> CommitDate: Mon Sep 17 01:23:03 2018 +0200 [RPCSS] During the setup phase, the RPCSS service, initially running under the LocalSystem account, should re-configure itself to run under the NetworkService account. This will also fix MS Office 2010 installation, where the installation expects the NetworkService account profile to be already loaded (this condition is always verified on Windows since RPCSS and other services also run under this account). CORE-14988, CORE-14989 --- base/services/rpcss/CMakeLists.txt | 1 + base/services/rpcss/rpcss_main.c | 8 ++ base/services/rpcss/setup.c | 179 +++++++++++++++++++++++++++++++++++++ 3 files changed, 188 insertions(+) diff --git a/base/services/rpcss/CMakeLists.txt b/base/services/rpcss/CMakeLists.txt index a7a31c5dfe..2ed8b49df3 100644 --- a/base/services/rpcss/CMakeLists.txt +++ b/base/services/rpcss/CMakeLists.txt @@ -8,6 +8,7 @@ list(APPEND SOURCE epmp.c irotp.c rpcss_main.c + setup.c precomp.h ${CMAKE_CURRENT_BINARY_DIR}/epm_s.c ${CMAKE_CURRENT_BINARY_DIR}/irot_s.c) diff --git a/base/services/rpcss/rpcss_main.c b/base/services/rpcss/rpcss_main.c index 885726dba1..c515fa1a11 100644 --- a/base/services/rpcss/rpcss_main.c +++ b/base/services/rpcss/rpcss_main.c @@ -118,6 +118,10 @@ static DWORD WINAPI service_handler( DWORD ctrl, DWORD event_type, LPVOID event_ } } +#ifdef __REACTOS__ +extern VOID DoRpcSsSetupConfiguration(VOID); +#endif + static void WINAPI ServiceMain( DWORD argc, LPWSTR *argv ) { SERVICE_STATUS status; @@ -140,6 +144,10 @@ static void WINAPI ServiceMain( DWORD argc, LPWSTR *argv ) status.dwWaitHint = 10000; SetServiceStatus( service_handle, &status ); +#ifdef __REACTOS__ + DoRpcSsSetupConfiguration(); +#endif + WaitForSingleObject( exit_event, INFINITE ); status.dwCurrentState = SERVICE_STOPPED; diff --git a/base/services/rpcss/setup.c b/base/services/rpcss/setup.c new file mode 100644 index 0000000000..e51831efc4 --- /dev/null +++ b/base/services/rpcss/setup.c @@ -0,0 +1,179 @@ +/* + * PROJECT: ReactOS RPC Subsystem Service + * LICENSE: GPL-2.0+ (
https://spdx.org/licenses/GPL-2.0+
) + * PURPOSE: One-time service setup configuration. + * COPYRIGHT: Copyright 2018 Hermes Belusca-Maito + */ + +/* INCLUDES *****************************************************************/ + +/* PSDK/NDK Headers */ +#define WIN32_NO_STATUS +#include <windef.h> +#include <winbase.h> +#include <winreg.h> +#include <winsvc.h> + +#include <ndk/rtlfuncs.h> +#include <ntsecapi.h> + +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(rpcss); + +/* FUNCTIONS ****************************************************************/ + +static BOOL +SetupIsActive(VOID) +{ + LONG lResult; + HKEY hKey; + DWORD dwData = 0; + DWORD cbData = sizeof(dwData); + DWORD dwType = REG_NONE; + + lResult = RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SYSTEM\\Setup", 0, KEY_QUERY_VALUE, &hKey); + if (lResult != ERROR_SUCCESS) + return FALSE; + + lResult = RegQueryValueExW(hKey, L"SystemSetupInProgress", NULL, + &dwType, (LPBYTE)&dwData, &cbData); + RegCloseKey(hKey); + + if ((lResult == ERROR_SUCCESS) && (dwType == REG_DWORD) && + (cbData == sizeof(dwData)) && (dwData == 1)) + { + return TRUE; + } + + return FALSE; +} + +static BOOL +RunningAsSYSTEM(VOID) +{ + /* S-1-5-18 -- Local System */ + static SID SystemSid = { SID_REVISION, 1, { SECURITY_NT_AUTHORITY }, { SECURITY_LOCAL_SYSTEM_RID } }; + + BOOL bRet = FALSE; + PTOKEN_USER pTokenUser; + HANDLE hToken; + DWORD cbTokenBuffer = 0; + + /* Get the process token */ + if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken)) + return FALSE; + + /* Retrieve token's information */ + if (!GetTokenInformation(hToken, TokenUser, NULL, 0, &cbTokenBuffer) && + GetLastError() != ERROR_INSUFFICIENT_BUFFER) + { + goto Quit; + } + + pTokenUser = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, cbTokenBuffer); + if (!pTokenUser) + goto Quit; + + if (GetTokenInformation(hToken, TokenUser, pTokenUser, cbTokenBuffer, &cbTokenBuffer)) + { + /* Compare with SYSTEM SID */ + bRet = EqualSid(pTokenUser->User.Sid, &SystemSid); + } + + HeapFree(GetProcessHeap(), 0, pTokenUser); + +Quit: + CloseHandle(hToken); + return bRet; +} + +static VOID +RpcSsConfigureAsNetworkService(VOID) +{ + SC_HANDLE hSCManager, hService; + + /* Open the service controller */ + hSCManager = OpenSCManagerW(NULL, SERVICES_ACTIVE_DATABASE, SC_MANAGER_CONNECT); + if (!hSCManager) + { + ERR("OpenSCManager() failed with error 0x%lx\n", GetLastError()); + return; + } + + /* Open the RPCSS service */ + hService = OpenServiceW(hSCManager, L"RPCSS", SERVICE_CHANGE_CONFIG); + if (!hService) + ERR("OpenService(\"RPCSS\") failed with error 0x%lx\n", GetLastError()); + if (hService) + { + /* Use the NetworkService account */ + if (!ChangeServiceConfigW(hService, + SERVICE_NO_CHANGE, + SERVICE_NO_CHANGE, + SERVICE_NO_CHANGE, + NULL, + NULL, + NULL, + NULL, + L"NT AUTHORITY\\NetworkService", + L"", + NULL)) + { + ERR("ChangeServiceConfig(\"RPCSS\") failed with error 0x%lx\n", GetLastError()); + } + + CloseServiceHandle(hService); + } + + CloseServiceHandle(hSCManager); +} + +static VOID +AddImpersonatePrivilege(VOID) +{ + /* S-1-5-6 -- "Service" group */ + static SID ServiceSid = { SID_REVISION, 1, { SECURITY_NT_AUTHORITY }, { SECURITY_SERVICE_RID } }; + + NTSTATUS Status; + LSA_HANDLE PolicyHandle; + LSA_OBJECT_ATTRIBUTES ObjectAttributes; + LSA_UNICODE_STRING RightString; + + ZeroMemory(&ObjectAttributes, sizeof(ObjectAttributes)); + Status = LsaOpenPolicy(NULL, &ObjectAttributes, + POLICY_CREATE_ACCOUNT | POLICY_LOOKUP_NAMES, + &PolicyHandle); + if (!NT_SUCCESS(Status)) + { + ERR("LsaOpenPolicy() failed with Status 0x%08lx\n", Status); + return; + } + + RtlInitUnicodeString(&RightString, L"SeImpersonatePrivilege"); + Status = LsaAddAccountRights(PolicyHandle, &ServiceSid, &RightString, 1); + if (!NT_SUCCESS(Status)) + { + ERR("LsaAddAccountRights(\"S-1-5-6\", \"%wZ\") failed with Status 0x%08lx\n", Status, &RightString); + } + + LsaClose(PolicyHandle); +} + +VOID DoRpcSsSetupConfiguration(VOID) +{ + /* + * On first run during the setup phase, the RPCSS service runs under + * the LocalSystem account. RPCSS then re-configures itself to run + * under the NetworkService account and adds the Impersonate privilege + * to the "Service" group. + * This is done in this way, because the NetworkService account does not + * initially exist when the setup phase is running and the RPCSS service + * is started, but this account is created later during the setup phase. + */ + if (SetupIsActive() && RunningAsSYSTEM()) + { + RpcSsConfigureAsNetworkService(); + AddImpersonatePrivilege(); + } +}
6 years, 3 months
1
0
0
0
02/03: [SERVICES] Add basic support for setting lpServiceStartName via RChangeServiceConfigW().
by Hermès Bélusca-Maïto
https://git.reactos.org/?p=reactos.git;a=commitdiff;h=9d43950db7bd5402e947b…
commit 9d43950db7bd5402e947b28ff73cbf4cac697b54 Author: Hermès Bélusca-Maïto <hermes.belusca-maito(a)reactos.org> AuthorDate: Sun Sep 16 23:22:04 2018 +0200 Commit: Hermès Bélusca-Maïto <hermes.belusca-maito(a)reactos.org> CommitDate: Mon Sep 17 01:22:59 2018 +0200 [SERVICES] Add basic support for setting lpServiceStartName via RChangeServiceConfigW(). --- base/system/services/rpcserver.c | 47 +++++++++++++++++++++++++++------------- 1 file changed, 32 insertions(+), 15 deletions(-) diff --git a/base/system/services/rpcserver.c b/base/system/services/rpcserver.c index 77cf44be73..aa64233350 100644 --- a/base/system/services/rpcserver.c +++ b/base/system/services/rpcserver.c @@ -2179,28 +2179,45 @@ RChangeServiceConfigW( goto done; } - if (lpPassword != NULL) + /* Start name and password are only used by Win32 services */ + if (lpService->Status.dwServiceType & SERVICE_WIN32) { - if (*(LPWSTR)lpPassword != 0) + /* Write service start name */ + if (lpServiceStartName != NULL && *lpServiceStartName != 0) { - /* FIXME: Decrypt the password */ - - /* Write the password */ - dwError = ScmSetServicePassword(lpService->szServiceName, - (LPCWSTR)lpPassword); + dwError = RegSetValueExW(hServiceKey, + L"ObjectName", + 0, + REG_SZ, + (LPBYTE)lpServiceStartName, + (DWORD)((wcslen(lpServiceStartName) + 1) * sizeof(WCHAR))); if (dwError != ERROR_SUCCESS) goto done; } - else + + if (lpPassword != NULL) { - /* Delete the password */ - dwError = ScmSetServicePassword(lpService->szServiceName, - NULL); - if (dwError == ERROR_FILE_NOT_FOUND) - dwError = ERROR_SUCCESS; + if (*(LPWSTR)lpPassword != 0) + { + /* FIXME: Decrypt the password */ - if (dwError != ERROR_SUCCESS) - goto done; + /* Write the password */ + dwError = ScmSetServicePassword(lpService->szServiceName, + (LPCWSTR)lpPassword); + if (dwError != ERROR_SUCCESS) + goto done; + } + else + { + /* Delete the password */ + dwError = ScmSetServicePassword(lpService->szServiceName, + NULL); + if (dwError == ERROR_FILE_NOT_FOUND) + dwError = ERROR_SUCCESS; + + if (dwError != ERROR_SUCCESS) + goto done; + } } }
6 years, 3 months
1
0
0
0
01/03: [SERVICES] Minor code style fixes; replace wcslen(xxx) ==/!= 0 and strcpy(string, 'empty-string') calls.
by Hermès Bélusca-Maïto
https://git.reactos.org/?p=reactos.git;a=commitdiff;h=a987856e714ebaf2d7b17…
commit a987856e714ebaf2d7b170b396c74bcee291e4f0 Author: Hermès Bélusca-Maïto <hermes.belusca-maito(a)reactos.org> AuthorDate: Sun Sep 16 23:16:17 2018 +0200 Commit: Hermès Bélusca-Maïto <hermes.belusca-maito(a)reactos.org> CommitDate: Mon Sep 17 01:22:55 2018 +0200 [SERVICES] Minor code style fixes; replace wcslen(xxx) ==/!= 0 and strcpy(string, 'empty-string') calls. --- base/system/services/rpcserver.c | 103 ++++++++++++++++++++++++--------------- 1 file changed, 65 insertions(+), 38 deletions(-) diff --git a/base/system/services/rpcserver.c b/base/system/services/rpcserver.c index ae6c721410..77cf44be73 100644 --- a/base/system/services/rpcserver.c +++ b/base/system/services/rpcserver.c @@ -463,7 +463,6 @@ ScmConvertToBootPathName(wchar_t *CanonName, wchar_t **RelativeName) /* Get buffer size needed for expanding env strings */ BufferSize = ExpandEnvironmentStringsW(L"%SystemRoot%\\", &Dest, 1); - if (BufferSize <= 1) { DPRINT("Error during a call to ExpandEnvironmentStringsW()\n"); @@ -1018,7 +1017,7 @@ RCloseServiceHandle( &pcbBytesNeeded, &dwServicesReturned); - /* if pcbBytesNeeded returned a value then there are services running that are dependent on this service */ + /* If pcbBytesNeeded returned a value then there are services running that are dependent on this service */ if (pcbBytesNeeded) { DPRINT("Deletion failed due to running dependencies.\n"); @@ -1497,7 +1496,9 @@ RSetServiceObjectSecurity( if (dwSecurityInformation == 0 || dwSecurityInformation & ~(OWNER_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION | DACL_SECURITY_INFORMATION | SACL_SECURITY_INFORMATION)) + { return ERROR_INVALID_PARAMETER; + } if (!RtlValidSecurityDescriptor((PSECURITY_DESCRIPTOR)lpSecurityDescriptor)) return ERROR_INVALID_PARAMETER; @@ -1513,11 +1514,15 @@ RSetServiceObjectSecurity( if ((dwSecurityInformation & OWNER_SECURITY_INFORMATION) && (((PISECURITY_DESCRIPTOR)lpSecurityDescriptor)->Owner == NULL)) + { return ERROR_INVALID_PARAMETER; + } if ((dwSecurityInformation & GROUP_SECURITY_INFORMATION) && (((PISECURITY_DESCRIPTOR)lpSecurityDescriptor)->Group == NULL)) + { return ERROR_INVALID_PARAMETER; + } if (!RtlAreAllAccessesGranted(hSvc->Handle.DesiredAccess, DesiredAccess)) @@ -1961,7 +1966,9 @@ RChangeServiceConfigW( (dwServiceType != SERVICE_FILE_SYSTEM_DRIVER) && ((dwServiceType & ~SERVICE_INTERACTIVE_PROCESS) != SERVICE_WIN32_OWN_PROCESS) && ((dwServiceType & ~SERVICE_INTERACTIVE_PROCESS) != SERVICE_WIN32_SHARE_PROCESS)) - return ERROR_INVALID_PARAMETER; + { + return ERROR_INVALID_PARAMETER; + } /* Check for invalid start type value */ if ((dwStartType != SERVICE_NO_CHANGE) && @@ -1970,7 +1977,9 @@ RChangeServiceConfigW( (dwStartType != SERVICE_AUTO_START) && (dwStartType != SERVICE_DEMAND_START) && (dwStartType != SERVICE_DISABLED)) + { return ERROR_INVALID_PARAMETER; + } /* Only drivers can be boot start or system start services */ if ((dwStartType == SERVICE_BOOT_START) || @@ -1987,7 +1996,9 @@ RChangeServiceConfigW( (dwErrorControl != SERVICE_ERROR_NORMAL) && (dwErrorControl != SERVICE_ERROR_SEVERE) && (dwErrorControl != SERVICE_ERROR_CRITICAL)) + { return ERROR_INVALID_PARAMETER; + } if (lpdwTagId && (!lpLoadOrderGroup || !*lpLoadOrderGroup)) { @@ -2170,7 +2181,7 @@ RChangeServiceConfigW( if (lpPassword != NULL) { - if (wcslen((LPWSTR)lpPassword) != 0) + if (*(LPWSTR)lpPassword != 0) { /* FIXME: Decrypt the password */ @@ -2265,22 +2276,20 @@ RCreateServiceW( return ERROR_ACCESS_DENIED; } - if (wcslen(lpServiceName) == 0) - { + if (*lpServiceName == 0) return ERROR_INVALID_NAME; - } - if (wcslen(lpBinaryPathName) == 0) - { + if (*lpBinaryPathName == 0) return ERROR_INVALID_PARAMETER; - } /* Check for invalid service type value */ if ((dwServiceType != SERVICE_KERNEL_DRIVER) && (dwServiceType != SERVICE_FILE_SYSTEM_DRIVER) && ((dwServiceType & ~SERVICE_INTERACTIVE_PROCESS) != SERVICE_WIN32_OWN_PROCESS) && ((dwServiceType & ~SERVICE_INTERACTIVE_PROCESS) != SERVICE_WIN32_SHARE_PROCESS)) - return ERROR_INVALID_PARAMETER; + { + return ERROR_INVALID_PARAMETER; + } /* Check for invalid start type value */ if ((dwStartType != SERVICE_BOOT_START) && @@ -2288,7 +2297,9 @@ RCreateServiceW( (dwStartType != SERVICE_AUTO_START) && (dwStartType != SERVICE_DEMAND_START) && (dwStartType != SERVICE_DISABLED)) + { return ERROR_INVALID_PARAMETER; + } /* Only drivers can be boot start or system start services */ if ((dwStartType == SERVICE_BOOT_START) || @@ -2296,7 +2307,9 @@ RCreateServiceW( { if ((dwServiceType != SERVICE_KERNEL_DRIVER) && (dwServiceType != SERVICE_FILE_SYSTEM_DRIVER)) + { return ERROR_INVALID_PARAMETER; + } } /* Check for invalid error control value */ @@ -2304,7 +2317,9 @@ RCreateServiceW( (dwErrorControl != SERVICE_ERROR_NORMAL) && (dwErrorControl != SERVICE_ERROR_SEVERE) && (dwErrorControl != SERVICE_ERROR_CRITICAL)) + { return ERROR_INVALID_PARAMETER; + } if ((dwServiceType == (SERVICE_WIN32_OWN_PROCESS | SERVICE_INTERACTIVE_PROCESS)) && (lpServiceStartName)) @@ -2334,7 +2349,7 @@ RCreateServiceW( if (lpService->bDeleted) return ERROR_SERVICE_MARKED_FOR_DELETE; - /* Return Error exist */ + /* Return service-exists error */ return ERROR_SERVICE_EXISTS; } @@ -2542,7 +2557,7 @@ RCreateServiceW( if (dwError != ERROR_SUCCESS) goto done; - if (lpPassword != NULL && wcslen((LPWSTR)lpPassword) != 0) + if (lpPassword != NULL && *(LPWSTR)lpPassword != 0) { /* FIXME: Decrypt the password */ @@ -2933,7 +2948,6 @@ RQueryServiceConfigW( LPWSTR lpDependencies = NULL; DWORD dwDependenciesLength = 0; DWORD dwRequiredSize; - WCHAR lpEmptyString[] = {0,0}; LPWSTR lpStr; DPRINT("RQueryServiceConfigW() called\n"); @@ -3035,7 +3049,7 @@ RQueryServiceConfigW( } else { - wcscpy(lpStr, lpEmptyString); + *lpStr = 0; } lpServiceConfig->lpBinaryPathName = (LPWSTR)((ULONG_PTR)lpStr - (ULONG_PTR)lpServiceConfig); @@ -3048,7 +3062,7 @@ RQueryServiceConfigW( } else { - wcscpy(lpStr, lpEmptyString); + *lpStr = 0; } lpServiceConfig->lpLoadOrderGroup = (LPWSTR)((ULONG_PTR)lpStr - (ULONG_PTR)lpServiceConfig); @@ -3063,7 +3077,7 @@ RQueryServiceConfigW( } else { - wcscpy(lpStr, lpEmptyString); + *lpStr = 0; } lpServiceConfig->lpDependencies = (LPWSTR)((ULONG_PTR)lpStr - (ULONG_PTR)lpServiceConfig); @@ -3079,7 +3093,7 @@ RQueryServiceConfigW( } else { - wcscpy(lpStr, lpEmptyString); + *lpStr = 0; } lpServiceConfig->lpServiceStartName = (LPWSTR)((ULONG_PTR)lpStr - (ULONG_PTR)lpServiceConfig); @@ -3092,7 +3106,7 @@ RQueryServiceConfigW( } else { - wcscpy(lpStr, lpEmptyString); + *lpStr = 0; } lpServiceConfig->lpDisplayName = (LPWSTR)((ULONG_PTR)lpStr - (ULONG_PTR)lpServiceConfig); @@ -3264,9 +3278,9 @@ RGetServiceDisplayNameW( /* If the service could not be found and lpcchBuffer is less than 2, windows puts null in lpDisplayName and puts 2 in lpcchBuffer */ - if (*lpcchBuffer < 2) + if (*lpcchBuffer < sizeof(WCHAR)) { - *lpcchBuffer = 2; + *lpcchBuffer = sizeof(WCHAR); if (lpDisplayName != NULL) { *lpDisplayName = 0; @@ -3340,9 +3354,9 @@ RGetServiceKeyNameW( /* If the service could not be found and lpcchBuffer is less than 2, windows puts null in lpDisplayName and puts 2 in lpcchBuffer */ - if (*lpcchBuffer < 2) + if (*lpcchBuffer < sizeof(WCHAR)) { - *lpcchBuffer = 2; + *lpcchBuffer = sizeof(WCHAR); if (lpServiceName != NULL) { *lpServiceName = 0; @@ -4026,7 +4040,6 @@ RQueryServiceConfigA( LPWSTR lpDependencies = NULL; DWORD dwDependenciesLength = 0; DWORD dwRequiredSize; - CHAR lpEmptyString[]={0,0}; LPSTR lpStr; DPRINT("RQueryServiceConfigA() called\n"); @@ -4086,28 +4099,28 @@ RQueryServiceConfigA( if (lpImagePath != NULL) dwRequiredSize += (DWORD)(wcslen(lpImagePath) + 1); else - dwRequiredSize += 2; + dwRequiredSize += 2 * sizeof(CHAR); if ((lpService->lpGroup != NULL) && (lpService->lpGroup->lpGroupName != NULL)) dwRequiredSize += (DWORD)(wcslen(lpService->lpGroup->lpGroupName) + 1); else - dwRequiredSize += 2; + dwRequiredSize += 2 * sizeof(CHAR); /* Add Dependencies length */ if (lpDependencies != NULL) dwRequiredSize += dwDependenciesLength; else - dwRequiredSize += 2; + dwRequiredSize += 2 * sizeof(CHAR); if (lpServiceStartName != NULL) dwRequiredSize += (DWORD)(wcslen(lpServiceStartName) + 1); else - dwRequiredSize += 2; + dwRequiredSize += 2 * sizeof(CHAR); if (lpService->lpDisplayName != NULL) dwRequiredSize += (DWORD)(wcslen(lpService->lpDisplayName) + 1); else - dwRequiredSize += 2; + dwRequiredSize += 2 * sizeof(CHAR); if (lpServiceConfig == NULL || cbBufSize < dwRequiredSize) { @@ -4138,7 +4151,7 @@ RQueryServiceConfigA( } else { - strcpy(lpStr, lpEmptyString); + *lpStr = 0; } lpServiceConfig->lpBinaryPathName = (LPSTR)((ULONG_PTR)lpStr - (ULONG_PTR)lpServiceConfig); @@ -4157,7 +4170,7 @@ RQueryServiceConfigA( } else { - strcpy(lpStr, lpEmptyString); + *lpStr = 0; } lpServiceConfig->lpLoadOrderGroup = (LPSTR)((ULONG_PTR)lpStr - (ULONG_PTR)lpServiceConfig); @@ -4177,7 +4190,7 @@ RQueryServiceConfigA( } else { - strcpy(lpStr, lpEmptyString); + *lpStr = 0; } lpServiceConfig->lpDependencies = (LPSTR)((ULONG_PTR)lpStr - (ULONG_PTR)lpServiceConfig); @@ -4199,7 +4212,7 @@ RQueryServiceConfigA( } else { - strcpy(lpStr, lpEmptyString); + *lpStr = 0; } lpServiceConfig->lpServiceStartName = (LPSTR)((ULONG_PTR)lpStr - (ULONG_PTR)lpServiceConfig); @@ -4218,7 +4231,7 @@ RQueryServiceConfigA( } else { - strcpy(lpStr, lpEmptyString); + *lpStr = 0; } lpServiceConfig->lpDisplayName = (LPSTR)((ULONG_PTR)lpStr - (ULONG_PTR)lpServiceConfig); @@ -4451,7 +4464,7 @@ RGetServiceDisplayNameA( puts null in lpDisplayName and puts 1 in lpcchBuffer */ if (*lpcchBuffer == 0) { - *lpcchBuffer = 1; + *lpcchBuffer = sizeof(CHAR); if (lpDisplayName != NULL) { *lpDisplayName = 0; @@ -4549,7 +4562,7 @@ RGetServiceKeyNameA( put null in lpDisplayName and puts 1 in lpcchBuffer, verified WINXP. */ if (*lpcchBuffer == 0) { - *lpcchBuffer = 1; + *lpcchBuffer = sizeof(CHAR); if (lpServiceName != NULL) { *lpServiceName = 0; @@ -4921,7 +4934,9 @@ RChangeServiceConfig2A( if ((Info.dwInfoLevel < SERVICE_CONFIG_DESCRIPTION) || (Info.dwInfoLevel > SERVICE_CONFIG_FAILURE_ACTIONS)) + { return ERROR_INVALID_LEVEL; + } InfoW.dwInfoLevel = Info.dwInfoLevel; @@ -5106,11 +5121,13 @@ ScmSetFailureActions(HKEY hServiceKey, NULL, &dwType, NULL, - &dwRequiredSize); + &dwRequiredSize); if (dwError != ERROR_SUCCESS && dwError != ERROR_MORE_DATA && dwError != ERROR_FILE_NOT_FOUND) + { return dwError; + } dwRequiredSize = (dwType == REG_BINARY) ? max(sizeof(SERVICE_FAILURE_ACTIONSW), dwRequiredSize) : sizeof(SERVICE_FAILURE_ACTIONSW); @@ -5323,7 +5340,9 @@ RChangeServiceConfig2W( if ((Info.dwInfoLevel < SERVICE_CONFIG_DESCRIPTION) || (Info.dwInfoLevel > SERVICE_CONFIG_FAILURE_ACTIONS)) + { return ERROR_INVALID_LEVEL; + } hSvc = ScmGetServiceFromHandle(hService); if (hSvc == NULL) @@ -5463,7 +5482,9 @@ RQueryServiceConfig2A( if ((dwInfoLevel < SERVICE_CONFIG_DESCRIPTION) || (dwInfoLevel > SERVICE_CONFIG_FAILURE_ACTIONS)) + { return ERROR_INVALID_LEVEL; + } hSvc = ScmGetServiceFromHandle(hService); if (hSvc == NULL) @@ -5551,7 +5572,9 @@ RQueryServiceConfig2A( if (dwError != ERROR_SUCCESS && dwError != ERROR_MORE_DATA && dwError != ERROR_FILE_NOT_FOUND) + { goto done; + } dwRequiredSize = (dwType == REG_BINARY) ? max(sizeof(SERVICE_FAILURE_ACTIONSA), dwRequiredSize) : sizeof(SERVICE_FAILURE_ACTIONSA); @@ -5705,7 +5728,9 @@ RQueryServiceConfig2W( if ((dwInfoLevel < SERVICE_CONFIG_DESCRIPTION) || (dwInfoLevel > SERVICE_CONFIG_FAILURE_ACTIONS)) + { return ERROR_INVALID_LEVEL; + } hSvc = ScmGetServiceFromHandle(hService); if (hSvc == NULL) @@ -5785,7 +5810,9 @@ RQueryServiceConfig2W( if (dwError != ERROR_SUCCESS && dwError != ERROR_MORE_DATA && dwError != ERROR_FILE_NOT_FOUND) + { goto done; + } dwRequiredSize = (dwType == REG_BINARY) ? max(sizeof(SERVICE_FAILURE_ACTIONSW), dwRequiredSize) : sizeof(SERVICE_FAILURE_ACTIONSW); @@ -5959,7 +5986,7 @@ RQueryServiceStatusEx( else lpStatus->dwProcessId = lpService->lpImage->dwProcessId; - lpStatus->dwServiceFlags = 0; /* FIXME */ + lpStatus->dwServiceFlags = 0; /* FIXME */ /* Unlock the service database */ ScmUnlockDatabase();
6 years, 3 months
1
0
0
0
01/01: [NETAPI32] Add more DFS stubs
by Eric Kohl
https://git.reactos.org/?p=reactos.git;a=commitdiff;h=47714b25a9ff6fbe0cb74…
commit 47714b25a9ff6fbe0cb74545fa8e01d23160da8e Author: Eric Kohl <eric.kohl(a)reactos.org> AuthorDate: Sun Sep 16 21:10:36 2018 +0200 Commit: Eric Kohl <eric.kohl(a)reactos.org> CommitDate: Sun Sep 16 21:11:16 2018 +0200 [NETAPI32] Add more DFS stubs --- dll/win32/netapi32/dfs.c | 248 +++++++++++++++++++++++++++++++++++++-- dll/win32/netapi32/netapi32.spec | 32 ++--- 2 files changed, 253 insertions(+), 27 deletions(-) diff --git a/dll/win32/netapi32/dfs.c b/dll/win32/netapi32/dfs.c index af4bcddaf5..3d1a2de6f3 100644 --- a/dll/win32/netapi32/dfs.c +++ b/dll/win32/netapi32/dfs.c @@ -27,13 +27,35 @@ NetDfsAdd( _In_ DWORD Flags) { #if 0 - NET_API_STATUS - __stdcall - status = NetrDfsAdd(DfsEntryPath, - ServerName, - PathName, - Comment, - Flags); + NET_API_STATUS Status; + + TRACE("NetDfsAdd(%s %s %s %s 0x%lx)\n", + debugstr_w(DfsEntryPath), debugstr_w(ServerName), debugstr_w(PathName), + debugstr_w(Comment), Flags); + + if (DfsEntryPath == NULL || + *DfsEntryPath == UNICODE_NULL || + ServerName == NULL || + *ServerName == UNICODE_NULL || + PathName == NULL || + *PathName == UNICODE_NULL) + return ERROR_INVALID_PARAMETER; + + RpcTryExcept + { + Status = NetrDfsAdd(DfsEntryPath, + ServerName, + PathName, + Comment, + Flags); + } + RpcExcept(EXCEPTION_EXECUTE_HANDLER) + { + Status = I_RpcMapWin32Status(RpcExceptionCode()); + } + RpcEndExcept; + + return Status; #endif UNIMPLEMENTED; return 0; @@ -88,7 +110,7 @@ NetDfsEnum( _In_ DWORD PrefMaxLen, _Out_ LPBYTE *Buffer, _Out_ LPDWORD EntriesRead, - _Out_ LPDWORD ResumeHandle) + _Inout_ LPDWORD ResumeHandle) { UNIMPLEMENTED; return 0; @@ -99,8 +121,8 @@ NET_API_STATUS WINAPI NetDfsGetClientInfo( _In_ LPWSTR DfsEntryPath, - _In_ LPWSTR ServerName, - _In_ LPWSTR ShareName, + _In_opt_ LPWSTR ServerName, + _In_opt_ LPWSTR ShareName, _In_ DWORD Level, _Out_ LPBYTE *Buffer) { @@ -109,7 +131,17 @@ NetDfsGetClientInfo( } -/* NetDfsGetDcAddress */ +NET_API_STATUS +WINAPI +NetDfsGetDcAddress( + _In_ LPWSTR ServerName, + _Out_ LPWSTR *DcIpAddress, + _Out_ PBOOLEAN IsRoot, + _Out_ PULONG Timeout) +{ + UNIMPLEMENTED; + return 0; +} NET_API_STATUS @@ -125,4 +157,198 @@ NetDfsGetFtContainerSecurity( } +NET_API_STATUS +WINAPI +NetDfsGetInfo( + _In_ LPWSTR DfsEntryPath, + _In_opt_ LPWSTR ServerName, + _In_opt_ LPWSTR ShareName, + _In_ DWORD Level, + _Out_ LPBYTE *Buffer) +{ + UNIMPLEMENTED; + return 0; +} + + +NET_API_STATUS +WINAPI +NetDfsGetSecurity( + _In_ LPWSTR DfsEntryPath, + _In_ SECURITY_INFORMATION SecurityInformation, + _Out_ PSECURITY_DESCRIPTOR *ppSecurityDescriptor, + _Out_ LPDWORD lpcbSecurityDescriptor) +{ + UNIMPLEMENTED; + return 0; +} + + +NET_API_STATUS +WINAPI +NetDfsGetStdContainerSecurity( + _In_ LPWSTR MachineName, + _In_ SECURITY_INFORMATION SecurityInformation, + _Out_ PSECURITY_DESCRIPTOR *ppSecurityDescriptor, + _Out_ LPDWORD lpcbSecurityDescriptor) +{ + UNIMPLEMENTED; + return 0; +} + + +/* NetDfsManagerGetConfigInfo */ + + +NET_API_STATUS +WINAPI +NetDfsManagerInitialize( + _In_ LPWSTR ServerName, + _Reserved_ DWORD Flags) +{ + UNIMPLEMENTED; + return 0; +} + + +/* NetDfsManagerSendSiteInfo */ + + +NET_API_STATUS +WINAPI +NetDfsMove( + _In_ LPWSTR Path, + _In_ LPWSTR NewPath, + _In_ ULONG Flags) +{ + UNIMPLEMENTED; + return 0; +} + + +NET_API_STATUS +WINAPI +NetDfsRemove( + _In_ LPWSTR DfsEntryPath, + _In_opt_ LPWSTR ServerName, + _In_opt_ LPWSTR ShareName) +{ + UNIMPLEMENTED; + return 0; +} + + +NET_API_STATUS +WINAPI +NetDfsRemoveFtRoot( + _In_ LPWSTR ServerName, + _In_ LPWSTR RootShare, + _In_ LPWSTR FtDfsName, + _Reserved_ DWORD Flags) +{ + UNIMPLEMENTED; + return 0; +} + + +NET_API_STATUS +WINAPI +NetDfsRemoveFtRootForced( + _In_ LPWSTR DomainName, + _In_ LPWSTR ServerName, + _In_ LPWSTR RootShare, + _In_ LPWSTR FtDfsName, + _Reserved_ DWORD Flags) +{ + UNIMPLEMENTED; + return 0; +} + + +NET_API_STATUS +WINAPI +NetDfsRemoveStdRoot( + _In_ LPWSTR ServerName, + _In_ LPWSTR RootShare, + _In_ DWORD Flags) +{ + UNIMPLEMENTED; + return 0; +} + + +NET_API_STATUS +WINAPI +NetDfsRename( + _In_ LPWSTR Path, + _In_ LPWSTR NewPath) +{ + UNIMPLEMENTED; + return 0; +} + + +NET_API_STATUS +WINAPI +NetDfsSetClientInfo( + _In_ LPWSTR DfsEntryPath, + _In_opt_ LPWSTR ServerName, + _In_opt_ LPWSTR ShareName, + _In_ DWORD Level, + _In_ LPBYTE Buffer) +{ + UNIMPLEMENTED; + return 0; +} + + +NET_API_STATUS +WINAPI +NetDfsSetFtContainerSecurity( + _In_ LPWSTR DomainName, + _In_ SECURITY_INFORMATION SecurityInformation, + _In_ PSECURITY_DESCRIPTOR pSecurityDescriptor) +{ + UNIMPLEMENTED; + return 0; +} + + +NET_API_STATUS +WINAPI +NetDfsSetInfo( + _In_ LPWSTR DfsEntryPath, + _In_opt_ LPWSTR ServerName, + _In_opt_ LPWSTR ShareName, + _In_ DWORD Level, + _In_ LPBYTE Buffer) +{ + UNIMPLEMENTED; + return 0; +} + + +NET_API_STATUS +WINAPI +NetDfsSetSecurity( + _In_ LPWSTR DfsEntryPath, + _In_ SECURITY_INFORMATION SecurityInformation, + _In_ PSECURITY_DESCRIPTOR pSecurityDescriptor) +{ + UNIMPLEMENTED; + return 0; +} + + +NET_API_STATUS +WINAPI +NetDfsSetStdContainerSecurity( + _In_ LPWSTR MachineName, + _In_ SECURITY_INFORMATION SecurityInformation, + _In_ PSECURITY_DESCRIPTOR pSecurityDescriptor) +{ + UNIMPLEMENTED; + return 0; +} + /* EOF */ diff --git a/dll/win32/netapi32/netapi32.spec b/dll/win32/netapi32/netapi32.spec index 3b476e94b1..7c5b07e17b 100644 --- a/dll/win32/netapi32/netapi32.spec +++ b/dll/win32/netapi32/netapi32.spec @@ -120,25 +120,25 @@ @ stdcall NetDfsAddStdRootForced(wstr wstr wstr wstr) @ stdcall NetDfsEnum(wstr long long ptr ptr ptr) @ stdcall NetDfsGetClientInfo(wstr wstr wstr long ptr) -@ stub NetDfsGetDcAddress +@ stdcall NetDfsGetDcAddress(wstr ptr ptr ptr) @ stdcall NetDfsGetFtContainerSecurity(wstr long ptr ptr); -@ stub NetDfsGetInfo -@ stub NetDfsGetSecurity -@ stub NetDfsGetStdContainerSecurity +@ stdcall NetDfsGetInfo(wstr wstr wstr long ptr) +@ stdcall NetDfsGetSecurity(wstr ptr ptr ptr) +@ stdcall NetDfsGetStdContainerSecurity(wstr ptr ptr ptr) @ stub NetDfsManagerGetConfigInfo -@ stub NetDfsManagerInitialize +@ stdcall NetDfsManagerInitialize(wstr long) @ stub NetDfsManagerSendSiteInfo -@ stub NetDfsMove -@ stub NetDfsRemove -@ stub NetDfsRemoveFtRoot -@ stub NetDfsRemoveFtRootForced -@ stub NetDfsRemoveStdRoot -@ stub NetDfsRename -@ stub NetDfsSetClientInfo -@ stub NetDfsSetFtContainerSecurity -@ stub NetDfsSetInfo -@ stub NetDfsSetSecurity -@ stub NetDfsSetStdContainerSecurity +@ stdcall NetDfsMove(wstr wstr long) +@ stdcall NetDfsRemove(wstr wstr wstr) +@ stdcall NetDfsRemoveFtRoot(wstr wstr wstr long) +@ stdcall NetDfsRemoveFtRootForced(wstr wstr wstr wstr long) +@ stdcall NetDfsRemoveStdRoot(wstr wstr long) +@ stdcall NetDfsRename(wstr wstr) +@ stdcall NetDfsSetClientInfo(wstr wstr wstr long ptr) +@ stdcall NetDfsSetFtContainerSecurity(wstr ptr ptr) +@ stdcall NetDfsSetInfo(wstr wstr wstr long ptr) +@ stdcall NetDfsSetSecurity(wstr ptr ptr) +@ stdcall NetDfsSetStdContainerSecurity(wstr ptr ptr) @ stdcall NetEnumerateComputerNames(wstr long long ptr ptr) @ stdcall NetEnumerateTrustedDomains(wstr ptr) @ stdcall NetErrorLogClear(wstr wstr ptr)
6 years, 3 months
1
0
0
0
02/02: [MSCONFIG_NEW] Small Romanian translation update
by Bișoc George
https://git.reactos.org/?p=reactos.git;a=commitdiff;h=29603e7291401080a14fd…
commit 29603e7291401080a14fde6f327c703b5ce6f640 Author: Bișoc George <fraizeraust99(a)gmail.com> AuthorDate: Sun Sep 16 19:27:31 2018 +0200 Commit: Hermès BÉLUSCA - MAÏTO <hermes.belusca-maito(a)reactos.org> CommitDate: Sun Sep 16 19:55:46 2018 +0200 [MSCONFIG_NEW] Small Romanian translation update --- base/applications/msconfig_new/lang/ro-RO.rc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/base/applications/msconfig_new/lang/ro-RO.rc b/base/applications/msconfig_new/lang/ro-RO.rc index c45d4510da..a561922510 100644 --- a/base/applications/msconfig_new/lang/ro-RO.rc +++ b/base/applications/msconfig_new/lang/ro-RO.rc @@ -4,7 +4,7 @@ LANGUAGE LANG_ROMANIAN, SUBLANG_NEUTRAL IDD_ABOUTBOX DIALOGEX 0, 0, 229, 98 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "About the System Configuration Program" +CAPTION "Despre programul de configurare al sistemului" FONT 8, "MS Shell Dlg" BEGIN ICON IDI_APPICON, IDC_STATIC, 14, 14, 20, 20 @@ -40,7 +40,7 @@ END IDD_SYSTEM_PAGE DIALOGEX 0, 0, 366, 175 STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CAPTION -CAPTION "System" +CAPTION "Sistem" FONT 8, "MS Shell Dlg" BEGIN CONTROL "", IDC_SYSTEM_TREE, "SysTreeView32", TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | TVS_EDITLABELS | TVS_SHOWSELALWAYS | WS_BORDER | WS_HSCROLL | WS_TABSTOP, 5, 5, 285, 146 @@ -84,7 +84,7 @@ BEGIN LTEXT "secunde", IDC_STATIC, 330, 104, 31, 10 CONTROL "&Permanenizează configurația de inițializare", 292, "Button", BS_AUTOCHECKBOX | BS_TOP | BS_MULTILINE | WS_TABSTOP, 295, 121, 66, 49 - PUSHBUTTON "&Delete", IDC_BTN_DELETE, 295, 68, 66, 14 + PUSHBUTTON "&Șterge", IDC_BTN_DELETE, 295, 68, 66, 14 END IDD_SERVICES_PAGE DIALOGEX 0, 0, 366, 175 @@ -124,7 +124,7 @@ END IDD_FILE_EXTRACT_DIALOG DIALOGEX 0, 0, 353, 117 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Expand Files from an Installation Source" +CAPTION "Extragere fișiere de la o instalație sursă" FONT 8, "MS Shell Dlg" BEGIN LTEXT "Specificați fișierele pe care doriți să le extrageți, locația sursei cu fișierele de instalare, și locația destinației.", IDC_STATIC, 7, 7, 339, 17
6 years, 3 months
1
0
0
0
01/02: [CHARMAP_NEW] Update the E-mail header string
by Bișoc George
https://git.reactos.org/?p=reactos.git;a=commitdiff;h=577d5347f11f1975b541e…
commit 577d5347f11f1975b541e27ba3265024ffe2cb19 Author: Bișoc George <fraizeraust99(a)gmail.com> AuthorDate: Sun Sep 16 19:23:15 2018 +0200 Commit: Hermès BÉLUSCA - MAÏTO <hermes.belusca-maito(a)reactos.org> CommitDate: Sun Sep 16 19:55:46 2018 +0200 [CHARMAP_NEW] Update the E-mail header string --- base/applications/charmap_new/lang/it-IT.rc | 2 +- base/applications/charmap_new/lang/ro-RO.rc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/base/applications/charmap_new/lang/it-IT.rc b/base/applications/charmap_new/lang/it-IT.rc index 5a81e8f752..c04c6d723c 100644 --- a/base/applications/charmap_new/lang/it-IT.rc +++ b/base/applications/charmap_new/lang/it-IT.rc @@ -2,7 +2,7 @@ * PROJECT: ReactOS Character Map * LICENSE: GPL-2.0+ (
https://spdx.org/licenses/GPL-2.0+
) * PURPOSE: Italian Translation for ReactOS Character Map - * COPYRIGHT: Bișoc George (fraizeraust99(a)gmail.com) + * COPYRIGHT: Bișoc George (fraizeraust99 at gmail dot com) */ LANGUAGE LANG_ITALIAN, SUBLANG_NEUTRAL diff --git a/base/applications/charmap_new/lang/ro-RO.rc b/base/applications/charmap_new/lang/ro-RO.rc index a043a35ca6..6863e70133 100644 --- a/base/applications/charmap_new/lang/ro-RO.rc +++ b/base/applications/charmap_new/lang/ro-RO.rc @@ -2,7 +2,7 @@ * PROJECT: ReactOS Character Map * LICENSE: GPL-2.0+ (
https://spdx.org/licenses/GPL-2.0+
) * PURPOSE: Romanian Translation for ReactOS Character Map - * COPYRIGHT: Bișoc George (fraizeraust99(a)gmail.com) + * COPYRIGHT: Bișoc George (fraizeraust99 at gmail dot com) */ LANGUAGE LANG_ROMANIAN, SUBLANG_NEUTRAL
6 years, 3 months
1
0
0
0
← Newer
1
...
8
9
10
11
12
13
14
...
23
Older →
Jump to page:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Results per page:
10
25
50
100
200