Leaked source code of windows server 2003
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
/*++
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
|