windows-nt/Source/XPSP1/NT/ds/netapi/rpcxlate/rxapi/rxchdev.c
2020-09-26 16:20:57 +08:00

320 lines
8.4 KiB
C

/*++
Copyright (c) 1991-92 Microsoft Corporation
Module Name:
rxchdev.c
Abstract:
Contains RxNetCharDev routines:
RxNetCharDevControl
RxNetCharDevEnum
RxNetCharDevGetInfo
Author:
Richard Firth (rfirth) 20-May-1991
Environment:
Win-32/flat address space
Notes:
Routines in this module assume that caller-supplied parameters have
already been verified. No effort is made to further check the veracity
of parms. Any actions causing exceptions must be trapped at a higher
level. This applies to ALL parameters - strings, pointers, buffers, etc.
Revision History:
20-May-1991 RFirth
Created
13-Sep-1991 JohnRo
Made changes suggested by PC-LINT.
25-Sep-1991 JohnRo
Fixed MIPS build problems.
05-Dec-1991 RFirth
Enum returns in TotalEntries (or EntriesLeft) the number of items to
be enumerated BEFORE this call. Used to be number left after this call
07-Feb-1992 JohnRo
Use NetApiBufferAllocate() instead of private version.
--*/
#include "downlevl.h"
#include <rxchdev.h>
#include <lmchdev.h>
NET_API_STATUS
RxNetCharDevControl(
IN LPTSTR ServerName,
IN LPTSTR DeviceName,
IN DWORD Opcode
)
/*++
Routine Description:
Remotely applies a control action to a shared device. This particular
routine deals with down-level Lanman servers
Arguments:
ServerName - Where to run the remoted API
DeviceName - Name of device for which to issue control
Opcode - Action to apply
Return Value:
NET_API_STATUS
Success - NERR_Success
Failure - ERROR_INVALID_PARAMETER
DeviceName invalid
(return code from remoted API)
--*/
{
if (STRLEN(DeviceName) > LM20_DEVLEN) {
return ERROR_INVALID_PARAMETER;
}
return RxRemoteApi(API_WCharDevControl, // API #
ServerName, // where to run the API
REMSmb_NetCharDevControl_P, // parameter string
NULL, NULL, NULL, // no primary data structures
NULL, NULL, NULL, // no aux. data structures
FALSE, // caller needs to be logged on
DeviceName, // API parameters...
Opcode
);
}
NET_API_STATUS
RxNetCharDevEnum(
IN LPTSTR ServerName,
IN DWORD Level,
OUT LPBYTE* Buffer,
IN DWORD PrefMaxLen,
OUT LPDWORD EntriesRead,
OUT LPDWORD EntriesLeft,
IN OUT LPDWORD ResumeHandle OPTIONAL
)
/*++
Routine Description:
Returns a buffer containing a list of information structures detailing the
shared communications devices at a down-level Lanman server
Arguments:
ServerName - Where to run the remoted API
Level - Of info requested - 0 or 1
Buffer - Pointer to returned pointer to buffer containing info
PrefMaxLen - Caller's preferred maximum returned buffer size
EntriesRead - Pointer to returned number of structures in Buffer
EntriesLeft - Pointer to returned number of structures left to enumerate
ResumeHandle- Pointer to returned handle for continuing enumeration. IGNORED
Return Value:
NET_API_STATUS
Success - NERR_Success
Failure - ERROR_INVALID_PARAMETER
DeviceName invalid
ResumeHandle not 0 or NULL
(return code from remoted API)
--*/
{
DWORD entries_read, total_avail;
LPDESC pDesc16, pDesc32, pDescSmb;
LPBYTE bufptr;
NET_API_STATUS rc;
UNREFERENCED_PARAMETER(PrefMaxLen);
//
// test out the caller supplied arguments. This should be done at the outer
// level
//
*Buffer = NULL;
*EntriesRead = *EntriesLeft = 0;
if (!NULL_REFERENCE(ResumeHandle)) {
return ERROR_INVALID_PARAMETER;
}
switch (Level) {
case 0:
pDesc16 = REM16_chardev_info_0;
pDesc32 = REM32_chardev_info_0;
pDescSmb = REMSmb_chardev_info_0;
break;
case 1:
pDesc16 = REM16_chardev_info_1;
pDesc32 = REM32_chardev_info_1;
pDescSmb = REMSmb_chardev_info_1;
break;
default:
return ERROR_INVALID_LEVEL;
}
//
// In the Enum case, since we don't know how much data will come back, we
// leave the returned buffer allocation to the lower levels of software.
// Thus we get back an exact amount of data, not a horrendous maximum
//
bufptr = NULL;
rc = RxRemoteApi(API_NetCharDevEnum, // API #
ServerName, // where to remote it
REMSmb_NetCharDevEnum_P, // parameter descriptor
pDesc16, pDesc32, pDescSmb, // primary structure descriptors
NULL, NULL, NULL, // no aux data structures
ALLOCATE_RESPONSE,
Level, // API parameters start here...
&bufptr, // RxRemoteApi will allocate buffer
65535, // maximum 16-bit SMB receive buffer
&entries_read,
&total_avail
);
if (rc) {
//
// If a buffer was allocated on our behalf by RxRemoteApi before it
// went under then free it
//
if (bufptr) {
(void) NetApiBufferFree(bufptr);
}
} else {
*Buffer = bufptr;
*EntriesRead = entries_read;
*EntriesLeft = total_avail;
}
return rc;
}
NET_API_STATUS
RxNetCharDevGetInfo(
IN LPTSTR ServerName,
IN LPTSTR DeviceName,
IN DWORD Level,
OUT LPBYTE* Buffer
)
/*++
Routine Description:
Returns an information structure detailing a particular shared comms device
at a down-level server
Arguments:
ServerName - Where to run the remoted API
DeviceName - Name of device for which to get info
Level - Of info required - 0 or 1
Buffer - Pointer to returned pointer to buffer containing info
Return Value:
NET_API_STATUS
Success - NERR_Success
Failure - ERROR_INVALID_PARAMETER
DeviceName too long
ERROR_INVALID_LEVEL
Level parameter not allowed
(return code from remoted API)
--*/
{
DWORD buflen, total_avail;
LPDESC pDesc16, pDesc32, pDescSmb;
LPBYTE bufptr;
NET_API_STATUS rc;
//
// test out the caller supplied arguments. This should be done at the outer
// level
//
*Buffer = NULL;
if (STRLEN(DeviceName) > LM20_DEVLEN) {
return ERROR_INVALID_PARAMETER;
}
switch (Level) {
case 0:
pDesc16 = REM16_chardev_info_0;
pDesc32 = REM32_chardev_info_0;
pDescSmb = REMSmb_chardev_info_0;
buflen = sizeof(CHARDEV_INFO_0) + STRING_SPACE_REQD(DEVLEN + 1);
break;
case 1:
pDesc16 = REM16_chardev_info_1;
pDesc32 = REM32_chardev_info_1;
pDescSmb = REMSmb_chardev_info_1;
buflen = sizeof(CHARDEV_INFO_1) + STRING_SPACE_REQD(DEVLEN + 1) +
STRING_SPACE_REQD(UNLEN + 1);
break;
default:
return ERROR_INVALID_LEVEL;
}
//
// In the GetInfo case we are content to pre-allocate the return buffer
// because we know how large it should be (although we actually allocate
// the maximum size for a particular GetInfo structure level)
//
if (rc = NetApiBufferAllocate(buflen, (LPVOID *) &bufptr)) {
return rc;
}
rc = RxRemoteApi(API_NetCharDevGetInfo, // API #
ServerName, // where to remote it
REMSmb_NetCharDevGetInfo_P, // parameter descriptor
pDesc16, pDesc32, pDescSmb, // primary structure descriptors
NULL, NULL, NULL, // no aux data structures
FALSE, // can't use NULL session
DeviceName, // API parameters start here...
Level,
bufptr,
buflen, // supplied by us
&total_avail // not used by 32-bit API
);
if (rc) {
(void) NetApiBufferFree(bufptr);
} else {
*Buffer = bufptr;
}
return rc;
}