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

153 lines
4.8 KiB
C

/*++
Copyright (c) 1991-1993 Microsoft Corporation
Module Name:
SessDel.c
Abstract:
This file contains RxNetSessionDel().
Author:
John Rogers (JohnRo) 18-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:
18-Oct-1991 JohnRo
Created.
21-Oct-1991 JohnRo
Fixed bug: RxNetSessionEnum wants BufPtr as "LPBYTE *".
Added debug output.
27-Jan-1993 JohnRo
RAID 8926: NetConnectionEnum to downlevel: memory leak on error.
Use PREFIX_ equates.
--*/
// These must be included first:
#include <windef.h> // IN, DWORD, etc.
#include <lmcons.h> // DEVLEN, 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> // NetApiBufferFree().
#include <lmerr.h> // ERROR_ and NERR_ equates.
#include <netdebug.h> // NetpKdPrint(), FORMAT_ equates.
#include <prefix.h> // PREFIX_ equates.
#include <rap.h> // LPDESC.
#include <remdef.h> // REM16_, REM32_, REMSmb_ equates.
#include <rx.h> // RxRemoteApi().
#include <rxpdebug.h> // IF_DEBUG().
#include <rxsess.h> // My prototype, RxpSession routines.
NET_API_STATUS
RxNetSessionDel (
IN LPTSTR UncServerName,
IN LPTSTR ClientName OPTIONAL,
IN LPTSTR UserName OPTIONAL
)
{
LPSESSION_SUPERSET_INFO ArrayPtr = NULL;
DWORD EntryCount;
NET_API_STATUS Status;
DWORD TotalEntries;
NetpAssert(UncServerName != NULL);
NetpAssert(*UncServerName != '\0');
//
// In LM 2.0, there's no way to delete with UserName or delete all clients,
// so we have to do an enum and find the sessions we want to delete.
//
Status = RxNetSessionEnum (
UncServerName,
ClientName,
UserName,
SESSION_SUPERSET_LEVEL,
/*lint -save -e530 */ // (We know variable isn't initialized.)
(LPBYTE *) (LPVOID *) & ArrayPtr,
/*lint -restore */ // (Resume uninitialized variable checking.)
1024, // prefered maximum (arbitrary)
& EntryCount,
& TotalEntries,
NULL); // no resume handle
if (Status == NERR_Success) {
NetpAssert( EntryCount == TotalEntries );
IF_DEBUG(SESSION) {
NetpKdPrint(( PREFIX_NETAPI
"RxNetSessionDel: enum found " FORMAT_DWORD
" entries in array at " FORMAT_LPVOID ".\n",
EntryCount, (LPVOID) ArrayPtr ));
}
if (EntryCount > 0) {
LPSESSION_SUPERSET_INFO EntryPtr = ArrayPtr;
NET_API_STATUS WorstStatus = NERR_Success;
for ( ; EntryCount > 0; --EntryCount) {
IF_DEBUG(SESSION) {
NetpKdPrint(( PREFIX_NETAPI
"RxNetSessionDel: checking entry at "
FORMAT_LPVOID ", count is " FORMAT_DWORD ".\n",
(LPVOID) EntryPtr, EntryCount ));
}
if (RxpSessionMatches( EntryPtr, ClientName, UserName) ) {
Status = RxRemoteApi(
API_WSessionDel, // API number
UncServerName,
REMSmb_NetSessionDel_P, // parm desc
NULL, // no data desc 16
NULL, // no data desc 32
NULL, // no data desc SMB
NULL, // no aux desc 16
NULL, // no aux desc 32
NULL, // no aux desc SMB
0, // flags: normal
// rest of API's arguments, in 32-bit LM2.x format:
ClientName, // client computer name
(DWORD) 0); // reserved.
if (Status != NERR_Success) {
WorstStatus = Status;
}
}
++EntryPtr;
}
Status = WorstStatus;
} else {
// No entries found.
Status = RxpSessionMissingErrorCode( ClientName, UserName );
}
}
if (ArrayPtr != NULL ) {
(void) NetApiBufferFree( ArrayPtr );
}
return (Status);
} // RxNetSessionDel