Author: ekohl
Date: Sat Oct 29 21:54:24 2011
New Revision: 54272
URL:
http://svn.reactos.org/svn/reactos?rev=54272&view=rev
Log:
[UMPNPMGR]
- Implement PNP_GetHwProfInfo.
- Fix PNP_GetClassRegProp: Set the transfer length only in case of success.
Modified:
trunk/reactos/base/services/umpnpmgr/umpnpmgr.c
Modified: trunk/reactos/base/services/umpnpmgr/umpnpmgr.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/base/services/umpnpmgr/ump…
==============================================================================
--- trunk/reactos/base/services/umpnpmgr/umpnpmgr.c [iso-8859-1] (original)
+++ trunk/reactos/base/services/umpnpmgr/umpnpmgr.c [iso-8859-1] Sat Oct 29 21:54:24 2011
@@ -1333,7 +1333,8 @@
}
done:;
- *pulTransferLen = (ret == CR_SUCCESS) ? *pulLength : 0;
+ if (ret == CR_SUCCESS)
+ *pulTransferLen = *pulLength;
if (hPropKey != NULL)
RegCloseKey(hPropKey);
@@ -2145,8 +2146,128 @@
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 @@
handle_t hBinding,
WORD *pwVersion)
{
+ *pwVersion = 0x501;
+ return CR_SUCCESS;
UNIMPLEMENTED;
return CR_CALL_NOT_IMPLEMENTED;
}
@@ -3144,6 +3267,8 @@
case SERVICE_CONTROL_SHUTDOWN:
DPRINT1(" SERVICE_CONTROL_SHUTDOWN received\n");
+ /* Stop listening to RPC Messages */
+ RpcMgmtStopServerListening(NULL);
UpdateServiceStatus(SERVICE_STOPPED);
return ERROR_SUCCESS;