/*++

Copyright (c) 2000 Microsoft Corporation

Module Name:

    hwcomp.h

Abstract:

    Module's interface.

Author:

    Ovidiu Temereanca (ovidiut) 04-Jul-2000  Initial implementation

Revision History:

--*/


//
// Interface
//

BOOL
WINAPI
HwdbInitializeA (
    IN      PCSTR TempDir
    );

BOOL
WINAPI
HwdbInitializeW (
    IN      PCWSTR TempDir
    );

VOID
WINAPI
HwdbTerminate (
    VOID
    );

HANDLE
WINAPI
HwdbOpenA (
    IN      PCSTR DatabaseFile
    );

HANDLE
WINAPI
HwdbOpenW (
    IN      PCWSTR DatabaseFile
    );

VOID
WINAPI
HwdbClose (
    IN      HANDLE Hwdb
    );


typedef
BOOL
(*HWDBAPPENDINFSCALLBACKA) (
    IN      PVOID Context,
    IN      PCSTR PnpId,
    IN      PCSTR ActualInfFilename,
    IN      PCSTR SourceDir,
    IN      PCSTR FullInfPath
    );

BOOL
WINAPI
HwdbAppendInfsA (
    IN      HANDLE Hwdb,
    IN      PCSTR SourceDirectory,
    IN      HWDBAPPENDINFSCALLBACKA Callback,       OPTIONAL
    IN      PVOID CallbackContext                   OPTIONAL
    );

typedef
BOOL
(*HWDBAPPENDINFSCALLBACKW) (
    IN      PVOID Context,
    IN      PCWSTR PnpId,
    IN      PCWSTR ActualInfFilename,
    IN      PCWSTR SourceDir,
    IN      PCWSTR FullInfPath
    );

BOOL
WINAPI
HwdbAppendInfsW (
    IN      HANDLE Hwdb,
    IN      PCWSTR SourceDirectory,
    IN      HWDBAPPENDINFSCALLBACKW Callback,       OPTIONAL
    IN      PVOID CallbackContext                   OPTIONAL
    );

BOOL
WINAPI
HwdbAppendDatabase (
    IN      HANDLE HwdbTarget,
    IN      HANDLE HwdbSource
    );

BOOL
WINAPI
HwdbFlushA (
    IN      HANDLE Hwdb,
    IN      PCSTR OutputFile
    );

BOOL
WINAPI
HwdbFlushW (
    IN      HANDLE Hwdb,
    IN      PCWSTR OutputFile
    );

BOOL
WINAPI
HwdbHasDriverA (
    IN      HANDLE Hwdb,
    IN      PCSTR PnpId,
    OUT     PBOOL Unsupported
    );

BOOL
WINAPI
HwdbHasDriverW (
    IN      HANDLE Hwdb,
    IN      PCWSTR PnpId,
    OUT     PBOOL Unsupported
    );

BOOL
WINAPI
HwdbHasAnyDriverA (
    IN      HANDLE Hwdb,
    IN      PCSTR PnpIds,
    OUT     PBOOL Unsupported
    );

BOOL
WINAPI
HwdbHasAnyDriverW (
    IN      HANDLE Hwdb,
    IN      PCWSTR PnpIds,
    OUT     PBOOL Unsupported
    );

typedef
BOOL
(WINAPI* PHWDBINITIALIZEA) (
    IN      PCSTR TempDir
    );

typedef
BOOL
(WINAPI* PHWDBINITIALIZEW) (
    IN      PCWSTR TempDir
    );

typedef
VOID
(WINAPI* PHWDBTERMINATE) (
    VOID
    );

typedef
HANDLE
(WINAPI* PHWDBOPENA) (
    IN      PCSTR DatabaseFile
    );

typedef
HANDLE
(WINAPI* PHWDBOPENW) (
    IN      PCWSTR DatabaseFile
    );

typedef
VOID
(WINAPI* PHWDBCLOSE) (
    IN      HANDLE Hwdb
    );

typedef
BOOL
(WINAPI* PHWDBAPPENDINFSA) (
    IN      HANDLE Hwdb,
    IN      PCSTR SourceDirectory,
    IN      HWDBAPPENDINFSCALLBACKA Callback,       OPTIONAL
    IN      PVOID CallbackContext                   OPTIONAL
    );

typedef
BOOL
(WINAPI* PHWDBAPPENDINFSW) (
    IN      HANDLE Hwdb,
    IN      PCWSTR SourceDirectory,
    IN      HWDBAPPENDINFSCALLBACKW Callback,       OPTIONAL
    IN      PVOID CallbackContext                   OPTIONAL
    );

typedef
BOOL
(WINAPI* PHWDBAPPENDDATABASE) (
    IN      HANDLE HwdbTarget,
    IN      HANDLE HwdbSource
    );

