153 lines
4.8 KiB
C
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
|