/*++ Copyright (c) 1991-1992 Microsoft Corporation Module Name: DiskEnum.c Abstract: This file supports downlevel server handling of disk enum requests. Author: John Rogers (JohnRo) 03-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: 03-May-1991 JohnRo Created. 09-May-1991 JohnRo Fixed bug where list wasn't terminated with null string. 09-May-1991 JohnRo Made changes suggested by LINT. 14-May-1991 JohnRo Pass 3 aux descriptors to RxRemoteApi. 24-Oct-1991 JohnRo Handle UNICODE conversion of array at end. 07-Feb-1992 JohnRo Use NetApiBufferAllocate() instead of private version. 05-Jun-1992 JohnRo RAID 11253: NetConfigGetAll fails when remoted to downlevel. --*/ // These must be included first: #include // IN, LPTSTR, etc. #include // NET_API_STATUS, etc. // These may be included in any order: #include // API_WServerDiskEnum. #include // NetApiBufferAllocate(), NetApiBufferFree(). #include // NERR_ and ERROR_ equates. #include // NetpAssert(). #include // REM16_, REMSmb_, REM32_ equates. #include // RxRemoteApi(). #include // My prototype. #include // NetpCopyStrArrayToTStrArray(). // Level 0 entries are 3 chars ("D:\0") each. #define LEVEL_0_LENGTH 3 // Define max size of return area. 26 drives, 3 chars ("D:\0") each. // Also include 1 null char at end of list. #define MAX_RETURN_BUFF_SIZE ( ((26*LEVEL_0_LENGTH)+1) * sizeof(TCHAR) ) NET_API_STATUS RxNetServerDiskEnum ( IN LPTSTR UncServerName, IN DWORD Level, OUT LPBYTE *BufPtr, IN DWORD PrefMaxSize, OUT LPDWORD EntriesRead, OUT LPDWORD TotalEntries, IN OUT LPDWORD Resume_Handle OPTIONAL ) /*++ Routine Description: RxNetServerDiskEnum performs the equivalent of NetServerDiskEnum, except that UncServerName is known to be a downlevel server. Arguments: Same as NetServerDiskEnum. Return Value: Same as NetServerDiskEnum. --*/ { DWORD Status; LPVOID TempBuff = NULL; // This version always returns maximum amount of data available, since // that would only be (26 * 3) + 1 = 79 bytes. Even in Unicode it would // still only be 158 bytes. (If we do decide to use the PrefMaxSize parm, // then we would call NetpAdjustPreferedMaximum here.) DBG_UNREFERENCED_PARAMETER(PrefMaxSize); // This version only supports 1 call to enumerate disks, so resume handle // should never be set to nonzero. But let's check, so caller finds out // they have a buggy program. if (Resume_Handle != NULL) { if (*Resume_Handle != 0) { return (ERROR_INVALID_PARAMETER); } } // Check for other caller's errors. if (Level != 0) { return (ERROR_INVALID_LEVEL); } // // Allocate space for entire area. (Note that we can't reply on // RxRemoteApi's neat new ALLOCATE_RESPONSE handling because the buffer // sent across the wire doesn't include the null at the end of the // array.) // Status = NetApiBufferAllocate(MAX_RETURN_BUFF_SIZE, & TempBuff); if (Status != NERR_Success) { return (Status); } NetpAssert(TempBuff != NULL); // // Ask downlevel server to enumerate disks for us. // Status = RxRemoteApi( API_WServerDiskEnum, // api number UncServerName, // where to execute the API REMSmb_NetServerDiskEnum_P, // parm desc REM16_server_diskenum_0, // data desc (16 bit local) REM16_server_diskenum_0, // data desc (32 bit local) REMSmb_server_diskenum_0, // data desc (SMB version) NULL, // no aux desc 16 NULL, // no aux desc 32 NULL, // no aux desc SMB 0, // flags: normal // rest of API's arguments in LM 2.x format: Level, TempBuff, (DWORD) MAX_RETURN_BUFF_SIZE, EntriesRead, TotalEntries); // We've allocated space for maximum data, so shouldn't get this... NetpAssert(Status != ERROR_MORE_DATA); if (Status != NERR_Success) { (void) NetApiBufferFree(TempBuff); *BufPtr = NULL; } else { LPSTR TempCharArray = TempBuff; // // For some reason, the LM 2.x support for this API doesn't send the // null character which terminates the list. So, we have to force it // in ourselves. // TempCharArray[ (*EntriesRead) * LEVEL_0_LENGTH ] = '\0'; #ifdef UNICODE { LPVOID UnicodeBuff; // // Allocate space for UNICODE version of array. // Status = NetApiBufferAllocate(MAX_RETURN_BUFF_SIZE, & UnicodeBuff); if (Status != NERR_Success) { return (Status); } NetpAssert(UnicodeBuff != NULL); // // Translate result array to Unicode. // NetpCopyStrArrayToTStrArray( UnicodeBuff, // dest (in UNICODE) TempCharArray); // src array (in codepage) (void) NetApiBufferFree( TempBuff ); *BufPtr = UnicodeBuff; } #else // not UNICODE *BufPtr = TempBuff; #endif // not UNICODE } return (Status); }