1022 lines
35 KiB
C
1022 lines
35 KiB
C
|
/*++
|
||
|
|
||
|
Copyright (c) 1996-1999 Microsoft Corporation.
|
||
|
|
||
|
|
||
|
Component
|
||
|
|
||
|
Unimodem TSP Public Header
|
||
|
|
||
|
File
|
||
|
|
||
|
UNIMODEM.H
|
||
|
|
||
|
History
|
||
|
|
||
|
10/25/1997 JosephJ Created, taking stuff from nt50\tsp\public.h
|
||
|
01/29/1998 JosephJ Revised, allowing multiple diagnostics objects,
|
||
|
as well as expanding the LINEDIAGNOSTICS_PARSEREC
|
||
|
structure from 2 to 4 fields.
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#ifndef _UNIMODEM_H_
|
||
|
#define _UNIMODEM_H_
|
||
|
|
||
|
#if _MSC_VER > 1000
|
||
|
#pragma once
|
||
|
#endif
|
||
|
|
||
|
#include <setupapi.h>
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
extern "C" {
|
||
|
#endif
|
||
|
|
||
|
|
||
|
//====================================================================
|
||
|
// Supported TAPI Device Classes
|
||
|
//
|
||
|
//====================================================================
|
||
|
#define szUMDEVCLASS_COMM TEXT("comm")
|
||
|
#define szUMDEVCLASS_COMM_DATAMODEM TEXT("comm/datamodem")
|
||
|
#define szUMDEVCLASS_COMM_DATAMODEM_PORTNAME TEXT("comm/datamodem/portname")
|
||
|
#define szUMDEVCLASS_TAPI_LINE_DIAGNOSTICS TEXT("tapi/line/diagnostics")
|
||
|
|
||
|
//=========================================================================
|
||
|
//
|
||
|
// "comm"
|
||
|
//
|
||
|
//
|
||
|
// Supported APIS:
|
||
|
// lineGet/SetDevConfig
|
||
|
// lineConfigDialog
|
||
|
// lineConfigDialogEdit
|
||
|
//
|
||
|
// The associated configuration object is UMDEVCFG defined below...
|
||
|
//
|
||
|
//=========================================================================
|
||
|
|
||
|
// Device Setting Information
|
||
|
//
|
||
|
typedef struct // UMDEVCFGHDR
|
||
|
{
|
||
|
DWORD dwSize;
|
||
|
DWORD dwVersion; // Set to MDMCFG_VERSION
|
||
|
WORD fwOptions; // One or more of the flags below...
|
||
|
|
||
|
#define UMTERMINAL_NONE 0x00000000
|
||
|
#define UMTERMINAL_PRE 0x00000001
|
||
|
#define UMTERMINAL_POST 0x00000002
|
||
|
#define UMMANUAL_DIAL 0x00000004
|
||
|
#define UMLAUNCH_LIGHTS 0x00000008 // Not supported on NT5.
|
||
|
|
||
|
WORD wWaitBong; // seconds to wait for the BONG character
|
||
|
// for modems that do not support detection
|
||
|
// of the BONG tone.
|
||
|
|
||
|
} UMDEVCFGHDR, *PUMDEVCFGHDR;
|
||
|
|
||
|
|
||
|
typedef struct // UMDEVCFG
|
||
|
{
|
||
|
UMDEVCFGHDR dfgHdr;
|
||
|
COMMCONFIG commconfig;
|
||
|
} UMDEVCFG, *PUMDEVCFG;
|
||
|
|
||
|
#define UMDEVCFG_VERSION 0x00010003 // Version number of structure
|
||
|
|
||
|
|
||
|
|
||
|
// How much to wait for a credit-card-bong if modem doesn't support it.
|
||
|
// (TODO: move this somewhere else!)
|
||
|
//
|
||
|
#define UMMIN_WAIT_BONG 0
|
||
|
#define UMMAX_WAIT_BONG 60
|
||
|
#define UMDEF_WAIT_BONG 8
|
||
|
#define UMINC_WAIT_BONG 2
|
||
|
|
||
|
//=========================================================================
|
||
|
//
|
||
|
// "comm/datamodem"
|
||
|
//
|
||
|
// Supported APIS:
|
||
|
// lineGetID Returns the structure below.
|
||
|
//
|
||
|
//=========================================================================
|
||
|
|
||
|
//=========================================================================
|
||
|
//
|
||
|
// "comm/datamodem/portname"
|
||
|
//
|
||
|
// Supported APIS:
|
||
|
// lineGetID The Varstring is of type ASCII string and
|
||
|
// contains the null-terminated name of the COMM port
|
||
|
// attached to the device, if there is one.
|
||
|
//
|
||
|
//=========================================================================
|
||
|
|
||
|
|
||
|
//=========================================================================
|
||
|
//
|
||
|
// "tapi/line/diagnostics"
|
||
|
//
|
||
|
// Supported APIS:
|
||
|
// lineGet/SetDevConfig: LINEDIAGNOSTICSCONFIG is the associated
|
||
|
// configuration object...
|
||
|
// lineGetID: LINEDIAGNOSTICS is the returned object.
|
||
|
//
|
||
|
//
|
||
|
//=========================================================================
|
||
|
|
||
|
//
|
||
|
// Many of the diagnostics-related structures and sub-structures defined
|
||
|
// below have a 4-DWORD header defined below:
|
||
|
//
|
||
|
//
|
||
|
typedef struct // LINEDIAGNOSTICSOBJECTHEADER
|
||
|
{
|
||
|
DWORD dwSig; // object-specific signature. All
|
||
|
// signatures defined here have
|
||
|
// prefix "LDSIG_", and are defined below:
|
||
|
|
||
|
#define LDSIG_LINEDIAGNOSTICSCONFIG 0xb2f78d82 // LINEDIAGNOSTICSCONFIG sig
|
||
|
#define LDSIG_LINEDIAGNOSTICS 0xf0c4d4e0 // LINEDIAGNOSTICS sig
|
||
|
#define LDSIG_RAWDIAGNOSTICS 0xf78b949b // see LINEDIAGNOSTICS defn.
|
||
|
#define LDSIG_PARSEDDIAGNOSTICS 0x16cf3208 // see LINEDIAGNOSTICS defn.
|
||
|
|
||
|
|
||
|
DWORD dwNextObjectOffset; // Offset from the start of this header to
|
||
|
// the next object if any (0 if none following).
|
||
|
// Depending on the type of object, this
|
||
|
// field may or may not be used.
|
||
|
DWORD dwTotalSize; // Total size of this object
|
||
|
DWORD dwFlags; // object-specific flags
|
||
|
DWORD dwParam; // object-specific data
|
||
|
|
||
|
} LINEDIAGNOSTICSOBJECTHEADER, *PLINEDIAGNOSTICSOBJECTHEADER;
|
||
|
|
||
|
//
|
||
|
// The following structure defines the diagnostics capabilities and
|
||
|
// curent settings of the device. It is accessed via
|
||
|
// lineGet/SetDevConfig("tapi/line/diagnostics");
|
||
|
//
|
||
|
|
||
|
typedef struct // LINEDIAGNOSTICSCONFIG
|
||
|
{
|
||
|
LINEDIAGNOSTICSOBJECTHEADER hdr;
|
||
|
//
|
||
|
// hdr.dwSig must be set to LDSIG_LINEDIAGNOSTICSCONFIG
|
||
|
// hdr.dwNextObjectOffset will point to the next configuration object,
|
||
|
// if any.
|
||
|
// hdr.dwTotalSize must be set to the current size of this
|
||
|
// structure.
|
||
|
// hdr.dwFlags contains read only diagnostics capabilities --- one
|
||
|
// of the constants defined below ...
|
||
|
// This field is ignored when the structure is passed
|
||
|
// in a call to lineSetDevConfig
|
||
|
//
|
||
|
#define fSTANDARD_CALL_DIAGNOSTICS 0x1
|
||
|
|
||
|
// hdr.dwParam contains current diagnostics settings. One or more
|
||
|
// constants defined above -- indicate that the
|
||
|
// corresponding capability is enabled for
|
||
|
// the device.
|
||
|
|
||
|
} LINEDIAGNOSTICSCONFIG, *PLINEDIAGNOSTICSCONFIG;
|
||
|
|
||
|
|
||
|
//
|
||
|
// Diagnostic information is accessed by lineGetID("tapi/line/diagnostics"),
|
||
|
// with CALLSELECT_CALL. On return, the supplied VARSTRING will be filled
|
||
|
// in with one or more LINEDIAGNOSTICS structures defined below, and.
|
||
|
// potentially other kinds of structures (all with header
|
||
|
// LINEDIAGNOSTICSOBJECTHEADER).
|
||
|
//
|
||
|
// Note that this information can only be obtained if (a) diagnostics
|
||
|
// have been enabled by a previous call to
|
||
|
// lineSetDevConfig("tapi/line/diagnostics) and (b) a valid call handle
|
||
|
// exists. Typically this information is obtained just before
|
||
|
// deallocating the call.
|
||
|
//
|
||
|
// The LINEDIAGNOSTICS structure includes the raw
|
||
|
// diagnostics information returned by the device as well as summary
|
||
|
// information and variable-length arrays containing parsed information.
|
||
|
//
|
||
|
// All the diagnostic information in a particular LINEDIAGNOSTICS object
|
||
|
// is "domain ID" specific. The dwDomainID field of the structure defines the
|
||
|
// domain, or name space, from which any constants are taken. The
|
||
|
// currently Domain IDs are defined below, and have prefix "DOMAINID":
|
||
|
//
|
||
|
|
||
|
#define DOMAINID_MODEM 0x522aa7e1
|
||
|
#define DOMAINID_NULL 0x0
|
||
|
|
||
|
|
||
|
typedef struct // LINEDIAGNOSTICS
|
||
|
{
|
||
|
//
|
||
|
// The following 2 fields provide version and size informatio about
|
||
|
// this structure, as well as identify the domain (name space) of the
|
||
|
// diagnostics information applies to. All subsequent fields in the
|
||
|
// structure are domainID-specific.
|
||
|
//
|
||
|
|
||
|
LINEDIAGNOSTICSOBJECTHEADER hdr;
|
||
|
//
|
||
|
// hdr.dwSig must be set to constant LDSIG_LINEDIAGNOSTICS
|
||
|
// hdr.dwNextObjectOffset will point to the next diagnostic object,
|
||
|
// if any.
|
||
|
// hdr.dwTotalSize contains the total size of this structure,
|
||
|
// including variable portion
|
||
|
// hdr.dwFlags is reserved and must be ignored.
|
||
|
// hdr.dwParam is set to the current sizeof(LINEDIAGNOSTICS) --
|
||
|
// used for versioning of the LINEDIAGNOSICS structure.
|
||
|
// Note that this does NOT include the size of the
|
||
|
// variable length portion.
|
||
|
|
||
|
DWORD dwDomainID; // Identifies the name space from which the
|
||
|
// interpretation of any constants are taken.
|
||
|
|
||
|
|
||
|
//
|
||
|
// The following 5 DWORD fields provide summary diagnostic information,
|
||
|
// obtained by analyzing all the diagnostic information.
|
||
|
//
|
||
|
|
||
|
DWORD dwResultCode; // dDomainID-specific LDRC_ constants defined below
|
||
|
DWORD dwParam1; // Params1-4 are dwResultCode-specific data items.
|
||
|
DWORD dwParam2;
|
||
|
DWORD dwParam3;
|
||
|
DWORD dwParam4;
|
||
|
|
||
|
|
||
|
//
|
||
|
// The remaining fields point to variable length objects containing
|
||
|
// parsed and unparsed (raw) diagnostics information.
|
||
|
//
|
||
|
// Each variable length object starts with a
|
||
|
// LINEDIAGNOSTICSOBJECTHEADER structure, referred to as "ohdr" in
|
||
|
// the documentation below.
|
||
|
//
|
||
|
|
||
|
DWORD dwRawDiagnosticsOffset;
|
||
|
//
|
||
|
// Offset from the start of this structure
|
||
|
// to the start of an object containing
|
||
|
// the raw diagnostics output.
|
||
|
//
|
||
|
// ohdr.dwSig will be set to LDSIG_RAWDIAGNOSTICS
|
||
|
// ohdr.dwNextObjectOffset UNUSED and will be set to 0.
|
||
|
// ohdr.dwTotalSize is set to the total size of the
|
||
|
// raw-diagnostics object.
|
||
|
// ohdr.dwFlags is undefined and should be ignored.
|
||
|
// ohdr.dwParam is set to the size, in bytes of raw
|
||
|
// diagnostics data following ohdr.
|
||
|
//
|
||
|
// Note that ohdr.dwTotalSize will be equal to
|
||
|
// ( sizeof(LINEDIAGNOSTICSOBJECTHEADER)
|
||
|
// + ohdr.dwParam)
|
||
|
//
|
||
|
// The raw diagnostics bytes will be null terminated and
|
||
|
// the ohdr.dwParam includes the size of the terminating null.
|
||
|
// HOWEVER, the raw diagnostics may contain embedded nulls.
|
||
|
// For DEVCLASSID_MODEM, the bytestring will contain
|
||
|
// no embedded nulls and has the HTML-like tagged format
|
||
|
// defined in the AT#UD diagnostics specification.
|
||
|
//
|
||
|
// The following macros help extract and validate raw diagnostics
|
||
|
// information...
|
||
|
//
|
||
|
#define RAWDIAGNOSTICS_HDR(_plinediagnostics) \
|
||
|
((LINEDIAGNOSTICSOBJECTHEADER*) \
|
||
|
( (BYTE*)(_plinediagnostics) \
|
||
|
+ ((_plinediagnostics)->dwRawDiagnosticsOffset)))
|
||
|
|
||
|
#define IS_VALID_RAWDIAGNOSTICS_HDR(_praw_diagnostics_hdr) \
|
||
|
((_praw_diagnostics_hdr)->dwSig==LDSIG_RAWDIAGNOSTICS)
|
||
|
|
||
|
#define RAWDIAGNOSTICS_DATA(_plinediagnostics) \
|
||
|
( (BYTE*)(_plinediagnostics) \
|
||
|
+ ((_plinediagnostics)->dwRawDiagnosticsOffset) \
|
||
|
+ sizeof(LINEDIAGNOSTICSOBJECTHEADER))
|
||
|
|
||
|
#define RAWDIAGNOSTICS_DATA_SIZE(_praw_diagnostics_hdr) \
|
||
|
((_praw_diagnostics_hdr)->dwParam)
|
||
|
|
||
|
DWORD dwParsedDiagnosticsOffset;
|
||
|
//
|
||
|
// Offset from the start of this structure
|
||
|
// to the start of an object containing
|
||
|
// parsed diagnostics output.
|
||
|
//
|
||
|
// ohdr.dwSig will be set to LDSIG_PARSEDDIAGNOSTICS
|
||
|
// ohdr.dwNextObjectOffset UNUSED and will be set to 0.
|
||
|
// ohdr.dwTotalSize is set to the total size of the
|
||
|
// parsed-diagnostics object.
|
||
|
// ohdr.dwFlags is undefined and should be ignored.
|
||
|
// ohdr.dwParam is set to the number of contiguous
|
||
|
// LINEDIAGNOSTICS_PARSEREC structures (defined below)
|
||
|
// following ohdr.
|
||
|
// Note that ohdr.dwTotalSize will be equal to
|
||
|
// ( sizeof(LINEDIAGNOSTICSOBJECTHEADER)
|
||
|
// + ohdr.dwParam*sizeof(LINEDIAGNOSTICS_PARSEREC))
|
||
|
//
|
||
|
// The following macros help extract and validate parsed diagnostics
|
||
|
// information...
|
||
|
//
|
||
|
#define PARSEDDIAGNOSTICS_HDR(_plinediagnostics) \
|
||
|
((LINEDIAGNOSTICSOBJECTHEADER*) \
|
||
|
( (BYTE*)(_plinediagnostics) \
|
||
|
+ ((_plinediagnostics)->dwParsedDiagnosticsOffset)))
|
||
|
|
||
|
#define PARSEDDIAGNOSTICS_DATA(_plinediagnostics) \
|
||
|
((LINEDIAGNOSTICS_PARSEREC*) \
|
||
|
( (BYTE*)(_plinediagnostics) \
|
||
|
+ ((_plinediagnostics)->dwParsedDiagnosticsOffset)\
|
||
|
+ sizeof(LINEDIAGNOSTICSOBJECTHEADER)))
|
||
|
|
||
|
#define PARSEDDIAGNOSTICS_NUM_ITEMS(_pparsed_diagnostics_hdr) \
|
||
|
((_pparsed_diagnostics_hdr)->dwParam)
|
||
|
|
||
|
#define IS_VALID_PARSEDDIAGNOSTICS_HDR(_pparsed_diagnostics_hdr) \
|
||
|
((_pparsed_diagnostics_hdr)->dwSig==LDSIG_PARSEDDIAGNOSTICS)
|
||
|
|
||
|
|
||
|
} LINEDIAGNOSTICS, *PLINEDIAGNOSTICS;
|
||
|
|
||
|
|
||
|
//
|
||
|
// The following structure defines a keyword-value pair of parsed-diagnostic
|
||
|
// information.
|
||
|
//
|
||
|
typedef struct // LINEDIAGNOSTICS_PARSEREC
|
||
|
{
|
||
|
|
||
|
DWORD dwKeyType;
|
||
|
//
|
||
|
// "Super key" -- identifying the type of key
|
||
|
//
|
||
|
|
||
|
DWORD dwKey;
|
||
|
//
|
||
|
// This is domain-specific and key-type specific. For DEVCLASSID_MODEM,
|
||
|
// This will be one of the MODEMDIAGKEY_* constants
|
||
|
// defined below.
|
||
|
|
||
|
DWORD dwFlags;
|
||
|
//
|
||
|
// Help to identify the meaning of dwValue
|
||
|
// One or more of the following flags:
|
||
|
// (1st 4 are mutually exclusive)
|
||
|
//
|
||
|
#define fPARSEKEYVALUE_INTEGER (0x1<<0)
|
||
|
// value is an integer literal
|
||
|
|
||
|
#define fPARSEKEYVALUE_LINEDIAGNOSTICSOBJECT (0x1<<1)
|
||
|
// value is the offset in bytes to a LINEDIGAGNOSTICS
|
||
|
// object which contains the information associated
|
||
|
// with this entry. The byte offset is from the start
|
||
|
// of the object containing the parsed information,
|
||
|
// not from start of the containing LINEDIAGNOSTICS object.
|
||
|
|
||
|
|
||
|
#define fPARSEKEYVALUE_ASCIIZ_STRING (0x1<<2)
|
||
|
// value is the offset in bytes to an ASCII
|
||
|
// null-terminated string. The byte offset is from the
|
||
|
// start of the object containing the parsed information,
|
||
|
// not from start of the containing LINEDIAGNOSTICS object.
|
||
|
|
||
|
#define fPARSEKEYVALUE_UNICODEZ_STRING (0x1<<3)
|
||
|
// value is the offset in bytes to a UNICODE
|
||
|
// null-terminated string. The byte offset is from the
|
||
|
// start of the object containing the parsed information,
|
||
|
// not from start of the containing LINEDIAGNOSTICS object.
|
||
|
|
||
|
|
||
|
DWORD dwValue;
|
||
|
//
|
||
|
// This is dwKey specific. The documentation
|
||
|
// associated with each MODEMDIAGKEY_* constant definition
|
||
|
// precicely describes the content of its corresponding dwValue.
|
||
|
// See also dwFlags above.
|
||
|
//
|
||
|
|
||
|
} LINEDIAGNOSTICS_PARSEREC, *PLINEDIAGNOSTICS_PARSEREC;
|
||
|
|
||
|
|
||
|
|
||
|
// -----------------------------------------------------------------------------
|
||
|
// ANALOG MODEM SUMMARY DIAGNOSIC INFORMATION
|
||
|
// -----------------------------------------------------------------------------
|
||
|
//
|
||
|
// Diagnostics Result Codes (LDRC_*) for modems
|
||
|
//
|
||
|
#define LDRC_UNKNOWN 0
|
||
|
// The result code is unknown. Raw diagnostics information may be present,
|
||
|
// if so dwRawDiagnosticsOffset and dwRawDiagnosticsSize will be nonzero.
|
||
|
// dwParam1-4: unused and will be set to zero.
|
||
|
|
||
|
// Other codes are TBD.
|
||
|
|
||
|
|
||
|
// -----------------------------------------------------------------------------
|
||
|
// LINEDIAGNOSTICS_PARSEREC KeyType,
|
||
|
// key and value definitions for domainID DOMAINID_MODEM
|
||
|
// -----------------------------------------------------------------------------
|
||
|
|
||
|
//
|
||
|
// KEYTYPE
|
||
|
//
|
||
|
#define MODEM_KEYTYPE_STANDARD_DIAGNOSTICS 0x2a4d3263
|
||
|
|
||
|
// All the modem-domain-id key constants have prefix "MODEMDIAGKEY_". Both
|
||
|
// keys and values are based on the AT#UD diagnostic specification.
|
||
|
//
|
||
|
// Most of the values corresponding to the keys defined below are DWORD-sized
|
||
|
// bitfields or counters. A few of the values are offsets (from the start
|
||
|
// of the LINEDIAGNOSTICS structure) to variable-sized values. The formats
|
||
|
// of all values are documented directly after the corresponding key definition,
|
||
|
// and have prefix "MODEMDIAG_". Where useful, macros are provided which
|
||
|
// extract individual bits or bitfields out of the dwValue field. For example,
|
||
|
// see the macros associated with the MODEMDIAGKEY_V34_INFO key, which contains
|
||
|
// information extracted from the V.34 INFO structure.
|
||
|
|
||
|
|
||
|
#define MODEMDIAGKEY_VERSION 0x0
|
||
|
|
||
|
// Value: DWORD. HiWord represents major version;
|
||
|
// LoWord represents minor version;
|
||
|
// Following Macros may be used to extract the hi- and low- version numbers.
|
||
|
// from the parserec's .dwValue field...
|
||
|
//
|
||
|
#define MODEMDIAG_MAJORVER(_ver) ((HIWORD) (_ver))
|
||
|
#define MODEMDIAG_MINORVER(_ver) ((LOWORD) (_ver))
|
||
|
|
||
|
#define MODEMDIAGKEY_CALL_SETUP_RESULT 0x1
|
||
|
|
||
|
// Value: Call Setup Result codes based on on Table 2 of the
|
||
|
// AT#UD specification....
|
||
|
|
||
|
#define MODEMDIAG_CALLSETUPCODE_NO_PREVIOUS_CALL 0x0
|
||
|
//
|
||
|
// Modem log has be en cleared since any previous calls...
|
||
|
//
|
||
|
|
||
|
#define MODEMDIAG_CALLSETUPCODE_NO_DIAL_TONE 0x1
|
||
|
//
|
||
|
// No dial tone detected.
|
||
|
//
|
||
|
|
||
|
#define MODEMDIAG_CALLSETUPCODE_REORDER_SIGNAL 0x2
|
||
|
//
|
||
|
// Reorder signal detected, network busy.
|
||
|
//
|
||
|
|
||
|
#define MODEMDIAG_CALLSETUPCODE_BUSY_SIGNAL 0x3
|
||
|
//
|
||
|
// Busy signal detected
|
||
|
//
|
||
|
|
||
|
#define MODEMDIAG_CALLSETUPCODE_NO_SIGNAL 0x4
|
||
|
//
|
||
|
// No recognized signal detected.
|
||
|
//
|
||
|
|
||
|
#define MODEMDIAG_CALLSETUPCODE_VOICE 0x5
|
||
|
//
|
||
|
// Analog voice detected
|
||
|
//
|
||
|
|
||
|
#define MODEMDIAG_CALLSETUPCODE_TEXT_TELEPHONE_SIGNAL 0x6
|
||
|
//
|
||
|
// Text telephone signal detected (V.18)
|
||
|
//
|
||
|
|
||
|
#define MODEMDIAG_CALLSETUPCODE_DATA_ANSWERING_SIGNAL 0x7
|
||
|
//
|
||
|
// Data answering signal detected (e.g. V.25 ANS, V.8 ANSam)
|
||
|
//
|
||
|
|
||
|
#define MODEMDIAG_CALLSETUPCODE_DATA_CALLING_SIGNAL 0x8
|
||
|
//
|
||
|
// Data calling signal detected (e.g. V.25 CT, V.8 CI).
|
||
|
//
|
||
|
|
||
|
#define MODEMDIAG_CALLSETUPCODE_FAX_ANSWERING_SIGNAL 0x9
|
||
|
//
|
||
|
// Fax answering signal detected (e.g. T.30 CED, DIS).
|
||
|
//
|
||
|
|
||
|
#define MODEMDIAG_CALLSETUPCODE_FAX_CALLING_SIGNAL 0xa
|
||
|
//
|
||
|
// Fax calling signal detected (e.g. T.30 CNG)
|
||
|
//
|
||
|
|
||
|
#define MODEMDIAG_CALLSETUPCODE_V8BIS_SIGNAL 0xb
|
||
|
//
|
||
|
// V.8bis signal detected.
|
||
|
//
|
||
|
|
||
|
|
||
|
#define MODEMDIAGKEY_MULTIMEDIA_MODE 0x2
|
||
|
|
||
|
// Value: Multimedia mode, based on Table 3 of the AT#UD specification...
|
||
|
|
||
|
#define MODEMDIAG_MMMODE_DATA_ONLY 0x0
|
||
|
#define MODEMDIAG_MMMODE_FAX_ONLY 0x1
|
||
|
#define MODEMDIAG_MMMODE_VOICE_ONLY 0x2
|
||
|
#define MODEMDIAG_MMMODE_VOICEVIEW 0x3
|
||
|
#define MODEMDIAG_MMMODE_ASVD_V61 0x4
|
||
|
#define MODEMDIAG_MMMODE_ASVD_V34Q 0x5
|
||
|
#define MODEMDIAG_MMMODE_DSVD_MT 0x6
|
||
|
#define MODEMDIAG_MMMODE_DSVD_1_2 0x7
|
||
|
#define MODEMDIAG_MMMODE_DSVD_70 0x8
|
||
|
#define MODEMDIAG_MMMODE_H324 0x9
|
||
|
#define MODEMDIAG_MMMODE_OTHER_V80 0xa
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
#define MODEMDIAGKEY_DTE_DCE_INTERFACE_MODE 0x3
|
||
|
|
||
|
// Value: DTE-DCE interface mode, based on Table 4 of the AT#UD specication
|
||
|
// ...
|
||
|
#define MODEMDIAG_DCEDTEMODE_ASYNC_DATA 0x0
|
||
|
#define MODEMDIAG_DCEDTEMODE_V80_TRANSPARENT_SYNC 0x1
|
||
|
#define MODEMDIAG_DCEDTEMODE_V80_FRAMED_SYNC 0x2
|
||
|
|
||
|
#define V8_CM_STRING 0x4
|
||
|
// Value: offset from the start of the LINEDIAGNOSTICS structure to
|
||
|
// the V.8 CM octet string, same format as V.25ter Annex A.
|
||
|
// The offset points to a contiguous region of memory who
|
||
|
|
||
|
// TODO: define parsed-versions of V.8 CM and V.8 JM octet strings, not
|
||
|
// covered in the information returned in PARSEREC
|
||
|
|
||
|
#define MODEMDIAGKEY_RECEIVED_SIGNAL_POWER 0x10
|
||
|
// Value: Received signal power level, in -dBm.
|
||
|
|
||
|
#define MODEMDIAGKEY_TRANSMIT_SIGNAL_POWER 0x11
|
||
|
// Value: Transmit signal power level, in -dBm.
|
||
|
|
||
|
#define MODEMDIAGKEY_NOISE_LEVEL 0x12
|
||
|
// Value: Estimated noise level, in -dBM.
|
||
|
|
||
|
#define MODEMDIAGKEY_NORMALIZED_MSE 0x13
|
||
|
// Value: Normalized Mean Squared error. JosephJ: TODO: Of what?
|
||
|
|
||
|
#define MODEMDIAGKEY_NEAR_ECHO_LOSS 0x14
|
||
|
// Value: Near echo loss, in units of dB
|
||
|
|
||
|
#define MODEMDIAGKEY_FAR_ECHO_LOSS 0x15
|
||
|
// Value: Far echo loss, in units of dB
|
||
|
|
||
|
#define MODEMDIAGKEY_FAR_ECHO_DELAY 0x16
|
||
|
// Value: Far echo delay, in units of ms.
|
||
|
|
||
|
#define MODEMDIAGKEY_ROUND_TRIP_DELAY 0x17
|
||
|
// Value: Round trip delay, in units of ms.
|
||
|
|
||
|
#define MODEMDIAGKEY_V34_INFO 0x18
|
||
|
// Value: V.34 INFO bitmap, based on Table 5 of the AT#UD specifiction.
|
||
|
// This DWORD value encodes 32 bits extracted from the V.34 INFO bitmap.
|
||
|
// The following Macros extract specific V.34 INFO bit ranges out of
|
||
|
// the 32-bit value:
|
||
|
//
|
||
|
// 10/30/1997 JosephJ: TODO what exactly are these? Also, what
|
||
|
// does 20;0, 50;0 below mean?
|
||
|
|
||
|
#define MODEMDIAG_V34_INFO0_20_0(_value) (((_value)>>30) & 0x3)
|
||
|
//
|
||
|
// INFO0 bit 20;0
|
||
|
//
|
||
|
|
||
|
#define MODEMDIAG_V34_INFOc_79_88(_value) (((_value)>>20) & 0x3ff)
|
||
|
//
|
||
|
// INFOc bit 79-88
|
||
|
//
|
||
|
|
||
|
#define MODEMDIAG_V34_INFOc_PRE_EMPHASIS(_value) (((_value)>>16) & 0xf)
|
||
|
//
|
||
|
// Pre-emphasis field, selected by the symbol rate chosen.
|
||
|
// INFOc bits 26-29 or 35-38 or 44-47 or 53-56 or 62-65 or 71-74
|
||
|
//
|
||
|
#define MODEMDIAG_V34_INFOa_26_29(_value) (((_value)>>12) & 0xf)
|
||
|
//
|
||
|
// INFOa bits 26-29
|
||
|
//
|
||
|
|
||
|
#define MODEMDIAG_V34_INFO_MP_50_0(_value) (((_value)>>10) & 0x3)
|
||
|
//
|
||
|
// MP bit 50;0
|
||
|
//
|
||
|
|
||
|
#define MODEMDIAG_V34_INFOa_40_49(_value) (((_value)>>0) & 0x3ff)
|
||
|
//
|
||
|
// INFOa bits 40-49
|
||
|
//
|
||
|
|
||
|
#define MODEMDIAGKEY_TRANSMIT_CARRIER_NEGOTIATION_RESULT 0x20
|
||
|
// Value: based on Table 6 of the AT#UD specification
|
||
|
// TODO: fill out...
|
||
|
|
||
|
|
||
|
#define MODEMDIAGKEY_RECEIVE_CARRIER_NEGOTIATION_RESULT 0x21
|
||
|
// Value: based on Table 6 of the AT#UD specification
|
||
|
// TODO: fill out...
|
||
|
|
||
|
#define MODEMDIAGKEY_TRANSMIT_CARRIER_SYMBOL_RATE 0x22
|
||
|
// Value: Transmit carrier symbol rate.
|
||
|
|
||
|
|
||
|
#define MODEMDIAGKEY_RECEIVE_CARRIER_SYMBOL_RATE 0x23
|
||
|
// Value: Receive carrier symbol rate.
|
||
|
|
||
|
#define MODEMDIAGKEY_TRANSMIT_CARRIER_FREQUENCY 0x24
|
||
|
// Value: Transmit carrier frequency TODO: units? Hz?
|
||
|
|
||
|
#define MODEMDIAGKEY_RECEIVE_CARRIER_FREQUENCY 0x25
|
||
|
// Value: Transmit carrier frequency TODO: units? Hz?
|
||
|
|
||
|
#define MODEMDIAGKEY_INITIAL_TRANSMIT_CARRIER_DATA_RATE 0x26
|
||
|
// Value: Initial transmit carrier data rate. TODO: units? /sec?
|
||
|
|
||
|
#define MODEMDIAGKEY_INITIAL_RECEIVE_CARRIER_DATA_RATE 0x27
|
||
|
// Value: Initial receive carrier data rate. TODO: units? /sec?
|
||
|
|
||
|
#define MODEMDIAGKEY_TEMPORARY_CARRIER_LOSS_EVENT_COUNT 0x30
|
||
|
// Value: Temporary carrier loss event count
|
||
|
|
||
|
#define MODEMDIAGKEY_CARRIER_RATE_RENEGOTIATION_COUNT 0x31
|
||
|
// Value: Carrier rate renegotiation event count
|
||
|
|
||
|
#define MODEMDIAGKEY_CARRIER_RETRAINS_REQUESTED 0x32
|
||
|
// Value: Carrier retrains requested
|
||
|
|
||
|
#define MODEMDIAGKEY_CARRIER_RETRAINS_GRANTED 0x33
|
||
|
// Value: Carrier retrains granted.
|
||
|
|
||
|
#define MODEMDIAGKEY_FINAL_TRANSMIT_CARRIER_RATE 0x34
|
||
|
// Value: final carrier transmit rate TODO: units? /sec?
|
||
|
|
||
|
#define MODEMDIAGKEY_FINAL_RECEIVE_CARRIER_RATE 0x35
|
||
|
// Value: final carrier receive rate TODO: units? /sec?
|
||
|
|
||
|
#define MODEMDIAGKEY_PROTOCOL_NEGOTIATION_RESULT 0x40
|
||
|
// Value: Protocol negotiation result code, based on
|
||
|
// Table 7 of the AT#UD diagnostics specification...
|
||
|
|
||
|
#define MODEMDKAGKEY_ERROR_CONTROL_FRAME_SIZE 0x41
|
||
|
// Value: Error control frame size. TODO: units? bytes?
|
||
|
|
||
|
#define MODEMDIAGKEY_ERROR_CONTROL_LINK_TIMEOUTS 0x42
|
||
|
// Value: Error control link timeouts. TODO: time or count?
|
||
|
|
||
|
#define MODMEDIAGKEY_ERROR_CONTROL_NAKs 0x43
|
||
|
// Value: Error control NAKs
|
||
|
|
||
|
#define MODEMDIAGKEY_COMPRESSION_NEGOTIATION_RESULT 0x44
|
||
|
// Value: Compression negotiation result, based on
|
||
|
// Table 8 of the AT#UD spec.
|
||
|
//
|
||
|
// TODO: add specific constant definitions here...
|
||
|
|
||
|
#define MODEMDIAGKEY_COMPRESSION_DICTIONARY_SIZE 0x45
|
||
|
// Value: compression dictionary size. TODO: size? bytes?
|
||
|
|
||
|
|
||
|
#define MODEMDIAGKEY_TRANSMIT_FLOW_CONTROL 0x50
|
||
|
// Value: Transmit flow control, defined by
|
||
|
// one of the following constants:
|
||
|
|
||
|
#define MODEMDIAG_FLOW_CONTROL_OFF 0x0
|
||
|
//
|
||
|
// No flow control
|
||
|
//
|
||
|
|
||
|
#define MODEMDIAG_FLOW_CONTROL_DC1_DC3 0x2
|
||
|
//
|
||
|
// DC1/DC3 (XON/XOFF) flow control
|
||
|
//
|
||
|
|
||
|
#define MODEMDIAG_FLOW_CONTROL_RTS_CTS 0x3
|
||
|
//
|
||
|
// RTS/CTS (V.24 ckt 106/133) flow control: TODO verify that latter
|
||
|
// is the same as RTS/CTS.
|
||
|
//
|
||
|
|
||
|
#define MODEMDIAGKEY_RECEIVE_FLOW_CONTROL 0x51
|
||
|
// Value: Receive flow control, defined by the above
|
||
|
// (MODEMDiG_FLOW_CONTROL_*) constants.
|
||
|
|
||
|
#define MODEMDIAGKEY_DTE_TRANSMIT_CHARACTERS 0x52
|
||
|
// Value: Transmit characters obtained from DTE
|
||
|
|
||
|
#define MODEMDIAGKEY_DTE_RECEIVED_CHARACTERS 0x53
|
||
|
// Value: Received characters sent to DTE
|
||
|
|
||
|
#define MODEMDIAGKEY_DTE_TRANSMIT_CHARACTERS_LOST 0x54
|
||
|
// Value: Transmit characters lost (data overrun errors from DTE)
|
||
|
|
||
|
#define MODEMDIAGKEY_DTE_RECEIVED_CHARACTERS_LOST 0x55
|
||
|
// Value: Transmit characters lost (data overrun errors to DTE)
|
||
|
|
||
|
#define MODEMDIAGKEY_EC_TRANSMIT_FRAME_COUNT 0x56
|
||
|
// Value: Error control protocol transmit frame count
|
||
|
|
||
|
#define MODEMDIAGKEY_EC_RECEIVED_FRAME_COUNT 0x57
|
||
|
// Value: Error control protocol received frame count
|
||
|
|
||
|
#define MODEMDIAGKEY_EC_TRANSMIT_FRAME_ERROR_COUNT 0x58
|
||
|
// Value: Error control protocol transmit frame error count
|
||
|
|
||
|
#define MODEMDIAGKEY_EC_RECEIVED_FRAME_ERROR_COUNT 0x59
|
||
|
// Value: Error control protocol received frame error count
|
||
|
|
||
|
#define MODEMDIAGKEY_TERMINATION_CAUSE 0x60
|
||
|
// Value: Termination cause, based on Table 9-10 of the AT#UD
|
||
|
// specification.
|
||
|
|
||
|
#define MODEMDIAGKEY_CALL_WAINTING_EVENT_COUNT 0x61
|
||
|
// Value: Call wainting event count.
|
||
|
// TODO: Define specific constants.
|
||
|
|
||
|
|
||
|
//
|
||
|
// KEYTYPE
|
||
|
//
|
||
|
#define MODEM_KEYTYPE_AT_COMMAND_RESPONSE 0x5259091c
|
||
|
//
|
||
|
// The values are responses to specific AT commands. This type is relevant
|
||
|
// only to AT ("Hayes(tm) compatible") modems.
|
||
|
// The key (one of the MODEMDIAGKEY_ATRESP_* constants ) identifies the
|
||
|
// command.
|
||
|
//
|
||
|
|
||
|
#define MODEMDIAGKEY_ATRESP_CONNECT 0x1
|
||
|
// Value: Connect response string.
|
||
|
// This will be a null-terminated ascii string.
|
||
|
|
||
|
// ========================================================================
|
||
|
// UNIMODEM DEVICE-SPECIFIC returned for lineGetDevCaps
|
||
|
|
||
|
// The following structure is located at dwDevSpecificOffset into
|
||
|
// the LINEDEVCAPS structure returned by lineGetDevCaps.
|
||
|
//
|
||
|
typedef struct // DEVCAPS_DEVSPECIFIC_UNIMODEM
|
||
|
{
|
||
|
DWORD dwSig;
|
||
|
//
|
||
|
// This will be set to 0x1;
|
||
|
|
||
|
DWORD dwKeyOffset;
|
||
|
//
|
||
|
// This is the offset from the start of THIS structure, to
|
||
|
// a null-terminated ASCI (not UNICODE) string giving
|
||
|
// the device's driver key.
|
||
|
//
|
||
|
// WARNING: this is present for compatibility reasons. Applications
|
||
|
// are STRONGLY discouraged to use this information, because the
|
||
|
// location of the driver key could change on upgrade, so if
|
||
|
// applications save away this key, the application could fail
|
||
|
// on upgrade of the OS.
|
||
|
//
|
||
|
|
||
|
} DEVCAPS_DEVSPECIFIC_UNIMODEM, *PDEVCAPS_DEVSPECIFIC_UNIMODEM;
|
||
|
|
||
|
// ========================================================================
|
||
|
|
||
|
typedef struct // ISDN_STATIC_CONFIG
|
||
|
{
|
||
|
DWORD dwSig;
|
||
|
//
|
||
|
// Must be set to dwSIG_ISDN_STATIC_CONFIGURATION
|
||
|
//
|
||
|
#define dwSIG_ISDN_STATIC_CONFIGURATION 0x877bfc9f
|
||
|
|
||
|
DWORD dwTotalSize;
|
||
|
//
|
||
|
// Total size of this structure, including variable portion, if any.
|
||
|
//
|
||
|
|
||
|
DWORD dwFlags; // reserved
|
||
|
DWORD dwNextHeaderOffset; // reserved
|
||
|
|
||
|
DWORD dwSwitchType;
|
||
|
//
|
||
|
// One of the dwISDN_SWITCH_* values below.
|
||
|
//
|
||
|
#define dwISDN_SWITCH_ATT1 0 // AT&T 5ESS Customm
|
||
|
#define dwISDN_SWITCH_ATT_PTMP 1 // AT&T Point to Multipoint
|
||
|
#define dwISDN_SWITCH_NI1 2 // National ISDN 1
|
||
|
#define dwISDN_SWITCH_DMS100 3 // North3ern Telecom DMS-100 NT1
|
||
|
#define dwISDN_SWITCH_INS64 4 // NTT INS64 - (Japan)
|
||
|
#define dwISDN_SWITCH_DSS1 5 // DSS1 (Euro-ISDN)
|
||
|
#define dwISDN_SWITCH_1TR6 6 // 1TR6 (Germany)
|
||
|
#define dwISDN_SWITCH_VN3 7 // VN3 (France)
|
||
|
#define dwISDN_SWITCH_BELGIUM1 8 // Belgian National
|
||
|
#define dwISDN_SWITCH_AUS1 9 // Australian National TPH 1962
|
||
|
#define dwISDN_SWITCH_UNKNOWN 10 // Unknown
|
||
|
|
||
|
DWORD dwSwitchProperties;
|
||
|
//
|
||
|
// One or more fISDN_SWITCHPROP_* flags below
|
||
|
//
|
||
|
// Note the following three are exclusive, so only one can be
|
||
|
// set at a time:
|
||
|
#define fISDN_SWITCHPROP_US (0x1<<0) // Uses DN/SPID
|
||
|
#define fISDN_SWITCHPROP_MSN (0x1<<1) // Uses MSN
|
||
|
#define fISDN_SWITCHPROP_EAZ (0x1<<2) // Uses EAX
|
||
|
#define fISDN_SWITCHPROP_1CH (0x1<<3) // Only one channel.
|
||
|
|
||
|
DWORD dwNumEntries;
|
||
|
//
|
||
|
// The number of channels OR MSNs.
|
||
|
// The numbers and possibly IDs are specified in the following
|
||
|
// two offsets.
|
||
|
//
|
||
|
|
||
|
DWORD dwNumberListOffset;
|
||
|
//
|
||
|
// Offset in BYTES from the start of this structure to a
|
||
|
// UNICODE multi-sz set of strings representing numbers.
|
||
|
// There will dwNumChannels entries.
|
||
|
//
|
||
|
// The interpretation of these numbers is switch-property-specific,
|
||
|
// and is as follows:
|
||
|
// US: Directory Number.
|
||
|
// MSN: MSN Number
|
||
|
// EAZ: EAZ Number.
|
||
|
|
||
|
DWORD dwIDListOffset;
|
||
|
//
|
||
|
// Offset in BYTES from the start of this structure to a
|
||
|
// UNICODE multi-sz set of strings representing IDs.
|
||
|
// There will dwNumChannels entries.
|
||
|
//
|
||
|
// The interpretation of these IDs is switch-property-specific and
|
||
|
// is as follows:
|
||
|
// US: SPID.
|
||
|
// MSN: Not used and should be set to 0.
|
||
|
// EAZ: EAZ
|
||
|
|
||
|
//
|
||
|
// variable length portion, if any, follows...
|
||
|
//
|
||
|
|
||
|
} ISDN_STATIC_CONFIG;
|
||
|
|
||
|
|
||
|
typedef struct // ISDN_STATIC_CAPS
|
||
|
{
|
||
|
DWORD dwSig;
|
||
|
//
|
||
|
// Must be set to dwSIG_ISDN_STATIC_CAPS
|
||
|
//
|
||
|
#define dwSIG_ISDN_STATIC_CAPS 0xd11c5587
|
||
|
DWORD dwTotalSize;
|
||
|
//
|
||
|
// Total size of this structure, including variable portion, if any.
|
||
|
//
|
||
|
|
||
|
DWORD dwFlags; // reserved
|
||
|
DWORD dwNextHeaderOffset; // reserved
|
||
|
|
||
|
|
||
|
DWORD dwNumSwitchTypes;
|
||
|
DWORD dwSwitchTypeOffset;
|
||
|
//
|
||
|
// Offset to switch types, which is a DWORD array of types.
|
||
|
//
|
||
|
|
||
|
DWORD dwSwitchPropertiesOffset;
|
||
|
//
|
||
|
// Offset to a DWORD array of properties of the corresponding switch.
|
||
|
//
|
||
|
|
||
|
DWORD dwNumChannels;
|
||
|
//
|
||
|
// The number of channels supported.
|
||
|
//
|
||
|
|
||
|
DWORD dwNumMSNs;
|
||
|
//
|
||
|
// The number of MSNs supported.
|
||
|
//
|
||
|
|
||
|
DWORD dwNumEAZ;
|
||
|
//
|
||
|
// The number of EAZs supported.
|
||
|
//
|
||
|
|
||
|
//
|
||
|
// variable length portion, if any, follows...
|
||
|
//
|
||
|
|
||
|
} ISDN_STATIC_CAPS;
|
||
|
|
||
|
typedef struct // MODEM_CONFIG_HEADER
|
||
|
{
|
||
|
DWORD dwSig;
|
||
|
DWORD dwTotalSize;
|
||
|
DWORD dwNextHeaderOffset;
|
||
|
DWORD dwFlags;
|
||
|
|
||
|
} MODEM_CONFIG_HEADER;
|
||
|
|
||
|
typedef struct // MODEM_PROTOCOL_CAPS
|
||
|
{
|
||
|
|
||
|
MODEM_CONFIG_HEADER hdr;
|
||
|
//
|
||
|
// hdr.dwSig must be set to dwSIG_MODEM_PROTOCOL_CAPS
|
||
|
// hdr.dwFlags are reserved and should be ignored by app.
|
||
|
//
|
||
|
#define dwSIG_MODEM_PROTOCOL_CAPS 0x35ccd4b3
|
||
|
|
||
|
DWORD dwNumProtocols;
|
||
|
//
|
||
|
// The number of protocols supported.
|
||
|
//
|
||
|
|
||
|
DWORD dwProtocolListOffset;
|
||
|
//
|
||
|
// Offset to a DWORD array of protocols supported.
|
||
|
//
|
||
|
|
||
|
//
|
||
|
// variable length portion, if any, follows...
|
||
|
//
|
||
|
|
||
|
} MODEM_PROTOCOL_CAPS;
|
||
|
|
||
|
typedef struct _PROTOCOL_ITEM {
|
||
|
DWORD dwProtocol; // Protocol Supported
|
||
|
|
||
|
DWORD dwProtocolNameOffset; // Offset from beggining of MODEM_PROTOCOL_CAPS structure
|
||
|
// to NULL terminated friendly name of the protocol.
|
||
|
} PROTOCOL_ITEM, *PPROTOCOL_ITEM;
|
||
|
|
||
|
|
||
|
|
||
|
//=========================================================================
|
||
|
//
|
||
|
// Modem install wizard structures and flags
|
||
|
//
|
||
|
//=========================================================================
|
||
|
|
||
|
#define UM_MAX_BUF_SHORT 32
|
||
|
#define UM_LINE_LEN 256
|
||
|
|
||
|
#define MIPF_NT4_UNATTEND 0x1
|
||
|
// Take the information about what modem to install
|
||
|
// from the unattended.txt file
|
||
|
#define MIPF_DRIVER_SELECTED 0x2
|
||
|
// The modem driver is selected, just register
|
||
|
// and install it
|
||
|
|
||
|
|
||
|
// Unattended install parameters
|
||
|
typedef struct _tagUMInstallParams
|
||
|
{
|
||
|
DWORD Flags; // Flags that specify the unattended mode
|
||
|
WCHAR szPort[UM_MAX_BUF_SHORT]; // Port on which to install the modem
|
||
|
WCHAR szInfName[MAX_PATH]; // for NT4 method, inf name
|
||
|
WCHAR szSection[UM_LINE_LEN]; // for NT4 method, section name
|
||
|
|
||
|
|
||
|
} UM_INSTALLPARAMS, *PUM_INSTALLPARAMS, *LPUM_INSTALLPARAMS;
|
||
|
|
||
|
|
||
|
// This structure is the private structure that may be
|
||
|
// specified in the SP_INSTALLWIZARD_DATA's PrivateData field.
|
||
|
typedef struct tagUM_INSTALL_WIZARD
|
||
|
{
|
||
|
DWORD cbSize; // set to the size of the structure
|
||
|
DWORD Reserved1; // reserved, must be 0
|
||
|
DWORD Reserved2; // reserved, must be 0
|
||
|
LPARAM Reserved3; // reserved, must be 0
|
||
|
UM_INSTALLPARAMS InstallParams; // parameters for the wizard
|
||
|
|
||
|
} UM_INSTALL_WIZARD, *PUM_INSTALL_WIZARD, *LPUM_INSTALL_WIZARD;
|
||
|
|
||
|
|
||
|
|
||
|
//=========================================================================
|
||
|
//
|
||
|
// Modem properties defines
|
||
|
//
|
||
|
//=========================================================================
|
||
|
|
||
|
#define REGSTR_VAL_DEVICEEXTRAPAGES TEXT("DeviceExtraPages") // Property pages provided by the device manufacturer
|
||
|
|
||
|
typedef BOOL (APIENTRY *PFNADDEXTRAPAGES)(HDEVINFO,PSP_DEVINFO_DATA,LPFNADDPROPSHEETPAGE,LPARAM);
|
||
|
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#endif // _UNIMODEM_H_
|