Implement SetComputerNameExA/W
Modified: trunk/reactos/lib/kernel32/misc/computername.c
Modified: trunk/reactos/lib/kernel32/misc/stubs.c
Modified: trunk/reactos/w32api/include/winbase.h
_____
Modified: trunk/reactos/lib/kernel32/misc/computername.c
--- trunk/reactos/lib/kernel32/misc/computername.c 2005-09-04
18:00:59 UTC (rev 17638)
+++ trunk/reactos/lib/kernel32/misc/computername.c 2005-09-04
20:11:51 UTC (rev 17639)
@@ -16,8 +16,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
-/* $Id$
- *
+/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS system libraries
* PURPOSE: Computer name functions
@@ -285,32 +284,16 @@
/*
* @implemented
*/
-BOOL STDCALL
-SetComputerNameA (LPCSTR lpComputerName)
-{
- UNICODE_STRING ComputerName;
- BOOL bResult;
-
- RtlCreateUnicodeStringFromAsciiz (&ComputerName,
- (LPSTR)lpComputerName);
-
- bResult = SetComputerNameW (ComputerName.Buffer);
-
- RtlFreeUnicodeString (&ComputerName);
-
- return bResult;
-}
-
-
-/*
- * @implemented
- */
static BOOL
-IsValidComputerName (LPCWSTR lpComputerName)
+IsValidComputerName (
+ COMPUTER_NAME_FORMAT NameType,
+ LPCWSTR lpComputerName)
{
PWCHAR p;
ULONG Length;
+ /* FIXME: do verification according to NameType */
+
Length = 0;
p = (PWCHAR)lpComputerName;
while (*p != 0)
@@ -346,60 +329,137 @@
}
+static BOOL SetComputerNameToRegistry(
+ LPCWSTR RegistryKey,
+ LPCWSTR ValueNameStr,
+ LPCWSTR lpBuffer)
+{
+ OBJECT_ATTRIBUTES ObjectAttributes;
+ UNICODE_STRING KeyName;
+ UNICODE_STRING ValueName;
+ HANDLE KeyHandle;
+ NTSTATUS Status;
+
+ RtlInitUnicodeString (&KeyName, RegistryKey);
+ InitializeObjectAttributes (&ObjectAttributes,
+ &KeyName,
+ OBJ_CASE_INSENSITIVE,
+ NULL,
+ NULL );
+
+ Status = NtOpenKey (&KeyHandle,
+ KEY_WRITE,
+ &ObjectAttributes);
+ if (!NT_SUCCESS(Status))
+ {
+ SetLastErrorByStatus (Status);
+ return FALSE;
+ }
+
+ RtlInitUnicodeString (&ValueName, ValueNameStr);
+
+ Status = NtSetValueKey (KeyHandle,
+ &ValueName,
+ 0,
+ REG_SZ,
+ (PVOID)lpBuffer,
+ (wcslen (lpBuffer) + 1) * sizeof(WCHAR));
+ if (!NT_SUCCESS(Status))
+ {
+ ZwClose (KeyHandle);
+ SetLastErrorByStatus (Status);
+ return FALSE;
+ }
+
+ NtFlushKey (KeyHandle);
+ ZwClose (KeyHandle);
+
+ return TRUE;
+}
+
+
/*
* @implemented
*/
BOOL STDCALL
+SetComputerNameA (LPCSTR lpComputerName)
+{
+ return SetComputerNameExA( ComputerNameNetBIOS, lpComputerName );
+}
+
+
+/*
+ * @implemented
+ */
+BOOL STDCALL
SetComputerNameW (LPCWSTR lpComputerName)
{
- OBJECT_ATTRIBUTES ObjectAttributes;
- UNICODE_STRING KeyName;
- UNICODE_STRING ValueName;
- HANDLE KeyHandle;
- NTSTATUS Status;
+ return SetComputerNameExW( ComputerNameNetBIOS, lpComputerName );
+}
- if (!IsValidComputerName (lpComputerName))
+
+/*
+ * @implemented
+ */
+BOOL STDCALL
+SetComputerNameExA (
+ COMPUTER_NAME_FORMAT NameType,
+ LPCSTR lpBuffer)
+{
+ UNICODE_STRING Buffer;
+ BOOL bResult;
+
+ RtlCreateUnicodeStringFromAsciiz (&Buffer,
+ (LPSTR)lpBuffer);
+
+ bResult = SetComputerNameExW (NameType, Buffer.Buffer);
+
+ RtlFreeUnicodeString (&Buffer);
+
+ return bResult;
+}
+
+
+/*
+ * @implemented
+ */
+BOOL STDCALL
+SetComputerNameExW (
+ COMPUTER_NAME_FORMAT NameType,
+ LPCWSTR lpBuffer)
+{
+ if (!IsValidComputerName (NameType, lpBuffer))
{
SetLastError (ERROR_INVALID_PARAMETER);
return FALSE;
}
- RtlInitUnicodeString (&KeyName,
-
L"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\ComputerName\
\ComputerName");
- InitializeObjectAttributes (&ObjectAttributes,
- &KeyName,
- OBJ_CASE_INSENSITIVE,
- NULL,
- NULL);
- Status = NtOpenKey (&KeyHandle,
- KEY_WRITE,
- &ObjectAttributes);
- if (!NT_SUCCESS(Status))
- {
- SetLastErrorByStatus (Status);
- return FALSE;
- }
+ switch( NameType ) {
+ case ComputerNamePhysicalDnsDomain:
+ return SetComputerNameToRegistry
+ ( L"\\Registry\\Machine\\System\\CurrentControlSet"
+ L"\\Services\\Tcpip\\Parameters",
+ L"Domain",
+ lpBuffer );
- RtlInitUnicodeString (&ValueName,
- L"ComputerName");
+ case ComputerNamePhysicalDnsHostname:
+ return SetComputerNameToRegistry
+ ( L"\\Registry\\Machine\\System\\CurrentControlSet"
+ L"\\Services\\Tcpip\\Parameters",
+ L"Hostname",
+ lpBuffer );
- Status = NtSetValueKey (KeyHandle,
- &ValueName,
- 0,
- REG_SZ,
- (PVOID)lpComputerName,
- (wcslen (lpComputerName) + 1) *
sizeof(WCHAR));
- if (!NT_SUCCESS(Status))
- {
- ZwClose (KeyHandle);
- SetLastErrorByStatus (Status);
- return FALSE;
- }
+ case ComputerNamePhysicalNetBIOS:
+ return SetComputerNameToRegistry
+ ( L"\\Registry\\Machine\\System\\CurrentControlSet"
+ L"\\Control\\ComputerName\\ComputerName",
+ L"ComputerName",
+ lpBuffer );
- NtFlushKey (KeyHandle);
- ZwClose (KeyHandle);
-
- return TRUE;
+ default:
+ SetLastError (ERROR_INVALID_PARAMETER);
+ return FALSE;
+ }
}
/* EOF */
_____
Modified: trunk/reactos/lib/kernel32/misc/stubs.c
--- trunk/reactos/lib/kernel32/misc/stubs.c 2005-09-04 18:00:59 UTC
(rev 17638)
+++ trunk/reactos/lib/kernel32/misc/stubs.c 2005-09-04 20:11:51 UTC
(rev 17639)
@@ -1,5 +1,4 @@
-/* $Id$
- *
+/*
* KERNEL32.DLL stubs (STUB functions)
* Remove from this file, if you implement them.
*/
@@ -1239,20 +1238,6 @@
*/
BOOL
STDCALL
-SetComputerNameExW (
- COMPUTER_NAME_FORMAT NameType,
- LPCWSTR lpBuffer
- )
-{
- STUB;
- return 0;
-}
-
-/*
- * @unimplemented
- */
-BOOL
-STDCALL
SetFirmwareEnvironmentVariableW(
LPCWSTR lpName,
LPCWSTR lpGuid,
@@ -1498,20 +1483,6 @@
*/
BOOL
STDCALL
-SetComputerNameExA (
- COMPUTER_NAME_FORMAT NameType,
- LPCSTR lpBuffer
- )
-{
- STUB;
- return 0;
-}
-
-/*
- * @unimplemented
- */
-BOOL
-STDCALL
SetFirmwareEnvironmentVariableA(
LPCSTR lpName,
LPCSTR lpGuid,
_____
Modified: trunk/reactos/w32api/include/winbase.h
--- trunk/reactos/w32api/include/winbase.h 2005-09-04 18:00:59 UTC
(rev 17638)
+++ trunk/reactos/w32api/include/winbase.h 2005-09-04 20:11:51 UTC
(rev 17639)
@@ -2093,6 +2093,7 @@
#define ReportEvent ReportEventW
#define SearchPath SearchPathW
#define SetComputerName SetComputerNameW
+#define SetComputerNameEx SetComputerNameExW
#define SetCurrentDirectory SetCurrentDirectoryW
#define SetDefaultCommConfig SetDefaultCommConfigW
#if (_WIN32_WINNT >= 0x0502)
@@ -2291,6 +2292,7 @@
#define ReportEvent ReportEventA
#define SearchPath SearchPathA
#define SetComputerName SetComputerNameA
+#define SetComputerNameEx SetComputerNameExA
#define SetCurrentDirectory SetCurrentDirectoryA
#define SetDefaultCommConfig SetDefaultCommConfigA
#if (_WIN32_WINNT >= 0x0502)