Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

655 lines
14 KiB

/*++
Copyright (c) 1989-1995 Microsoft Corporation
Module Name:
cfgmgr32.h
Abstract:
This module contains the private defintions for the
Configuration Manager.
Author:
Paula Tomlinson (paulat) 06/19/1995
Revision History:
--*/
#ifndef _CFGMGRP_H_
#define _CFGMGRP_H_
#define PNP_VERSION CONFIGMG_VERSION
#define CFGMGR32_VERSION CONFIGMG_VERSION
#define CFGMGR_MUTEX_NAME L"CFGMGR_EXCLUSIVE_MUTEX"
#define CFGMGR_WAIT_TIME 10000
#define MAX_DEVICE_INSTANCE_LEN 256
#define MAX_DEVICE_INSTANCE_SIZE 512
#define MAX_SERVICE_NAME_LEN 256
#define MAX_PROFILE_ID_LEN 5
#define MAX_LOG_CONF 9999
#define MAX_RES_DES 9999
#define MAX_CM_PATH 360
#define PRIMING_STRING TEXT("PLT")
#define PNP_PRIVATE (0x10000099)
//
// Action types for PNP_DevNodeRegistryProperty routine
//
//#define PNP_GET_DEVNODE_REG_PROPERTY 0x00000001
//#define PNP_SET_DEVNODE_REG_PROPERTY 0x00000002
//
// Action types for PNP_GetDeviceInstance
//
#define PNP_GET_PARENT_DEVICE_INSTANCE 0x00000001
#define PNP_GET_CHILD_DEVICE_INSTANCE 0x00000002
#define PNP_GET_SIBLING_DEVICE_INSTANCE 0x00000003
//
// Registry branch flags for PNP_CreateKey
//
#define PNP_BRANCH_CURRENTUSER 0x00000001
#define PNP_BRANCH_LOCALMACHINE 0x00000002
//
// Action types for PNP_DeviceInstanceAction
//
#define PNP_DEVINST_CREATE 0x00000001
#define PNP_DEVINST_MOVE 0x00000002
#define PNP_DEVINST_SETUP 0x00000003
#define PNP_DEVINST_ENABLE 0x00000004
#define PNP_DEVINST_DISABLE 0x00000005
#define PNP_DEVINST_REMOVESUBTREE 0x00000006
#define PNP_DEVINST_REENUMERATE 0x00000007
#define PNP_DEVINST_QUERYREMOVE 0x00000008
//
// Action types for PNP_EnumerateSubKeys
//
#define PNP_ENUMERATOR_SUBKEYS 0x00000001
#define PNP_CLASS_SUBKEYS 0x00000002
//
// action types for PNP_HwProfFlags
//
#define PNP_GET_HWPROFFLAGS 0x00000001
#define PNP_SET_HWPROFFLAGS 0x00000002
//
// flags for IsValidDeviceID
//
#define PNP_NOT_MOVED 0x00000001
#define PNP_NOT_PHANTOM 0x00000002
#define PNP_PRESENT 0x00000004
#define PNP_NOT_REMOVED 0x00000008
#define PNP_STRICT 0xFFFFFFFF
//
// flags for PNP_SetActiveService
//
#define PNP_SERVICE_STARTED 0x00000001
#define PNP_SERVICE_STOPPED 0x00000002
//
// macros for setting StatusFlags value
//
#define SET_FLAG(Status, Flag) ((Status) |= (Flag))
#define CLEAR_FLAG(Status, Flag) ((Status) &= ~(Flag))
#define INVALID_FLAGS(ulFlags, ulAllowed) ((ulFlags) & ~(ulAllowed))
//
// private DN status flags
//
#define DN_PRIVATE_FLAGS 0xFFE00000 // The "or" of the belowed flags
#define DN_PROCESSED_ONCE 0x80000000
#define DN_CSDISABLED 0x40000000
#define DN_PROBLEM_KNOWN 0x20000000
#define DN_PREASSIGNED 0x10000000
#define DN_NEED_CONTINUE 0x08000000
#define DN_PRELOADED 0x04000000
#define DN_NOT_VERIFIED 0x02000000
#define DN_NO_WAIT_INSTALL 0x01000000
#define DN_PARTIAL_CONFIG 0x00800000
#define DN_NEED_RESTART 0x00400000
#define DN_NO_EXIT_REMOVE 0x00200000
//
// Map the LCPRI_* values into these NT byte field values
//
#define NT_FORCECONFIG (0x00) // Coming from a forced config
#define NT_BOOTCONFIG (0x01) // Coming from a boot config
#define NT_DESIRED (0x20) // Preferable (better performance)
#define NT_NORMAL (0x30) // Workable (acceptable performance)
#define NT_LASTBESTCONFIG (0x3F) // CM only--do not use
#define NT_SUBOPTIMAL (0x50) // Not desired, but will work
#define NT_LASTSOFTCONFIG (0x7F) // CM only--do not use
#define NT_RESTART (0x80) // Need to restart Windows
#define NT_REBOOT (0x90) // Need to reboot Windows
#define NT_POWEROFF (0xA0) // Need to shutdown/power-off
#define NT_HARDRECONFIG (0xC0) // Need to change a jumper
#define NT_HARDWIRED (0xE0) // Cannot be changed
#define NT_IMPOSSIBLE (0xF0) // Impossible configuration
#define NT_DISABLED (0xFF) // Disabled configuration
#define MAX_NTPRI (0xFF) // Maximum known LC Priority
//-------------------------------------------------------------------
// internal data structures
//-------------------------------------------------------------------
//
// Define the Plug and Play driver types. (from ntos\pnp\pnpi.h)
//
typedef enum _PLUGPLAY_SERVICE_TYPE {
PlugPlayServiceBusExtender,
PlugPlayServiceAdapter,
PlugPlayServicePeripheral,
PlugPlayServiceSoftware,
MaxPlugPlayServiceType
} PLUGPLAY_SERVICE_TYPE, *PPLUGPLAY_SERVICE_TYPE;
typedef struct PnP_Machine_s {
PVOID hStringTable;
PVOID hBindingHandle;
WCHAR szMachineName[MAX_COMPUTERNAME_LENGTH + 1];
} PNP_MACHINE, *PPNP_MACHINE;
typedef struct ServiceInfo_s {
WCHAR szService[MAX_SERVICE_NAME_LEN];
LPWSTR pszDeviceList;
ULONG ulDeviceListSize;
} SERVICE_INFO, *PSERVICE_INFO;
//-------------------------------------------------------------------
// 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.
//
typedef struct _LOCKINFO {
HANDLE LockHandles[2];
} LOCKINFO, *PLOCKINFO;
#define DESTROYED_EVENT 0
#define ACCESS_MUTEX 1
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]);
}
#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;
#define CM_PRIVATE_LOGCONF_SIGNATURE (0x08156201)
#define CM_PRIVATE_RESDES_SIGNATURE (0x08156202)
#define MAX_LOGCONF_TAG (0x0000FFFF)
#define MAX_RESDES_TAG (0x0000FFFF)
#define MAX_LOGCONF (0x0000FFFF)
#define MAX_RESDES (0x0000FFFF)
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 RL_Next;
ULONG RL_Header;
DWORDLONG RL_Start;
DWORDLONG RL_End;
} Range_Element, *PRange_Element;
typedef struct Range_List_Hdr_s {
ULONG RLH_Head;
ULONG RLH_Header;
ULONG RLH_Signature;
LOCKINFO RLH_Lock;
} Range_List_Hdr, *PRange_List_Hdr;
#define Range_List_Signature 0x5959574D
//-------------------------------------------------------------------
// Client side private utility routines
//-------------------------------------------------------------------
BOOL
IsValidDeviceInstanceId(
IN LPCTSTR DeviceInstanceId
);
BOOL
INVALID_DEVINST(
PWSTR pDeviceID
);
VOID
CopyFixedUpDeviceId(
OUT LPTSTR DestinationString,
IN LPCTSTR SourceString,
IN DWORD SourceStringLen
);
CONFIGRET
PnPUnicodeToMultiByte(
IN PCWSTR UnicodeString,
OUT PSTR AnsiString,
IN ULONG AnsiStringLen
);
BOOL
PnPGetGlobalHandles(
IN HMACHINE hMachine,
PVOID *phStringTable, OPTIONAL
PVOID *phBindingHandle OPTIONAL
);
BOOL
PnPRetrieveMachineName(
IN HMACHINE hMachine,
OUT LPWSTR pszMachineName
);
VOID
PnPTrace(
PCWSTR szMessage,
ULONG ulStatus
);
CONFIGRET
MapRpcExceptionToCR(
ULONG ulRpcExceptionCode
);
BOOL
GuidToString(
LPGUID Guid,
LPWSTR StringGuid
);
BOOL
GuidFromString(
LPWSTR StringGuid,
LPGUID Guid
);
CONFIGRET
GetDevNodeKeyPath(
IN handle_t hBinding,
IN LPCWSTR pDeviceID,
IN ULONG ulFlags,
IN ULONG ulHardwareProfile,
OUT LPWSTR pszBaesKey,
OUT LPWSTR pszPrivateKey
);
//-------------------------------------------------------------------
// Server (remote) side private utility routines
//-------------------------------------------------------------------
//
// revent.c
//
DWORD
InitializePnPManager(
LPDWORD lpParam
);
//
// rutil.c
//
BOOL
SplitClassInstanceString(
IN LPCWSTR pszClassInstance,
OUT LPWSTR pszClass,
OUT LPWSTR pszInstance
);
BOOL
CreateDeviceIDRegKey(
HKEY hParentKey,
LPCWSTR pDeviceID
);
BOOL
IsValidGuid(
LPWSTR pszGuid
);
BOOL
IsRootDeviceID(
LPCWSTR pDeviceID
);
CONFIGRET
AddAttachedComponent(
IN PCWSTR pszParent,
IN PCWSTR pszChild
);
CONFIGRET
RemoveAttachedComponent(
IN PCWSTR pszParent,
IN PCWSTR pszChild
);
CONFIGRET
BuildSubTreeList(
IN PCWSTR pDeviceID,
OUT PWSTR *pList
);
BOOL
MultiSzValidateW(
LPWSTR pszMultiSz,
ULONG ulLength
);
BOOL
MultiSzAppendW(
LPWSTR pszMultiSz,
PULONG pulSize,
LPCWSTR pszString
);
LPWSTR
MultiSzFindNextStringW(
LPWSTR pMultiSz
);
BOOL
MultiSzSearchStringW(
IN LPCWSTR pString,
IN LPCWSTR pSubString
);
ULONG
MultiSzSizeW(
IN LPCWSTR pString
);
BOOL
MultiSzDeleteStringW(
IN OUT LPWSTR pString,
IN LPCWSTR pSubString
);
BOOL
BuildSecurityDescriptor(
OUT PSECURITY_DESCRIPTOR pSecurityDescriptor
);
CONFIGRET
OpenDeviceIDKey(
IN LPCWSTR pszDeviceID,
OUT PHKEY phKey,
IN ULONG ulFlag
);
BOOL
IsValidDeviceID(
IN LPCWSTR pszDeviceID,
IN HKEY hKey,
IN ULONG ulFlags
);
BOOL
IsDevicePhantom(
IN LPWSTR pszDeviceID
);
CONFIGRET
MarkDeviceProblem(
IN HKEY hDeviceKey,
IN LPCWSTR pszDeviceID,
IN ULONG ulProblem
);
CONFIGRET
GetProfileCount(
OUT PULONG pulProfiles
);
CONFIGRET
GetServiceName(
IN LPCWSTR pszDeviceID,
OUT LPWSTR pszService,
IN ULONG ulLength
);
CONFIGRET
CopyRegistryTree(
IN HKEY hSrcKey,
IN HKEY hDestKey,
IN ULONG ulOption
);
BOOL
PathToString(
IN LPWSTR pszString,
IN LPCWSTR pszPath
);
BOOL
IsDeviceMoved(
IN LPCWSTR pszDeviceID,
IN HKEY hKey
);
CONFIGRET
MakeKeyVolatile(
IN LPCWSTR pszParentKey,
IN LPCWSTR pszChildKey
);
CONFIGRET
MakeKeyNonVolatile(
IN LPCWSTR pszParentKey,
IN LPCWSTR pszChildKey
);
CONFIGRET
OpenLogConfKey(
IN LPCWSTR pszDeviceID,
OUT PHKEY phKey
);
BOOL
GetActiveService(
IN PCWSTR pszDevice,
OUT PWSTR pszService
);
CONFIGRET
PNP_SetActiveService(
IN handle_t hBinding,
IN LPCWSTR pszService,
IN ULONG ulFlags
);
BOOL
IsDeviceIdPresent(
IN LPCWSTR pszDeviceID,
IN HKEY hKey
);
//-------------------------------------------------------------------
// Common private utility routines (used by client and server)
//-------------------------------------------------------------------
BOOL
InitPrivateResource(
OUT PLOCKINFO Lock
);
VOID
DestroyPrivateResource(
IN OUT PLOCKINFO Lock
);
BOOL
SplitDeviceInstanceString(
IN LPCWSTR pszDeviceInstance,
OUT LPWSTR pszBase,
OUT LPWSTR pszDeviceID,
OUT LPWSTR pszInstanceID
);
CONFIGRET
DeletePrivateKey(
IN HKEY hBranchKey,
IN LPCWSTR pszParentKey,
IN LPCWSTR pszChildKey
);
BOOL
RegDeleteNode(
HKEY hParentKey,
LPCWSTR szKey
);
BOOL
Split1(
IN LPCWSTR pszString,
OUT LPWSTR pszString1,
OUT LPWSTR pszString2
);
BOOL
Split2(
IN LPCWSTR pszString,
OUT LPWSTR pszString1,
OUT LPWSTR pszString2
);
//
// utility routines in rtravers.c that are used by rdevnode.c
//
CONFIGRET
GetServiceDeviceListSize(
IN LPCWSTR pszService,
OUT PULONG pulLength
);
CONFIGRET
GetServiceDeviceList(
IN LPCWSTR pszService,
OUT LPWSTR pBuffer,
IN OUT PULONG pulLength,
IN ULONG ulFlags
);
#endif // _CFGMGRP_H_