/******************************************************************\ * Microsoft Windows NT * * Copyright(c) Microsoft Corp., 1992 * \******************************************************************/ /*++ Module Name: RASSAPIP.H Description: This file contains structure defs and defines used in implementing the RASADMIN APIs. Author: Michael Salamone (MikeSa) July 13,1992 Revision History: --*/ #ifndef _RASSAPIP_H_ #define _RASAAPIP_H_ #define RASSAPI_MAX_CALLBACK_NUMBER_SIZE 48 #define RASSAPI_MAX_DEVICE_NAME_OLD 32 // 3rd party DLLs don't need this version information because they will only // be administering a NT3.51 or greater server. #define RAS_SERVER_20 20 // identifies a NT RAS 2.0 server // // Number of port statistics returned by a RAS 1.0 server // #define RAS10_MAX_STATISTICS 6 // // RAS10 specific port statistics defines // #define RAS10_BYTES_RCVED 0 #define RAS10_BYTES_XMITED 1 #define RAS10_SERIAL_OVERRUN_ERR 2 #define RAS10_TIMEOUT_ERR 3 #define RAS10_FRAMING_ERR 4 #define RAS10_CRC_ERR 5 #define MEDIA_NAME_DEFAULT L"SERIAL" #define DEVICE_TYPE_DEFAULT L"MODEM" #define DEVICE_NAME_DEFAULT L"UNKNOWN" // // structures used by down level RAS 1.x servers // typedef struct tagWpdStatisticsInfo { ULONG stat_bytesreceived; ULONG stat_bytesxmitted; USHORT stat_overrunerr; USHORT stat_timeouterr; USHORT stat_framingerr; USHORT stat_crcerr; } WpdStatisticsInfo; struct dialin_user_info_0 { unsigned char duseri0_privilege_mask ; char duseri0_phone_number[RASSAPI_MAX_PHONENUMBER_SIZE + 1]; }; struct dialin_user_info_1 { struct dialin_user_info_0 duseri0; char duseri1_name[LM20_UNLEN+1]; }; struct dialin_user_info_2 { struct dialin_user_info_0 duseri0; USER_INFO_2 usri2; }; struct dialin_port_info_0 { char dporti0_username[LM20_UNLEN+1]; // name of user using the port char dporti0_computer[NETBIOS_NAME_LEN+1]; // computer user dialed in from // Used when the admin wants to // send a message to this user unsigned short dporti0_comid; // COM1 = 1 etc unsigned long dporti0_time; // time user dialed in and // authenticated - number of seconds // since 00:00:00 Jan 1, 1970 unsigned short dporti0_line_condition; // If RAS_PORT_AUTHENTICATED, then // comid, time username and computer // name fields are valid. unsigned short dporti0_modem_condition; }; struct dialin_port_info_1 { struct dialin_port_info_0 dporti0; unsigned long dporti1_baud; WpdStatisticsInfo dporti1_stats; }; struct dialin_server_info_0 { unsigned short dserveri0_total_ports; unsigned short dserveri0_ports_in_use; }; // // defined to support RAS 1.x - the max ports in RAS 2.0 and greater // is 64 (could be greater) // #define RAS_MAX_SERVER_PORTS 16 // // Max length of RAS 1.0 port name including terminating // NULL character - eg., "COM16" // #define RAS10_MAX_PORT_NAME 6 // // How long a client will wait for a pipe connection (milliseconds) // if it is busy. // #define PIPE_CONNECTION_TIMEOUT 10000L #define PIPE_BUFSIZE 512 // // Name of pipe that will be used to process requests // #define RASADMIN_PIPE TEXT("\\pipe\\dialin\\adminsrv") // // Pipe path to which RASADMIN_PIPE should be concatenated for local // machine // #define LOCAL_PIPE TEXT("\\\\.") // // Request codes for RAS 1.x server // #define RASADMINREQ_DISCONNECT_USER 1 #define RASADMINREQ_GET_PORT_INFO 2 #define RASADMINREQ_CLEAR_PORT_STATS 3 #define RASADMINREQ_ENUM_PORTS 4 #define RASADMINREQ_GET_SERVER_INFO 5 // // Request codes for RAS 2.0 server // #define RASADMIN20_REQ_DISCONNECT_USER 2001 #define RASADMIN20_REQ_GET_PORT_INFO 2002 #define RASADMIN20_REQ_CLEAR_PORT_STATS 2003 #define RASADMIN20_REQ_ENUM_PORTS 2004 #define RASADMIN20_REQ_ENUM_RESUME 2005 // // This request code remains the same as in RAS 1.0 // so that, if RAS 1.0 admin tried to connect, it // will get server info back, but not in the format // that it recognizes. It will then be unable to // admin the RAS 2.0 server. // #define RASADMIN20_REQ_GET_SERVER_INFO 5 // // These can be returned in the RetCode field of server response // packet sent to the client. These should not be changed in // order to preserve compatibility with different versions of // RASADMIN. // #define ERR_NO_SUCH_DEVICE 635 #define ERR_SERVER_SYSTEM_ERR 636 // // These are the packets sent back and forth between RAS 1.x server // and the RASADMIN APIs. // struct PortEnumRequestPkt { unsigned short Request; // ENUM_PORTS }; // ENUM_PORTS_TOTALAVAIL struct PortEnumReceivePkt { unsigned short RetCode; unsigned short TotalAvail; struct dialin_port_info_0 Data[RAS_MAX_SERVER_PORTS]; }; struct DisconnectUserRequestPkt { unsigned short Request; // DISCONNECT_USER unsigned short ComId; }; struct DisconnectUserReceivePkt { unsigned short RetCode; }; struct PortClearRequestPkt { unsigned short Request; // CLEAR_PORT_STATISTICS unsigned short ComId; }; struct PortClearReceivePkt { unsigned short RetCode; }; struct ServerInfoRequestPkt { unsigned short Request; // GET_SERVER_INFO }; struct ServerInfoReceivePkt { unsigned short RetCode; struct dialin_server_info_0 Data; }; struct PortInfoRequestPkt { unsigned short Request; // GET_PORT_INFO unsigned short ComId; }; struct PortInfoReceivePkt { unsigned short RetCode; struct dialin_port_info_1 Data; }; // // These are the packed structures that are sent out on the network. // It is up to the receiver to unpack and convert to the proper endian // for the host. // typedef struct _P_WPD_STATISTICS_INFO { BYTE stat_bytesreceived[4]; BYTE stat_bytesxmitted[4]; BYTE stat_overrunerr[2]; BYTE stat_timeouterr[2]; BYTE stat_framingerr[2]; BYTE stat_crcerr[2]; } P_WPD_STATISTICS_INFO, *PP_WPD_STATISTICS_INFO; typedef struct _P_DIALIN_PORT_INFO_0 { BYTE dporti0_username[LM20_UNLEN+1]; // name of user using the port BYTE dporti0_computer[NETBIOS_NAME_LEN+1]; // computer user dialed in from // Used when the admin wants to // send a message to this user BYTE dporti0_comid[2]; // COM1 = 1 etc BYTE dporti0_time[4]; // time user dialed in and // authenticated - number of seconds // since 00:00:00 Jan 1, 1970 BYTE dporti0_line_condition[2]; // If RAS_PORT_AUTHENTICATED, then // comid, time username and computer // name fields are valid. BYTE dporti0_modem_condition[2]; } P_DIALIN_PORT_INFO_0, *PP_DIALIN_PORT_INFO_0; typedef struct _P_DIALIN_PORT_INFO_1 { P_DIALIN_PORT_INFO_0 dporti0; BYTE dporti1_baud[4]; P_WPD_STATISTICS_INFO dporti1_stats; } P_DIALIN_PORT_INFO_1, *PP_DIALIN_PORT_INFO_1; typedef struct _P_DIALIN_SERVER_INFO_0 { BYTE dserveri0_total_ports[2]; BYTE dserveri0_ports_in_use[2]; } P_DIALIN_SERVER_INFO_0, *PP_DIALIN_SERVER_INFO_0; typedef struct _P_PORT_ENUM_REQUEST_PKT { BYTE Request[2]; // ENUM_PORTS } P_PORT_ENUM_REQUEST_PKT, *PP_PORT_ENUM_REQUEST_PKT; // ENUM_PORTS_TOTALAVAIL typedef struct _P_PORT_ENUM_RECEIVE_PKT { BYTE RetCode[2]; BYTE TotalAvail[2]; P_DIALIN_PORT_INFO_0 Data[RAS_MAX_SERVER_PORTS]; } P_PORT_ENUM_RECEIVE_PKT, *PP_PORT_ENUM_RECEIVE_PKT; typedef struct _P_DISCONNECT_USER_REQUEST_PKT { BYTE Request[2]; // DISCONNECT_USER BYTE ComId[2]; } P_DISCONNECT_USER_REQUEST_PKT, *PP_DISCONNECT_USER_REQUEST_PKT; typedef struct _P_DISCONNECT_USER_RECEIVE_PKT { BYTE RetCode[2]; } P_DISCONNECT_USER_RECEIVE_PKT, *PP_DISCONNECT_USER_RECEIVE_PKT; typedef struct _P_PORT_CLEAR_REQUEST_PKT { BYTE Request[2]; // CLEAR_PORT_STATISTICS BYTE ComId[2]; } P_PORT_CLEAR_REQUEST_PKT, *PP_PORT_CLEAR_REQUEST_PKT; typedef struct _P_PORT_CLEAR_RECEIVE_PKT { BYTE RetCode[2]; } P_PORT_CLEAR_RECEIVE_PKT, *PP_PORT_CLEAR_RECEIVE_PKT; typedef struct _P_SERVER_INFO_REQUEST_PKT { BYTE Request[2]; // GET_SERVER_INFO } P_SERVER_INFO_REQUEST_PKT, *PP_SERVER_INFO_REQUEST_PKT; typedef struct _P_SERVER_INFO_RECEIVE_PKT { BYTE RetCode[2]; P_DIALIN_SERVER_INFO_0 Data; } P_SERVER_INFO_RECEIVE_PKT, *PP_SERVER_INFO_RECEIVE_PKT; typedef struct _P_PORT_INFO_REQUEST_PKT { BYTE Request[2]; // GET_PORT_INFO BYTE ComId[2]; } P_PORT_INFO_REQUEST_PKT, *PP_PORT_INFO_REQUEST_PKT; typedef struct _P_PORT_INFO_RECEIVE_PKT { BYTE RetCode[2]; P_DIALIN_PORT_INFO_1 Data; } P_PORT_INFO_RECEIVE_PKT, *PP_PORT_INFO_RECEIVE_PKT; // // These are the packets sent back and forth between a RAS 2.0 server // and the RASADMIN APIs // typedef struct tagPortEnumReceivePkt { DWORD RetCode; WORD TotalAvail; RAS_PORT_0 *Data; } PORT_ENUM_RECEIVE, *PPORT_ENUM_RECEIVE; typedef struct tagPortInfoReceivePkt { DWORD RetCode; DWORD ReqBufSize; RAS_PORT_1 Data; } PORT_INFO_RECEIVE, *PPORT_INFO_RECEIVE; typedef struct tagPortClearReceivePkt { DWORD RetCode; } PORT_CLEAR_RECEIVE, *PPORT_CLEAR_RECEIVE; typedef struct tagDisconnectUserReceivePkt { DWORD RetCode; } DISCONNECT_USER_RECEIVE, *PDISCONNECT_USER_RECEIVE; typedef struct tagServerInfoReceivePkt { WORD RetCode; // VERY IMPORTANT TO BE A WORD!!! - RAS1.0 COMPATIBILITY RAS_SERVER_0 Data; } SERVER_INFO_RECEIVE, *PSERVER_INFO_RECEIVE; typedef struct _CLIENT_REQUEST { WORD RequestCode; WCHAR PortName[RASSAPI_MAX_PORT_NAME]; DWORD RcvBufSize; DWORD ClientVersion; } CLIENT_REQUEST, *PCLIENT_REQUEST; // // These are the packed structures that are sent out on the network. // It is up to the receiver to unpack and convert to the proper endian // for the host. // typedef struct _P_RAS_PORT_0 { BYTE wszPortName[2 * RASSAPI_MAX_PORT_NAME]; BYTE wszDeviceType[2 * RASSAPI_MAX_DEVICETYPE_NAME]; BYTE wszDeviceName[2 * RASSAPI_MAX_DEVICE_NAME_OLD]; BYTE wszMediaName[2 * RASSAPI_MAX_MEDIA_NAME]; BYTE reserved[4]; BYTE Flags[4]; BYTE wszUserName[2 * (UNLEN + 1)]; BYTE wszComputer[2 * NETBIOS_NAME_LEN]; BYTE dwStartSessionTime[4]; BYTE wszLogonDomain[2 * (DNLEN + 1)]; BYTE fAdvancedServer[4]; } P_RAS_PORT_0, *PP_RAS_PORT_0; typedef struct _P_RAS_STATISTIC { BYTE Stat[4]; } P_RAS_STATISTIC, *PP_RAS_STATISTIC; /* PPP control protocol results returned by RasPppGetInfo. */ typedef struct __PPP_NBFCP_RESULT { BYTE dwError[4]; BYTE dwNetBiosError[4]; BYTE szName[NETBIOS_NAME_LEN + 1]; BYTE wszWksta[2 * (NETBIOS_NAME_LEN + 1)]; } P_PPP_NBFCP_RESULT, *PP_PPP_NBFCP_RESULT; typedef struct __PPP_IPCP_RESULT { BYTE dwError[4]; BYTE wszAddress[2 * (RAS_IPADDRESSLEN + 1)]; } P_PPP_IPCP_RESULT, *PP_PPP_IPCP_RESULT; typedef struct __PPP_IPXCP_RESULT { BYTE dwError[4]; BYTE wszAddress[2 * (RAS_IPXADDRESSLEN + 1)]; } P_PPP_IPXCP_RESULT, *PP_PPP_IPXCP_RESULT; typedef struct __PPP_ATCP_RESULT { BYTE dwError[4]; BYTE wszAddress[2 * (RAS_ATADDRESSLEN + 1)]; } P_PPP_ATCP_RESULT, *PP_PPP_ATCP_RESULT; typedef struct __PPP_PROJECTION_RESULT { P_PPP_NBFCP_RESULT nbf; P_PPP_IPCP_RESULT ip; P_PPP_IPXCP_RESULT ipx; P_PPP_ATCP_RESULT at; } P_PPP_PROJECTION_RESULT, *PP_PPP_PROJECTION_RESULT; typedef struct _P_RAS_PORT_1 { P_RAS_PORT_0 rasport0; BYTE LineCondition[4]; BYTE HardwareCondition[4]; BYTE LineSpeed[4]; // in bits/second BYTE NumStatistics[2]; BYTE NumMediaParms[2]; BYTE SizeMediaParms[4]; P_PPP_PROJECTION_RESULT ProjResult; } P_RAS_PORT_1, *PP_RAS_PORT_1; typedef struct _P_RAS_FORMAT { BYTE Format[4]; } P_RAS_FORMAT, *PP_RAS_FORMAT; typedef union _P_RAS_VALUE { BYTE Number[4]; struct { BYTE Length[4]; BYTE Offset[4]; } String; } P_RAS_VALUE, *PP_RAS_VALUE; typedef struct _P_RAS_PARAMS { BYTE P_Key[RASSAPI_MAX_PARAM_KEY_SIZE]; P_RAS_FORMAT P_Type; BYTE P_Attributes; P_RAS_VALUE P_Value; } P_RAS_PARAMS, *PP_RAS_PARAMS; typedef struct _P_RAS_SERVER_0 { BYTE TotalPorts[2]; BYTE PortsInUse[2]; BYTE RasVersion[4]; } P_RAS_SERVER_0, *PP_RAS_SERVER_0; typedef struct _P_PORT_ENUM_RECEIVE { BYTE RetCode[4]; BYTE TotalAvail[2]; P_RAS_PORT_0 Data[1]; } P_PORT_ENUM_RECEIVE, *PP_PORT_ENUM_RECEIVE; typedef struct _P_PORT_INFO_RECEIVE { BYTE RetCode[4]; BYTE ReqBufSize[4]; P_RAS_PORT_1 Data; } P_PORT_INFO_RECEIVE, *PP_PORT_INFO_RECEIVE; typedef struct _P_PORT_CLEAR_RECEIVE { BYTE RetCode[4]; } P_PORT_CLEAR_RECEIVE, *PP_PORT_CLEAR_RECEIVE; typedef struct _P_DISCONNECT_USER_RECEIVE { BYTE RetCode[4]; } P_DISCONNECT_USER_RECEIVE, *PP_DISCONNECT_USER_RECEIVE; typedef struct _P_SERVER_INFO_RECEIVE { BYTE RetCode[2]; P_RAS_SERVER_0 Data; } P_SERVER_INFO_RECEIVE, *PP_SERVER_INFO_RECEIVE; typedef struct _P_CLIENT_REQUEST { BYTE RequestCode[2]; BYTE PortName[2 * RASSAPI_MAX_PORT_NAME]; BYTE RcvBufSize[4]; BYTE ClientVersion[4]; } P_CLIENT_REQUEST, *PP_CLIENT_REQUEST; // // The following macros deal with on-the-wire integer and long values // On the wire format is little-endian i.e. a long value of 0x01020304 is // represented as 04 03 02 01. Similarly an int value of 0x0102 is // represented as 02 01. // // The host format is not assumed since it will vary from processor to // processor. // // Get a short from on-the-wire format to the host format #define GETUSHORT(DstPtr, SrcPtr) \ *(unsigned short *)(DstPtr) = \ ((*((unsigned char *)(SrcPtr)+1) << 8) +\ (*((unsigned char *)(SrcPtr)+0))) // Get a dword from on-the-wire format to the host format #define GETULONG(DstPtr, SrcPtr) \ *(unsigned long *)(DstPtr) = \ ((*((unsigned char *)(SrcPtr)+3) << 24) +\ (*((unsigned char *)(SrcPtr)+2) << 16) + \ (*((unsigned char *)(SrcPtr)+1) << 8) + \ (*((unsigned char *)(SrcPtr)+0))) // Put a ushort from the host format to on-the-wire format #define PUTUSHORT(DstPtr, Src) \ *((unsigned char *)(DstPtr)+1)=(unsigned char)((unsigned short)(Src) >> 8),\ *((unsigned char *)(DstPtr)+0)=(unsigned char)(Src) // Put a ulong from the host format to on-the-wire format #define PUTULONG(DstPtr, Src) \ *((unsigned char *)(DstPtr)+3)=(unsigned char)((unsigned long)(Src) >> 24),\ *((unsigned char *)(DstPtr)+2)=(unsigned char)((unsigned long)(Src) >> 16),\ *((unsigned char *)(DstPtr)+1)=(unsigned char)((unsigned long)(Src) >> 8),\ *((unsigned char *)(DstPtr)+0)=(unsigned char)(Src) #endif // _RASSAPIP_H_