#ifndef _DSETUP_H
#define _DSETUP_H

/* DirectXSetup definitions */

#include <windows.h>

#ifdef _WIN32
#define COM_NO_WINDOWS_H
#include <objbase.h>
#endif

#ifdef __cplusplus
extern "C" {
#endif

#define FOURCC_VERS  mmioFOURCC('v','e','r','s')

#define DSETUPERR_SUCCESS_RESTART  1
#define DSETUPERR_SUCCESS  0
#define DSETUPERR_BADWINDOWSVERSION  -1
#define DSETUPERR_SOURCEFILENOTFOUND  -2
#define DSETUPERR_BADSOURCESIZE  -3
#define DSETUPERR_BADSOURCETIME  -4
#define DSETUPERR_NOCOPY  -5
#define DSETUPERR_OUTOFDISKSPACE  -6
#define DSETUPERR_CANTFINDINF  -7
#define DSETUPERR_CANTFINDDIR  -8
#define DSETUPERR_INTERNAL  -9
#define DSETUPERR_NTWITHNO3D  -10
#define DSETUPERR_UNKNOWNOS  -11
#define DSETUPERR_USERHITCANCEL  -12
#define DSETUPERR_NOTPREINSTALLEDONNT  -13
#define DSETUPERR_NEWERVERSION  -14
#define DSETUPERR_NOTADMIN  -15
#define DSETUPERR_UNSUPPORTEDPROCESSOR  -16

#define DSETUP_DDRAWDRV  0x00000008
#define DSETUP_DSOUNDDRV  0x00000010
#define DSETUP_DXCORE  0x00010000
#define DSETUP_DIRECTX  (DSETUP_DXCORE|DSETUP_DDRAWDRV|DSETUP_DSOUNDDRV)
#define DSETUP_TESTINSTALL  0x00020000
#define DSETUP_USEROLDERFLAG  0x02000000

#define DSETUP_CB_MSG_NOMESSAGE  0
#define DSETUP_CB_MSG_CANTINSTALL_UNKNOWNOS  1
#define DSETUP_CB_MSG_CANTINSTALL_NT  2
#define DSETUP_CB_MSG_CANTINSTALL_BETA  3
#define DSETUP_CB_MSG_CANTINSTALL_NOTWIN32  4
#define DSETUP_CB_MSG_CANTINSTALL_WRONGLANGUAGE  5
#define DSETUP_CB_MSG_CANTINSTALL_WRONGPLATFORM  6
#define DSETUP_CB_MSG_PREINSTALL_NT  7
#define DSETUP_CB_MSG_NOTPREINSTALLEDONNT  8
#define DSETUP_CB_MSG_SETUP_INIT_FAILED  9
#define DSETUP_CB_MSG_INTERNAL_ERROR  10
#define DSETUP_CB_MSG_CHECK_DRIVER_UPGRADE  11
#define DSETUP_CB_MSG_OUTOFDISKSPACE  12
#define DSETUP_CB_MSG_BEGIN_INSTALL  13
#define DSETUP_CB_MSG_BEGIN_INSTALL_RUNTIME  14
#define DSETUP_CB_MSG_BEGIN_INSTALL_DRIVERS  15
#define DSETUP_CB_MSG_BEGIN_RESTORE_DRIVERS  16
#define DSETUP_CB_MSG_FILECOPYERROR  17

#define DSETUP_CB_UPGRADE_TYPE_MASK  0x000F
#define DSETUP_CB_UPGRADE_KEEP  0x0001
#define DSETUP_CB_UPGRADE_SAFE  0x0002
#define DSETUP_CB_UPGRADE_FORCE  0x0004
#define DSETUP_CB_UPGRADE_UNKNOWN  0x0008

#define DSETUP_CB_UPGRADE_HASWARNINGS  0x0100
#define DSETUP_CB_UPGRADE_CANTBACKUP  0x0200

#define DSETUP_CB_UPGRADE_DEVICE_ACTIVE  0x0800

#define DSETUP_CB_UPGRADE_DEVICE_DISPLAY  0x1000
#define DSETUP_CB_UPGRADE_DEVICE_MEDIA  0x2000

typedef struct _DSETUP_CB_UPGRADEINFO {
    DWORD UpgradeFlags;
} DSETUP_CB_UPGRADEINFO;

typedef struct _DSETUP_CB_FILECOPYERROR {
    DWORD dwError;
} DSETUP_CB_FILECOPYERROR;

#ifdef _WIN32
#ifndef UNICODE_ONLY
typedef struct _DIRECTXREGISTERAPPA {
    DWORD dwSize;
    DWORD dwFlags;
    LPSTR lpszApplicationName;
    LPGUID lpGUID;
    LPSTR lpszFilename;
    LPSTR lpszCommandLine;
    LPSTR lpszPath;
    LPSTR lpszCurrentDirectory;
} DIRECTXREGISTERAPPA, *PDIRECTXREGISTERAPPA, *LPDIRECTXREGISTERAPPA;

typedef struct _DIRECTXREGISTERAPP2A {
    DWORD dwSize;
    DWORD dwFlags;
    LPSTR lpszApplicationName;
    LPGUID lpGUID;
    LPSTR lpszFilename;
    LPSTR lpszCommandLine;
    LPSTR lpszPath;
    LPSTR lpszCurrentDirectory;
    LPSTR lpszLauncherName;
} DIRECTXREGISTERAPP2A, *PDIRECTXREGISTERAPP2A, *LPDIRECTXREGISTERAPP2A;

#endif /* UNICODE_ONLY */

#ifndef ANSI_ONLY
typedef struct _DIRECTXREGISTERAPPW {
    DWORD dwSize;
    DWORD dwFlags;
    LPWSTR lpszApplicationName;
    LPGUID lpGUID;
    LPWSTR lpszFilename;
    LPWSTR lpszCommandLine;
    LPWSTR lpszPath;
    LPWSTR lpszCurrentDirectory;
} DIRECTXREGISTERAPPW, *PDIRECTXREGISTERAPPW, *LPDIRECTXREGISTERAPPW;

typedef struct _DIRECTXREGISTERAPP2W {
    DWORD dwSize;
    DWORD dwFlags;
    LPWSTR lpszApplicationName;
    LPGUID lpGUID;
    LPWSTR lpszFilename;
    LPWSTR lpszCommandLine;
    LPWSTR lpszPath;
    LPWSTR lpszCurrentDirectory;
    LPWSTR lpszLauncherName;
} DIRECTXREGISTERAPP2W, *PDIRECTXREGISTERAPP2W, *LPDIRECTXREGISTERAPP2W;
#endif /* ANSI_ONLY */

#ifndef UNICODE_ONLY
INT WINAPI DirectXSetupA(HWND,LPSTR,DWORD);
INT WINAPI DirectXDeviceDriverSetupA(HWND,LPSTR,LPSTR,DWORD);
INT WINAPI DirectXRegisterApplicationA(HWND,LPVOID);
#endif
#ifndef ANSI_ONLY
INT WINAPI DirectXSetupW(HWND,LPWSTR,DWORD);
INT WINAPI DirectXDeviceDriverSetupW(HWND,LPWSTR,LPWSTR,DWORD);
INT WINAPI DirectXRegisterApplicationW(HWND,LPVOID);
#endif

#ifdef UNICODE
typedef DIRECTXREGISTERAPPW DIRECTXREGISTERAPP;
typedef PDIRECTXREGISTERAPPW PDIRECTXREGISTERAPP;
typedef LPDIRECTXREGISTERAPPW LPDIRECTXREGISTERAPP;
typedef DIRECTXREGISTERAPP2W DIRECTXREGISTERAPP2;
typedef PDIRECTXREGISTERAPP2W PDIRECTXREGISTERAPP2;
typedef LPDIRECTXREGISTERAPP2W LPDIRECTXREGISTERAPP2;
typedef INT (WINAPI *LPDIRECTXSETUP)(HWND,LPWSTR,DWORD);
typedef INT (WINAPI *LPDIRECTXDEVICEDRIVERSETUP)(HWND,LPWSTR,LPSTR,DWORD);
typedef INT (WINAPI *LPDIRECTXREGISTERAPPLICATION)(HWND,LPVOID);
#define DirectXSetup  DirectXSetupW
#define DirectXDeviceDriverSetup  DirectXDeviceDriverSetupW
#define DirectXRegisterApplication  DirectXRegisterApplicationW
#else
typedef DIRECTXREGISTERAPPA DIRECTXREGISTERAPP;
typedef PDIRECTXREGISTERAPPA PDIRECTXREGISTERAPP;
typedef LPDIRECTXREGISTERAPPA LPDIRECTXREGISTERAPP;
typedef DIRECTXREGISTERAPP2A DIRECTXREGISTERAPP2;
typedef PDIRECTXREGISTERAPP2A PDIRECTXREGISTERAPP2;
typedef LPDIRECTXREGISTERAPP2A LPDIRECTXREGISTERAPP2;
typedef INT (WINAPI *LPDIRECTXSETUP)(HWND,LPSTR,DWORD);
typedef INT (WINAPI *LPDIRECTXDEVICEDRIVERSETUP)(HWND,LPSTR,LPSTR,DWORD);
typedef INT (WINAPI *LPDIRECTXREGISTERAPPLICATION)(HWND,LPVOID);
#define DirectXSetup  DirectXSetupA
#define DirectXDeviceDriverSetup  DirectXDeviceDriverSetupA
#define DirectXRegisterApplication  DirectXRegisterApplicationA
#endif /* UNICODE */

INT WINAPI DirectXUnRegisterApplication(HWND,LPGUID);

typedef DWORD (PASCAL *DSETUP_CALLBACK)(DWORD,DWORD,LPSTR,LPSTR,void*);

INT WINAPI DirectXSetupSetCallback(DSETUP_CALLBACK);
INT WINAPI DirectXSetupGetVersion(DWORD*,DWORD*);

#endif /* WIN32 */

#ifdef __cplusplus
};
#endif

#endif /* _DSETUP_H */
