/****************************************************************************
 *
 *   registry.h
 *
 *   Copyright (c) 1992-1994 Microsoft Corporation
 *
 *   This file contains public definitions for maintaining registry information
 *   for drivers managing kernel driver registry related data.
 ****************************************************************************/


/****************************************************************************

 Our registry access data

 ****************************************************************************/

 typedef struct {
     SC_HANDLE ServiceManagerHandle;  // Handle to the service controller
     LPTSTR DriverName;               // Name of driver
     TCHAR  TempKeySaveFileName[MAX_PATH];  // Where parameters key is saved
 } REG_ACCESS, *PREG_ACCESS;

/****************************************************************************

 Test if configuration etc can be supported

 ****************************************************************************/

 #define DrvAccess(RegAccess) ((RegAccess)->ServiceManagerHandle != NULL)


/****************************************************************************

 Driver types

 ****************************************************************************/

 typedef enum {
     SoundDriverTypeNormal = 1,
     SoundDriverTypeSynth           /* Go in the synth group */
 } SOUND_KERNEL_MODE_DRIVER_TYPE;

/****************************************************************************

 Function prototypes

 ****************************************************************************/

/*
 *      Create a new key
 */
 HKEY DrvCreateDeviceKey(LPCTSTR DriverName);

/*
 *      Open a subkey under our driver's node
 */
 HKEY DrvOpenRegKey(LPCTSTR DriverName,
                    LPCTSTR Path);
/*
 *      Create a services node for our driver if there isn't one already,
 *      otherwise open the existing one.  Returns ERROR_SUCCESS if OK.
 */
 BOOL
 DrvCreateServicesNode(PTCHAR DriverName,
                       SOUND_KERNEL_MODE_DRIVER_TYPE DriverType,
                       PREG_ACCESS RegAccess,
                       BOOL Create);

/*
 *      Close down our connection to the services manager
 */

 VOID
 DrvCloseServiceManager(
     PREG_ACCESS RegAccess);
/*
 *      Delete the services node for our driver
 */

 BOOL
 DrvDeleteServicesNode(
     PREG_ACCESS RegAccess);

/*
 *  Save the parameters subkey
 */
 BOOL DrvSaveParametersKey(PREG_ACCESS RegAccess);

/*
 *  Restore the parameters subkey
 */
 BOOL DrvRestoreParametersKey(PREG_ACCESS RegAccess);

/*
 *  Create the 'Parameters' subkey
 */
 LONG
 DrvCreateParamsKey(
     PREG_ACCESS RegAccess);

/*
 *  Open the key to a numbered device (starts at 0)
 */
 HKEY DrvOpenDeviceKey(LPCTSTR DriverName, UINT n);

/*
 *      Set a device parameter
 */
 #define DrvSetDeviceParameter(a, b, c) \
     DrvSetDeviceIdParameter(a, 0, b, c)
 LONG
 DrvSetDeviceIdParameter(
     PREG_ACCESS RegAccess,
     UINT   DeviceNumber,
     PTCHAR ValueName,
     DWORD Value);

/*
 *      Read current parameter setting
 */

 #define DrvQueryDeviceParameter(a, b, c) \
           DrvQueryDeviceIdParameter(a, 0, b, c)
 LONG
 DrvQueryDeviceIdParameter(
     PREG_ACCESS RegAccess,
     UINT   DeviceNumber,
     PTCHAR ValueName,
     PDWORD pValue);


/*
 *      Try loading a kernel driver
 */
 BOOL
 DrvLoadKernelDriver(
     PREG_ACCESS RegAccess);
/*
 *      Try unloading a kernel driver
 */

 BOOL
 DrvUnloadKernelDriver(
     PREG_ACCESS RegAccess);

/*
 *      See if driver is loaded
 */

 BOOL
 DrvIsDriverLoaded(
     PREG_ACCESS RegAccess);

/*
 *      Do driver (installation+) configuration
 */

 BOOL DrvConfigureDriver(
          PREG_ACCESS RegAccess,
          LPTSTR      DriverName,
          SOUND_KERNEL_MODE_DRIVER_TYPE
                      DriverType,
          BOOL (*     SetParms    )(PVOID),
          PVOID       Context);


/*
 *      Remove a driver
 */

 LRESULT DrvRemoveDriver(
             PREG_ACCESS RegAccess);

/*
 *      Number of card instances installed for a given driver
 */

 LONG
 DrvNumberOfDevices(
     PREG_ACCESS RegAccess,
     LPDWORD NumberOfDevices);


/*
 *      Set the midi mapper setup to use
 */
 VOID DrvSetMapperName(LPTSTR SetupName);

/*
 *      Find which interrupts and DMA Channels are free
 */

BOOL GetInterruptsAndDMA(
    LPDWORD InterruptsInUse,
    LPDWORD DmaChannelsInUse,
    LPCTSTR IgnoreDriver
);