252 lines
4.6 KiB
C
252 lines
4.6 KiB
C
|
/*++
|
|||
|
|
|||
|
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;
|
|||
|
}
|
|||
|
|