|
|
/*++
Copyright (c) 1995 Microsoft Corporation
Module Name:
rmisc.c
Abstract:
This module contains the server-side misc configuration manager routines.
Author:
Paula Tomlinson (paulat) 6-28-1995
Environment:
User-mode only.
Revision History:
28-June-1995 paulat
Creation and initial implementation.
--*/
//
// includes
//
#include "precomp.h"
#include "umpnpdat.h"
//
// private prototypes
//
//
// global data
//
CONFIGRET PNP_GetVersion( IN handle_t hBinding, IN OUT WORD * pVersion )
/*++
Routine Description:
This is the RPC server entry point, it returns the version number for the server-side component.
Arguments:
hBinding Not used.
Return Value:
Return the version number, with the major version in the high byte and the minor version number in the low byte.
--*/
{ CONFIGRET Status = CR_SUCCESS;
UNREFERENCED_PARAMETER(hBinding);
try {
*pVersion = (WORD)PNP_VERSION;
} except(EXCEPTION_EXECUTE_HANDLER) { Status = CR_FAILURE; }
return Status;
} // PNP_GetVersion
CONFIGRET PNP_GetGlobalState( IN handle_t hBinding, OUT PULONG pulState, IN ULONG ulFlags )
/*++
Routine Description:
This is the RPC server entry point, it returns the Global State of the Configuration Manager.
Arguments:
hBinding Not used.
pulState Returns the current global state.
ulFlags Not used.
Return Value:
Return CR_SUCCESS if the function succeeds, otherwise it returns one of the CR_* errors.
--*/
{ CONFIGRET Status = CR_SUCCESS;
UNREFERENCED_PARAMETER(hBinding); UNREFERENCED_PARAMETER(ulFlags);
try { //
// BUGBUG: For Cairo this will be dynamic
//
*pulState = CM_GLOBAL_STATE_CAN_DO_UI | CM_GLOBAL_STATE_SERVICES_AVAILABLE;
} except(EXCEPTION_EXECUTE_HANDLER) { Status = CR_FAILURE; }
return Status;
} // PNP_GetGlobalState
CONFIGRET PNP_SetActiveService( IN handle_t hBinding, IN LPCWSTR pszService, IN ULONG ulFlags )
/*++
Routine Description:
This routine is currently not an rpc routine, it is called directly and privately by the service controller.
Arguments:
hBinding Not used.
pszService Specifies the service name.
ulFlags Either PNP_SERVICE_STARTED or PNP_SERVICE_STOPPED.
Return Value:
Return CR_SUCCESS if the function succeeds, otherwise it returns one of the CR_* errors.
--*/
{ CONFIGRET Status = CR_SUCCESS; ULONG ulSize = 0, ulStatus = 0; LPWSTR pDeviceList = NULL, pszDevice = NULL; HKEY hKey = NULL, hControlKey = NULL; WCHAR RegStr[MAX_PATH];
UNREFERENCED_PARAMETER(hBinding);
try { //
// validate parameters
//
if (pszService == NULL) { Status = CR_INVALID_POINTER; goto Clean0; }
if (ulFlags != PNP_SERVICE_STOPPED && ulFlags != PNP_SERVICE_STARTED) { Status = CR_INVALID_FLAG; goto Clean0; }
//
// not handling stops right now, everything beyond here assumes
// the service is starting (or at least it attempted to start)
//
if (ulFlags == PNP_SERVICE_STOPPED) { goto Clean0; // not handling this right now
}
//
// retreive the list of devices that this service is controlling
//
Status = PNP_GetDeviceListSize(NULL, pszService, &ulSize, CM_GETIDLIST_FILTER_SERVICE);
if (Status != CR_SUCCESS) { goto Clean0; }
pDeviceList = malloc(ulSize * sizeof(WCHAR)); if (pDeviceList == NULL) { Status = CR_OUT_OF_MEMORY; goto Clean0; }
Status = PNP_GetDeviceList(NULL, pszService, pDeviceList, &ulSize, CM_GETIDLIST_FILTER_SERVICE);
if (Status != CR_SUCCESS) { goto Clean0; }
//
// set the ActiveService value for each device
//
for (pszDevice = pDeviceList; *pszDevice; pszDevice += lstrlen(pszDevice) + 1) {
wsprintf(RegStr, TEXT("%s\\%s"), pszRegPathEnum, pszDevice);
//
// open the device instance key
//
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, RegStr, 0, KEY_ALL_ACCESS, &hKey) == ERROR_SUCCESS) {
//
// open/create the volatile Control key
//
if (RegCreateKeyEx(hKey, pszRegKeyDeviceControl, 0, NULL, REG_OPTION_VOLATILE, KEY_ALL_ACCESS, NULL, &hControlKey, NULL) == ERROR_SUCCESS) {
RegSetValueEx(hControlKey, pszRegValueActiveService, 0, REG_SZ, (LPBYTE)pszService, (lstrlen(pszService) + 1) * sizeof(WCHAR));
//
// set the statusflag to DN_STARTED
//
ulSize = sizeof(DWORD);
if (RegQueryValueEx(hKey, pszRegValueStatusFlags, NULL, NULL, (LPBYTE)&ulStatus, &ulSize) != ERROR_SUCCESS) { ulStatus = 0; }
SET_FLAG(ulStatus, DN_STARTED);
RegSetValueEx(hKey, pszRegValueStatusFlags, 0, REG_DWORD, (LPBYTE)&ulStatus, sizeof(DWORD));
RegCloseKey(hControlKey); hControlKey = NULL; }
RegCloseKey(hKey); hKey = NULL; } }
Clean0: ;
} except(EXCEPTION_EXECUTE_HANDLER) { Status = CR_FAILURE; }
if (pDeviceList != NULL) { free(pDeviceList); } if (hKey != NULL) { RegCloseKey(hKey); }
return Status;
} // PNP_SetActiveService
//--------------------------------------------------------------------
// Stub server side CM routines - not implemented yet
//--------------------------------------------------------------------
CONFIGRET PNP_SetHwProf( IN handle_t hBinding, IN ULONG ulHardwareProfile, IN ULONG ulFlags ) { UNREFERENCED_PARAMETER(hBinding); UNREFERENCED_PARAMETER(ulHardwareProfile); UNREFERENCED_PARAMETER(ulFlags);
return CR_CALL_NOT_IMPLEMENTED; }
CONFIGRET PNP_QueryArbitratorFreeData( IN handle_t hBinding, OUT LPBYTE pData, IN ULONG ulDataLen, IN LPCWSTR pszDeviceID, IN RESOURCEID ResourceID, IN ULONG ulFlags ) { UNREFERENCED_PARAMETER(hBinding); UNREFERENCED_PARAMETER(pData); UNREFERENCED_PARAMETER(ulDataLen); UNREFERENCED_PARAMETER(pszDeviceID); UNREFERENCED_PARAMETER(ResourceID); UNREFERENCED_PARAMETER(ulFlags);
return CR_CALL_NOT_IMPLEMENTED; }
CONFIGRET PNP_QueryArbitratorFreeSize( IN handle_t hBinding, OUT PULONG pulSize, IN LPCWSTR pszDeviceID, IN RESOURCEID ResourceID, IN ULONG ulFlags ) { UNREFERENCED_PARAMETER(hBinding); UNREFERENCED_PARAMETER(pulSize); UNREFERENCED_PARAMETER(pszDeviceID); UNREFERENCED_PARAMETER(ResourceID); UNREFERENCED_PARAMETER(ulFlags);
return CR_CALL_NOT_IMPLEMENTED; }
CONFIGRET PNP_RunDetection( IN handle_t hBinding, IN ULONG ulFlags ) { UNREFERENCED_PARAMETER(hBinding); UNREFERENCED_PARAMETER(ulFlags);
return CR_CALL_NOT_IMPLEMENTED; }
CONFIGRET PNP_Connect( IN PNP_HANDLE UNCServerName ) { UNREFERENCED_PARAMETER(UNCServerName); return CR_SUCCESS; }
CONFIGRET PNP_Disconnect( IN PNP_HANDLE UNCServerName ) { UNREFERENCED_PARAMETER(UNCServerName); return CR_SUCCESS; }
|