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

219 lines
6.5 KiB
C

/*++
Copyright (c) 1991-92 Microsoft Corporation
Module Name:
SessGet.c
Abstract:
This file contains the RpcXlate code to handle the NetSession APIs
that can't be handled by simple calls to RxRemoteApi.
Author:
John Rogers (JohnRo) 17-Oct-1991
Environment:
Portable to any flat, 32-bit environment. (Uses Win32 typedefs.)
Requires ANSI C extensions: slash-slash comments, long external names.
Revision History:
17-Oct-1991 JohnRo
Created.
25-Oct-1991 JohnRo
Fixed bug where null chars weren't treated correctly.
20-Nov-1991 JohnRo
NetSessionGetInfo requires UncClientName and UserName.
This fixes the AE (application error) in NetSess.exe.
21-Nov-1991 JohnRo
Removed NT dependencies to reduce recompiles.
07-Feb-1992 JohnRo
Use NetApiBufferAllocate() instead of private version.
08-Sep-1992 JohnRo
Fixed __stdcall for RpcXlate workers.
--*/
// These must be included first:
#include <windef.h> // IN, DWORD, etc.
#include <lmcons.h> // NET_API_STATUS, etc.
#include <lmshare.h> // Required by rxsess.h.
// These may be included in any order:
#include <apinums.h> // API_ equates.
#include <lmapibuf.h> // NetApiBufferAllocate().
#include <lmerr.h> // ERROR_ and NERR_ equates.
#include <netdebug.h> // DBGSTATIC, NetpKdPrint(()), FORMAT_ equates.
#include <netlib.h> // NetpPointerPlusSomeBytes, etc.
#include <rap.h> // LPDESC.
#include <remdef.h> // REMSmb_ equates.
#include <rx.h> // RxRemoteApi().
#include <rxpdebug.h> // IF_DEBUG().
#include <rxsess.h> // My prototype.
#include <strucinf.h> // NetpSessionStructureInfo().
// VOID
// NetpChangeNullCharToNullPtr(
// IN OUT LPTSTR p
// );
//
#define ChangeNullCharToNullPtr(p) \
{ \
if ( ((p) != NULL) && (*(p) == '\0') ) { \
(p) = NULL; \
} \
}
NET_API_STATUS
RxNetSessionGetInfo (
IN LPTSTR UncServerName,
IN LPTSTR UncClientName,
IN LPTSTR UserName,
IN DWORD LevelWanted,
OUT LPBYTE *BufPtr
)
/*++
Routine Description:
RxNetSessionGetInfo performs the same function as NetSessionGetInfo,
except that the server name is known to refer to a downlevel server.
Arguments:
(Same as NetSessionGetInfo, except UncServerName must not be null, and
must not refer to the local computer.)
Return Value:
(Same as NetSessionGetInfo.)
--*/
{
NET_API_STATUS ApiStatus;
LPBYTE TempBuffer; // Buffer we'll use.
DWORD TempBufferSize;
LPDESC TempDataDesc16, TempDataDesc32, TempDataDescSmb;
NET_API_STATUS TempStatus;
DWORD TotalAvail;
IF_DEBUG(SESSION) {
NetpKdPrint(("RxNetSessionGetInfo: starting, server=" FORMAT_LPTSTR
", lvl=" FORMAT_DWORD ".\n", UncServerName, LevelWanted));
}
//
// Update pointers if they point to null chars.
//
ChangeNullCharToNullPtr( UncClientName );
ChangeNullCharToNullPtr( UserName );
//
// Error check DLL stub and the app.
//
NetpAssert(UncServerName != NULL);
if (BufPtr == NULL) {
return (ERROR_INVALID_PARAMETER);
}
*BufPtr = NULL; // assume error; it makes error handlers easy to code.
// This also forces possible GP fault before we allocate memory.
if ( (UncClientName == NULL) || (UserName == NULL) ) {
return (ERROR_INVALID_PARAMETER);
}
//
// Learn about temp info level (max superset of all levels).
//
TempStatus = NetpSessionStructureInfo (
SESSION_SUPERSET_LEVEL, // level to learn about
PARMNUM_ALL, // No parmnum with this.
TRUE, // Need native sizes.
& TempDataDesc16,
& TempDataDesc32,
& TempDataDescSmb,
& TempBufferSize, // max buffer size (native)
NULL, // don't need fixed size.
NULL // don't need string size.
);
NetpAssert(TempStatus == NERR_Success);
//
// Allocate memory for 32-bit version of superset info level.
//
TempStatus = NetApiBufferAllocate(
TempBufferSize,
(LPVOID *) & TempBuffer);
if (TempStatus != NERR_Success) {
return (TempStatus);
}
IF_DEBUG(SESSION) {
NetpKdPrint(( "RxNetSessionGetInfo: allocated temp buffer at "
FORMAT_LPVOID "\n", (LPVOID) TempBuffer ));
}
//
// Actually remote the API, which will get back the superset
// data in native format.
//
ApiStatus = RxRemoteApi(
API_WSessionGetInfo, // API number
UncServerName, // Required, with \\name.
REMSmb_NetSessionGetInfo_P, // parm desc
TempDataDesc16,
TempDataDesc32,
TempDataDescSmb,
NULL, // no aux data desc 16
NULL, // no aux data desc 32
NULL, // no aux data desc SMB
0, // Flags: normal
// rest of API's arguments, in 32-bit LM 2.x format:
UncClientName,
SESSION_SUPERSET_LEVEL, // level with all possible fields
TempBuffer,
TempBufferSize,
& TotalAvail); // total size
NetpAssert( ApiStatus != ERROR_MORE_DATA );
NetpAssert( ApiStatus != NERR_BufTooSmall );
if (ApiStatus == NERR_Success) {
DWORD EntriesSelected;
//
// Copy and convert from temp info level to level the caller wants.
// Check for match on UncClientName and UserName first.
//
TempStatus = RxpCopyAndConvertSessions(
(LPSESSION_SUPERSET_INFO) TempBuffer, // input "array"
1, // only one "entry" this time
LevelWanted,
UncClientName,
UserName,
(LPVOID *) BufPtr, // alloc'ed (may be NULL if no match)
& EntriesSelected); // output entry count
NetpAssert(TempStatus == NERR_Success);
if (EntriesSelected == 0) {
ApiStatus = RxpSessionMissingErrorCode( UncClientName, UserName );
NetpAssert( ApiStatus != NERR_Success );
}
}
(void) NetApiBufferFree( TempBuffer );
return (ApiStatus);
} // RxNetSessionGetInfo