Git conversion: Make reactos the root directory, move rosapps, rostests, wallpapers...
[reactos.git] / dll / win32 / advapi32 / misc / hwprofiles.c
diff --git a/dll/win32/advapi32/misc/hwprofiles.c b/dll/win32/advapi32/misc/hwprofiles.c
new file mode 100644 (file)
index 0000000..980001d
--- /dev/null
@@ -0,0 +1,205 @@
+/*
+ * COPYRIGHT:       See COPYING in the top level directory
+ * PROJECT:         ReactOS system libraries
+ * FILE:            dll/win32/advapi32/misc/hwprofiles.c
+ * PURPOSE:         advapi32.dll Hardware Functions
+ * PROGRAMMER:      Steven Edwards
+ *                  Eric Kohl
+ */
+
+#include <advapi32.h>
+WINE_DEFAULT_DEBUG_CHANNEL(advapi);
+
+/******************************************************************************
+ * GetCurrentHwProfileA [ADVAPI32.@]
+ *
+ * Get the current hardware profile.
+ *
+ * PARAMS
+ *  lpHwProfileInfo [O] Destination for hardware profile information.
+ *
+ * RETURNS
+ *  Success: TRUE. lpHwProfileInfo is updated with the hardware profile details.
+ *  Failure: FALSE.
+ *
+ * @implemented
+ */
+BOOL WINAPI
+GetCurrentHwProfileA(LPHW_PROFILE_INFOA lpHwProfileInfo)
+{
+    HW_PROFILE_INFOW ProfileInfo;
+    UNICODE_STRING StringU;
+    ANSI_STRING StringA;
+    BOOL bResult;
+    NTSTATUS Status;
+
+    TRACE("GetCurrentHwProfileA() called\n");
+
+    bResult = GetCurrentHwProfileW(&ProfileInfo);
+    if (bResult == FALSE)
+        return FALSE;
+
+    lpHwProfileInfo->dwDockInfo = ProfileInfo.dwDockInfo;
+
+    /* Convert the profile GUID to ANSI */
+    StringU.Buffer = (PWCHAR)ProfileInfo.szHwProfileGuid;
+    StringU.Length = wcslen(ProfileInfo.szHwProfileGuid) * sizeof(WCHAR);
+    StringU.MaximumLength = HW_PROFILE_GUIDLEN * sizeof(WCHAR);
+    StringA.Buffer = (PCHAR)&lpHwProfileInfo->szHwProfileGuid;
+    StringA.Length = 0;
+    StringA.MaximumLength = HW_PROFILE_GUIDLEN;
+    Status = RtlUnicodeStringToAnsiString(&StringA,
+                                          &StringU,
+                                          FALSE);
+    if (!NT_SUCCESS(Status))
+    {
+        SetLastError(RtlNtStatusToDosError(Status));
+        return FALSE;
+    }
+
+    /* Convert the profile name to ANSI */
+    StringU.Buffer = (PWCHAR)ProfileInfo.szHwProfileName;
+    StringU.Length = wcslen(ProfileInfo.szHwProfileName) * sizeof(WCHAR);
+    StringU.MaximumLength = MAX_PROFILE_LEN * sizeof(WCHAR);
+    StringA.Buffer = (PCHAR)&lpHwProfileInfo->szHwProfileName;
+    StringA.Length = 0;
+    StringA.MaximumLength = MAX_PROFILE_LEN;
+    Status = RtlUnicodeStringToAnsiString(&StringA,
+                                          &StringU,
+                                          FALSE);
+    if (!NT_SUCCESS(Status))
+    {
+        SetLastError(RtlNtStatusToDosError(Status));
+        return FALSE;
+    }
+
+    return TRUE;
+}
+
+
+/*
+ * @implemented
+ */
+BOOL WINAPI
+GetCurrentHwProfileW(LPHW_PROFILE_INFOW lpHwProfileInfo)
+{
+    WCHAR szKeyName[256];
+    HKEY hDbKey;
+    HKEY hProfileKey;
+    DWORD dwLength;
+    DWORD dwConfigId;
+    UUID uuid;
+
+    TRACE("GetCurrentHwProfileW() called\n");
+
+    if (lpHwProfileInfo == NULL)
+    {
+        SetLastError(ERROR_INVALID_PARAMETER);
+        return FALSE;
+    }
+
+    if (RegOpenKeyExW(HKEY_LOCAL_MACHINE,
+                      L"System\\CurrentControlSet\\Control\\IDConfigDB",
+                      0,
+                      KEY_QUERY_VALUE,
+                      &hDbKey))
+    {
+        SetLastError(ERROR_REGISTRY_CORRUPT);
+        return FALSE;
+    }
+
+    dwLength = sizeof(DWORD);
+    if (RegQueryValueExW(hDbKey,
+                         L"CurrentConfig",
+                         0,
+                         NULL,
+                         (LPBYTE)&dwConfigId,
+                         &dwLength))
+    {
+        RegCloseKey(hDbKey);
+        SetLastError(ERROR_REGISTRY_CORRUPT);
+        return FALSE;
+    }
+
+    swprintf(szKeyName,
+             L"Hardware Profile\\%04lu",
+             dwConfigId);
+
+    if (RegOpenKeyExW(hDbKey,
+                      szKeyName,
+                      0,
+                      KEY_QUERY_VALUE | KEY_SET_VALUE,
+                      &hProfileKey))
+    {
+        RegCloseKey(hDbKey);
+        SetLastError(ERROR_REGISTRY_CORRUPT);
+        return FALSE;
+    }
+
+    dwLength = sizeof(DWORD);
+    if (RegQueryValueExW(hProfileKey,
+                         L"DockState",
+                         0,
+                         NULL,
+                         (LPBYTE)&lpHwProfileInfo->dwDockInfo,
+                         &dwLength))
+    {
+        lpHwProfileInfo->dwDockInfo =
+            DOCKINFO_DOCKED | DOCKINFO_UNDOCKED | DOCKINFO_USER_SUPPLIED;
+    }
+
+    dwLength = HW_PROFILE_GUIDLEN * sizeof(WCHAR);
+    if (RegQueryValueExW(hProfileKey,
+                         L"HwProfileGuid",
+                         0,
+                         NULL,
+                         (LPBYTE)&lpHwProfileInfo->szHwProfileGuid,
+                         &dwLength))
+    {
+        /* Create a new GUID */
+        UuidCreate(&uuid);
+        swprintf(
+            lpHwProfileInfo->szHwProfileGuid,
+            L"{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}",
+            uuid.Data1, 
+            uuid.Data2, 
+            uuid.Data3,
+            uuid.Data4[0], uuid.Data4[1],
+            uuid.Data4[2], uuid.Data4[3], uuid.Data4[4], uuid.Data4[5], 
+            uuid.Data4[6], uuid.Data4[7]);
+
+        dwLength = (wcslen(lpHwProfileInfo->szHwProfileGuid) + 1) * sizeof(WCHAR);
+        RegSetValueExW(hProfileKey,
+                       L"HwProfileGuid",
+                       0,
+                       REG_SZ,
+                       (LPBYTE)lpHwProfileInfo->szHwProfileGuid,
+                       dwLength);
+    }
+
+    dwLength = MAX_PROFILE_LEN * sizeof(WCHAR);
+    if (RegQueryValueExW(hProfileKey,
+                         L"FriendlyName",
+                         0,
+                         NULL,
+                         (LPBYTE)&lpHwProfileInfo->szHwProfileName,
+                         &dwLength))
+    {
+        wcscpy(lpHwProfileInfo->szHwProfileName,
+               L"Noname Hardware Profile");
+        dwLength = (wcslen(lpHwProfileInfo->szHwProfileName) + 1) * sizeof(WCHAR);
+        RegSetValueExW(hProfileKey,
+                       L"FriendlyName",
+                       0,
+                       REG_SZ,
+                       (LPBYTE)lpHwProfileInfo->szHwProfileName,
+                       dwLength);
+    }
+
+    RegCloseKey(hProfileKey);
+    RegCloseKey(hDbKey);
+
+    return TRUE;
+}
+
+/* EOF */