/*++ Copyright (c) 1991-1992 Microsoft Corporation Module Name: SrvEquiv.c Abstract: This file contains support code to convert between old and new server info levels. Author: John Rogers (JohnRo) 02-May-1991 Environment: Portable to any flat, 32-bit environment. (Uses Win32 typedefs.) Requires ANSI C extensions: slash-slash comments, long external names. Revision History: 02-May-1991 JohnRo Created. 09-May-1991 JohnRo Made some LINT-suggested changes. 28-May-1991 JohnRo Added incomplete output parm to RxGetServerInfoLevelEquivalent. 14-Jun-1991 JohnRo Correct IncompleteOutput values. 17-Jul-1991 JohnRo Extracted RxpDebug.h from Rxp.h. 21-Nov-1991 JohnRo Removed NT dependencies to reduce recompiles. 26-Aug-1992 JohnRo RAID 4463: NetServerGetInfo(level 3) to downlevel: assert in convert.c. Use PREFIX_ equates. --*/ // These must be included first: #include // IN, LPVOID, etc. #include // NET_API_STATUS. // These may be included in any order: #include // Old info levels, MAX_ stuff, my prototype. #include // NERR_ and ERROR_ equates. #include // New info level structures. #include // NetpKdPrint(()), FORMAT_ equates, etc. #include // NetpPointerPlusSomeBytes(), etc. #include // PREFIX_ equates. #include // LPDESC, etc. #include // REM16_ REM32_, and REMSmb_ equates. #include // IF_DEBUG(). #include // My prototype. NET_API_STATUS RxGetServerInfoLevelEquivalent ( IN DWORD FromLevel, IN BOOL FromNative, IN BOOL ToNative, OUT LPDWORD ToLevel, OUT LPDESC * ToDataDesc16 OPTIONAL, OUT LPDESC * ToDataDesc32 OPTIONAL, OUT LPDESC * ToDataDescSmb OPTIONAL, OUT LPDWORD FromMaxSize OPTIONAL, OUT LPDWORD FromFixedSize OPTIONAL, OUT LPDWORD FromStringSize OPTIONAL, OUT LPDWORD ToMaxSize OPTIONAL, OUT LPDWORD ToFixedSize OPTIONAL, OUT LPDWORD ToStringSize OPTIONAL, OUT LPBOOL IncompleteOutput OPTIONAL // incomplete (except platform ID) ) /*++ Routine Description: BUGBUG Arguments: BUGBUG Return Value: NET_API_STATUS - NERR_Success or ERROR_INVALID_LEVEL. --*/ { // LPDESC FromDataDesc; // Desc for data we've got. // LPBYTE ToStringArea; NetpAssert(FromNative == TRUE); UNREFERENCED_PARAMETER(FromNative); NetpAssert(ToNative == TRUE); UNREFERENCED_PARAMETER(ToNative); IF_DEBUG(SERVER) { NetpKdPrint(( PREFIX_NETAPI "RxGetServerInfoLevelEquivalent: starting, " "FromLevel=" FORMAT_DWORD ".\n", FromLevel)); } // // Decide what to do based on the info level. Note that normally we'd // be using REM16_, REM32_, and REMSmb_ descriptors here. However, // the REM16_ and REM32_ ones have been modified to reflect a nonexistant // field (svX_platform_id). This messes up the automatic conversions // done by RxRemoteApi. So, we use "downlevel" descriptors (DL_REM16_ // and DL_REM32_) which are defined in DlServer.h. // switch (FromLevel) { case 0 : // 0 is equivalent to level 100 (minus the platform ID). NetpSetOptionalArg(ToLevel, 100); NetpSetOptionalArg(ToDataDesc16, NULL); NetpSetOptionalArg(ToDataDesc32, REM32_server_info_100); NetpSetOptionalArg(ToDataDescSmb, NULL); NetpSetOptionalArg(FromMaxSize, MAX_LEVEL_0_TOTAL_SIZE); NetpSetOptionalArg(FromFixedSize, sizeof(SERVER_INFO_0)); NetpSetOptionalArg(FromStringSize, MAX_LEVEL_0_STRING_SIZE); NetpSetOptionalArg(FromMaxSize, MAX_LEVEL_0_TOTAL_SIZE); NetpSetOptionalArg(ToMaxSize, MAX_LEVEL_100_TOTAL_SIZE); NetpSetOptionalArg(ToFixedSize, sizeof(SERVER_INFO_100)); NetpSetOptionalArg(ToStringSize, MAX_LEVEL_100_STRING_SIZE); NetpSetOptionalArg(IncompleteOutput, FALSE); // all but platform ID // FromDataDesc = REM32_server_info_0; // ToDataDesc = REM32_server_info_100; break; case 1 : // 1 is equivalent to level 101 (minus the platform ID). NetpSetOptionalArg(ToLevel, 101); NetpSetOptionalArg(ToDataDesc16, NULL); NetpSetOptionalArg(ToDataDesc32, REM32_server_info_101); NetpSetOptionalArg(ToDataDescSmb, NULL); NetpSetOptionalArg(FromMaxSize, MAX_LEVEL_1_TOTAL_SIZE); NetpSetOptionalArg(FromFixedSize, sizeof(SERVER_INFO_1)); NetpSetOptionalArg(FromStringSize, MAX_LEVEL_1_STRING_SIZE); NetpSetOptionalArg(ToMaxSize, MAX_LEVEL_101_TOTAL_SIZE); NetpSetOptionalArg(ToFixedSize, sizeof(SERVER_INFO_101)); NetpSetOptionalArg(ToStringSize, MAX_LEVEL_101_STRING_SIZE); NetpSetOptionalArg(IncompleteOutput, FALSE); // all but platform ID break; case 100 : // 100 is superset of level 0. NetpSetOptionalArg(ToLevel, 0); NetpSetOptionalArg(ToDataDesc16, DL_REM16_server_info_0); NetpSetOptionalArg(ToDataDesc32, DL_REM32_server_info_0); NetpSetOptionalArg(ToDataDescSmb, REMSmb_server_info_0); NetpSetOptionalArg(FromMaxSize, MAX_LEVEL_100_TOTAL_SIZE); NetpSetOptionalArg(FromFixedSize, sizeof(SERVER_INFO_100)); NetpSetOptionalArg(FromStringSize, MAX_LEVEL_100_STRING_SIZE); NetpSetOptionalArg(ToMaxSize, MAX_LEVEL_0_TOTAL_SIZE); NetpSetOptionalArg(ToFixedSize, sizeof(SERVER_INFO_0)); NetpSetOptionalArg(ToStringSize, MAX_LEVEL_0_STRING_SIZE); NetpSetOptionalArg(IncompleteOutput, FALSE); // FromDataDesc = REM32_server_info_100; // ToDataDesc = REM32_server_info_0; break; case 101 : // 101 is superset of 1. NetpSetOptionalArg(ToLevel, 1); NetpSetOptionalArg(ToDataDesc16, DL_REM16_server_info_1); NetpSetOptionalArg(ToDataDesc32, DL_REM32_server_info_1); NetpSetOptionalArg(ToDataDescSmb, REMSmb_server_info_1); NetpSetOptionalArg(FromMaxSize, MAX_LEVEL_101_TOTAL_SIZE); NetpSetOptionalArg(FromFixedSize, sizeof(SERVER_INFO_101)); NetpSetOptionalArg(FromStringSize, MAX_LEVEL_101_STRING_SIZE); NetpSetOptionalArg(ToMaxSize, MAX_LEVEL_1_TOTAL_SIZE); NetpSetOptionalArg(ToFixedSize, sizeof(SERVER_INFO_1)); NetpSetOptionalArg(ToStringSize, MAX_LEVEL_1_STRING_SIZE); NetpSetOptionalArg(IncompleteOutput, FALSE); // FromDataDesc = REM32_server_info_101; // ToDataDesc = REM32_server_info_1; break; case 102 : // Level 102 is a subset of old level 2. NetpSetOptionalArg(ToLevel, 2); NetpSetOptionalArg(ToDataDesc16, DL_REM16_server_info_2); NetpSetOptionalArg(ToDataDesc32, DL_REM32_server_info_2); NetpSetOptionalArg(ToDataDescSmb, REMSmb_server_info_2); NetpSetOptionalArg(FromMaxSize, MAX_LEVEL_102_TOTAL_SIZE); NetpSetOptionalArg(FromFixedSize, sizeof(SERVER_INFO_102)); NetpSetOptionalArg(FromStringSize, MAX_LEVEL_102_STRING_SIZE); NetpSetOptionalArg(ToMaxSize, MAX_LEVEL_2_TOTAL_SIZE); NetpSetOptionalArg(ToFixedSize, sizeof(SERVER_INFO_2)); NetpSetOptionalArg(ToStringSize, MAX_LEVEL_2_STRING_SIZE); NetpSetOptionalArg(IncompleteOutput, TRUE); // FromDataDesc = REM32_server_info_102; // ToDataDesc = REM32_server_info_2; break; case 402 : // Level 402 is a subset of old level 2. NetpSetOptionalArg(ToLevel, 2); NetpSetOptionalArg(ToDataDesc16, DL_REM16_server_info_2); NetpSetOptionalArg(ToDataDesc32, DL_REM32_server_info_2); NetpSetOptionalArg(ToDataDescSmb, REMSmb_server_info_2); NetpSetOptionalArg(FromMaxSize, MAX_LEVEL_402_TOTAL_SIZE); NetpSetOptionalArg(FromFixedSize, sizeof(SERVER_INFO_402)); NetpSetOptionalArg(FromStringSize, MAX_LEVEL_402_STRING_SIZE); NetpSetOptionalArg(ToMaxSize, MAX_LEVEL_2_TOTAL_SIZE); NetpSetOptionalArg(ToFixedSize, sizeof(SERVER_INFO_2)); NetpSetOptionalArg(ToStringSize, MAX_LEVEL_2_STRING_SIZE); NetpSetOptionalArg(IncompleteOutput, TRUE); // FromDataDesc = REM32_server_info_402; // ToDataDesc = REM32_server_info_2; break; case 403 : // Level 403 is a subset of old level 3. NetpSetOptionalArg(ToLevel, 3); NetpSetOptionalArg(ToDataDesc16, DL_REM16_server_info_3); NetpSetOptionalArg(ToDataDesc32, DL_REM32_server_info_3); NetpSetOptionalArg(ToDataDescSmb, REMSmb_server_info_3); NetpSetOptionalArg(FromMaxSize, MAX_LEVEL_403_TOTAL_SIZE); NetpSetOptionalArg(FromFixedSize, sizeof(SERVER_INFO_403)); NetpSetOptionalArg(FromStringSize, MAX_LEVEL_403_STRING_SIZE); NetpSetOptionalArg(ToMaxSize, MAX_LEVEL_3_TOTAL_SIZE); NetpSetOptionalArg(ToFixedSize, sizeof(SERVER_INFO_3)); NetpSetOptionalArg(ToStringSize, MAX_LEVEL_3_STRING_SIZE); NetpSetOptionalArg(IncompleteOutput, TRUE); // FromDataDesc = REM32_server_info_403; // ToDataDesc = REM32_server_info_3; break; default : return (ERROR_INVALID_LEVEL); } IF_DEBUG(SERVER) { NetpKdPrint(( PREFIX_NETAPI "RxGetServerInfoLevelEquivalent: returning:\n")); if ( ToLevel != NULL ) { NetpKdPrint((" ToLevel=" FORMAT_DWORD "\n", *ToLevel)); } if (ToDataDesc16 != NULL) { NetpKdPrint((" ToDataDesc16=" FORMAT_LPDESC "\n", *ToDataDesc16)); } if (ToDataDesc32 != NULL) { NetpKdPrint((" ToDataDesc32=" FORMAT_LPDESC "\n", *ToDataDesc32)); } if (ToDataDescSmb != NULL) { NetpKdPrint((" ToDataDescSmb=" FORMAT_LPDESC "\n", *ToDataDescSmb)); } if (FromMaxSize != NULL) { NetpKdPrint((" FromMaxSize=" FORMAT_DWORD "\n", *FromMaxSize)); } if (FromFixedSize != NULL) { NetpKdPrint((" FromFixedSize=" FORMAT_DWORD "\n", *FromFixedSize)); } if (FromStringSize != NULL) { NetpKdPrint((" FromStringSize=" FORMAT_DWORD "\n", *FromStringSize)); } if (ToMaxSize != NULL) { NetpKdPrint((" ToMaxSize=" FORMAT_DWORD "\n", *ToMaxSize)); } if (ToFixedSize != NULL) { NetpKdPrint((" ToFixedSize=" FORMAT_DWORD "\n", *ToFixedSize)); } if (ToStringSize != NULL) { NetpKdPrint((" ToStringSize=" FORMAT_DWORD "\n", *ToStringSize)); } if (IncompleteOutput != NULL) { if (*IncompleteOutput) { NetpKdPrint((" IncompleteOutput=TRUE.\n" )); } else { NetpKdPrint((" IncompleteOutput=FALSE.\n" )); } } } return (NERR_Success); } // RxGetServerInfoLevelEquivalent