{******************************************************************}
{                                                                  }
{       Borland Delphi Runtime Library                             }
{       Config Manager API interface unit                          }
{                                                                  }
{ Portions created by Microsoft are                                }
{ Copyright (c) Microsoft Corporation.  All rights reserved.       }
{                                                                  }
{ The original file is: cfg.h, released August 2001.               }
{ The original Pascal code is: Cfg.pas, released 5 Nov 2004.       }
{ The initial developer of the Pascal code is Robert Marquardt     }
{ (robert_marquardt att gmx dott de)                               }
{                                                                  }
{ Portions created by Robert Marquardt are                         }
{ Copyright (C) 2004 Robert Marquardt.                             }
{                                                                  }
{ Contributor(s):                                                  }
{                                                                  }
{ Obtained through:                                                }
{ Joint Endeavour of Delphi Innovators (Project JEDI)              }
{                                                                  }
{ You may retrieve the latest version of this file at the Project  }
{ JEDI home page, located at http://delphi-jedi.org                }
{                                                                  }
{ The contents of this file are used with permission, subject to   }
{ the Mozilla Public License Version 1.1 (the "License"); you may  }
{ not use this file except in compliance with the License. You may }
{ obtain a copy of the License at                                  }
{ http://www.mozilla.org/MPL/MPL-1.1.html                          }
{                                                                  }
{ Software distributed under the License is distributed on an      }
{ "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or   }
{ implied. See the License for the specific language governing     }
{ rights and limitations under the License.                        }
{                                                                  }
{******************************************************************}
{$IFNDEF JWA_OMIT_SECTIONS}
unit Cfg;

interface

uses
  JwaWinType;

{$WEAKPACKAGEUNIT ON}
{$ENDIF JWA_OMIT_SECTIONS}

{$HPPEMIT '#include "cfg.h"'}

{$IFNDEF JWA_IMPLEMENTATIONSECTION}
//
// The following definitions are also used by kernel mode code to
// set up the registry.
//
//
// VetoType used in
//      CM_Disable_DevNode
//      CM_Uninstall_DevNode
//      CM_Query_And_Remove_SubTree
//
const
  PNP_VetoTypeUnknown          = 0;   // Name is unspecified
  {$EXTERNALSYM PNP_VetoTypeUnknown}
  PNP_VetoLegacyDevice         = 1;   // Name is an Instance Path
  {$EXTERNALSYM PNP_VetoLegacyDevice}
  PNP_VetoPendingClose         = 2;   // Name is an Instance Path
  {$EXTERNALSYM PNP_VetoPendingClose}
  PNP_VetoWindowsApp           = 3;   // Name is a Module
  {$EXTERNALSYM PNP_VetoWindowsApp}
  PNP_VetoWindowsService       = 4;   // Name is a Service
  {$EXTERNALSYM PNP_VetoWindowsService}
  PNP_VetoOutstandingOpen      = 5;   // Name is an Instance Path
  {$EXTERNALSYM PNP_VetoOutstandingOpen}
  PNP_VetoDevice               = 6;   // Name is an Instance Path
  {$EXTERNALSYM PNP_VetoDevice}
  PNP_VetoDriver               = 7;   // Name is a Driver Service Name
  {$EXTERNALSYM PNP_VetoDriver}
  PNP_VetoIllegalDeviceRequest = 8;   // Name is an Instance Path
  {$EXTERNALSYM PNP_VetoIllegalDeviceRequest}
  PNP_VetoInsufficientPower    = 9;   // Name is unspecified
  {$EXTERNALSYM PNP_VetoInsufficientPower}
  PNP_VetoNonDisableable       = 10;  // Name is an Instance Path
  {$EXTERNALSYM PNP_VetoNonDisableable}
  PNP_VetoLegacyDriver         = 11;  // Name is a Service
  {$EXTERNALSYM PNP_VetoLegacyDriver}
  PNP_VetoInsufficientRights   = 12;  // Name is unspecified
  {$EXTERNALSYM PNP_VetoInsufficientRights}
type
  PPNP_VETO_TYPE = ^PNP_VETO_TYPE;
  {$EXTERNALSYM PPNP_VETO_TYPE}
  PNP_VETO_TYPE = DWORD;
  {$EXTERNALSYM PNP_VETO_TYPE}

const
  //
  // DevInst problem values, returned by call to CM_Get_DevInst_Status
  //
  CM_PROB_NOT_CONFIGURED             = $00000001;   // no config for device
  {$EXTERNALSYM CM_PROB_NOT_CONFIGURED}
  CM_PROB_DEVLOADER_FAILED           = $00000002;   // service load failed
  {$EXTERNALSYM CM_PROB_DEVLOADER_FAILED}
  CM_PROB_OUT_OF_MEMORY              = $00000003;   // out of memory
  {$EXTERNALSYM CM_PROB_OUT_OF_MEMORY}
  CM_PROB_ENTRY_IS_WRONG_TYPE        = $00000004;   //
  {$EXTERNALSYM CM_PROB_ENTRY_IS_WRONG_TYPE}
  CM_PROB_LACKED_ARBITRATOR          = $00000005;   //
  {$EXTERNALSYM CM_PROB_LACKED_ARBITRATOR}
  CM_PROB_BOOT_CONFIG_CONFLICT       = $00000006;   // boot config conflict
  {$EXTERNALSYM CM_PROB_BOOT_CONFIG_CONFLICT}
  CM_PROB_FAILED_FILTER              = $00000007;   //
  {$EXTERNALSYM CM_PROB_FAILED_FILTER}
  CM_PROB_DEVLOADER_NOT_FOUND        = $00000008;   // Devloader not found
  {$EXTERNALSYM CM_PROB_DEVLOADER_NOT_FOUND}
  CM_PROB_INVALID_DATA               = $00000009;   //
  {$EXTERNALSYM CM_PROB_INVALID_DATA}
  CM_PROB_FAILED_START               = $0000000A;   //
  {$EXTERNALSYM CM_PROB_FAILED_START}
  CM_PROB_LIAR                       = $0000000B;   //
  {$EXTERNALSYM CM_PROB_LIAR}
  CM_PROB_NORMAL_CONFLICT            = $0000000C;   // config conflict
  {$EXTERNALSYM CM_PROB_NORMAL_CONFLICT}
  CM_PROB_NOT_VERIFIED               = $0000000D;   //
  {$EXTERNALSYM CM_PROB_NOT_VERIFIED}
  CM_PROB_NEED_RESTART               = $0000000E;   // requires restart
  {$EXTERNALSYM CM_PROB_NEED_RESTART}
  CM_PROB_REENUMERATION              = $0000000F;   //
  {$EXTERNALSYM CM_PROB_REENUMERATION}
  CM_PROB_PARTIAL_LOG_CONF           = $00000010;   //
  {$EXTERNALSYM CM_PROB_PARTIAL_LOG_CONF}
  CM_PROB_UNKNOWN_RESOURCE           = $00000011;   // unknown res type
  {$EXTERNALSYM CM_PROB_UNKNOWN_RESOURCE}
  CM_PROB_REINSTALL                  = $00000012;   //
  {$EXTERNALSYM CM_PROB_REINSTALL}
  CM_PROB_REGISTRY                   = $00000013;   //
  {$EXTERNALSYM CM_PROB_REGISTRY}
  CM_PROB_VXDLDR                     = $00000014;   // WINDOWS 95 ONLY
  {$EXTERNALSYM CM_PROB_VXDLDR}
  CM_PROB_WILL_BE_REMOVED            = $00000015;   // devinst will remove
  {$EXTERNALSYM CM_PROB_WILL_BE_REMOVED}
  CM_PROB_DISABLED                   = $00000016;   // devinst is disabled
  {$EXTERNALSYM CM_PROB_DISABLED}
  CM_PROB_DEVLOADER_NOT_READY        = $00000017;   // Devloader not ready
  {$EXTERNALSYM CM_PROB_DEVLOADER_NOT_READY}
  CM_PROB_DEVICE_NOT_THERE           = $00000018;   // device doesn't exist
  {$EXTERNALSYM CM_PROB_DEVICE_NOT_THERE}
  CM_PROB_MOVED                      = $00000019;   //
  {$EXTERNALSYM CM_PROB_MOVED}
  CM_PROB_TOO_EARLY                  = $0000001A;   //
  {$EXTERNALSYM CM_PROB_TOO_EARLY}
  CM_PROB_NO_VALID_LOG_CONF          = $0000001B;   // no valid log config
  {$EXTERNALSYM CM_PROB_NO_VALID_LOG_CONF}
  CM_PROB_FAILED_INSTALL             = $0000001C;   // install failed
  {$EXTERNALSYM CM_PROB_FAILED_INSTALL}
  CM_PROB_HARDWARE_DISABLED          = $0000001D;   // device disabled
  {$EXTERNALSYM CM_PROB_HARDWARE_DISABLED}
  CM_PROB_CANT_SHARE_IRQ             = $0000001E;   // can't share IRQ
  {$EXTERNALSYM CM_PROB_CANT_SHARE_IRQ}
  CM_PROB_FAILED_ADD                 = $0000001F;   // driver failed add
  {$EXTERNALSYM CM_PROB_FAILED_ADD}
  CM_PROB_DISABLED_SERVICE           = $00000020;   // service's Start = 4
  {$EXTERNALSYM CM_PROB_DISABLED_SERVICE}
  CM_PROB_TRANSLATION_FAILED         = $00000021;   // resource translation failed
  {$EXTERNALSYM CM_PROB_TRANSLATION_FAILED}
  CM_PROB_NO_SOFTCONFIG              = $00000022;   // no soft config
  {$EXTERNALSYM CM_PROB_NO_SOFTCONFIG}
  CM_PROB_BIOS_TABLE                 = $00000023;   // device missing in BIOS table
  {$EXTERNALSYM CM_PROB_BIOS_TABLE}
  CM_PROB_IRQ_TRANSLATION_FAILED     = $00000024;   // IRQ translator failed
  {$EXTERNALSYM CM_PROB_IRQ_TRANSLATION_FAILED}
  CM_PROB_FAILED_DRIVER_ENTRY        = $00000025;   // DriverEntry() failed.
  {$EXTERNALSYM CM_PROB_FAILED_DRIVER_ENTRY}
  CM_PROB_DRIVER_FAILED_PRIOR_UNLOAD = $00000026;   // Driver should have unloaded.
  {$EXTERNALSYM CM_PROB_DRIVER_FAILED_PRIOR_UNLOAD}
  CM_PROB_DRIVER_FAILED_LOAD         = $00000027;   // Driver load unsuccessful.
  {$EXTERNALSYM CM_PROB_DRIVER_FAILED_LOAD}
  CM_PROB_DRIVER_SERVICE_KEY_INVALID = $00000028;   // Error accessing driver's service key
  {$EXTERNALSYM CM_PROB_DRIVER_SERVICE_KEY_INVALID}
  CM_PROB_LEGACY_SERVICE_NO_DEVICES  = $00000029;   // Loaded legacy service created no devices
  {$EXTERNALSYM CM_PROB_LEGACY_SERVICE_NO_DEVICES}
  CM_PROB_DUPLICATE_DEVICE           = $0000002A;   // Two devices were discovered with the same name
  {$EXTERNALSYM CM_PROB_DUPLICATE_DEVICE}
  CM_PROB_FAILED_POST_START          = $0000002B;   // The drivers set the device state to failed
  {$EXTERNALSYM CM_PROB_FAILED_POST_START}
  CM_PROB_HALTED                     = $0000002C;   // This device was failed post start via usermode
  {$EXTERNALSYM CM_PROB_HALTED}
  CM_PROB_PHANTOM                    = $0000002D;   // The devinst currently exists only in the registry
  {$EXTERNALSYM CM_PROB_PHANTOM}
  CM_PROB_SYSTEM_SHUTDOWN            = $0000002E;   // The system is shutting down
  {$EXTERNALSYM CM_PROB_SYSTEM_SHUTDOWN}
  CM_PROB_HELD_FOR_EJECT             = $0000002F;   // The device is offline awaiting removal
  {$EXTERNALSYM CM_PROB_HELD_FOR_EJECT}
  CM_PROB_DRIVER_BLOCKED             = $00000030;   // One or more drivers is blocked from loading
  {$EXTERNALSYM CM_PROB_DRIVER_BLOCKED}
  CM_PROB_REGISTRY_TOO_LARGE         = $00000031;   // System hive has grown too large
  {$EXTERNALSYM CM_PROB_REGISTRY_TOO_LARGE}
  NUM_CM_PROB                        = $00000032;
  {$EXTERNALSYM NUM_CM_PROB}

  //
  // Configuration Manager Global State Flags (returned by CM_Get_Global_State)
  //
  CM_GLOBAL_STATE_CAN_DO_UI            = $00000001; // Can  do UI?
  {$EXTERNALSYM CM_GLOBAL_STATE_CAN_DO_UI}
  CM_GLOBAL_STATE_ON_BIG_STACK         = $00000002; // WINDOWS 95 ONLY
  {$EXTERNALSYM CM_GLOBAL_STATE_ON_BIG_STACK}
  CM_GLOBAL_STATE_SERVICES_AVAILABLE   = $00000004; // CM APIs available?
  {$EXTERNALSYM CM_GLOBAL_STATE_SERVICES_AVAILABLE}
  CM_GLOBAL_STATE_SHUTTING_DOWN        = $00000008; // CM shutting down
  {$EXTERNALSYM CM_GLOBAL_STATE_SHUTTING_DOWN}
  CM_GLOBAL_STATE_DETECTION_PENDING    = $00000010; // detection pending
  {$EXTERNALSYM CM_GLOBAL_STATE_DETECTION_PENDING}

  //
  // Device Instance status flags, returned by call to CM_Get_DevInst_Status
  //
  DN_ROOT_ENUMERATED = $00000001; // Was enumerated by ROOT
  {$EXTERNALSYM DN_ROOT_ENUMERATED}
  DN_DRIVER_LOADED   = $00000002; // Has Register_Device_Driver
  {$EXTERNALSYM DN_DRIVER_LOADED}
  DN_ENUM_LOADED     = $00000004; // Has Register_Enumerator
  {$EXTERNALSYM DN_ENUM_LOADED}
  DN_STARTED         = $00000008; // Is currently configured
  {$EXTERNALSYM DN_STARTED}
  DN_MANUAL          = $00000010; // Manually installed
  {$EXTERNALSYM DN_MANUAL}
  DN_NEED_TO_ENUM    = $00000020; // May need reenumeration
  {$EXTERNALSYM DN_NEED_TO_ENUM}
  DN_NOT_FIRST_TIME  = $00000040; // Has received a config
  {$EXTERNALSYM DN_NOT_FIRST_TIME}
  DN_HARDWARE_ENUM   = $00000080; // Enum generates hardware ID
  {$EXTERNALSYM DN_HARDWARE_ENUM}
  DN_LIAR            = $00000100; // Lied about can reconfig once
  {$EXTERNALSYM DN_LIAR}
  DN_HAS_MARK        = $00000200; // Not CM_Create_DevInst lately
  {$EXTERNALSYM DN_HAS_MARK}
  DN_HAS_PROBLEM     = $00000400; // Need device installer
  {$EXTERNALSYM DN_HAS_PROBLEM}
  DN_FILTERED        = $00000800; // Is filtered
  {$EXTERNALSYM DN_FILTERED}
  DN_MOVED           = $00001000; // Has been moved
  {$EXTERNALSYM DN_MOVED}
  DN_DISABLEABLE     = $00002000; // Can be rebalanced
  {$EXTERNALSYM DN_DISABLEABLE}
  DN_REMOVABLE       = $00004000; // Can be removed
  {$EXTERNALSYM DN_REMOVABLE}
  DN_PRIVATE_PROBLEM = $00008000; // Has a private problem
  {$EXTERNALSYM DN_PRIVATE_PROBLEM}
  DN_MF_PARENT       = $00010000; // Multi function parent
  {$EXTERNALSYM DN_MF_PARENT}
  DN_MF_CHILD        = $00020000; // Multi function child
  {$EXTERNALSYM DN_MF_CHILD}
  DN_WILL_BE_REMOVED = $00040000; // DevInst is being removed
  {$EXTERNALSYM DN_WILL_BE_REMOVED}

  //
  // Windows 4 OPK2 Flags
  //
  DN_NOT_FIRST_TIMEE  = $00080000;  // S: Has received a config enumerate
  {$EXTERNALSYM DN_NOT_FIRST_TIMEE}
  DN_STOP_FREE_RES    = $00100000;  // S: When child is stopped, free resources
  {$EXTERNALSYM DN_STOP_FREE_RES}
  DN_REBAL_CANDIDATE  = $00200000;  // S: Don't skip during rebalance
  {$EXTERNALSYM DN_REBAL_CANDIDATE}
  DN_BAD_PARTIAL      = $00400000;  // S: This devnode's log_confs do not have same resources
  {$EXTERNALSYM DN_BAD_PARTIAL}
  DN_NT_ENUMERATOR    = $00800000;  // S: This devnode's is an NT enumerator
  {$EXTERNALSYM DN_NT_ENUMERATOR}
  DN_NT_DRIVER        = $01000000;  // S: This devnode's is an NT driver
  {$EXTERNALSYM DN_NT_DRIVER}
  //
  // Windows 4.1 Flags
  //
  DN_NEEDS_LOCKING    = $02000000;  // S: Devnode need lock resume processing
  {$EXTERNALSYM DN_NEEDS_LOCKING}
  DN_ARM_WAKEUP       = $04000000;  // S: Devnode can be the wakeup device
  {$EXTERNALSYM DN_ARM_WAKEUP}
  DN_APM_ENUMERATOR   = $08000000;  // S: APM aware enumerator
  {$EXTERNALSYM DN_APM_ENUMERATOR}
  DN_APM_DRIVER       = $10000000;  // S: APM aware driver
  {$EXTERNALSYM DN_APM_DRIVER}
  DN_SILENT_INSTALL   = $20000000;  // S: Silent install
  {$EXTERNALSYM DN_SILENT_INSTALL}
  DN_NO_SHOW_IN_DM    = $40000000;  // S: No show in device manager
  {$EXTERNALSYM DN_NO_SHOW_IN_DM}
  DN_BOOT_LOG_PROB    = $80000000;  // S: Had a problem during preassignment of boot log conf
  {$EXTERNALSYM DN_BOOT_LOG_PROB}

  //
  // Windows NT Flags
  //
  // These are overloaded on top of unused Win 9X flags
  //
  //DN_LIAR             = $00000100;           // Lied about can reconfig once
  DN_NEED_RESTART       = DN_LIAR;             // System needs to be restarted for this Devnode to work properly
  {$EXTERNALSYM DN_NEED_RESTART}
  //DN_NOT_FIRST_TIME   = $00000040;           // Has Register_Enumerator
  DN_DRIVER_BLOCKED     = DN_NOT_FIRST_TIME;   // One or more drivers are blocked from loading for this Devnode
  {$EXTERNALSYM DN_DRIVER_BLOCKED}
  //DN_MOVED            = $00001000;           // Has been moved
  DN_LEGACY_DRIVER      = DN_MOVED;            // This device is using a legacy driver
  {$EXTERNALSYM DN_LEGACY_DRIVER}

  DN_CHANGEABLE_FLAGS   = DWORD(DN_NOT_FIRST_TIME +
    DN_HARDWARE_ENUM + DN_HAS_MARK + DN_DISABLEABLE +
    DN_REMOVABLE + DN_MF_CHILD + DN_MF_PARENT +
    DN_NOT_FIRST_TIMEE + DN_STOP_FREE_RES + DN_REBAL_CANDIDATE +
    DN_NT_ENUMERATOR + DN_NT_DRIVER + DN_SILENT_INSTALL + DN_NO_SHOW_IN_DM);
  {$EXTERNALSYM DN_CHANGEABLE_FLAGS}

  //
  // Logical configuration Priority values
  //
  // These priority values are used in user-mode calls to CM_Add_Empty_Log_Conf.
  // Drivers may also specify priority values for a given IO_RESOURCE_LIST
  // structure by including a ConfigData member union as the first
  // IO_RESOURCE_DESCRIPTOR in the IO_RESOURCE_LIST. In this case, the descriptor
  // type would be CmResourceTypeConfigData.
  //
  LCPRI_FORCECONFIG     = $00000000; // Coming from a forced config
  {$EXTERNALSYM LCPRI_FORCECONFIG}
  LCPRI_BOOTCONFIG      = $00000001; // Coming from a boot config
  {$EXTERNALSYM LCPRI_BOOTCONFIG}
  LCPRI_DESIRED         = $00002000; // Preferable (better performance)
  {$EXTERNALSYM LCPRI_DESIRED}
  LCPRI_NORMAL          = $00003000; // Workable (acceptable performance)
  {$EXTERNALSYM LCPRI_NORMAL}
  LCPRI_LASTBESTCONFIG  = $00003FFF; // CM only--do not use
  {$EXTERNALSYM LCPRI_LASTBESTCONFIG}
  LCPRI_SUBOPTIMAL      = $00005000; // Not desired, but will work
  {$EXTERNALSYM LCPRI_SUBOPTIMAL}
  LCPRI_LASTSOFTCONFIG  = $00007FFF; // CM only--do not use
  {$EXTERNALSYM LCPRI_LASTSOFTCONFIG}
  LCPRI_RESTART         = $00008000; // Need to restart
  {$EXTERNALSYM LCPRI_RESTART}
  LCPRI_REBOOT          = $00009000; // Need to reboot
  {$EXTERNALSYM LCPRI_REBOOT}
  LCPRI_POWEROFF        = $0000A000; // Need to shutdown/power-off
  {$EXTERNALSYM LCPRI_POWEROFF}
  LCPRI_HARDRECONFIG    = $0000C000; // Need to change a jumper
  {$EXTERNALSYM LCPRI_HARDRECONFIG}
  LCPRI_HARDWIRED       = $0000E000; // Cannot be changed
  {$EXTERNALSYM LCPRI_HARDWIRED}
  LCPRI_IMPOSSIBLE      = $0000F000; // Impossible configuration
  {$EXTERNALSYM LCPRI_IMPOSSIBLE}
  LCPRI_DISABLED        = $0000FFFF; // Disabled configuration
  {$EXTERNALSYM LCPRI_DISABLED}
  MAX_LCPRI             = $0000FFFF; // Maximum known LC Priority
  {$EXTERNALSYM MAX_LCPRI}

{$ENDIF JWA_IMPLEMENTATIONSECTION}



{$IFNDEF JWA_OMIT_SECTIONS}
implementation
//uses ...
{$ENDIF JWA_OMIT_SECTIONS}



{$IFNDEF JWA_INTERFACESECTION}
//your implementation here
{$ENDIF JWA_INTERFACESECTION}



{$IFNDEF JWA_OMIT_SECTIONS}
end.
{$ENDIF JWA_OMIT_SECTIONS}

