/*++ Copyright (c) 1991-92 Microsoft Corporation Module Name: rxmsg.c Abstract: Routines in this module implement the functionality required to remote the NetMessage APIs to down-level servers Contains RxNetMessage routines: RxNetMessageBufferSend RxNetMessageNameAdd RxNetMessageNameDel RxNetMessageNameEnum RxNetMessageNameGetInfo Author: Richard L Firth (rfirth) 20-May-1991 Environment: Win-32/flat address space Notes: Routines in this module assume that caller-supplied parameters have already been verified. No effort is made to further check the veracity of parms. Any actions causing exceptions must be trapped at a higher level. This applies to ALL parameters - strings, pointers, buffers, etc. Revision History: 20-May-1991 rfirth Created 16-Sep-1991 JohnRo Made changes as suggested by PC-LINT. 25-Sep-1991 JohnRo Fixed MIPS build problems. 05-Dec-1991 RFirth Enum returns in TotalEntries (or EntriesLeft) the number of items to be enumerated BEFORE this call. Used to be number left after this call 01-Apr-1992 JohnRo Use NetApiBufferAllocate() instead of private version. --*/ #include "downlevl.h" #include #include NET_API_STATUS RxNetMessageBufferSend( IN LPTSTR ServerName, IN LPTSTR Recipient, IN LPTSTR Sender OPTIONAL, IN LPBYTE Buffer, IN DWORD BufLen ) /*++ Routine Description: Allows a down-level server to send a message buffer to a registered message recipient Arguments: ServerName - Which down-level server to run this API on Recipient - Message name to send buffer to Sender - Optional name used to supply computer name, not logged on user Buffer - Pointer to buffer containing message to send BufLen - size of buffer being sent (bytes) Return Value: NET_API_STATUS Success - NERR_Success Failure - (Return code from down-level NetMessageBufferSend) --*/ { UNREFERENCED_PARAMETER(Sender); return RxRemoteApi(API_WMessageBufferSend, // API # ServerName, // where to do it REMSmb_NetMessageBufferSend_P, // parameter descriptor NULL, NULL, NULL, // no primary data descriptors NULL, NULL, NULL, // or secondaries FALSE, // can't use NULL session Recipient, // API params start here Buffer, BufLen ); } NET_API_STATUS RxNetMessageNameAdd( IN LPTSTR ServerName, IN LPTSTR MessageName ) /*++ Routine Description: Adds a messaging name at a down-level server Arguments: ServerName - Which down-level server to run this API on MessageName - to add Return Value: NET_API_STATUS Success - NERR_Success Failure - (Return code from down-level NetMessageNameAdd) --*/ { return RxRemoteApi(API_WMessageNameAdd, // API # ServerName, // where to do it REMSmb_NetMessageNameAdd_P, // parameter descriptor NULL, NULL, NULL, // no primary data descriptors NULL, NULL, NULL, // or secondaries FALSE, // can't use NULL session MessageName, // API params start here 0 // error if name forwarded ); } NET_API_STATUS RxNetMessageNameDel( IN LPTSTR ServerName, IN LPTSTR MessageName ) /*++ Routine Description: Deletes a messaging name at a down-level server Arguments: ServerName - Which down-level server to run this API on MessageName - to delete Return Value: NET_API_STATUS Success - NERR_Success Failure - (Return code from down-level NetMessageNameDel) --*/ { return RxRemoteApi(API_WMessageNameDel, // API # ServerName, // where to do it REMSmb_NetMessageNameDel_P, // parameter descriptor NULL, NULL, NULL, // no primary data descriptors NULL, NULL, NULL, // or secondaries FALSE, // can't use NULL session MessageName, // API params start here 0 // error if name forwarded ); } NET_API_STATUS RxNetMessageNameEnum( IN LPTSTR ServerName, IN DWORD Level, OUT LPBYTE* Buffer, IN DWORD PrefMaxLen, OUT LPDWORD EntriesRead, OUT LPDWORD EntriesLeft, IN OUT LPDWORD ResumeHandle OPTIONAL ) /*++ Routine Description: description-of-function. Arguments: ServerName - Which down-level server to run this API on Level - Of info to return - 0 or 1 Buffer - Pointer to returned buffer PrefMaxLen - Caller's preferred maximum size of Buffer EntriesRead - Number of entries returned in Buffer EntriesLeft - Number of entries left to enumerate ResumeHandle- Where to resume if all entries not returned. IGNORED Return Value: NET_API_STATUS Success - NERR_Success Failure - ERROR_INVALID_LEVEL (return code from down-level NetMessageNameEnum) --*/ { NET_API_STATUS rc; LPBYTE bufptr; LPDESC pDesc16, pDesc32, pDescSmb; DWORD entries_read, total_entries; UNREFERENCED_PARAMETER(PrefMaxLen); UNREFERENCED_PARAMETER(ResumeHandle); *Buffer = NULL; *EntriesRead = *EntriesLeft = 0; switch (Level) { case 0: pDesc16 = REM16_msg_info_0; pDesc32 = REM32_msg_info_0; pDescSmb = REMSmb_msg_info_0; break; case 1: pDesc16 = REM16_msg_info_1; pDesc32 = REM32_msg_info_1; pDescSmb = REMSmb_msg_info_1; break; default: return ERROR_INVALID_LEVEL; } bufptr = NULL; rc = RxRemoteApi(API_WMessageNameEnum, // API # ServerName, // where to do it REMSmb_NetMessageNameEnum_P, // parameter descriptor pDesc16, // 16-bit data descriptor pDesc32, // 32-bit data descriptor pDescSmb, // SMB data descriptor NULL, NULL, NULL, // no secondary structures ALLOCATE_RESPONSE, Level, // API params start here &bufptr, 65535, &entries_read, &total_entries ); if (rc) { if (bufptr) { (void) NetApiBufferFree(bufptr); } } else { *Buffer = bufptr; *EntriesLeft = total_entries; *EntriesRead = entries_read; } return rc; } NET_API_STATUS RxNetMessageNameGetInfo( IN LPTSTR ServerName, IN LPTSTR MessageName, IN DWORD Level, OUT LPBYTE* Buffer ) /*++ Routine Description: Retrieves information about a specific message name from a down-level server Arguments: ServerName - Which down-level server to run this API on MessageName - Name to get info for Level - Of info required - 0 or 1 Buffer - Where to return buffer containing info Return Value: NET_API_STATUS Success - NERR_Success Failure - ERROR_INVALID_LEVEL (return code from down-level NetMessageNameGetInfo API) --*/ { NET_API_STATUS rc; LPDESC pDesc16, pDesc32, pDescSmb; LPBYTE bufptr; DWORD buflen, total_avail; *Buffer = NULL; switch (Level) { case 0: pDesc16 = REM16_msg_info_0; pDesc32 = REM32_msg_info_0; pDescSmb = REMSmb_msg_info_0; buflen = sizeof(MSG_INFO_0) + STRING_SPACE_REQD(UNLEN); break; case 1: pDesc16 = REM16_msg_info_1; pDesc32 = REM32_msg_info_1; pDescSmb = REMSmb_msg_info_1; buflen = sizeof(MSG_INFO_1) + STRING_SPACE_REQD(2 * UNLEN); break; default: return ERROR_INVALID_LEVEL; } if (rc = NetApiBufferAllocate(buflen, (LPVOID *) &bufptr)) { return rc; } rc = RxRemoteApi(API_WMessageNameGetInfo, // API # ServerName, // where to do it REMSmb_NetMessageNameGetInfo_P, // parameter descriptor pDesc16, // 16-bit data descriptor pDesc32, // 32-bit data descriptor pDescSmb, // SMB data descriptor NULL, NULL, NULL, // no secondary structures FALSE, // can't use NULL session MessageName, // first parameter Level, bufptr, buflen, &total_avail // not used in 32-bit side ); if (rc) { (void) NetApiBufferFree(bufptr); } else { *Buffer = bufptr; } return rc; }