Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

503 lines
23 KiB

/***************************************************************************
Name : AWNSFINT.H
Comment : INTERNAL-ONLY Definitions of BC and NSF related structs
Copyright (c) 1993 Microsoft Corp.
Revision Log
Date Name Description
-------- ----- ---------------------------------------------------------
08/28/93 arulm Modifying aftering adding encryption
***************************************************************************/
#ifndef _AWNSFINT_H
#define _AWNSFINT_H
#include <awnsfcor.h>
#include <fr.h>
/***********************************************************************
* *
* NOTICE: This file has to be ANSI compilable, under GCC on UNIX *
* and other ANSI compiles. Be sure to use no MS C specific features *
* In particular, don't use // for comments!!!! *
* *
***********************************************************************/
#pragma pack(2) /* ensure portable packing (i.e. 2 or more) */
/* these sizes should remain constant across all platforms */
#define GRPSIZE_STD 5
#define GRPSIZE_IMAGE 6
#define GRPSIZE_POLLCAPS 5
#define GRPSIZE_NSS 3
#define GRPSIZE_FAX 12
#define BCEXTRA_TEXTID 64 /** space for one 60-byte Text ID **/
#define BCEXTRA_POLL 128 /** space for reasonable poll requests **/
#define BCEXTRA_HUGE 640 /** space for everything, probably.... **/
#define MAXNSCPOLLREQ 5
#ifndef NOCHALL
# define POLL_CHALLENGE_LEN 10
#endif
#ifdef PORTABLE /* ANSI C */
typedef struct { BYTE b[GRPSIZE_STD]; } BCSTD;
typedef struct { BYTE b[GRPSIZE_IMAGE]; } BCIMAGE;
typedef struct { BYTE b[GRPSIZE_POLLCAPS]; } BCPOLLCAPS;
typedef struct { BYTE b[GRPSIZE_NSS]; } BCNSS;
typedef struct { BYTE b[GRPSIZE_FAX]; } BCFAX;
typedef struct
{
BCTYPE bctype;
WORD wBCSize;
WORD wBCVer;
WORD wBCSig;
WORD wTotalSize; /** total size of header + associated var len strings **/
BCSTD Std;
BCIMAGE Image;
BCPOLLCAPS PollCaps;
BCNSS NSS;
BCFAX Fax;
WORD wTextEncoding; /** char set code see above **/
WORD wTextIdLen; /** length of text id **/
WORD wszTextId; /** offset from start of struct to zero-term szTextId **/
WORD wMachineIdLen; /** size of Machine Id (not zero-terminated) **/
WORD wrgbMachineId; /** offset from start of struct to zero-term szNumId **/
/* WORD wszNumId; */ /** offset from start of struct to zero-term szNumId **/
WORD wszRecipSubAddr; /* offset from start of struct to zero-term SUB frame */
WORD wRecipSubAddrLen; /* length of SUB frame */
WORD wNumPollReq; /** number of SEPPWDOFF structs i.e. size of following array **/
WORD rgwPollReq[MAXNSCPOLLREQ]; /** array of offsets to POLLREQ structures **/
#ifndef NOCHALL
WORD wChallengeLen; /** length of challenge string **/
WORD wChallenge; /** offset to challenge string **/
#endif
BYTE b[BCEXTRA_HUGE];
DWORD Guard;
}
BCwithHUGE, FAR* LPBC, NEAR* NPBC;
#define BC_SIZE (sizeof(BCwithHUGE)-BCEXTRA_HUGE-sizeof(DWORD))
#else /* Microsoft C only */
/********
@doc EXTERNAL DATATYPES OEMNSF
@types BCFAX | Fax Capabilities Group
@field BOOL | fPublicPoll | Blind/Public poll availability/request
@field DWORD | AwRes | Resolution Capabilities or Mode. See <t STD_RESOLUTIONS> for values.
@field WORD | Encoding | Encoding Capabilities or Mode. See <t STD_DATA_TYPES>
@field WORD | PageWidth | Page Width Capabilities or Mode. See <t FAX_PAGE_WIDTHS>
@field WORD | PageLength | Page Length Capabilities or Mode. See <t FAX_PAGE_LENGTHS>
********/
typedef struct
{
///////// This structure is not transmitted /////////
WORD fPublicPoll;
//2bytes
DWORD AwRes; /* One or more of the AWRES_ #defines */
WORD Encoding; /* One or more of MH_DATA/MR_DATA/MMR_DATA */
WORD PageWidth; /* One of the WIDTH_ #defines (these are not bitflags!) */
WORD PageLength; /* One of the LENGTH_ #defines (these are not bitflags!) */
//12 bytes
}
BCFAX, far* LPBCFAX, near* NPBCFAX;
/********
@doc EXTERNAL DATATYPES OEMNSF
@types BC | Basic Capabilities structure corresponding
to sent or received NSF, NSS or NSC frames.
@field BCTYPE | bctype | Type of BC structure. Must always be set. See <t BCTYPE> for values.
@field WORD | wBCSize| Size of this (fixed size) AWBC struct. Must always be set.
@field WORD | wBCVer | Version. Currently set it to VER_AWFXPROT100.
@field WORD | wBCSig | Set to VER_AWFXPROT100.
@field BCSTD | Std | Standard Capability group. See <t BCSTD> for details.
@field BCIMAGE | Image | Image Capability group. See <t BCIMAGE> for details.
@field BCPOLLCAPS | PollCaps | PollCaps Capability group. See <t BCPOLLCAPS> for details.
@field BCNSS | NSS | NSS Capability group. See <t BCNSS> for details.
@field BCFAX | Fax | Fax Capability group. See <t BCFAX> for details.
@field WORD | wTextEncoding | Character-Set code used in TextId
@field WORD | wTextIdLen | Length of TextId in bytes
@field WORD | wszTextId | Offset from start of struct to zero-term szTextId
@field WORD | wMachineIdLen | Length of MachineId in bytes (not zero-terminated)
@field WORD | wrgbMachineId | Offset from start of struct to MachineId.
@field WORD | wszRecipSubAddr | Offset from start of struct to zero-term SubAddress.
@field WORD | wRecipSubAddrLen | Length of SubAddress.
|
@field WORD | wNumPollReq | Number of valid PollReqs in the following array. Cannot exceed MAXNSCPOLLREQ.
@field WORD | rgwPollReq[] | Array of offsets (from start of struct) to POLLREQ structures.
|
@field WORD | wChallengeLen | Length of the Password-Challenge string
@field WORD | wChallenge | Offset (from start of struct) to Challenge string
@xref <t BCTYPE>
********/
typedef struct
{
BCTYPE bctype; // must always be set. One of the enum values above
WORD wBCSize; // size of this (fixed size) BC struct, must be set
WORD wBCVer; // if using this header file, set it to VER_AWFXPROT100
WORD wBCSig; // if using this header file, set it to VER_AWFXPROT100
WORD wTotalSize; // total size of header + associated var len strings
BCSTD Std;
BCIMAGE Image;
BCPOLLCAPS PollCaps;
BCNSS NSS;
BCFAX Fax; // for internal use _only_
WORD wTextEncoding; // char set code
WORD wTextIdLen; // length of text id
WORD wszTextId; // offset from start of struct to zero-term szTextId
WORD wMachineIdLen; // size of Machine Id (not zero-terminated)
WORD wrgbMachineId; // offset from start of struct to zero-term szNumId
// WORD wszNumId; // offset from start of struct to zero-term szNumId
WORD wszRecipSubAddr; // offset from start of struct to zero-term SUB frame
WORD wRecipSubAddrLen; // length of SUB frame
WORD wNumPollReq; // size of following array
WORD rgwPollReq[MAXNSCPOLLREQ]; // array of offsets to POLLREQ structures
#ifndef NOCHALL
WORD wChallengeLen; // length of challenge string
WORD wChallenge; // offset to challenge string
#endif //!NOCHALL
}
BC, far* LPBC, near* NPBC;
#define BC_SIZE sizeof(BC)
//#ifndef __cplusplus
typedef struct
{
#ifndef __cplusplus
BC;
#else
BC bc;
#endif //!__cplusplus
BYTE b[BCEXTRA_TEXTID];
DWORD Guard;
}
BCwithTEXT;
typedef struct
{
#ifndef __cplusplus
BC;
#else
BC bc;
#endif //!__cplusplus
BYTE b[BCEXTRA_POLL];
DWORD Guard;
}
BCwithPOLL;
typedef struct
{
#ifndef __cplusplus
BC;
#else
BC bc;
#endif //!__cplusplus
BYTE b[BCEXTRA_HUGE];
DWORD Guard;
}
BCwithHUGE;
//#endif //!__cplusplus
/**------------------- ACK struct ----------------**/
typedef struct
{
BCTYPE bctype; // must always be set. One of SEND_ACK or SEND_DISCONNECT
WORD wACKSize; // size of this (fixed size) ACK struct, must be set
WORD wACKVer; // if using this header file, set it to VER_AWFXPROT100
WORD wACKSig; // if using this header file, set it to VER_AWFXPROT100
BOOL fAck;
}
ACK, far* LPACK;
#endif /** PORTABLE **/
#define AppendToBCLen(lpbc, uMax, lpb, uLen, wOff, wLen) \
{ USHORT uCopy; \
LPBYTE lpbTo; \
BG_CHK((lpbc) && (uMax) && (lpb) && (uLen)); \
BG_CHK((lpbc)->wTotalSize >= sizeof(BC)); \
if((lpbc)->wTotalSize+1 < (uMax)) \
{ \
uCopy = min((uLen), (uMax)-1-(lpbc)->wTotalSize); \
BG_CHK(uCopy == (uLen)); \
lpbTo = ((LPBYTE)(lpbc))+(lpbc)->wTotalSize; \
_fmemcpy(lpbTo, (lpb), uCopy); \
lpbTo[uCopy] = 0; \
(lpbc)->wOff = (lpbc)->wTotalSize; \
(lpbc)->wLen = uCopy; \
(lpbc)->wTotalSize += uCopy+1; \
} \
BG_CHK((lpbc)->wTotalSize <= uMax); \
}
#define AppendToBCOff(lpbc, uMax, lpb, uLen, wOff) \
{ USHORT uCopy; \
LPBYTE lpbTo; \
BG_CHK((lpbc) && (uMax) && (lpb) && (uLen)); \
BG_CHK((lpbc)->wTotalSize >= sizeof(BC)); \
if((lpbc)->wTotalSize+1 < (uMax)) \
{ \
uCopy = min((uLen), (uMax)-1-(lpbc)->wTotalSize); \
BG_CHK(uCopy == (uLen)); \
lpbTo = ((LPBYTE)(lpbc))+(lpbc)->wTotalSize; \
_fmemcpy(lpbTo, (lpb), uCopy); \
lpbTo[uCopy] = 0; \
(lpbc)->wOff = (lpbc)->wTotalSize; \
(lpbc)->wTotalSize += uCopy+1; \
} \
BG_CHK((lpbc)->wTotalSize <= uMax); \
}
#define AppendToBC(lpbc, uMax, lpb, uLen) \
{ USHORT uCopy; \
LPBYTE lpbTo; \
BG_CHK((lpbc) && (uMax) && (lpb) && (uLen)); \
BG_CHK((lpbc)->wTotalSize >= sizeof(BC)); \
if((lpbc)->wTotalSize+1 < (uMax)) \
{ \
uCopy = min((uLen), (uMax)-1-(lpbc)->wTotalSize); \
BG_CHK(uCopy == (uLen)); \
lpbTo = ((LPBYTE)(lpbc))+(lpbc)->wTotalSize; \
_fmemcpy(lpbTo, (lpb), uCopy); \
lpbTo[uCopy] = 0; \
(lpbc)->wTotalSize += uCopy+1; \
} \
BG_CHK((lpbc)->wTotalSize <= uMax); \
}
#define InitBC(lpbc, uSize, t) \
{ \
_fmemset((lpbc), 0, (uSize)); \
(lpbc)->bctype = (t); \
(lpbc)->wBCSize = sizeof(BC); \
(lpbc)->wBCVer = VER_AWFXPROT100; \
(lpbc)->wBCSig = VER_AWFXPROT100; \
(lpbc)->wTotalSize = sizeof(BC); \
}
#define GetTextId(lpbc, lpbOut, uMax) \
BG_CHK((lpbOut) && (lpbc) && (uMax)); \
((LPBYTE)(lpbOut))[0] = 0; \
if( (lpbc)->wTextIdLen && (lpbc)->wszTextId && \
(lpbc)->wszTextId < (lpbc)->wTotalSize && \
(lpbc)->wszTextId+(lpbc)->wTextIdLen <= (lpbc)->wTotalSize) \
{ \
USHORT uLen; \
uLen = min(((uMax)-1), (lpbc)->wTextIdLen); \
_fmemcpy((lpbOut), (((LPBYTE)(lpbc)) + (lpbc)->wszTextId), uLen); \
((LPBYTE)(lpbOut))[uLen] = 0; \
}
#define PutTextId(lpbc, uMax, lpbIn, uLen, enc) \
if(uLen) { AppendToBCLen(lpbc, uMax, lpbIn, uLen, wszTextId, wTextIdLen);\
(lpbc)->wTextEncoding = (enc); }
#define HasTextId(lpbc) ((lpbc)->wTextIdLen && (lpbc)->wszTextId)
#define PutRecipSubAddr(lpbc, uMax, lpbIn, uLen) \
if(uLen) { AppendToBCLen(lpbc, uMax, lpbIn, uLen, wszRecipSubAddr, wRecipSubAddrLen); }
#define GetRecipSubAddr(lpbc, lpbOut, uMax) \
BG_CHK((lpbOut) && (lpbc) && (uMax)); \
((LPBYTE)(lpbOut))[0] = 0; \
if( (lpbc)->wRecipSubAddrLen && (lpbc)->wszRecipSubAddr && \
(lpbc)->wszRecipSubAddr < (lpbc)->wTotalSize && \
(lpbc)->wszRecipSubAddr+(lpbc)->wRecipSubAddrLen <= (lpbc)->wTotalSize) \
{ \
USHORT uLen; \
uLen = min(((uMax)-1), (lpbc)->wRecipSubAddrLen); \
_fmemcpy((lpbOut), (((LPBYTE)(lpbc)) + (lpbc)->wszRecipSubAddr), uLen); \
((LPBYTE)(lpbOut))[uLen] = 0; \
}
#define HasRecipSubAddr(lpbc) ((lpbc)->wRecipSubAddrLen && (lpbc)->wszRecipSubAddr)
/* returns FALSE (and doesnt caopy anything) if destination is too small */
#define CopyBC(lpbcOut, wMaxOut, lpbcIn) \
( (wMaxOut < lpbcIn->wTotalSize) ? FALSE : \
(_fmemcpy(lpbcOut, lpbcIn, lpbcIn->wTotalSize), TRUE) )
/** not for general use **/
/** #define DeleteTextId(lpbc) ((lpbc)->wszTextId=(lpbc)->wTextIdLen=(lpbc)->wTextEncoding=0) **/
#define OffToNP(npbc, off) (((npbc)->off) ? (((NPBYTE)(npbc)) + ((npbc)->off)) : NULL)
#define OffToLP(lpbc, off) (((lpbc)->off) ? (((LPBYTE)(lpbc)) + ((lpbc)->off)) : NULL)
#define OFF_CHK(lpbc, off) BG_CHK((lpbc)->off >= sizeof(BC) && (lpbc)->off <= (lpbc)->wTotalSize)
#if defined(IFBGPROC) || defined(IFFGPROC)
# define EXPORTBC _export WINAPI
#else
# define EXPORTBC
#endif
/***************************************************************************
@doc INTERNAL
@api WORD | NSxtoBC | Called to parse received Microsoft At Work NSx
frames and fill in a BC structure.
@parm IFR | ifr | This must be set to ifrNSF for parsing Capabilities
(NSF/DIS) and to ifrNSS for parsing Mode/Parameters (NSS/DCS)
@parm LPFR[] | rglpfr | [in] Pointer to array of LPFR pointers which
point to FR structures that contain the received frame(s).
@parm WORD | wNumFrame | [in] Number of received frames i.e. length of
the above array of pointers
@parm LPBC | lpbcOut | [out] Pointer to output BC struct
@parm WORD | wBCSize | [in] size of the above AWBC struct.
@rdesc Returns AWERROR_OK on success, otherwise one of the other
AWERROR_ values.
@xref <t IFR> <t FR> <t BC>
***************************************************************************/
/***************************************************************************
@doc INTERNAL
@api WORD | BCtoNSx | Called to create Microsoft At Work NSx frames
from a BC struct
@parm IFR | ifr | This must be set to ifrNSF for creating Capabilities
(NSF/DIS) and to ifrNSS for creating Mode/Parameters (NSS/DCS)
@parm LPBC | lpbcIn | [in] Pointer to input BC struct.
@parm LPBYTE | lpbOut | [out] Pointer to space where the NSx frames
will be created. On successful return this will point to an array
of *lpwNumFrame pointers to FR structures, (i.e. on return the
start of this buffer contains an LPFR[] array that is *lpwNumFrame
items long). The pointers point to the actual (variable-length)
FR stuctures which are placed in the buffer following this
array of pointers.
@parm WORD | wMaxOut | [in] Length of the above buffer. It is
reccomended that this be at least 256 bytes long
@parm LPWORD | lpwNumFrame | [out] Number of NSx frames created. Also
length of the LPFR[] array created in the supplied buffer.
@rdesc Returns AWERROR_OK on success, otherwise one of the other
AWERROR_ values.
@xref <t IFR> <t FR> <t BC>
***************************************************************************/
#if defined(IFBGPROC) || defined(IFFGPROC)
// internal APIs only!
/***************************************************************************
@doc INTERNAL
@api WORD | DIStoBCFAX | Parses a DIS into a BCFAX
@parm LPBYTE | lpbDIS | [in] Pointer to DIS (FIF part only)
@parm WORD | wLenDIS | [in] length of DIS
@parm LPBCFAX | lpbcfax | [out] Pointer to BCFAX struct to be filled in
@parm WORD | wLenBCFAX | [in] length of BCFAX struct
@rdesc Returns length of BCFAX filled in on success. 0 on failure
@comm **NOTE**: Be sure to call this function _after_ calling NSxtoBC,
because NSxtoBC zeros out the entire BC struct, _including_ the
BCFAX part, so if the order were reversed, the data parsed from
the DIS would be lost.
@xref <t IFR> <t BCFAX>
***************************************************************************/
WORD EXPORTBC DIStoBCFAX(IFR ifr, LPBYTE lpbDIS, WORD wLenDIS, LPBCFAX lpbcfax, WORD wLenBCFAX);
/***************************************************************************
@doc INTERNAL
@api WORD | BCFAXtoDIS | Creates a DIS from a BCFAX
@parm LPBCFAX | lpbcfax | [in] Pointer to BCFAX struct
@parm WORD | wLenBCFAX | [in] length of BCFAX struct
@parm LPBYTE | lpbDIS | [out] Pointer to space for DIS (FIF part only).
Note: This API does _not_ create an FR struct!!
@parm WORD | wLenDIS | [in] length of buffer provided for DIS
@rdesc Returns length of DIS created on success. 0 on failure
@xref <t IFR> <t BCFAX>
***************************************************************************/
WORD EXPORTBC BCFAXtoDIS(IFR ifr, LPBCFAX lpbcfax, WORD wLenBCFAX, LPBYTE lpbDIS, WORD wLenDIS);
#endif /* IFBGPROC || IFFGPROC */
#pragma pack()
#endif /** _AWNSFINT_H **/