typedef
BOOL
(WINAPI* PHWDBFLUSHA) (
    IN      HANDLE Hwdb,
    IN      PCSTR OutputFile
    );

typedef
BOOL
(WINAPI* PHWDBFLUSHW) (
    IN      HANDLE Hwdb,
    IN      PCWSTR OutputFile
    );

typedef
BOOL
(WINAPI* PHWDBHASDRIVERA) (
    IN      HANDLE Hwdb,
    IN      PCSTR PnpId,
    OUT     PBOOL Unsupported
    );

typedef
BOOL
(WINAPI* PHWDBHASDRIVERW) (
    IN      HANDLE Hwdb,
    IN      PCWSTR PnpId,
    OUT     PBOOL Unsupported
    );


typedef
BOOL
(WINAPI* PHWDBHASANYDRIVERA) (
    IN      HANDLE Hwdb,
    IN      PCSTR PnpId,
    OUT     PBOOL Unsupported
    );

typedef
BOOL
(WINAPI* PHWDBHASANYDRIVERW) (
    IN      HANDLE Hwdb,
    IN      PCWSTR PnpId,
    OUT     PBOOL Unsupported
    );

#if 0

typedef
BOOL
(WINAPI* PHWDBENUM_CALLBACKA) (
    IN      PVOID UserContext,
    IN      PCSTR PnpId,
    IN      PCSTR InfFileName
    );

typedef
BOOL
(WINAPI* PHWDBENUM_CALLBACKW) (
    IN      PVOID UserContext,
    IN      PCWSTR PnpId,
    IN      PCWSTR InfFileName
    );

BOOL
HwdbEnumeratePnpIdA (
    IN      HANDLE Hwdb,
    IN      PHWDBENUM_CALLBACKA EnumCallback,
    IN      PVOID UserContext
    );

BOOL
HwdbEnumeratePnpIdW (
    IN      HANDLE Hwdb,
    IN      PHWDBENUM_CALLBACKW EnumCallback,
    IN      PVOID UserContext
    );

typedef
BOOL
(WINAPI* PHWDBENUMERATEPNPIDA) (
    IN      HANDLE Hwdb,
    IN      PHWDBENUM_CALLBACKA EnumCallback,
    IN      PVOID UserContext
    );

typedef
BOOL
(WINAPI* PHWDBENUMERATEPNPIDW) (
    IN      HANDLE Hwdb,
    IN      PHWDBENUM_CALLBACKW EnumCallback,
    IN      PVOID UserContext
    );

#endif

typedef struct {
    CHAR InfFile[MAX_PATH];
    PCSTR PnpIds;
    PVOID Internal;
} HWDBINF_ENUMA, *PHWDBINF_ENUMA;

typedef struct {
    PCWSTR InfFile;
    PCWSTR PnpIds;
    PVOID Internal;
} HWDBINF_ENUMW, *PHWDBINF_ENUMW;


BOOL
HwdbEnumFirstInfA (
    OUT     PHWDBINF_ENUMA EnumPtr,
    IN      PCSTR DatabaseFile
    );

BOOL
HwdbEnumFirstInfW (
    OUT     PHWDBINF_ENUMW EnumPtr,
    IN      PCWSTR DatabaseFile
    );

BOOL
HwdbEnumNextInfA (
    IN OUT  PHWDBINF_ENUMA EnumPtr
    );

BOOL
HwdbEnumNextInfW (
    IN OUT  PHWDBINF_ENUMW EnumPtr
    );

VOID
HwdbAbortEnumInfA (
    IN OUT  PHWDBINF_ENUMA EnumPtr
    );

VOID
HwdbAbortEnumInfW (
    IN OUT  PHWDBINF_ENUMW EnumPtr
    );

//
// exported function names
//
#define S_HWDBAPI_HWDBINITIALIZE_A      "HwdbInitializeA"
#define S_HWDBAPI_HWDBINITIALIZE_W      "HwdbInitializeW"
#define S_HWDBAPI_HWDBTERMINATE         "HwdbTerminate"
#define S_HWDBAPI_HWDBOPEN_A            "HwdbOpenA"
#define S_HWDBAPI_HWDBOPEN_W            "HwdbOpenW"
#define S_HWDBAPI_HWDBCLOSE             "HwdbClose"
#define S_HWDBAPI_HWDBAPPENDINFS_A      "HwdbAppendInfsA"
#define S_HWDBAPI_HWDBAPPENDINFS_W      "HwdbAppendInfsW"
#define S_HWDBAPI_HWDBAPPENDDATABASE    "HwdbAppendDatabase"
#define S_HWDBAPI_HWDBFLUSH_A           "HwdbFlushA"
#define S_HWDBAPI_HWDBFLUSH_W           "HwdbFlushW"
#define S_HWDBAPI_HWDBHASDRIVER_A       "HwdbHasDriverA"
#define S_HWDBAPI_HWDBHASDRIVER_W       "HwdbHasDriverW"
#define S_HWDBAPI_HWDBHASANYDRIVER_A    "HwdbHasAnyDriverA"
#define S_HWDBAPI_HWDBHASANYDRIVER_W    "HwdbHasAnyDriverW"

