tspip.h
来自「wince下的源代码集合打包」· C头文件 代码 · 共 402 行
H
402 行
//// Copyright (c) 1995-2000 Microsoft Corporation. All rights reserved.// // Module Name:// // tspip.h// // Abstract:// // Private header file for tspi // //#include <termctrl.h>#include "unimodem.h"#define DEFAULT_UNIMODEM_THREAD_PRIO 200#define EXCEPTION_ACCESS_VIOLATION STATUS_ACCESS_VIOLATION #ifdef DEBUG#define ZONE_INIT DEBUGZONE(0)#define ZONE_TEMP DEBUGZONE(1) // temporary zone for debugging new code.#define ZONE_ASYNC DEBUGZONE(2) // async operation stuff#define ZONE_DIAL DEBUGZONE(7) // Dial string manipulation#define ZONE_THREAD DEBUGZONE(8) // UnimodemControlThread#define ZONE_LIST DEBUGZONE(9) // Linked list walks#define ZONE_CALLS DEBUGZONE(10)#define ZONE_MISC DEBUGZONE(11)#define ZONE_ALLOC DEBUGZONE(12)#define ZONE_FUNCTION DEBUGZONE(13)#define ZONE_FUNC ZONE_FUNCTION#define ZONE_WARN DEBUGZONE(14)#define ZONE_ERROR DEBUGZONE(15)#endif#define WM_MDMMESSAGE WM_USER+0x0100#define WM_MDMCHANGE WM_USER+0x0101#define WM_MDMCANCEL WM_USER+0x0102#define MDM_SUCCESS 0#define MDM_PENDING 1#define MDM_FAILURE 2#define MDM_HANGUP 3#define MDM_BUSY 4#define MDM_NOANSWER 5#define MDM_NOCARRIER 6#define MDM_NODIALTONE 7#define SPI_VERSION TAPI_CURRENT_VERSION#define VALIDATE_VERSION(version) \ {if (version != SPI_VERSION) \ { \ DEBUGMSG(1|ZONE_ERROR, (TEXT("Invalid SPI Version x%X\r\n"), version)); \ return LINEERR_OPERATIONFAILED; \ } \ }#define SUCCESS 0x0#define MDM_ID_NULL 0xffff // Async ID for an unexpected message#define SZWCHAR (sizeof(WCHAR))#define MAXDEVICENAME 128#define MAXADDRESSLEN TAPIMAXDESTADDRESSSIZE#define MAX_CLASS_NAME_LEN 128#define INVALID_DEVICE 0xFFFFFFFF#define INVALID_PENDINGID 0xFFFFFFFF// Check for an error code//#define IS_TAPI_ERROR(err) (BOOL)(HIWORD(err) & 0x8000)// Check the device type. Note that IRCOMM is treated the same as a NULL// cable as far as how unimodem handles it.#define IS_NULL_MODEM(pLineDev) ( (pLineDev->wDeviceType == DT_NULL_MODEM) || \ (pLineDev->wDeviceType == DT_IRCOMM_MODEM) )// Device Class and Information//#define TAPILINE 0#define COMM 1#define COMMMODEM 2#define NDIS 3#define MAX_SUPPORT_CLASS 4typedef struct _GETIDINFO { LPWSTR szClassName; DWORD dwFormat;} GETIDINFO;extern const GETIDINFO aGetID[MAX_SUPPORT_CLASS];// Pending operation type//#define INVALID_PENDINGOP 0#define PENDING_LINEMAKECALL 1#define PENDING_LINEANSWER 2#define PENDING_LINEDROP 3#define PENDING_LINEDIAL 4#define PENDING_LINEACCEPT 5#define PENDING_LINEDEVSPECIFIC 6#define PENDING_LISTEN 254#define PENDING_EXIT 255// Flags for setting passthrough mode#define PASSTHROUGH_ON 1#define PASSTHROUGH_OFF 2#define PASSTHROUGH_OFF_BUT_CONNECTED 3// Flags for resources//#define LINEDEVFLAGS_OUTOFSERVICE 0x00000001#define LINEDEVFLAGS_REMOVING 0x00000002#define MAX_CMD_LENGTH 40// Enumerated States of the line devicetypedef enum DevStates { DEVST_DISCONNECTED = 0, DEVST_PORTSTARTPRETERMINAL, DEVST_PORTPRETERMINAL, DEVST_PORTCONNECTINIT, DEVST_PORTCONNECTWAITFORLINEDIAL, // this is a resting state. ie. we sit here waiting for a lineDial. DEVST_PORTCONNECTDIALTONEDETECT, DEVST_PORTCONNECTDIAL, DEVST_PORTCONNECTING, DEVST_PORTPOSTTERMINAL, DEVST_CONNECTED, DEVST_PORTLISTENINIT, DEVST_PORTLISTENING, DEVST_PORTLISTENOFFER,} DEVSTATES;typedef enum _MDMSTATE{ MDMST_UNKNOWN = 1, MDMST_INITIALIZING, MDMST_DISCONNECTED, MDMST_DIALING, MDMST_CONNECTED, MDMST_DIALED, MDMST_ORIGINATING, MDMST_HANGING_UP_REMOTE, // This is when the remote side hangs up. // modem: Wait for response and then: // - send MODEM_HANGUP // - set MDMSTATE to MDMSTATE_DISCONNECTED MDMST_HANGING_UP_DTR, // After dropping DTR and waiting for 1200ms, check RLSD: // If RLSD is low, raise DTR and set state to // modem: MDMSTATE_HANGING_UP_NON_CMD // null-modem: MDMSTATE_DISCONNECTED // Else set state to: // modem: MDMSTATE_HANGING_UP_NON_COMMAND and send "+++" // null-modem: same, wait another 200ms (keeping count, stop at 3 or so) MDMST_HANGING_UP_NON_CMD, // After sending a \r to hangup or sending +++ or getting RLSD low: // Wait for any response or timeout and then: // - send ATH<cr> // - set state to MDMSTATE_HANGING_UP_CMD MDMST_HANGING_UP_CMD, // Wait for a response to ATH<cr> // If you get one, you are hung up, raise DTR, set state to // MDMSTATE_DISCONNECTED and return MODEM_SUCCESS. // Else if you don't get one, consider dropping DTR, waiting 200ms more // and setting state to MDMSTATE_HANGING_UP_DTR. (keep track of // how many times you do this, max out at 3 or so.)} MDMSTATE;// Flags for the call attributes//#define CALL_ALLOCATED 0x00000001#define CALL_ACTIVE 0x00000002#define CALL_INBOUND 0x00000004#define CALL_DROPPING 0x00000008#define AnsiNext(x) ((x)+1)#define AnsiPrev(y,x) ((x)-1)// Flags for the fwOptions field of DEVCFGHDR//#define TERMINAL_NONE 0x0000#define TERMINAL_PRE 0x0001#define TERMINAL_POST 0x0002#define MANUAL_DIAL 0x0004#define LAUNCH_LIGHTS 0x0008#define MIN_WAIT_BONG 0#define MAX_WAIT_BONG 60#define DEF_WAIT_BONG 8#define INC_WAIT_BONG 2// Device Setting Information//typedef struct tagDEVCFGHDR { WORD fwOptions; WORD wWaitBong;} DEVCFGHDR;typedef struct tagDEVCFG { DEVCFGHDR dfgHdr; COMMCONFIG commconfig;} DEVCFG, *PDEVCFG, FAR* LPDEVCFG;// In TAPI32, the devcfg structure is passed back to applications, // which store it in their address books. So, in CE TAPI I define// a compact version of the devcfg that contains all of the fields// that we care about. It is this structure that gets returned to// the apps and stored in the registry. Then when a lineSetDevConfig// call occurs, I copy individual fields out of the devMiniCfg into// the memory resident devcfg.//// The comments next to each field indicate which data structure// they belong to when expanded.// Note that in the V1 tree the DIAL_MODIFIER_LEN was 20. I went ahead and// bumped it to 40 in V2 without changing the wVersion since the dial modifier// is at the very end and I can't see any scenario where the V1 and V2// objects could get transposed and cause problems.#define DEVMINCFG_VERSION 0x0010#define DIAL_MODIFIER_LEN 40typedef struct tagDEVMINICFG { WORD wVersion; WORD wWaitBong; // DevCfgHdr DWORD dwCallSetupFailTimer; // CommConfig.ModemSettings DWORD dwModemOptions; // CommConfig.ModemSettings // MDM_BLIND_DIAL MDM_FLOWCONTROL_SOFT // MDM_CCITT_OVERRIDE MDM_FORCED_EC // MDM_CELLULAR MDM_SPEED_ADJUST // MDM_COMPRESSION MDM_TONE_DIAL // MDM_ERROR_CONTROL MDM_V23_OVERRIDE // MDM_FLOWCONTROL_HARD DWORD dwBaudRate; // DCB WORD fwOptions; // DevCfgHdr // TERMINAL_PRE TERMINAL_POST // MANUAL_DIAL BYTE ByteSize; // DCB BYTE StopBits; // DCB BYTE Parity; // DCB WCHAR szDialModifier[DIAL_MODIFIER_LEN+1]; // Unique to MiniCfg } DEVMINICFG, *PDEVMINICFG;// Line device data structure//typedef struct __LineDev { LIST_ENTRY llist; // pointer to next LineDev DWORD dwVersion; // Version stamp DWORD dwDeviceID; // Local device ID WCHAR szDeviceName[MAXDEVICENAME+1]; // actual device name WCHAR szFriendlyName[MAXDEVICENAME+1]; // friendly device name HKEY hSettingsKey; // Registry handle for settings key WORD wDeviceType; // the modem type WORD wDeviceAvail; // Is the modem currently available? DEVMINICFG DevMiniCfg; // Compact version of Device configuration DWORD dwDefaultMediaModes; // Default supported media modes DWORD dwBearerModes; // supported bearer modes DWORD dwCurBearerModes; // The current media bearer modes. Plural because // we keep track of PASSTHROUGH _and_ the real b-mode // at the same time. DWORD dwMediaModes; // Current supported media modes DWORD dwCurMediaModes; // The current media modes DWORD dwDetMediaModes; // The current detection media modes HANDLE hDevice; // Device handle DWORD pidDevice; // Device owner pid HANDLE hDevice_r0; // ring-0 Device handle HTAPILINE htLine; // Tapi line handle LINEEVENT lpfnEvent; // Line event callback function HWND hwndLine; // Tapi emulation WCHAR szAddress[MAXADDRESSLEN+1]; DWORD dwPendingID; // async pending ID DWORD dwPendingType; // pending operation DWORD dwPendingStatus; // status of pending op DWORD dwCallFlags; // Call attributes HTAPICALL htCall; // TAPI call handle HWND hwTermCtrl; // TermCtrl Window Handle HANDLE hTimeoutEvent; // Event Handle for Call Timeout event DWORD dwCurWatchdog; HANDLE hCallComplete; // Event Handle for Call Completions DWORD dwCallState; // Current call state DWORD dwCallStateMode; // Further details about current call state DWORD dwNumRings; CRITICAL_SECTION OpenCS; // Critical Section for DevLineClose DEVSTATES DevState; // intermediate TAPI device state MDMSTATE MdmState; // what state is the modem in DWORD dwDialOptions; // Options set in a lineMakeCall BOOL fTakeoverMode; // True if unimodem is in takover mode WCHAR szDriverKey[MAX_CLASS_NAME_LEN+10]; // ex. "Modem\0000" DWORD dwDevCapFlags; // LINEDEVCAPSFLAGS (ie. DIALBILLING, DIALQUIET, DIALDIALTONE) DWORD dwMaxDCERate; // Max DCE as stored in the Properties line of the registry DWORD dwCurrentBaudRate; // Extracted from the CONNECT or CARRIER response DWORD dwLastBaudRate; DWORD dwLineStatesMask; // Filter status messages DWORD dwMaxCmd; BOOL bWatchdogTimedOut; HANDLE hMdmLog; // Modem command history for this device. // // Fields used by UnimodemControlThread // BOOL bControlThreadRunning; LPSTR lpstrNextCmd; WCHAR chContinuation; // Modem command continuation character (usually ';')} TLINEDEV, *PTLINEDEV;// Default mask to MDM_ options//#define MDM_MASK (MDM_TONE_DIAL | MDM_BLIND_DIAL)typedef struct _TSPIGLOBALS{ HINSTANCE hInstance; DWORD dwProviderID; HPROVIDER hProvider; HKEY hDefaultsKey; LINEEVENT fnLineEventProc; // Line Event callback in TAPI ASYNC_COMPLETION fnCompletionCallback; // Completion Create callback in TAPI LIST_ENTRY LineDevs; // Linked List of TLINEDEV CRITICAL_SECTION LineDevsCS; // Critical section for above list HICON hIconLine;} TSPIGLOBALS, *PTSPIGLOBALS;extern TSPIGLOBALS TspiGlobals;// Some quick macros till we actually implement MemTracking#define TSPIAlloc( Size ) LocalAlloc( LPTR, Size )#define TSPIFree( Ptr ) LocalFree( Ptr )// Default CommMask for SetCommMask/WaitCommEvent#define EV_DEFAULT (EV_BREAK|EV_CTS|EV_DSR|EV_ERR|EV_RING|EV_RLSD|EV_RXCHAR)// Routines from config.cLONG DevSpecificLineConfigEdit(PTLINEDEV pLineDev, PUNIMDM_CHG_DEVCFG pChg);// Routines from dialer.cvoid Dialer(PTLINEDEV pLineDev);BOOL ModemInit(PTLINEDEV pLineDev);// Helper routines defined in misc.cVOID getDefaultDevConfig(PTLINEDEV ptLineDev, PDEVMINICFG pDevMiniCfg);void TSPIDLL_Load(void);PTLINEDEV createLineDev(HKEY hActiveKey, LPCWSTR lpszDevPath, LPCWSTR lpszDeviceName);PTLINEDEV GetLineDevfromID(DWORD dwDeviceID);PTLINEDEV GetLineDevfromName(LPCWSTR lpszDeviceName,LPCWSTR lpszFriendlyName);PTLINEDEV GetLineDevfromHandle (DWORD handle);PTLINEDEV LineExists( PTLINEDEV ptNewLine);BOOL ValidateDevCfgClass (LPCWSTR lpszDeviceClass);DWORD NullifyLineDevice (PTLINEDEV pLineDev, BOOL bDefaultConfig);LONG DevlineGetDefaultConfig(PTLINEDEV pLineDev);LONG ValidateAddress( PTLINEDEV pLineDev, LPCWSTR lpszInAddress, LPWSTR lpszOutAddress);LONG DevlineDial( PTLINEDEV pLineDev );BOOL DisplayTerminalWindow(PTLINEDEV pLineDev, DWORD dwTitle);void CallLineEventProc(PTLINEDEV ptLine, HTAPICALL htCall, DWORD dwMsg, DWORD dwParam1, DWORD dwParam2, DWORD dwParam3);void CompleteAsyncOp(PTLINEDEV pLineDev);BOOL StartCompleteAsyncOp(PTLINEDEV pLineDev);void NewCallState(PTLINEDEV pLineDev,DWORD dwCallState,DWORD dwCallState2);void InitVarData(LPVOID lpData, DWORD dwSize);DWORD SetAsyncID(PTLINEDEV pLineDev, DWORD dwID);void SetAsyncStatus(PTLINEDEV pLineDev, DWORD dwNewStatus);void SetAsyncOp(PTLINEDEV pLineDev, DWORD dwNewOp);// Routines from modem.cLPWSTR GetPendingName(DWORD dwPendingType);LONG DevlineClose (PTLINEDEV pLineDev, BOOL fDoDrop);LONG DevlineDetectCall(PTLINEDEV pLineDev);LONG DevlineDrop(PTLINEDEV pLineDev);LONG DevlineOpen(PTLINEDEV pLineDev);LONG ControlThreadCmd(PTLINEDEV pLineDev,DWORD dwPendingOP,DWORD dwPendingID);// Routines from registry.cDWORD MdmRegGetValue(PTLINEDEV ptLineDev, LPCWSTR szKeyName, LPCWSTR szValueName, DWORD dwType, LPBYTE lpData, LPDWORD lpdwSize);void EnumExternModems( void );
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?