From f39c8938c3330f3c9b823509908820ac32cb997f Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sat, 29 Oct 2011 21:54:24 +0000 Subject: [PATCH] [UMPNPMGR] - Implement PNP_GetHwProfInfo. - Fix PNP_GetClassRegProp: Set the transfer length only in case of success. svn path=/trunk/; revision=54272 --- reactos/base/services/umpnpmgr/umpnpmgr.c | 131 +++++++++++++++++++++- 1 file changed, 128 insertions(+), 3 deletions(-) diff --git a/reactos/base/services/umpnpmgr/umpnpmgr.c b/reactos/base/services/umpnpmgr/umpnpmgr.c index 3d5c941cd84..05301b254f1 100644 --- a/reactos/base/services/umpnpmgr/umpnpmgr.c +++ b/reactos/base/services/umpnpmgr/umpnpmgr.c @@ -1333,7 +1333,8 @@ DWORD PNP_GetClassRegProp( } done:; - *pulTransferLen = (ret == CR_SUCCESS) ? *pulLength : 0; + if (ret == CR_SUCCESS) + *pulTransferLen = *pulLength; if (hPropKey != NULL) RegCloseKey(hPropKey); @@ -2145,8 +2146,128 @@ DWORD PNP_GetHwProfInfo( DWORD ulProfileInfoSize, DWORD ulFlags) { - UNIMPLEMENTED; - return CR_CALL_NOT_IMPLEMENTED; + WCHAR szProfileName[5]; + HKEY hKeyConfig = NULL; + HKEY hKeyProfiles = NULL; + HKEY hKeyProfile = NULL; + DWORD dwDisposition; + DWORD dwSize; + LONG lError; + CONFIGRET ret = CR_SUCCESS; + + UNREFERENCED_PARAMETER(hBinding); + + DPRINT("PNP_GetHwProfInfo() called\n"); + + if (ulProfileInfoSize == 0) + { + ret = CR_INVALID_DATA; + goto done; + } + + if (ulFlags != 0) + { + ret = CR_INVALID_FLAG; + goto done; + } + + /* Initialize the profile information */ + pHWProfileInfo->HWPI_ulHWProfile = 0; + pHWProfileInfo->HWPI_szFriendlyName[0] = 0; + pHWProfileInfo->HWPI_dwFlags = 0; + + /* Open the 'IDConfigDB' key */ + lError = RegCreateKeyExW(HKEY_LOCAL_MACHINE, + L"System\\CurrentControlSet\\Control\\IDConfigDB", + 0, + NULL, + REG_OPTION_NON_VOLATILE, + KEY_QUERY_VALUE, + NULL, + &hKeyConfig, + &dwDisposition); + if (lError != ERROR_SUCCESS) + { + ret = CR_REGISTRY_ERROR; + goto done; + } + + /* Open the 'Hardware Profiles' subkey */ + lError = RegCreateKeyExW(hKeyConfig, + L"Hardware Profiles", + 0, + NULL, + REG_OPTION_NON_VOLATILE, + KEY_ENUMERATE_SUB_KEYS | KEY_QUERY_VALUE, + NULL, + &hKeyProfiles, + &dwDisposition); + if (lError != ERROR_SUCCESS) + { + ret = CR_REGISTRY_ERROR; + goto done; + } + + if (ulIndex == (ULONG)-1) + { + dwSize = sizeof(ULONG); + lError = RegQueryValueExW(hKeyConfig, + L"CurrentConfig", + NULL, + NULL, + (LPBYTE)&pHWProfileInfo->HWPI_ulHWProfile, + &dwSize); + if (lError != ERROR_SUCCESS) + { + pHWProfileInfo->HWPI_ulHWProfile = 0; + ret = CR_REGISTRY_ERROR; + goto done; + } + } + else + { + /* FIXME: not implemented yet */ + ret = CR_CALL_NOT_IMPLEMENTED; + goto done; + } + + swprintf(szProfileName, L"%04lu", pHWProfileInfo->HWPI_ulHWProfile); + + lError = RegOpenKeyExW(hKeyProfiles, + szProfileName, + 0, + KEY_QUERY_VALUE, + &hKeyProfile); + if (lError != ERROR_SUCCESS) + { + ret = CR_REGISTRY_ERROR; + goto done; + } + + dwSize = sizeof(pHWProfileInfo->HWPI_szFriendlyName); + lError = RegQueryValueExW(hKeyProfile, + L"FriendlyName", + NULL, + NULL, + (LPBYTE)&pHWProfileInfo->HWPI_szFriendlyName, + &dwSize); + if (lError != ERROR_SUCCESS) + { + ret = CR_REGISTRY_ERROR; + goto done; + } + +done: + if (hKeyProfile != NULL) + RegCloseKey(hKeyProfile); + + if (hKeyProfiles != NULL) + RegCloseKey(hKeyProfiles); + + if (hKeyConfig != NULL) + RegCloseKey(hKeyConfig); + + return ret; } @@ -2515,6 +2636,8 @@ DWORD PNP_GetVersionInternal( handle_t hBinding, WORD *pwVersion) { + *pwVersion = 0x501; + return CR_SUCCESS; UNIMPLEMENTED; return CR_CALL_NOT_IMPLEMENTED; } @@ -3144,6 +3267,8 @@ ServiceControlHandler(DWORD dwControl, case SERVICE_CONTROL_SHUTDOWN: DPRINT1(" SERVICE_CONTROL_SHUTDOWN received\n"); + /* Stop listening to RPC Messages */ + RpcMgmtStopServerListening(NULL); UpdateServiceStatus(SERVICE_STOPPED); return ERROR_SUCCESS;