Windows NT 4.0 source code leak
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.
 
 
 
 
 
 

341 lines
6.5 KiB

/*++
Copyright (c) 1991-1992 Microsoft Corporation
Module Name:
CDev.c
Abstract:
This module contains support for the Character Device catagory of
APIs for the NT server service.
Author:
David Treadwell (davidtr) 20-Dec-1991
Revision History:
--*/
#include "srvsvcp.h"
NET_API_STATUS NET_API_FUNCTION
NetrCharDevControl (
IN LPTSTR ServerName,
IN LPTSTR DeviceName,
IN DWORD OpCode
)
/*++
Routine Description:
This routine communicates with the server FSP to implement the
NetCharDevControl function.
Arguments:
None.
Return Value:
NET_API_STATUS - NO_ERROR or reason for failure.
--*/
{
#ifdef SRV_COMM_DEVICES
NET_API_STATUS error;
PSERVER_REQUEST_PACKET srp;
ServerName;
//
// Make sure that the caller has the access necessary for this
// operation.
//
error = SsCheckAccess(
&SsCharDevSecurityObject,
SRVSVC_CHARDEV_INFO_SET
);
if ( error != NO_ERROR ) {
return ERROR_ACCESS_DENIED;
}
//
// Make sure that the opcode is legitimate. Only CHARDEV_CLOSE, used
// to close the current open of the device, is possible.
//
if ( OpCode != CHARDEV_CLOSE ) {
return ERROR_INVALID_PARAMETER;
}
//
// Set up the request packet.
//
srp = SsAllocateSrp( );
if ( srp == NULL ) {
return ERROR_NOT_ENOUGH_MEMORY;
}
#ifdef UNICODE
RtlInitUnicodeString( &srp->Name1, DeviceName );
#else
{
OEM_STRING ansiString;
NTSTATUS status;
NetpInitOemString( &ansiString, DeviceName );
status = RtlOemStringToUnicodeString( &srp->Name1, &ansiString, TRUE );
SS_ASSERT( NT_SUCCESS(status) );
}
#endif
//
// Simply send the request on to the server.
//
error = SsServerFsControl( NULL, FSCTL_SRV_NET_CHARDEV_CONTROL, srp, NULL, 0 );
#ifndef UNICODE
RtlFreeUnicodeString( &srp->Name1 );
#endif
SsFreeSrp( srp );
return error;
#else
ServerName, DeviceName, OpCode;
return ERROR_NOT_SUPPORTED;
#endif
} // NetrCharDevControl
NET_API_STATUS NET_API_FUNCTION
NetrCharDevEnum (
SRVSVC_HANDLE ServerName,
LPCHARDEV_ENUM_STRUCT InfoStruct,
DWORD PreferedMaximumLength,
LPDWORD TotalEntries,
LPDWORD ResumeHandle
)
/*++
Routine Description:
This routine communicates with the server FSD to implement the
NetCharDevEnum function.
Arguments:
None.
Return Value:
NET_API_STATUS - NO_ERROR or reason for failure.
--*/
{
#ifdef SRV_COMM_DEVICES
NET_API_STATUS error;
PSERVER_REQUEST_PACKET srp;
ServerName;
//
// Make sure that the caller has the access necessary for this
// operation.
//
error = SsCheckAccess(
&SsCharDevSecurityObject,
SRVSVC_CHARDEV_ADMIN_INFO_GET
);
if ( error != NO_ERROR ) {
return ERROR_ACCESS_DENIED;
}
//
// Make sure that the level is valid.
//
if ( InfoStruct->Level != 0 && InfoStruct->Level != 1 ) {
return ERROR_INVALID_LEVEL;
}
//
// Set up the input parameters in the request buffer.
//
srp = SsAllocateSrp( );
if ( srp == NULL ) {
return ERROR_NOT_ENOUGH_MEMORY;
}
srp->Level = InfoStruct->Level;
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_CHARDEV_ENUM,
srp,
(PVOID *)&InfoStruct->CharDevInfo.Level1->Buffer,
PreferedMaximumLength
);
//
// Set up return information.
//
InfoStruct->CharDevInfo.Level1->EntriesRead =
srp->Parameters.Get.EntriesRead;
if ( ARGUMENT_PRESENT( TotalEntries ) ) {
*TotalEntries = srp->Parameters.Get.TotalEntries;
}
if ( srp->Parameters.Get.EntriesRead > 0 &&
ARGUMENT_PRESENT( ResumeHandle ) ) {
*ResumeHandle = srp->Parameters.Get.ResumeHandle;
}
SsFreeSrp( srp );
return error;
#else
ServerName, InfoStruct, PreferedMaximumLength, TotalEntries, ResumeHandle;
return ERROR_NOT_SUPPORTED;
#endif
} // NetrCharDevEnum
NET_API_STATUS
NetrCharDevGetInfo (
IN LPTSTR ServerName,
IN LPTSTR DeviceName,
IN DWORD Level,
OUT LPCHARDEV_INFO CharDevInfo
)
/*++
Routine Description:
This routine communicates with the server FSD to implement the
NetCharDevGetInfo function.
Arguments:
None.
Return Value:
NET_API_STATUS - NO_ERROR or reason for failure.
--*/
{
#ifdef SRV_COMM_DEVICES
NET_API_STATUS error;
PSERVER_REQUEST_PACKET srp;
ServerName;
//
// Make sure that the caller has the access necessary for this
// operation.
//
error = SsCheckAccess(
&SsCharDevSecurityObject,
SRVSVC_CHARDEV_ADMIN_INFO_GET
);
if ( error != NO_ERROR ) {
return ERROR_ACCESS_DENIED;
}
//
// Make sure that the level is valid.
//
if ( Level != 0 && Level != 1 ) {
return ERROR_INVALID_LEVEL;
}
//
// Set up the input parameters in the request buffer.
//
srp = SsAllocateSrp( );
if ( srp == NULL ) {
return ERROR_NOT_ENOUGH_MEMORY;
}
srp->Level = Level;
srp->Flags = SRP_RETURN_SINGLE_ENTRY;
srp->Parameters.Get.ResumeHandle = 0;
#ifdef UNICODE
RtlInitUnicodeString( &srp->Name1, DeviceName );
#else
{
NTSTATUS status;
OEM_STRING ansiString;
RtlInitString( &ansiString, DeviceName );
status = RtlOemStringToUnicodeString( &srp->Name1, &ansiString, TRUE );
SS_ASSERT( NT_SUCCESS(status) );
}
#endif
//
// 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_CHARDEV_ENUM,
srp,
(PVOID *)CharDevInfo,
-1
);
//
// Free resources and return.
//
#ifndef UNICODE
RtlFreeUnicodeString( &srp->Name1 );
#endif
SsFreeSrp( srp );
return error;
#else
ServerName, DeviceName, Level, CharDevInfo;
return ERROR_NOT_SUPPORTED;
#endif
} // NetrCharDevGetInfo