mirror of
https://github.com/reactos/reactos.git
synced 2024-08-26 21:28:48 +00:00
206 lines
5.9 KiB
C
206 lines
5.9 KiB
C
/*
|
|
* 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 */
|