typedef struct {
    PHWDBINITIALIZEA HwdbInitialize;
    PHWDBTERMINATE HwdbTerminate;
    PHWDBOPENA HwdbOpen;
    PHWDBCLOSE HwdbClose;
    PHWDBAPPENDINFSA HwdbAppendInfs;
    PHWDBFLUSHA HwdbFlush;
    PHWDBHASDRIVERA HwdbHasDriver;
    PHWDBHASANYDRIVERA HwdbHasAnyDriver;
} HWDB_ENTRY_POINTSA, *PHWDB_ENTRY_POINTSA;

typedef struct {
    PHWDBINITIALIZEW HwdbInitialize;
    PHWDBTERMINATE HwdbTerminate;
    PHWDBOPENW HwdbOpen;
    PHWDBCLOSE HwdbClose;
    PHWDBAPPENDINFSW HwdbAppendInfs;
    PHWDBFLUSHW HwdbFlush;
    PHWDBHASDRIVERW HwdbHasDriver;
    PHWDBHASANYDRIVERW HwdbHasAnyDriver;
} HWDB_ENTRY_POINTSW, *PHWDB_ENTRY_POINTSW;

#ifdef UNICODE

#define S_HWDBAPI_HWDBINITIALIZE        S_HWDBAPI_HWDBINITIALIZE_W
#define PHWDBINITIALIZE                 PHWDBINITIALIZEW
#define S_HWDBAPI_HWDBOPEN              S_HWDBAPI_HWDBOPEN_W
#define PHWDBOPEN                       PHWDBOPENW
#define S_HWDBAPI_HWDBAPPENDINFS        S_HWDBAPI_HWDBAPPENDINFS_W
#define PHWDBAPPENDINFS                 PHWDBAPPENDINFSW
#define S_HWDBAPI_HWDBFLUSH             S_HWDBAPI_HWDBFLUSH_W
#define PHWDBFLUSH                      PHWDBFLUSHW
#define S_HWDBAPI_HWDBHASDRIVER         S_HWDBAPI_HWDBHASDRIVER_W
#define PHWDBHASDRIVER                  PHWDBHASDRIVERW
#define S_HWDBAPI_HWDBHASANYDRIVER      S_HWDBAPI_HWDBHASANYDRIVER_W
#define PHWDBHASANYDRIVER               PHWDBHASANYDRIVERW
#define HWDBINF_ENUM                    HWDBINF_ENUMW
#define PHWDBINF_ENUM                   PHWDBINF_ENUMW
#define HwdbEnumFirstInf                HwdbEnumFirstInfW
#define HwdbEnumNextInf                 HwdbEnumNextInfW
#define HwdbAbortEnumInf                HwdbAbortEnumInfW
#define HWDB_ENTRY_POINTS               HWDB_ENTRY_POINTSW
#define PHWDB_ENTRY_POINTS              PHWDB_ENTRY_POINTSW

#else

#define S_HWDBAPI_HWDBINITIALIZE        S_HWDBAPI_HWDBINITIALIZE_A
#define PHWDBINITIALIZE                 PHWDBINITIALIZEA
#define S_HWDBAPI_HWDBOPEN              S_HWDBAPI_HWDBOPEN_A
#define PHWDBOPEN                       PHWDBOPENA
#define S_HWDBAPI_HWDBAPPENDINFS        S_HWDBAPI_HWDBAPPENDINFS_A
#define PHWDBAPPENDINFS                 PHWDBAPPENDINFSA
#define S_HWDBAPI_HWDBFLUSH             S_HWDBAPI_HWDBFLUSH_A
#define PHWDBFLUSH                      PHWDBFLUSHA
#define S_HWDBAPI_HWDBHASDRIVER         S_HWDBAPI_HWDBHASDRIVER_A
#define PHWDBHASDRIVER                  PHWDBHASDRIVERA
#define S_HWDBAPI_HWDBHASANYDRIVER      S_HWDBAPI_HWDBHASANYDRIVER_A
#define PHWDBHASANYDRIVER               PHWDBHASANYDRIVERA
#define HWDBINF_ENUM                    HWDBINF_ENUMA
#define PHWDBINF_ENUM                   PHWDBINF_ENUMA
#define HwdbEnumFirstInf                HwdbEnumFirstInfA
#define HwdbEnumNextInf                 HwdbEnumNextInfA
#define HwdbAbortEnumInf                HwdbAbortEnumInfA
#define HWDB_ENTRY_POINTS               HWDB_ENTRY_POINTSA
#define PHWDB_ENTRY_POINTS              PHWDB_ENTRY_POINTSA

#endif