/*++ Copyright (c) Microsoft Corporation. All rights reserved. Module Name: umpnplib.h Abstract: This module contains the private prototype defintions for routines contained in the statically linked library that is shared by both the Configuration Manager client DLL and User-Mode Plug and Play manager server DLL. Author: Jim Cavalaris (jamesca) 02/27/2001 Environment: User mode only. Revision History: 27-February-2001 jamesca Creation and initial implementation. --*/ #ifndef _UMPNPLIB_H_ #define _UMPNPLIB_H_ //------------------------------------------------------------------- // Common private utility routines (used by client and server) //------------------------------------------------------------------- BOOL IsLegalDeviceId( IN LPCWSTR pszDeviceInstance ); BOOL SplitString( IN LPCWSTR SourceString, IN WCHAR SearchChar, IN ULONG nOccurrence, OUT LPWSTR String1, IN ULONG Length1, OUT LPWSTR String2, IN ULONG Length2 ); BOOL SplitDeviceInstanceString( IN LPCWSTR pszDeviceInstance, OUT LPWSTR pszBase, OUT LPWSTR pszDeviceID, OUT LPWSTR pszInstanceID ); BOOL SplitClassInstanceString( IN LPCWSTR pszClassInstance, OUT LPWSTR pszClass, OUT LPWSTR pszInstance ); CONFIGRET DeletePrivateKey( IN HKEY hBranchKey, IN LPCWSTR pszParentKey, IN LPCWSTR pszChildKey ); BOOL RegDeleteNode( IN HKEY hParentKey, IN LPCWSTR szKey ); CONFIGRET GetDevNodeKeyPath( IN handle_t hBinding, IN LPCWSTR pDeviceID, IN ULONG ulFlags, IN ULONG ulHardwareProfile, OUT LPWSTR pszBaseKey, IN ULONG ulBaseKeyLength, OUT LPWSTR pszPrivateKey, IN ULONG ulPrivateKeyLength, IN BOOL bCreateAlways ); CONFIGRET MapRpcExceptionToCR( ULONG ulRpcExceptionCode ); //------------------------------------------------------------------- // Generic (private) locking support //------------------------------------------------------------------- // // Locking functions. These functions are used to make various parts of // the DLL multithread-safe. The basic idea is to have a mutex and an event. // The mutex is used to synchronize access to the structure being guarded. // The event is only signalled when the structure being guarded is destroyed. // To gain access to the guarded structure, a routine waits on both the mutex // and the event. If the event gets signalled, then the structure was destroyed. // If the mutex gets signalled, then the thread has access to the structure. // #define DESTROYED_EVENT 0 #define ACCESS_MUTEX 1 typedef struct _LOCKINFO { // // DESTROYED_EVENT, ACCESS_MUTEX // HANDLE LockHandles[2]; } LOCKINFO, *PLOCKINFO; BOOL InitPrivateResource( OUT PLOCKINFO Lock ); VOID DestroyPrivateResource( IN OUT PLOCKINFO Lock ); BOOL __inline LockPrivateResource( IN PLOCKINFO Lock ) { DWORD d = WaitForMultipleObjects(2, Lock->LockHandles, FALSE, INFINITE); // // Success if the mutex object satisfied the wait; // Failure if the table destroyed event satisified the wait, or // the mutex was abandoned, etc. // return ((d - WAIT_OBJECT_0) == ACCESS_MUTEX); } VOID __inline UnlockPrivateResource( IN PLOCKINFO Lock ) { ReleaseMutex(Lock->LockHandles[ACCESS_MUTEX]); } //------------------------------------------------------------------- // Defines and typedefs needed for logconf routines //------------------------------------------------------------------- #include "pshpack1.h" // set to 1-byte packing // // DEFINES REQUIRED FOR PARTIAL (SUR) IMPLEMENTATION OF LOG_CONF and RES_DES // // We only allow one logical config (the BOOT_LOG_CONF) for SUR so no need // to keep track of multiple log confs, this will all change for Cairo. // typedef struct Private_Log_Conf_Handle_s { ULONG LC_Signature; // CM_PRIVATE_LOGCONF_HANDLE DEVINST LC_DevInst; ULONG LC_LogConfType; ULONG LC_LogConfTag; //LC_LogConfIndex; } Private_Log_Conf_Handle, *PPrivate_Log_Conf_Handle; typedef struct Private_Res_Des_Handle_s { ULONG RD_Signature; // CM_PRIVATE_RESDES_HANDLE DEVINST RD_DevInst; ULONG RD_LogConfType; ULONG RD_LogConfTag; //RD_LogConfIndex; RESOURCEID RD_ResourceType; ULONG RD_ResDesTag; //RD_ResDesIndex; } Private_Res_Des_Handle, *PPrivate_Res_Des_Handle; typedef struct Generic_Des_s { DWORD GENERIC_Count; DWORD GENERIC_Type; } GENERIC_DES, *PGENERIC_DES; typedef struct Generic_Resource_S { GENERIC_DES GENERIC_Header; } GENERIC_RESOURCE, *PGENERIC_RESOURCE; typedef struct Private_Log_Conf_s { ULONG LC_Flags; // Type of log conf ULONG LC_Priority; // Priority of log conf CS_RESOURCE LC_CS; // First and only res-des, class-specific } Private_Log_Conf, *PPrivate_Log_Conf; #include "poppack.h" // restore to default packing //------------------------------------------------------------------- // Defines and typedefs needed for range routines //------------------------------------------------------------------- typedef struct Range_Element_s { ULONG_PTR RL_Next; ULONG_PTR RL_Header; DWORDLONG RL_Start; DWORDLONG RL_End; } Range_Element, *PRange_Element; typedef struct Range_List_Hdr_s { ULONG_PTR RLH_Head; ULONG_PTR RLH_Header; ULONG RLH_Signature; LOCKINFO RLH_Lock; } Range_List_Hdr, *PRange_List_Hdr; #define Range_List_Signature 0x5959574D #endif // _UMPNPLIB_H_