windows-nt/Source/XPSP1/NT/ds/netapi/svcdlls/wkssvc/server/wsstats.c

252 lines
4.6 KiB
C
Raw Permalink Normal View History

2020-09-26 03:20:57 -05:00
/*++
Copyright (c) 1991 Microsoft Corporation
Module Name:
WsStats.c
Abstract:
Contains workstation service half of the Net statistics routine:
NetrWorkstationStatisticsGet
(GetStatisticsFromRedir)
Author:
Richard L Firth (rfirth) 12-05-1991
Revision History:
12-05-1991 rfirth
Created
--*/
#include <nt.h>
#include <ntrtl.h>
#include <nturtl.h>
#include <windows.h>
#include <lmcons.h>
#include <lmerr.h>
#include <lmwksta.h>
#include <lmstats.h>
#include <ntddnfs.h>
#include <memory.h>
#include <netlibnt.h>
#include <ntrpcp.h>
#include "wsdevice.h"
//
// debugging
//
#ifdef DBG
#define STATIC
#ifdef DBGSTATS
BOOL DbgStats = TRUE;
#else
BOOL DbgStats = FALSE;
#endif
#ifdef UNICODE
#define PERCENT_S "%ws"
#else
#define PERCENT_S "%s"
#endif
#else
#define STATIC static
#endif
//
// private prototypes
//
static
NTSTATUS
GetStatisticsFromRedir(
OUT PREDIR_STATISTICS pStats
);
//
// functions
//
NET_API_STATUS
NET_API_FUNCTION
NetrWorkstationStatisticsGet(
IN LPTSTR ServerName,
IN LPTSTR ServiceName,
IN DWORD Level,
IN DWORD Options,
OUT LPBYTE* Buffer
)
/*++
Routine Description:
Returns workstation statistics to the caller. This is the server part of
the request. Parameters have been validated by the client routine
Arguments:
ServerName - IGNORED
ServiceName - IGNORED
Level - of information required. MBZ (IGNORED)
Options - MBZ
Buffer - pointer to pointer to returned buffer
Return Value:
NET_API_STATUS
Success - NERR_Success
Failure - ERROR_INVALID_LEVEL
Level not 0
ERROR_INVALID_PARAMETER
Unsupported options requested
ERROR_NOT_ENOUGH_MEMORY
For API buffer
--*/
{
NET_API_STATUS status;
NTSTATUS ntStatus;
PREDIR_STATISTICS stats;
UNREFERENCED_PARAMETER(ServerName);
UNREFERENCED_PARAMETER(ServiceName);
#if DBG
if (DbgStats) {
DbgPrint("NetrWorkstationStatisticsGet: ServerName=" PERCENT_S "\n"
"ServiceName=" PERCENT_S "\n"
"Level=%d\n"
"Options=%x\n",
ServerName,
ServiceName,
Level,
Options
);
}
#endif
if (Level) {
return ERROR_INVALID_LEVEL;
}
//
// we don't even allow clearing of stats any more
//
if (Options) {
return ERROR_INVALID_PARAMETER;
}
//
// get the redir statistics then munge them into API format
//
stats = (PREDIR_STATISTICS)MIDL_user_allocate(sizeof(*stats));
if (stats == NULL) {
return ERROR_NOT_ENOUGH_MEMORY;
}
ntStatus = GetStatisticsFromRedir(stats);
if (NT_SUCCESS(ntStatus)) {
*Buffer = (LPBYTE)stats;
status = NERR_Success;
} else {
MIDL_user_free(stats);
status = NetpNtStatusToApiStatus(ntStatus);
}
#if DBG
if (DbgStats) {
DbgPrint("NetrWorkstationStatisticsGet: returning %x\n", status);
}
#endif
return status;
}
static
NTSTATUS
GetStatisticsFromRedir(
OUT PREDIR_STATISTICS pStats
)
/*++
Routine Description:
Reads the redir statistics from the Redirector File System Device
Arguments:
pStats - place to store statistics (fixed length buffer)
Return Value:
NTSTATUS
Success - STATUS_SUCCESS
*pStats contains redirector statistics
Failure -
--*/
{
HANDLE FileHandle;
NTSTATUS Status;
IO_STATUS_BLOCK IoStatusBlock;
OBJECT_ATTRIBUTES Obja;
UNICODE_STRING FileName;
RtlInitUnicodeString(&FileName,DD_NFS_DEVICE_NAME_U);
InitializeObjectAttributes(
&Obja,
&FileName,
OBJ_CASE_INSENSITIVE,
NULL,
NULL
);
Status = NtCreateFile(
&FileHandle,
SYNCHRONIZE,
&Obja,
&IoStatusBlock,
NULL,
FILE_ATTRIBUTE_NORMAL,
FILE_SHARE_READ | FILE_SHARE_WRITE,
FILE_OPEN_IF,
FILE_SYNCHRONOUS_IO_NONALERT,
NULL,
0
);
if ( NT_SUCCESS(Status) ) {
Status = NtFsControlFile(
FileHandle,
NULL,
NULL,
NULL,
&IoStatusBlock,
FSCTL_LMR_GET_STATISTICS,
NULL,
0,
pStats,
sizeof(*pStats)
);
}
NtClose(FileHandle);
return Status;
}