183 lines
3.9 KiB
C
183 lines
3.9 KiB
C
|
/*++
|
|||
|
|
|||
|
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
|
|||
|
|
|||
|
|