/*++ Copyright (c) 1996 Microsoft Corporation Module Name: irda.h Abstract: irda.sys Author: Zed (mikezin) 09-Sep-1996 mbert Sept 97 --*/ #include extern POBJECT_TYPE *IoFileObjectType; #define SHIFT10000 13 #define CTEConvert100nsToMilliseconds(HnsTime) \ RtlExtendedMagicDivide((HnsTime), Magic10000, SHIFT10000) #define FSCTL_IRDA_BASE FILE_DEVICE_NETWORK #define LSAPSEL_TXT "LSAP-SEL" #define LSAPSEL_TXTLEN 8 #define TTP_CREDIT_ADVANCE_THRESH 8 #define TTP_RECV_MAX_SDU 0 // unlimited #define DEFAULT_LAZY_DSCV_INTERVAL 4 // How many times should we retry making a connection if // the link is busy? (lazy discoveries you know from peer can block connection.) #define BUSY_LINK_CONN_RETRIES 6 #define BUSY_LINK_CONN_RETRY_WAIT 200 // msec before retry attempt #define EXPDEVID(Id) (Id)[0], (Id)[1], (Id)[2], (Id)[3] // // Winsock error codes are also defined in winerror.h // Hence the IFDEF // #ifndef WSABASEERR // wmz from winsock.h #define WSABASEERR 10000 #define WSAEINTR (WSABASEERR+4) #define WSAEBADF (WSABASEERR+9) #define WSAEACCES (WSABASEERR+13) #define WSAEFAULT (WSABASEERR+14) #define WSAEINVAL (WSABASEERR+22) #define WSAEMFILE (WSABASEERR+24) #define WSAEWOULDBLOCK (WSABASEERR+35) #define WSAEINPROGRESS (WSABASEERR+36) #define WSAEALREADY (WSABASEERR+37) #define WSAENOTSOCK (WSABASEERR+38) #define WSAEDESTADDRREQ (WSABASEERR+39) #define WSAEMSGSIZE (WSABASEERR+40) #define WSAEPROTOTYPE (WSABASEERR+41) #define WSAENOPROTOOPT (WSABASEERR+42) #define WSAEPROTONOSUPPORT (WSABASEERR+43) #define WSAESOCKTNOSUPPORT (WSABASEERR+44) #define WSAEOPNOTSUPP (WSABASEERR+45) #define WSAEPFNOSUPPORT (WSABASEERR+46) #define WSAEAFNOSUPPORT (WSABASEERR+47) #define WSAEADDRINUSE (WSABASEERR+48) #define WSAEADDRNOTAVAIL (WSABASEERR+49) #define WSAENETDOWN (WSABASEERR+50) #define WSAENETUNREACH (WSABASEERR+51) #define WSAENETRESET (WSABASEERR+52) #define WSAECONNABORTED (WSABASEERR+53) #define WSAECONNRESET (WSABASEERR+54) #define WSAENOBUFS (WSABASEERR+55) #define WSAEISCONN (WSABASEERR+56) #define WSAENOTCONN (WSABASEERR+57) #define WSAESHUTDOWN (WSABASEERR+58) #define WSAETOOMANYREFS (WSABASEERR+59) #define WSAETIMEDOUT (WSABASEERR+60) #define WSAECONNREFUSED (WSABASEERR+61) #define WSAELOOP (WSABASEERR+62) #define WSAENAMETOOLONG (WSABASEERR+63) #define WSAEHOSTDOWN (WSABASEERR+64) #define WSAEHOSTUNREACH (WSABASEERR+65) #define WSAENOTEMPTY (WSABASEERR+66) #define WSAEPROCLIM (WSABASEERR+67) #define WSAEUSERS (WSABASEERR+68) #define WSAEDQUOT (WSABASEERR+69) #define WSAESTALE (WSABASEERR+70) #define WSAEREMOTE (WSABASEERR+71) #define WSAEDISCON (WSABASEERR+101) #endif // ifdef WSABASEERR #define IRDA_MIN_LSAP_SEL 1 #define IRDA_MAX_LSAP_SEL 127 typedef enum { IRDA_CONN_CREATED, // don't change order IRDA_CONN_CLOSING, IRDA_CONN_OPENING, IRDA_CONN_OPEN } IRDA_CONN_STATES; typedef enum { CONNECTION_UP, CONNECTION_DOWN, CONNECTION_INTERRUPTED } IRDA_CONNECTION_STATUS; // Irmon taskbar status #define ADDR_OBJ_SIG 0xAAAAAAAA #define CONN_OBJ_SIG 0xCCCCCCCC #define IS_VALID_ADDR(p) (((p) != NULL) && ((p)->Sig == ADDR_OBJ_SIG)) #define IS_VALID_CONN(p) (((p) != NULL) && ((p)->Sig == CONN_OBJ_SIG)) #define IRLPT_MODE1 1 #define IRLPT_MODE2 2 #define UNMARK_IRP_PENDING(_Request) \ (((IoGetCurrentIrpStackLocation(_Request))->Control) &= ~SL_PENDING_RETURNED) typedef struct _IRDA_CONN_OBJ *PIRDA_CONN_OBJ; typedef struct _IRDA_ADDR_OBJ { CTELock Lock; struct _IRDA_ADDR_OBJ *pNext; PIRDA_CONN_OBJ ConnObjList; BOOLEAN IsServer; UINT UseIrlptMode; BOOLEAN Use9WireMode; TDI_ADDRESS_IRDA LocalAddr; int LocalLsapSel; PVOID IasAttribHandle; PTDI_IND_CONNECT pEventConnect; PVOID pEventConnectContext; PTDI_IND_DISCONNECT pEventDisconnect; PVOID pEventDisconnectContext; PTDI_IND_RECEIVE pEventReceive; PVOID pEventReceiveContext; #if DBG unsigned Sig; int LockLine; #endif } IRDA_ADDR_OBJ, *PIRDA_ADDR_OBJ; typedef struct _IRDA_CONN_OBJ { CTELock Lock; struct _IRDA_CONN_OBJ *pNext; PIRDA_ADDR_OBJ pAddr; PVOID ClientContext; PVOID IrlmpContext; IRDA_CONN_STATES ConnState; BOOLEAN IsServer; LIST_ENTRY RecvIrpList; LIST_ENTRY SendIrpList; LIST_ENTRY SendIrpPassiveList; #if DBG unsigned Sig; int LockLine; int TotalFramesCnt; int CreditsExtended; int TotalByteCount; #endif TDI_ADDRESS_IRDA LocalAddr; int LocalLsapSel; TDI_ADDRESS_IRDA RemoteAddr; int RemoteLsapSel; int SendMaxSDU; int SendMaxPDU; int TtpRecvCreditsLeft; int RetryConnCount; IRDA_TIMER RetryConnTimer; REF_CNT RefCnt; CTEEvent SendEvent; LIST_ENTRY RecvBufList; BOOLEAN RecvBusy; BOOLEAN ConnectionUp; } IRDA_CONN_OBJ, *PIRDA_CONN_OBJ; typedef struct { LIST_ENTRY Linkage; UINT Len; UINT Offset; UCHAR Data[IRDA_MAX_DATA_SIZE]; UINT FinalSeg; } IRDA_RECV_BUF, *PIRDA_RECV_BUF; typedef struct { LIST_ENTRY Linkage; PVOID AttribHandle; PFILE_OBJECT pFileObject; } IRDA_IAS_ATTRIB, *PIRDA_IAS_ATTRIB; #if DBG #define GET_CONN_LOCK(pConn, Handle) { \ CTEGetLock(&(pConn)->Lock, Handle); \ (pConn)->LockLine = __LINE__; \ } #define FREE_CONN_LOCK(pConn, Handle) { \ CTEAssert((pConn)->LockLine != 0) \ (pConn)->LockLine = 0; \ CTEFreeLock(&(pConn)->Lock, Handle); \ } #define GET_ADDR_LOCK(pAddr, Handle) { \ CTEGetLock(&(pAddr)->Lock, Handle); \ (pAddr)->LockLine = __LINE__; \ } #define FREE_ADDR_LOCK(pAddr, Handle) { \ CTEAssert((pAddr)->LockLine != 0); \ (pAddr)->LockLine = 0; \ CTEFreeLock(&(pAddr)->Lock, Handle); \ } #else #define GET_CONN_LOCK(pConn,Handle) CTEGetLock(&(pConn)->Lock, Handle) #define FREE_CONN_LOCK(pConn,Handle) CTEFreeLock(&(pConn)->Lock, Handle) #define GET_ADDR_LOCK(pAddr,Handle) CTEGetLock(&(pAddr)->Lock, Handle) #define FREE_ADDR_LOCK(pAddr,Handle) CTEFreeLock(&(pAddr)->Lock, Handle) #endif NTSTATUS DriverEntry( PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegistryPath); VOID DriverUnload( PDRIVER_OBJECT pDriverObject); NTSTATUS IrDADispatch( PDEVICE_OBJECT pDeviceObject, PIRP pIrp); NTSTATUS IrDACreate( PDEVICE_OBJECT pDeviceObject, PIRP pIrp, PIO_STACK_LOCATION pIrpSp); FILE_FULL_EA_INFORMATION UNALIGNED * FindEA( PFILE_FULL_EA_INFORMATION pStartEA, CHAR *pTargetName, USHORT TargetNameLength); NTSTATUS IrDACleanup( PDEVICE_OBJECT pDeviceObject, PIRP pIrp, PIO_STACK_LOCATION pIrpSp); void IrDACloseObjectComplete( void *pContext, unsigned int Status, unsigned int UnUsed); NTSTATUS IrDAClose( PIRP pIrp, PIO_STACK_LOCATION pIrpSp); NTSTATUS IrDADispatchInternalDeviceControl( PDEVICE_OBJECT pDeviceObject, PIRP pIrp); NTSTATUS IrDADispatchDeviceControl( PIRP pIrp, PIO_STACK_LOCATION pIrpSp); NTSTATUS TdiDispatch( PIRP pIrp, PIO_STACK_LOCATION pIrpSp, BOOLEAN Pendable, BOOLEAN Cancelable); void TdiDispatchReqComplete( void *pContext, unsigned int Status, unsigned int ByteCount); void TdiCancelIrp( PDEVICE_OBJECT pDeviceObject, PIRP pIrp); NTSTATUS TdiQueryInformation( PIRP pIrp, PIO_STACK_LOCATION pIrpSp); NTSTATUS TdiSetInformation( PIRP pIrp, PIO_STACK_LOCATION pIrpSp); NTSTATUS TdiSetEvent( PIRDA_ADDR_OBJ pAddrObj, int Type, PVOID pHandler, PVOID pContext); int GetLsapSelServiceName( CHAR *ServiceName); VOID FreeConnObject( PIRDA_CONN_OBJ pConn); NTSTATUS TdiOpenAddress( PIRDA_ADDR_OBJ *ppNewAddrObj, TRANSPORT_ADDRESS UNALIGNED *pAddrList, USHORT AddrListLen); NTSTATUS TdiOpenConnection( PIRDA_CONN_OBJ *ppNewConnObj, PVOID pContext, USHORT ContextLen); NTSTATUS TdiCloseAddress( PIRDA_ADDR_OBJ pAddrObj); NTSTATUS TdiCloseConnection( PIRDA_CONN_OBJ pConnObj); NTSTATUS TdiAssociateAddress( PIRP pIrp, PIO_STACK_LOCATION pIrpSp); NTSTATUS TdiDisassociateAddress( PIRP pIrp, PIO_STACK_LOCATION pIrpSp); NTSTATUS TdiConnect( PIRP pIrp, PIO_STACK_LOCATION pIrpSp); NTSTATUS TdiDisconnect( PIRP pIrp, PIO_STACK_LOCATION pIrpSp, PIRDA_CONN_OBJ pConn); NTSTATUS TdiSend( PIRP pIrp, PIO_STACK_LOCATION pIrpSp); VOID TdiSendAtPassiveCallback( struct CTEEvent *Event, PVOID Arg); NTSTATUS TdiSendAtPassive( PIRP pIrp, PIO_STACK_LOCATION pIrpSp); NTSTATUS TdiReceive( PIRP pIrp, PIO_STACK_LOCATION pIrpSp); VOID PendingIasRequestCallback( struct CTEEvent *Event, PVOID Arg); VOID IrlmpGetValueByClassConf( IRDA_MSG *pMsg); ULONG GetMdlChainByteCount( PMDL pMdl); VOID CancelIrp( PDEVICE_OBJECT DeviceObject, PIRP pIrp); VOID CancelConnObjIrp( PDEVICE_OBJECT DeviceObject, PIRP pIrp); VOID PendIrp( PLIST_ENTRY pList, PIRP pIrp, PIRDA_CONN_OBJ pConn, BOOLEAN LockHeld); NTSTATUS InitiateIasQuery( PIRP pIrp, PIO_STACK_LOCATION pIrpSp, PIRDA_CONN_OBJ pConn); int GetUnusedLsapSel(); VOID SetLsapSelAddr( int LsapSel, CHAR *ServiceName); BOOLEAN MyStrEqual( CHAR *Str1, CHAR *Str2, int Len); VOID RetryConnection( PIRDA_CONN_OBJ pConn, PIRP pIrp ); VOID RetryConnTimerExp( PVOID Context); VOID LazyDscvTimerExp(PVOID Context); #if DBG char * IrpMJTxt( PIO_STACK_LOCATION pIrpSp); char * IrpTdiTxt( PIO_STACK_LOCATION pIrpSp); char * IrpTdiObjTypeTxt( PIO_STACK_LOCATION pIrpSp); char * TdiEventTxt( int EventType); void DumpObjects(void); char * IrDAPrimTxt( IRDA_SERVICE_PRIM Prim); char * TdiQueryTxt(LONG Type); #else #define DumpObjects() #endif