/*++ Copyright (c) 1991-92 Microsoft Corporation Module Name: WksGtInf.c Abstract: This file contains the RpcXlate code to handle the NetWkstaGetInfo API. Author: John Rogers (JohnRo) 15-Aug-1991 Environment: Portable to any flat, 32-bit environment. (Uses Win32 typedefs.) Requires ANSI C extensions: slash-slash comments, long external names. Revision History: 15-Aug-1991 JohnRo Implement downlevel NetWksta APIs. 11-Nov-1991 JohnRo Moved most of the code from here to WksGtOld.c for sharing with RxNetWkstaUserEnum(). 21-Nov-1991 JohnRo Removed NT dependencies to reduce recompiles. 07-Feb-1992 JohnRo Use NetApiBufferAllocate() instead of private version. --*/ // These must be included first: #include // IN, DWORD, etc. #include // LM20_ equates, NET_API_STATUS, etc. #include // Needed by . // These may be included in any order: #include // NetpIsNewWkstaInfoLevel(). #include // NetApiBufferAllocate(), NetApiBufferFree(). #include // ERROR_ and NERR_ equates. #include // DBGSTATIC, NetpKdPrint(()), FORMAT_ equates. #include // IF_DEBUG(). #include // My prototypes, RxpGetWkstaInfoLevelEquivalent #include // NetpWkstaStructureInfo(). NET_API_STATUS RxNetWkstaGetInfo ( IN LPTSTR UncServerName, IN DWORD Level, OUT LPBYTE *BufPtr ) /*++ Routine Description: RxNetWkstaGetInfo performs the same function as NetWkstaGetInfo, except that the server name is known to refer to a downlevel server. Arguments: (Same as NetWkstaGetInfo, except UncServerName must not be null, and must not refer to the local computer.) Return Value: (Same as NetWkstaGetInfo.) --*/ { LPBYTE NewApiBuffer32; // Buffer to be returned to caller. DWORD NewApiBufferSize32; DWORD NewFixedSize; DWORD NewStringSize; LPBYTE OldApiBuffer32 = NULL; // Buffer from remote system. DWORD OldLevel; NET_API_STATUS Status; IF_DEBUG(WKSTA) { NetpKdPrint(("RxNetWkstaGetInfo: starting, server=" FORMAT_LPTSTR ", lvl=" FORMAT_DWORD ".\n", UncServerName, Level)); } // // Error check DLL stub and the app. // NetpAssert(UncServerName != NULL); if ( !NetpIsNewWkstaInfoLevel( Level )) { return (ERROR_INVALID_LEVEL); } if (BufPtr == NULL) { return (ERROR_INVALID_PARAMETER); } *BufPtr = NULL; // assume error; it makes error handlers easy to code. // This also forces possible GP fault before we allocate memory. // // Caller must have given us a new info level. Find matching old level. // Status = RxpGetWkstaInfoLevelEquivalent( Level, // from level & OldLevel, // to level NULL // don't care we have incomplete info ); if (Status != NERR_Success) { return (Status); } // // Learn about new info level. // Status = NetpWkstaStructureInfo ( Level, // level to learn about PARMNUM_ALL, // No parmnum with this. TRUE, // Need native sizes. NULL, // don't need data desc16 for new level NULL, // don't need data desc32 for new level NULL, // don't need data descSMB for new level & NewApiBufferSize32, // max buffer size (native) & NewFixedSize, // fixed size. & NewStringSize // string size. ); if (Status != NERR_Success) { return (Status); } // // Actually remote the API, which will get back the (old) info level // data in native format. // Status = RxpWkstaGetOldInfo ( UncServerName, OldLevel, (LPBYTE *) & OldApiBuffer32); // alloc buffer and set ptr NetpAssert( Status != ERROR_MORE_DATA ); NetpAssert( Status != NERR_BufTooSmall ); if (Status == NERR_Success) { // Allocate memory for 32-bit version of new info, which we'll return to // caller. (Caller must free it with NetApiBufferFree.) Status = NetApiBufferAllocate( NewApiBufferSize32, (LPVOID *) & NewApiBuffer32); if (Status != NERR_Success) { if ( OldApiBuffer32 != NULL ) { (void) NetApiBufferFree( OldApiBuffer32 ); } return (Status); } IF_DEBUG(WKSTA) { NetpKdPrint(( "RxNetWkstaGetInfo: allocated new buffer at " FORMAT_LPVOID "\n", (LPVOID) NewApiBuffer32 )); } // // Copy/convert data from OldApiBuffer32 to NewApiBuffer32. // Status = NetpConvertWkstaInfo ( OldLevel, // from level OldApiBuffer32, // FromInfo, TRUE, // from native format Level, // ToLevel, NewApiBuffer32, // ToInfo, NewFixedSize, // ToFixedLength, NewStringSize, // ToStringLength, TRUE, // to native format NULL // don't need string area top ); NetpAssert(Status == NERR_Success); *BufPtr = NewApiBuffer32; } if ( OldApiBuffer32 != NULL ) { (void) NetApiBufferFree( OldApiBuffer32 ); } return (Status); } // RxNetWkstaGetInfo