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

334 lines
6.5 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*++
Copyright (c) 1991-1992 Microsoft Corporation
Module Name:
File.c
Abstract:
This module contains support for the File catagory of APIs for the
NT server service.
Author:
David Treadwell (davidtr) 13-Feb-1991
Revision History:
--*/
#include "srvsvcp.h"
//
// Forward declarations.
//
NET_API_STATUS
FileEnumCommon (
IN LPTSTR BasePath,
IN LPTSTR UserName,
IN DWORD Level,
OUT LPBYTE *Buffer,
IN DWORD PreferredMaximumLength,
OUT LPDWORD EntriesRead,
OUT LPDWORD TotalEntries,
IN OUT LPDWORD ResumeHandle OPTIONAL,
IN BOOLEAN IsGetInfo
);
NET_API_STATUS NET_API_FUNCTION
NetrFileClose (
IN LPTSTR ServerName,
IN DWORD FileId
)
/*++
Routine Description:
This routine communicates with the server FSD and FSP to implement the
NetFileClose function.
Arguments:
None.
Return Value:
NET_API_STATUS - NO_ERROR or reason for failure.
--*/
{
NET_API_STATUS error;
PSERVER_REQUEST_PACKET srp;
ServerName;
//
// Make sure that the caller is allowed to close files in the server.
//
error = SsCheckAccess( &SsFileSecurityObject, SRVSVC_FILE_CLOSE );
if ( error != NO_ERROR ) {
return ERROR_ACCESS_DENIED;
}
//
// Set up the request packet. We use the name buffer pointer to
// hold the file ID of the file to close.
//
srp = SsAllocateSrp( );
if ( srp == NULL ) {
return ERROR_NOT_ENOUGH_MEMORY;
}
srp->Parameters.Get.ResumeHandle = FileId;
//
// Simply send the request on to the server.
//
error = SsServerFsControl( FSCTL_SRV_NET_FILE_CLOSE, srp, NULL, 0 );
SsFreeSrp( srp );
return error;
} // NetrFileClose
NET_API_STATUS NET_API_FUNCTION
NetrFileEnum (
IN LPTSTR ServerName,
IN LPTSTR BasePath,
IN LPTSTR UserName,
OUT PFILE_ENUM_STRUCT InfoStruct,
IN DWORD PreferredMaximumLength,
OUT LPDWORD TotalEntries,
IN OUT LPDWORD ResumeHandle OPTIONAL
)
/*++
Routine Description:
This routine communicates with the server FSD to implement the
NetFileEnum function.
Arguments:
None.
Return Value:
NET_API_STATUS - NO_ERROR or reason for failure.
--*/
{
NET_API_STATUS error;
ServerName;
//
// Make sure that the caller is allowed to set share information in the
// server.
//
error = SsCheckAccess(
&SsFileSecurityObject,
SRVSVC_FILE_INFO_GET
);
if ( error != NO_ERROR ) {
return ERROR_ACCESS_DENIED;
}
if( InfoStruct->FileInfo.Level3 == NULL ) {
return ERROR_INVALID_PARAMETER;
}
return FileEnumCommon(
BasePath,
UserName,
InfoStruct->Level,
(LPBYTE *)&InfoStruct->FileInfo.Level3->Buffer,
PreferredMaximumLength,
&InfoStruct->FileInfo.Level3->EntriesRead,
TotalEntries,
ResumeHandle,
FALSE
);
} // NetrFileEnum
NET_API_STATUS NET_API_FUNCTION
NetrFileGetInfo (
IN LPTSTR ServerName,
IN DWORD FileId,
IN DWORD Level,
OUT LPFILE_INFO InfoStruct
)
/*++
Routine Description:
This routine communicates with the server FSD to implement the
NetFileGetInfo function.
Arguments:
None.
Return Value:
NET_API_STATUS - NO_ERROR or reason for failure.
--*/
{
NET_API_STATUS error;
ULONG entriesRead;
ULONG totalEntries;
ULONG resumeHandle = FileId;
ServerName;
//
// Make sure that the caller is allowed to get file information in the
// server.
//
error = SsCheckAccess(
&SsFileSecurityObject,
SRVSVC_FILE_INFO_GET
);
if ( error != NO_ERROR ) {
return ERROR_ACCESS_DENIED;
}
error = FileEnumCommon(
NULL,
NULL,
Level,
(LPBYTE *)InfoStruct,
(DWORD)-1,
&entriesRead,
&totalEntries,
&resumeHandle,
TRUE
);
if ( (error == NO_ERROR) && (entriesRead == 0) ) {
return ERROR_FILE_NOT_FOUND;
}
SS_ASSERT( error != NO_ERROR || entriesRead == 1 );
return error;
} // NetrFileGetInfo
NET_API_STATUS
FileEnumCommon (
IN LPTSTR BasePath,
IN LPTSTR UserName,
IN DWORD Level,
OUT LPBYTE *Buffer,
IN DWORD PreferredMaximumLength,
OUT LPDWORD EntriesRead,
OUT LPDWORD TotalEntries,
IN OUT LPDWORD ResumeHandle OPTIONAL,
IN BOOLEAN IsGetInfo
)
{
NET_API_STATUS error;
PSERVER_REQUEST_PACKET srp;
//
// Make sure that the level is valid.
//
if ( Level != 2 && Level != 3 ) {
return ERROR_INVALID_LEVEL;
}
//
// Set up the input parameters in the request buffer.
//
srp = SsAllocateSrp( );
if ( srp == NULL ) {
return ERROR_NOT_ENOUGH_MEMORY;
}
#ifdef UNICODE
RtlInitUnicodeString( &srp->Name1, BasePath );
RtlInitUnicodeString( &srp->Name2, UserName );
#else
{
NTSTATUS status;
OEM_STRING ansiString;
RtlInitString( &ansiString, BasePath );
status = RtlOemStringToUnicodeString( &srp->Name1, &ansiString, TRUE );
RtlInitString( &ansiString, UserName );
status = RtlOemStringToUnicodeString( &srp->Name2, &ansiString, TRUE );
}
#endif
srp->Level = Level;
if ( IsGetInfo ) {
srp->Flags = SRP_RETURN_SINGLE_ENTRY;
}
if ( ARGUMENT_PRESENT( ResumeHandle ) ) {
srp->Parameters.Get.ResumeHandle = *ResumeHandle;
} else {
srp->Parameters.Get.ResumeHandle = 0;
}
//
// Get the data from the server. This routine will allocate the
// return buffer and handle the case where PreferredMaximumLength ==
// -1.
//
error = SsServerFsControlGetInfo(
FSCTL_SRV_NET_FILE_ENUM,
srp,
(PVOID *)Buffer,
PreferredMaximumLength
);
//
// Set up return information. Only change the resume handle if at
// least one entry was returned.
//
*EntriesRead = srp->Parameters.Get.EntriesRead;
*TotalEntries = srp->Parameters.Get.TotalEntries;
if ( *EntriesRead > 0 && ARGUMENT_PRESENT( ResumeHandle ) ) {
*ResumeHandle = srp->Parameters.Get.ResumeHandle;
}
#ifndef UNICODE
RtlFreeUnicodeString( &srp->Name1 );
RtlFreeUnicodeString( &srp->Name2 );
#endif
SsFreeSrp( srp );
return error;
} // FileEnumCommon