windows-nt/Source/XPSP1/NT/ds/netapi/svcdlls/srvsvc/server/disk.c

183 lines
3.9 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*++
Copyright (c) 1992 Microsoft Corporation
Module Name:
disk.c
Abstract:
This module contains support for the NetServerDiskEnum API for the NT
OS/2 server service.
Author:
Johnson Apacible (johnsona) 19-March-1992
Revision History:
--*/
#include "srvsvcp.h"
#include "nturtl.h"
#include "winbase.h"
NET_API_STATUS NET_API_FUNCTION
NetrServerDiskEnum(
IN LPTSTR ServerName,
IN DWORD Level,
IN OUT DISK_ENUM_CONTAINER *DiskInfoStruct,
IN DWORD PrefMaxLen,
OUT LPDWORD TotalEntries,
IN OUT LPDWORD ResumeHandle
)
/*++
Routine Description:
This routine communicates with the server FSD to implement the
server half of the NetServerDiskEnum function.
Arguments:
ServerName - optional name of server.
Level - must be 0
DiskInfoStruct - the output buffer.
PrefMaxLen - the preferred maximum length of the output buffer.
TotalEntries - total number of drive entries in the output buffer.
ResumeHandle - ignored.
Return Value:
NET_API_STATUS - NO_ERROR or reason for failure.
--*/
{
NET_API_STATUS error;
TCHAR diskName[4];
UINT i;
UINT driveType;
UINT totalBytes = 0;
LPTSTR tempBuffer;
LPTSTR currentDiskInfo;
ServerName, PrefMaxLen, ResumeHandle;
//
// The only valid level is 0.
//
if ( Level != 0 ) {
return ERROR_INVALID_LEVEL;
}
if (DiskInfoStruct->Buffer != NULL) {
// The InfoStruct is defined as a parameter. However the Buffer
// parameter is only used as out. In these cases we need to free
// the buffer allocated by RPC if the client had specified a non
// NULL value for it.
MIDL_user_free(DiskInfoStruct->Buffer);
DiskInfoStruct->Buffer = NULL;
}
//
// Make sure that the caller is allowed to get disk information from
// the server.
//
error = SsCheckAccess(
&SsDiskSecurityObject,
SRVSVC_DISK_ENUM
);
if ( error != NO_ERROR ) {
return ERROR_ACCESS_DENIED;
}
//
// Go through all the driver letters, get those that does not return
// an error.
//
tempBuffer = MIDL_user_allocate(
(SRVSVC_MAX_NUMBER_OF_DISKS * (3 * sizeof(TCHAR))) +
sizeof(TCHAR)
);
if ( tempBuffer == NULL ) {
return ERROR_NOT_ENOUGH_MEMORY;
}
currentDiskInfo = tempBuffer;
diskName[0] = 'A';
diskName[1] = ':';
diskName[2] = '\\';
diskName[3] = '\0';
*TotalEntries = 0;
for ( i = 0; i < SRVSVC_MAX_NUMBER_OF_DISKS; i++ ) {
driveType = SsGetDriveType( diskName );
if ( driveType == DRIVE_FIXED ||
driveType == DRIVE_CDROM ||
driveType == DRIVE_REMOVABLE ||
driveType == DRIVE_RAMDISK ) {
//
// This is a valid disk
//
(*TotalEntries)++;
*(currentDiskInfo++) = diskName[0];
*(currentDiskInfo++) = ':';
*(currentDiskInfo++) = '\0';
}
diskName[0]++;
}
#ifdef UNICODE
*currentDiskInfo = UNICODE_NULL;
#else
*currentDiskInfo = '\0';
#endif
//
// EntriesRead must be one greater than TotalEntries so RPC can
// marshal the output strings back to the client correctly.
//
totalBytes = ((*TotalEntries) * (3 * sizeof(TCHAR))) + sizeof(TCHAR);
DiskInfoStruct->EntriesRead = (*TotalEntries) + 1;
DiskInfoStruct->Buffer = MIDL_user_allocate( totalBytes );
if ( DiskInfoStruct->Buffer != NULL ) {
RtlCopyMemory(
DiskInfoStruct->Buffer,
tempBuffer,
totalBytes
);
} else {
MIDL_user_free(tempBuffer);
return ERROR_NOT_ENOUGH_MEMORY;
}
MIDL_user_free( tempBuffer );
return NO_ERROR;
} // NetrServerDiskEnum