/********************************************************************/ /** Microsoft LAN Manager **/ /** Copyright(c) Microsoft Corp., 1987-1990 **/ /********************************************************************/ #ifndef _MSRV_INCLUDED #define _MSRV_INCLUDED #include // for ntrtl.h #include // DbgPrint prototypes #include // needed for windows.h when I have nt.h #define WINMM_H #include // ExitThread prototype #include #include #include // NetBios Prototypes and constants #include // Winstation functions (for HYDRA) #include "heap.h" #ifdef LINT #define near #define far #define void int #endif // LINT #define clearncb(x) memset((char *)x,'\0',sizeof(NCB)) // // Constant definitions // #define BUFLEN 200 // Length of NCB_BUF #define TXTMAX 128 // Maximum bytes of text per block #define MAXHEAD 80 // Maximum message header length #define MAXEND 60 // Maximum message end length #define MAXGRPMSGLEN 128 // Max domain message length #define MAX_SIZMESSBUF 62000 // The max size for the message buffer #define MIN_SIZMESSBUF 512 // The min size for the message buffer #define MSNGR_MAX_NETS MAX_LANA // The maximum number of nets the messenger // can handle. (Currently 12) #define TIME_BUF_SIZE 128 // Size of the buffer to hold the message time #define MSGFILENAMLEN PATHLEN*sizeof(TCHAR) // // Messaging name end bytes // #define NAME_LOCAL_END '\003' // 16th byte in local NCB name // // Messenger Thread Manager States (used as return codes) // #define UPDATE_ONLY 0 // no change in state - just send current status. #define STARTING 1 // the messenger is initializing. #define RUNNING 2 // initialization completed normally - now running #define STOPPING 3 // uninstall pending #define STOPPED 4 // uninstalled // // Forced Shutdown PendingCodes // #define PENDING TRUE #define IMMEDIATE FALSE // // Message transfer states // #define MESSTART 0 // Message start state #define MESSTOP 1 // Message stop state #define MESCONT 2 // Message continued state #define MESERR 3 // Message error state // // Alert Size // #define ALERT_MAX_DISPLAYED_MSG_SIZE 4096 // // Special Session Id = -1 (used to indicate that the message has to be broadcast to every session) // #define EVERYBODY_SESSION_ID -1 // Structure definitions // // ncb worker function type // typedef VOID (*PNCBIFCN) ( DWORD NetIndex, // Network Index DWORD NcbIndex, // Network Control Block Index CHAR RetVal // value returned by net bios ); typedef PNCBIFCN LPNCBIFCN; typedef struct _NCB_STATUS { int this_immediate; int last_immediate; unsigned char this_final; unsigned char last_final; unsigned char rep_count; unsigned char align; // *ALIGNMENT* }NCB_STATUS, *PNCB_STATUS, *LPNCB_STATUS; // structure used for keeping the session id list for each alias typedef struct _MSG_SESSION_ID_ITEM { LIST_ENTRY List; ULONG SessionId; } MSG_SESSION_ID_ITEM, *PMSG_SESSION_ID_ITEM; // Per NCB Information typedef struct _NCB_DATA { DWORD MsgPtr; LPNCBIFCN IFunc; NCB_STATUS Status; NCB Ncb; // Structure passed to Netbios CHAR Buffer[BUFLEN]; CHAR Name[NCBNAMSZ + 4]; CHAR Fname[NCBNAMSZ + 4]; SHORT mgid; CHAR State; UCHAR NameFlags; UCHAR NameNum; LIST_ENTRY SessionList; UCHAR Pad[3]; } NCB_DATA, *PNCB_DATA; // Per Network Information typedef struct _NET_DATA { ULONG NumNcbs; PNCB_DATA *NcbList; UCHAR net_lana_num; UCHAR Pad[3]; } NET_DATA, *PNET_DATA; // Global Information typedef struct _GLOBAL_DATA { ULONG NumNets; DWORD LogStatus; DWORD BufSize; PNET_DATA NetData; PCHAR Buffer; } GLOBAL_DATA, *PGLOBAL_DATA; extern GLOBAL_DATA GlobalData; #define NCB_INIT_ENTRIES 16 // Initial number of NCB allocated per network // For Multi-user systems, we allow up to 256 NCBs per network #define NCB_MAX_ENTRIES 256 // Maximum number of NCBs per network #define SESSION_MAX 256 // // Name Flag definitions // #define NFNEW 0x01 // New name #define NFDEL 0x02 // Name deleted #define NFFOR 0x04 // Messages forwarded // #define NFFWDNAME 0x10 // Forward-name #define NFMACHNAME 0x20 // Machine name (undeletable) #define NFLOCK 0x40 // Name entry locked #define NFDEL_PENDING 0x80 // Delete name issued but not complete*/ // // The messenger mailslot for domain messaging // #define MESSNGR_MS_NAME "\\\\.\\mailslot\\messngr" // // Structure and macro definitions // #ifdef INULL // If heap structures defined // // Multi-block message header // typedef struct { HEAPHDR mbb_hp; // Heap block header DWORD mbb_next; // Link to next message SYSTEMTIME mbb_bigtime; // Date of message DWORD mbb_btext; // Link to last text block DWORD mbb_ftext; // Link to first text block DWORD mbb_state; // State flag }MBB; #define MBB_CODE(x) HP_FLAG((x).mbb_hp) #define MBB_NEXT(x) (x).mbb_next #define MBB_BIGTIME(x) (x).mbb_bigtime #define MBB_BTEXT(x) (x).mbb_btext #define MBB_FTEXT(x) (x).mbb_ftext #define MBB_STATE(x) (x).mbb_state #define MBBPTR(x) ((MBB far *) &heap[(x)]) // // Multi-block message text // typedef struct { HEAPHDR mbt_hp; // Heap block header DWORD mbt_next; // Link to next block (offset) DWORD mbt_bytecount; // *ALIGNMENT2* }MBT, *PMBT, *LPMBT; #define MBT_CODE(x) HP_FLAG((x).mbt_hp) #define MBT_NEXT(x) (x).mbt_next #define MBT_COUNT(x) (x).mbt_bytecount // *ALIGNMENT2* #define MBTPTR(x) ((LPMBT) &heap[(x)]) #endif // INULL - End heap access macros // // A one session/name status structure // typedef struct _MSG_SESSION_STATUS{ SESSION_HEADER SessHead; SESSION_BUFFER SessBuffer[SESSION_MAX]; }MSG_SESSION_STATUS, *PMSG_SESSION_STATUS, *LPMSG_SESSION_STATUS; // // Shared data access macros // #define GETNCBDATA(n, x) GlobalData.NetData[(n)].NcbList[(x)] #define GETNCB(n, x) &GlobalData.NetData[(n)].NcbList[(x)]->Ncb #define GETNETLANANUM(n) GlobalData.NetData[(n)].net_lana_num #define NETLANANUM GETNETLANANUM #define GETNETDATA(n) &GlobalData.NetData[(n)] #define SD_NUMNETS() GlobalData.NumNets #define SD_NAMEFLAGS(n, x) GlobalData.NetData[(n)].NcbList[(x)]->NameFlags #define SD_NAMENUMS(n, x) GlobalData.NetData[(n)].NcbList[(x)]->NameNum #define SD_NAMES(n, x) GlobalData.NetData[(n)].NcbList[(x)]->Name #define SD_BUFLEN() GlobalData.BufSize #define SD_MESLOG() GlobalData.LogStatus #define SD_MESPTR(n, x) GlobalData.NetData[(n)].NcbList[(x)]->MsgPtr #define SD_BUFFER() GlobalData.Buffer #define SD_SIDLIST(n,x) GlobalData.NetData[(n)].NcbList[(x)]->SessionList #define NCBMAX(n) GlobalData.NetData[(n)].NumNcbs // // No. of repeated consectutive NCB errors required to abort the // message server. // #define SHUTDOWN_THRESHOLD 10 // // Database Lock requests for the MsgDatabaseLock function. // typedef enum _MSG_LOCK_REQUEST { MSG_INITIALIZE, MSG_GET_SHARED, MSG_GET_EXCLUSIVE, MSG_RELEASE } MSG_LOCK_REQUEST, *PMSG_LOCK_REQUEST, *LPMSG_LOCK_REQUEST; // // Macros to deregister a thread pool item and close // a handle once and only once // #define DEREGISTER_WORK_ITEM(g_hWorkItem) \ { \ HANDLE hTemp = InterlockedExchangePointer(&g_hWorkItem, NULL); \ \ if (hTemp != NULL) \ { \ NTSTATUS Status = RtlDeregisterWait(hTemp); \ \ if (!NT_SUCCESS(Status)) \ { \ MSG_LOG2(ERROR, \ "RtlDeregisterWait on %p failed %x\n", \ hTemp, \ Status); \ } \ } \ } #define CLOSE_HANDLE(HandleToClose, InvalidHandleValue) \ { \ HANDLE hTemp = InterlockedExchangePointer(&HandleToClose, InvalidHandleValue); \ \ if (hTemp != InvalidHandleValue) \ { \ CloseHandle(hTemp); \ } \ } // // global variables // extern BOOL g_IsTerminalServer; // WinStationQueryInformationW typedef BOOLEAN (*PWINSTATION_QUERY_INFORMATION) ( HANDLE hServer, ULONG SessionId, WINSTATIONINFOCLASS WinStationInformationClass, PVOID pWinStationInformation, ULONG WinStationInformationLength, PULONG pReturnLength ); extern PWINSTATION_QUERY_INFORMATION gpfnWinStationQueryInformation; // WinStationSendMessageW typedef BOOLEAN (*PWINSTATION_SEND_MESSAGE) ( HANDLE hServer, ULONG SessionId, LPWSTR pTitle, ULONG TitleLength, LPWSTR pMessage, ULONG MessageLength, ULONG Style, ULONG Timeout, PULONG pResponse, BOOLEAN DoNotWait ); extern PWINSTATION_SEND_MESSAGE gpfnWinStationSendMessage; // WinStationFreeMemory typedef BOOLEAN (*PWINSTATION_FREE_MEMORY) ( PVOID pBuffer ); extern PWINSTATION_FREE_MEMORY gpfnWinStationFreeMemory; // WinStationEnumerateW typedef BOOLEAN (*PWINSTATION_ENUMERATE) ( HANDLE hServer, PLOGONIDW *ppLogonId, PULONG pEntries ); extern PWINSTATION_ENUMERATE gpfnWinStationEnumerate; // // Function Prototypes // DWORD GetMsgrState( VOID ); VOID MsgrBlockStateChange( VOID ); VOID MsgrUnblockStateChange( VOID ); NET_API_STATUS MsgAddName( LPTSTR Name, ULONG SessionId ); VOID MsgAddUserNames( VOID ); VOID MsgAddAlreadyLoggedOnUserNames( VOID ); DWORD MsgBeginForcedShutdown( IN BOOL PendingCode, IN DWORD ExitCode ); BOOL MsgDatabaseLock( IN MSG_LOCK_REQUEST request, IN LPSTR idString ); BOOL MsgConfigurationLock( IN MSG_LOCK_REQUEST request, IN LPSTR idString ); NTSTATUS MsgInitCriticalSection( PRTL_CRITICAL_SECTION pCritsec ); NTSTATUS MsgInitResource( PRTL_RESOURCE pResource ); DWORD MsgDisplayInit( VOID ); BOOL MsgDisplayQueueAdd( IN LPSTR pMsgBuffer, IN DWORD MsgSize, IN ULONG SessionId, IN SYSTEMTIME BigTime ); VOID MsgDisplayThreadWakeup( VOID ); VOID MsgDisplayEnd( VOID ); NET_API_STATUS MsgInitializeMsgr( IN DWORD argc, IN LPTSTR *argv ); NET_API_STATUS MsgrInitializeMsgrInternal1( void ); NET_API_STATUS MsgrInitializeMsgrInternal2( void ); NET_API_STATUS MsgNewName( IN DWORD neti, IN DWORD ncbi ); VOID MsgrShutdown( ); VOID MsgThreadWakeup( VOID ); VOID MsgStatusInit( VOID ); DWORD MsgStatusUpdate( IN DWORD NewState ); VOID MsgThreadCloseAll( VOID ); DWORD MsgThreadManagerInit( VOID ); NET_API_STATUS MsgInit_NetBios( VOID ); BOOL MsgServeNCBs( DWORD net // Which network am I serving? ); VOID MsgServeNameReqs( IN DWORD net ); VOID MsgReadGroupMailslot( VOID ); NET_API_STATUS MsgServeGroupMailslot( VOID ); NET_API_STATUS MsgFmtNcbName( OUT PCHAR DestBuf, IN LPTSTR Name, IN DWORD Type); DWORD Msghdrprint( int action, // Where to log the header to. LPSTR from, // Name of sender LPSTR to, // Name of recipient SYSTEMTIME bigtime, // Bigtime of message HANDLE file_handle // Output file handle*/ ); DWORD Msglogmbb( LPSTR from, // Name of sender LPSTR to, // Name of recipient DWORD net, // Which network ? DWORD ncbi // Network Control Block index ); UCHAR Msglogmbe( DWORD state, // Final state of message DWORD net, // Which network? DWORD ncbi // Network Control Block index ); DWORD Msglogmbt( LPSTR text, // Text of message DWORD net, // Which network? DWORD ncbi // Network Control Block index ); DWORD Msglogsbm( LPSTR from, // Name of sender LPSTR to, // Name of recipient LPSTR text, // Text of message ULONG SessionId // Session Id ); VOID Msgmbmfree( DWORD mesi ); DWORD Msgmbmprint( int action, DWORD mesi, HANDLE file_handle, LPDWORD pdwAlertFlag ); DWORD MsgrCtrlHandler( IN DWORD dwControl, IN DWORD dwEventType, IN LPVOID lpEventData, IN LPVOID lpContext ); UCHAR Msgsendncb( PNCB NcbPtr, DWORD neti ); int Msgsmbcheck( LPBYTE buffer, USHORT size, UCHAR func, int parms, LPSTR fields ); NET_API_STATUS MsgStartListen( DWORD net, DWORD ncbi ); DWORD Msgtxtprint( int action, // Alert, File, or Alert and file LPSTR text, // Pointer to text DWORD length, // Length of text HANDLE file_handle // Log file handle ); NET_API_STATUS MsgInitSupportSeg( VOID ); VOID MsgFreeSupportSeg( VOID ); VOID MsgFreeSharedData( VOID ); BOOL MsgCreateWakeupSems( DWORD NumNets ); BOOL MsgCreateWakeupEvent( void ); VOID MsgCloseWakeupSems( VOID ); VOID MsgCloseWakeupEvent( VOID ); NET_API_STATUS MsgInitGroupSupport( DWORD iGrpMailslotWakeupSem ); VOID MsgGrpThreadShutdown( VOID ); DWORD MsgGetNumNets( VOID ); NET_API_STATUS MultiUserInitMessage( VOID ); VOID MsgArrivalBeep( ULONG SessionId ); INT DisplayMessage( LPWSTR pMessage, LPWSTR pTitle, ULONG SessionId ); NET_API_STATUS MsgGetClientSessionId( OUT PULONG pSessionId ); VOID MsgNetEventCompletion( PVOID pvContext, // This passed in as context. BOOLEAN fWaitStatus ); #endif // MSRV_INCLUDED