windows-nt/Source/XPSP1/NT/net/sfm/afp/service/server/session.c
2020-09-26 16:20:57 +08:00

144 lines
4.1 KiB
C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/********************************************************************/
/** Copyright(c) 1989 Microsoft Corporation. **/
/********************************************************************/
//***
//
// Filename: session.c
//
// Description: This module contains support routines for the session
// category API's for the AFP server service. These routines
// will be called by the RPC runtime.
//
// History:
// June 21,1992. NarenG Created original version.
//
#include "afpsvcp.h"
//**
//
// Call: AfpAdminrSessionEnum
//
// Returns: NO_ERROR
// ERROR_ACCESS_DENIED
// non-zero returns from AfpServerIOCtrlGetInfo
//
// Description: This routine communicates with the AFP FSD to implement
// the AfpAdminSessionEnum function.
//
DWORD
AfpAdminrSessionEnum(
IN AFP_SERVER_HANDLE hServer,
IN OUT PSESSION_INFO_CONTAINER pInfoStruct,
IN DWORD dwPreferedMaximumLength,
OUT LPDWORD lpdwTotalEntries,
IN OUT LPDWORD lpdwResumeHandle
)
{
AFP_REQUEST_PACKET AfpSrp;
DWORD dwRetCode=0;
DWORD dwAccessStatus=0;
AFP_PRINT( ( "AFPSVC_session: Received enum request\n"));
// Check if caller has access
//
if ( dwRetCode = AfpSecObjAccessCheck( AFPSVC_ALL_ACCESS, &dwAccessStatus))
{
AFP_PRINT(( "SFMSVC: AfpAdminrSessionEnum, AfpSecObjAccessCheck failed %ld\n",dwRetCode));
AfpLogEvent( AFPLOG_CANT_CHECK_ACCESS, 0, NULL,
dwRetCode, EVENTLOG_ERROR_TYPE );
return( ERROR_ACCESS_DENIED );
}
if ( dwAccessStatus )
{
AFP_PRINT(( "SFMSVC: AfpAdminrSessionEnum, AfpSecObjAccessCheck returned %ld\n",dwAccessStatus));
return( ERROR_ACCESS_DENIED );
}
// Set up request packet and make IOCTL to the FSD
//
AfpSrp.dwRequestCode = OP_SESSION_ENUM;
AfpSrp.dwApiType = AFP_API_TYPE_ENUM;
AfpSrp.Type.Enum.cbOutputBufSize = dwPreferedMaximumLength;
if ( lpdwResumeHandle )
AfpSrp.Type.Enum.EnumRequestPkt.erqp_Index = *lpdwResumeHandle;
else
AfpSrp.Type.Enum.EnumRequestPkt.erqp_Index = 0;
dwRetCode = AfpServerIOCtrlGetInfo( &AfpSrp );
if ( dwRetCode != ERROR_MORE_DATA && dwRetCode != NO_ERROR )
return( dwRetCode );
*lpdwTotalEntries = AfpSrp.Type.Enum.dwTotalAvail;
pInfoStruct->pBuffer = (PAFP_SESSION_INFO)(AfpSrp.Type.Enum.pOutputBuf);
pInfoStruct->dwEntriesRead = AfpSrp.Type.Enum.dwEntriesRead;
if ( lpdwResumeHandle )
*lpdwResumeHandle = AfpSrp.Type.Enum.EnumRequestPkt.erqp_Index;
// Convert all offsets to pointers
//
AfpBufOffsetToPointer( (LPBYTE)(pInfoStruct->pBuffer),
pInfoStruct->dwEntriesRead,
AFP_SESSION_STRUCT );
return( dwRetCode );
}
//**
//
// Call: AfpAdminrSessionClose
//
// Returns: NO_ERROR
// ERROR_ACCESS_DENIED
// non-zero returns from AfpServerIOCtrl
//
// Description: This routine communicates with the AFP FSD to implement
// the AfpAdminSessionClose function.
//
DWORD
AfpAdminrSessionClose( IN AFP_SERVER_HANDLE hServer,
IN DWORD dwSessionId
)
{
AFP_REQUEST_PACKET AfpSrp;
DWORD dwAccessStatus=0;
AFP_SESSION_INFO AfpSessionInfo;
DWORD dwRetCode=0;
// Check if caller has access
//
if ( dwRetCode = AfpSecObjAccessCheck( AFPSVC_ALL_ACCESS, &dwAccessStatus))
{
AFP_PRINT(( "SFMSVC: AfpAdminrSessionClose, AfpSecObjAccessCheck failed %ld\n",dwRetCode));
AfpLogEvent( AFPLOG_CANT_CHECK_ACCESS, 0, NULL,
dwRetCode, EVENTLOG_ERROR_TYPE );
return( ERROR_ACCESS_DENIED );
}
if ( dwAccessStatus )
{
AFP_PRINT(( "SFMSVC: AfpAdminrSessionClose, AfpSecObjAccessCheck returned %ld\n",dwAccessStatus));
return( ERROR_ACCESS_DENIED );
}
// The FSD expects an AFP_SESSION_INFO structure with only the id field
// filled in.
//
AfpSessionInfo.afpsess_id = dwSessionId;
// IOCTL the FSD to close the session
//
AfpSrp.dwRequestCode = OP_SESSION_CLOSE;
AfpSrp.dwApiType = AFP_API_TYPE_DELETE;
AfpSrp.Type.Delete.pInputBuf = &AfpSessionInfo;
AfpSrp.Type.Delete.cbInputBufSize = sizeof(AFP_SESSION_INFO);
return ( AfpServerIOCtrl( &AfpSrp ) );
}