//
// NConn16.h
//

#ifndef __NCONN16_H__
#define __NCONN16_H__


#ifndef EXTERN_C
#ifdef __cplusplus
#define EXTERN_C extern "C"
#else
#define EXTERN_C
#endif
#endif

typedef DWORD DEVNODE, DEVINST;


#ifndef WIN32
	typedef LONG HRESULT;
	#define S_OK                               ((HRESULT)0x00000000L)
	#define S_FALSE                            ((HRESULT)0x00000001L)
	//#define E_FAIL                             ((HRESULT)0x80004005L)
	//#define E_POINTER                          ((HRESULT)0x80004003L)
	//#define E_INVALIDARG                       ((HRESULT)0x80000003L)
#else
	#define VCP_ERROR                          300
	enum _ERR_VCP
	{
		ERR_VCP_IOFAIL = (VCP_ERROR + 1),       // File I/O failure
		ERR_VCP_STRINGTOOLONG,                  // String length limit exceeded
		ERR_VCP_NOMEM,                          // Insufficient memory to comply
		ERR_VCP_QUEUEFULL,                      // Trying to add a node to a maxed-out queue
		ERR_VCP_NOVHSTR,                        // No string handles available
		ERR_VCP_OVERFLOW,                       // Reference count would overflow
		ERR_VCP_BADARG,                         // Invalid argument to function
		ERR_VCP_UNINIT,                         // String library not initialized
		ERR_VCP_NOTFOUND ,                      // String not found in string table
		ERR_VCP_BUSY,                           // Can't do that now
		ERR_VCP_INTERRUPTED,                    // User interrupted operation
		ERR_VCP_BADDEST,                        // Invalid destination directory
		ERR_VCP_SKIPPED,                        // User skipped operation
		ERR_VCP_IO,                             // Hardware error encountered
		ERR_VCP_LOCKED,                         // List is locked
		ERR_VCP_WRONGDISK,                      // The wrong disk is in the drive
		ERR_VCP_CHANGEMODE,                     //
		ERR_VCP_LDDINVALID,                     // Logical Disk ID Invalid.
		ERR_VCP_LDDFIND,                        // Logical Disk ID not found.
		ERR_VCP_LDDUNINIT,                      // Logical Disk Descriptor Uninitialized.
		ERR_VCP_LDDPATH_INVALID,
		ERR_VCP_NOEXPANSION,                    // Failed to load expansion dll
		ERR_VCP_NOTOPEN,                        // Copy session not open
		ERR_VCP_NO_DIGITAL_SIGNATURE_CATALOG,   // Catalog is not digitally signed
		ERR_VCP_NO_DIGITAL_SIGNATURE_FILE,      // A file is not digitally signed
	};

	// Return error codes for NDI_ messages.
	#define NDI_ERROR           (1200)  
	enum _ERR_NET_DEVICE_INSTALL
	{
		ERR_NDI_ERROR               = NDI_ERROR,  // generic failure
		ERR_NDI_INVALID_HNDI,
		ERR_NDI_INVALID_DEVICE_INFO,
		ERR_NDI_INVALID_DRIVER_PROC,
		ERR_NDI_LOW_MEM,
		ERR_NDI_REG_API,
		ERR_NDI_NOTBOUND,
		ERR_NDI_NO_MATCH,
		ERR_NDI_INVALID_NETCLASS,
		ERR_NDI_INSTANCE_ONCE,
		ERR_NDI_CANCEL,
		ERR_NDI_NO_DEFAULT,
	};
#endif


//
// Exported functions
//

EXTERN_C BOOL WINAPI RestartWindowsQuickly16(VOID);
EXTERN_C DWORD WINAPI CallClassInstaller16(HWND hwndParent, LPCSTR lpszClassName, LPCSTR lpszDeviceID);
EXTERN_C DWORD WINAPI InstallAdapter(HWND hwndParent, LPCSTR lpszClassName, LPCSTR szDeviceID, LPCSTR szDriverPath);
EXTERN_C HRESULT WINAPI FindClassDev16(HWND hwndParent, LPCSTR pszClass, LPCSTR pszDeviceID);
EXTERN_C HRESULT WINAPI LookupDevNode16(HWND hwndParent, LPCSTR pszClass, LPCSTR pszEnumKey, DEVNODE FAR* pDevNode, DWORD FAR* pdwFreePointer);
EXTERN_C HRESULT WINAPI FreeDevNode16(DWORD dwFreePointer);
EXTERN_C HRESULT WINAPI IcsUninstall16(void);



//
// CallClassInstaller16 (a.k.a. InstallComponent) return codes
//

#define ICERR_ERROR					0x80000000 // High bit indicates error condition
#define ICERR_DI_ERROR				0xC0000000 // These bits are set on DI errors

// Custom status return values (no error)
#define ICERR_OK					0x00000000
#define ICERR_NEED_RESTART			0x00000001
#define ICERR_NEED_REBOOT			0x00000002

// Custom error return values
#define ICERR_INVALID_PARAMETER		0x80000001


#endif // !__NCONN16_H__