WinComm/vbx/vbapi.h
Scott Duensing d68405550d Fix COMM.DRV calling conventions and add ComDEB compatibility
Resolve GPFs in both USER.EXE and COMMTASK.DLL by correcting RETF
sizes for SETCOM and GETDCB, confirmed by disassembling CyberCom.DRV.
Add stock-compatible ComDEB structure so third-party code (ProComm
COMMTASK.DLL) can safely access internal fields at known offsets per
Microsoft KB Q101417.

COMM.DRV changes:
- SETCOM (ord 2): RETF 4, takes DCB FAR * only (not commId + DCB*)
- GETDCB (ord 15): RETF 2, takes commId, returns DCB FAR * in DX:AX
- Add 40-byte ComDebT matching stock COMM.DRV internal layout
  (evtWord at +0, MSR shadow at +35, queue counts at +8/+18)
- cevt returns pointer to ComDebT for third-party compatibility
- Sync ComDEB fields in ISR dispatch, reccom, sndcom, cflush, setque
- Move WEP to ordinal 16, add ordinal 101 stub (match stock/CyberCom)
- Default DBG_ENABLED to 0 (set to 1 to re-enable debug logging)

VBX control fixes:
- Fix SETBREAK/CLRBREAK constants (use numeric 8/9, not undefined macros)
- Fix serialEnableNotify return type (BOOL, not int16_t)
- Fix mscomm.h to work with RC compiler (#ifndef RC_INVOKED)
- Fix vbapi.h USHORT typedef and MODEL.flWndStyle type
- Add vbapi.lib dependency to makefile

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 20:03:34 -06:00

264 lines
11 KiB
C

// vbapi.h - Reconstructed VBX CDK header
//
// Reconstructed from the published Visual Basic Custom Control (VBX)
// specification for use with MSVC 1.52 targeting 16-bit Visual Basic 4.
// Types, structures, constants, and API prototypes match the VBX CDK.
#ifndef VBAPI_H
#define VBAPI_H
#include <windows.h>
// -----------------------------------------------------------------------
// Packing: VBX CDK structures use byte packing
// -----------------------------------------------------------------------
#pragma pack(1)
// -----------------------------------------------------------------------
// Core types
// -----------------------------------------------------------------------
#ifndef USHORT
typedef unsigned short USHORT;
#endif
typedef WORD HCTL; // Handle to a VBX control instance
typedef WORD HSZ; // Handle to a VB-managed string
typedef LONG HLSTR; // Handle to a VB long string
typedef USHORT ERR; // Error code
// Flag type
typedef DWORD FL;
// -----------------------------------------------------------------------
// Forward declarations and pointer types
// -----------------------------------------------------------------------
typedef struct tagMODEL MODEL;
typedef struct tagPROPINFO PROPINFO;
typedef struct tagEVENTINFO EVENTINFO;
typedef struct tagPARMINFO PARMINFO;
typedef MODEL FAR *LPMODEL;
typedef PROPINFO *PPROPINFO; // Near pointer (DLL data segment)
typedef EVENTINFO *PEVENTINFO; // Near pointer (DLL data segment)
typedef PARMINFO *PPARMINFO; // Near pointer (DLL data segment)
// -----------------------------------------------------------------------
// Control procedure type
// -----------------------------------------------------------------------
typedef LONG (FAR PASCAL *PCTLPROC)(HCTL, HWND, USHORT, USHORT, LONG);
// -----------------------------------------------------------------------
// VB version constants
// -----------------------------------------------------------------------
#define VB_VERSION 0x0300
#define VB300_VERSION 0x0300
// -----------------------------------------------------------------------
// Data types (bits 0-7 of PROPINFO.fl)
// -----------------------------------------------------------------------
#define DT_HSZ 0x01
#define DT_SHORT 0x02
#define DT_LONG 0x03
#define DT_BOOL 0x04
#define DT_COLOR 0x05
#define DT_ENUM 0x06
#define DT_REAL 0x07
#define DT_XPOS 0x08
#define DT_XSIZE 0x09
#define DT_YPOS 0x0A
#define DT_YSIZE 0x0B
#define DT_PICTURE 0x0C
#define DT_HLSTR 0x0D
// -----------------------------------------------------------------------
// Property flags (bits 8+ of PROPINFO.fl)
// -----------------------------------------------------------------------
#define PF_datatype 0x000000FFL // Mask for data type field
#define PF_fPropArray 0x00000100L
#define PF_fSetData 0x00000200L
#define PF_fSetMsg 0x00000400L
#define PF_fNoShow 0x00000800L
#define PF_fNoRuntimeW 0x00001000L
#define PF_fGetData 0x00002000L
#define PF_fGetMsg 0x00004000L
#define PF_fGetHszMsg 0x00008000L
#define PF_fUpdateOnEdit 0x00010000L
#define PF_fEditable 0x00020000L
#define PF_fPreHwnd 0x00040000L
#define PF_fDefVal 0x00080000L
#define PF_fNoInitDef 0x00100000L
#define PF_fNoRuntimeR 0x00200000L
#define PF_fSaveData 0x00400000L
#define PF_fSaveMsg 0x00800000L
#define PF_fLoadDataOnly 0x01000000L
#define PF_fLoadMsgOnly 0x02000000L
// -----------------------------------------------------------------------
// MODEL flags
// -----------------------------------------------------------------------
#define MODEL_fArrows 0x00000001L
#define MODEL_fFocusOk 0x00000002L
#define MODEL_fMnemonic 0x00000004L
#define MODEL_fDesInteract 0x00000008L
#define MODEL_fInitMsg 0x00000010L
#define MODEL_fLoadMsg 0x00000020L
#define MODEL_fInvisAtRun 0x00000040L
#define MODEL_fGraphical 0x00000080L
// -----------------------------------------------------------------------
// VBX control messages
// -----------------------------------------------------------------------
#define VBM__BASE (WM_USER + 0x0600)
#define VBM_INITIALIZE (VBM__BASE + 0)
#define VBM_SETPROPERTY (VBM__BASE + 1)
#define VBM_GETPROPERTY (VBM__BASE + 2)
#define VBM_CHECKPROPERTY (VBM__BASE + 3)
#define VBM_MNEMONIC (VBM__BASE + 4)
#define VBM_CREATED (VBM__BASE + 5)
#define VBM_LOADED (VBM__BASE + 6)
#define VBM_SAVEPROPERTY (VBM__BASE + 7)
#define VBM_LOADPROPERTY (VBM__BASE + 8)
#define VBM_METHOD (VBM__BASE + 9)
// -----------------------------------------------------------------------
// Error codes
// -----------------------------------------------------------------------
#define ERR_None 0
#define ERR_InvPropVal 380 // Invalid property value
#define ERR_InvPropSet 383 // Can't set property at this time
// -----------------------------------------------------------------------
// Standard property pointers
//
// Magic values recognized by VB as built-in properties.
// -----------------------------------------------------------------------
#define PPROPINFO_STD_CTLNAME ((PPROPINFO)0)
#define PPROPINFO_STD_INDEX ((PPROPINFO)1)
#define PPROPINFO_STD_HWND ((PPROPINFO)2)
#define PPROPINFO_STD_TAG ((PPROPINFO)5)
#define PPROPINFO_STD_LEFT ((PPROPINFO)6)
#define PPROPINFO_STD_TOP ((PPROPINFO)7)
#define PPROPINFO_STD_WIDTH ((PPROPINFO)8)
#define PPROPINFO_STD_HEIGHT ((PPROPINFO)9)
#define PPROPINFO_STD_ENABLED ((PPROPINFO)17)
#define PPROPINFO_STD_VISIBLE ((PPROPINFO)18)
#define PPROPINFO_STD_PARENT ((PPROPINFO)21)
#define PPROPINFO_STD_DRAGMODE ((PPROPINFO)22)
#define PPROPINFO_STD_DRAGICON ((PPROPINFO)23)
#define PPROPINFO_STD_NONE ((PPROPINFO)NULL)
// Aliases matching the plan's naming convention
#define PPROPINFO_STD_NAME PPROPINFO_STD_CTLNAME
// -----------------------------------------------------------------------
// PROPINFO - Property descriptor
// -----------------------------------------------------------------------
struct tagPROPINFO {
PSTR npszName; // Property name (near pointer, DLL DS)
FL fl; // Data type (bits 0-7) | Property flags (bits 8+)
BYTE offsetData; // Byte offset in control's cbCtlExtra data
BYTE infoData; // Type-specific info (e.g., max string length)
LONG dataDefault; // Default value
PSTR npszEnumList; // DT_ENUM: null-separated, double-null terminated
BYTE enumMax; // DT_ENUM: maximum valid value
};
// -----------------------------------------------------------------------
// PARMINFO - Event parameter descriptor
// -----------------------------------------------------------------------
struct tagPARMINFO {
PSTR npszName; // Parameter name
FL fl; // Data type
};
// -----------------------------------------------------------------------
// EVENTINFO - Event descriptor
// -----------------------------------------------------------------------
struct tagEVENTINFO {
PSTR npszName; // Event name
USHORT cParms; // Number of parameters
USHORT cwParms; // Size of parameters in words
PPARMINFO npParmInfo; // Parameter info array (NULL if no params)
PSTR npszParmProf; // Parameter profile string (e.g., "value As Integer")
FL fl; // Event flags
};
// -----------------------------------------------------------------------
// MODEL - Control model definition
//
// VB3+ version (usVersion = VB300_VERSION) for VB4 compatibility.
// Registered with VBRegisterModel() in VBINITCC.
// -----------------------------------------------------------------------
struct tagMODEL {
USHORT usVersion; // VB_VERSION (0x0300)
FL fl; // MODEL_* flags
PCTLPROC pctlproc; // Control procedure
USHORT fsClassStyle; // Window class style bits
FL flWndStyle; // Window style bits
USHORT cbCtlExtra; // Bytes of per-instance data
USHORT idBmpPalette; // Toolbox bitmap resource ID
PSTR npszDefCtlName; // Default control name (near)
PSTR npszClassName; // Window class name (NULL = default)
PSTR npszParentClassName; // Parent class name (NULL = default)
PPROPINFO *npproplist; // Property list (NULL-terminated array)
PEVENTINFO *npeventlist; // Event list (NULL-terminated array)
BYTE nDefProp; // Default property index
BYTE nDefEvent; // Default event index
BYTE nValueProp; // Value property index
USHORT usCtlVersion; // Control version (BCD, user-defined)
};
// -----------------------------------------------------------------------
// Utility macro: byte offset of a field within a structure
// -----------------------------------------------------------------------
#define OFFSETIN(type, field) ((BYTE)&(((type *)0)->field))
// -----------------------------------------------------------------------
// VB API function prototypes
//
// These functions are exported by the VB runtime (VBAPI module) and
// resolved at load time when VB loads the VBX.
// -----------------------------------------------------------------------
// Control registration
BOOL FAR PASCAL VBRegisterModel(HANDLE hmodule, MODEL FAR *lpmodel);
// Default control procedure
LONG FAR PASCAL VBDefControlProc(HCTL hctl, HWND hwnd, USHORT msg, USHORT wp, LONG lp);
// Event firing
ERR FAR PASCAL VBFireEvent(HCTL hctl, USHORT iEvent, LPVOID lpparams);
// String handle management
HSZ FAR PASCAL VBCreateHsz(_segment seg, LPSTR lpsz);
void FAR PASCAL VBDestroyHsz(HSZ hsz);
LPSTR FAR PASCAL VBDerefHsz(HSZ hsz);
// Long string handle management
HLSTR FAR PASCAL VBCreateHlstr(LPVOID lpdata, USHORT cbLen);
void FAR PASCAL VBDestroyHlstr(HLSTR hlstr);
LPSTR FAR PASCAL VBGetHlstr(HLSTR hlstr, USHORT FAR *lpcbLen);
ERR FAR PASCAL VBSetHlstr(HLSTR FAR *phlstr, LPVOID lpdata, USHORT cbLen);
// Control data access
LPVOID FAR PASCAL VBDerefControl(HCTL hctl);
// Runtime mode query (TRUE = runtime, FALSE = design)
BOOL FAR PASCAL VBGetMode(void);
// Control property access
ERR FAR PASCAL VBSetControlProperty(HCTL hctl, USHORT iProp, LONG data);
LONG FAR PASCAL VBGetControlProperty(HCTL hctl, USHORT iProp);
// Control window handle
HWND FAR PASCAL VBGetControlHwnd(HCTL hctl);
// Instance handle
HANDLE FAR PASCAL VBGetHInstance(void);
// -----------------------------------------------------------------------
// Restore default packing
// -----------------------------------------------------------------------
#pragma pack()
#endif // VBAPI_H