|
|
/******************************************************************************
* * Copyright (C) 2001 Microsoft Corporation. All Rights Reserved. * * File: threadpoolparamval.cpp * * Content: DirectPlay Thread Pool parameter validation functions. * * History: * Date By Reason * ======== ======== ========= * 10/31/01 VanceO Created. * ******************************************************************************/
#include "dpnthreadpooli.h"
#ifndef DPNBUILD_NOPARAMVAL
#if ((! defined(DPNBUILD_ONLYONETHREAD)) || (! defined(DPNBUILD_LIBINTERFACE)))
#undef DPF_MODNAME
#define DPF_MODNAME "IsValidDirectPlay8ThreadPoolObject"
//=============================================================================
// IsValidDirectPlay8ThreadPoolObject
//-----------------------------------------------------------------------------
//
// Description: Ensures the given pointer is a valid IDirectPlay8ThreadPool
// interface and object.
//
// Arguments:
// PVOID pvObject - Pointer to interface to validate.
//
// Returns: BOOL
// TRUE - The object is valid.
// FALSE - The object is not valid.
//=============================================================================
BOOL IsValidDirectPlay8ThreadPoolObject(PVOID pvObject) { INTERFACE_LIST * pIntList = (INTERFACE_LIST*) pvObject; DPTHREADPOOLOBJECT * pDPTPObject;
if (!DNVALID_READPTR(pvObject, sizeof(INTERFACE_LIST))) { DPFX(DPFPREP, 0, "Invalid object pointer!"); return FALSE; }
if (pIntList->lpVtbl != &DPTP_Vtbl) { DPFX(DPFPREP, 0, "Invalid object - bad vtable!"); return FALSE; }
if (pIntList->iid != IID_IDirectPlay8ThreadPool) { DPFX(DPFPREP, 0, "Invalid object - bad iid!"); return FALSE; }
if ((pIntList->pObject == NULL) || (! DNVALID_READPTR(pIntList->pObject, sizeof(OBJECT_DATA)))) { DPFX(DPFPREP, 0, "Invalid object data!"); return FALSE; }
pDPTPObject = (DPTHREADPOOLOBJECT*) GET_OBJECT_FROM_INTERFACE(pvObject);
if ((pDPTPObject == NULL) || (! DNVALID_READPTR(pDPTPObject, sizeof(DPTHREADPOOLOBJECT)))) { DPFX(DPFPREP, 0, "Invalid object!"); return FALSE; }
return TRUE; } // IsValidDirectPlay8ThreadPoolObject
#undef DPF_MODNAME
#define DPF_MODNAME "DPTPValidateInitialize"
//=============================================================================
// DPTPValidateInitialize
//-----------------------------------------------------------------------------
//
// Description: Validation for IDirectPlay8ThreadPool::Initialize.
//
// Arguments: See DPTP_Initialize.
//
// Returns: HRESULT
//=============================================================================
HRESULT DPTPValidateInitialize(IDirectPlay8ThreadPool * pInterface, PVOID const pvUserContext, const PFNDPNMESSAGEHANDLER pfn, const DWORD dwFlags) { HRESULT hr;
if (! IsValidDirectPlay8ThreadPoolObject(pInterface)) { DPFX(DPFPREP, 0, "Invalid object specified!"); hr = DPNERR_INVALIDOBJECT; goto Exit; }
if (pfn == NULL) { DPFX(DPFPREP, 0, "Invalid message handler function!"); hr = DPNERR_INVALIDPARAM; goto Exit; }
if (dwFlags & ~(DPNINITIALIZE_DISABLEPARAMVAL)) { DPFX(DPFPREP, 0, "Invalid flags!"); hr = DPNERR_INVALIDFLAGS; goto Exit; }
hr = DPN_OK;
Exit:
return hr; } // DPTPValidateInitialize
#undef DPF_MODNAME
#define DPF_MODNAME "DPTPValidateClose"
//=============================================================================
// DPTPValidateClose
//-----------------------------------------------------------------------------
//
// Description: Validation for IDirectPlay8ThreadPool::Close.
//
// Arguments: See DPTP_Close.
//
// Returns: HRESULT
//=============================================================================
HRESULT DPTPValidateClose(IDirectPlay8ThreadPool * pInterface, const DWORD dwFlags) { HRESULT hr;
if (! IsValidDirectPlay8ThreadPoolObject(pInterface)) { DPFX(DPFPREP, 0, "Invalid object specified!"); hr = DPNERR_INVALIDOBJECT; goto Exit; }
if (dwFlags != 0) { DPFX(DPFPREP, 0, "Invalid flags!"); hr = DPNERR_INVALIDFLAGS; goto Exit; }
hr = DPN_OK;
Exit:
return hr; } // DPTPValidateClose
#undef DPF_MODNAME
#define DPF_MODNAME "DPTPValidateGetThreadCount"
//=============================================================================
// DPTPValidateGetThreadCount
//-----------------------------------------------------------------------------
//
// Description: Validation for IDirectPlay8ThreadPool::GetThreadCount.
//
// Arguments: See DPTP_GetThreadCount.
//
// Returns: HRESULT
//=============================================================================
HRESULT DPTPValidateGetThreadCount(IDirectPlay8ThreadPool * pInterface, const DWORD dwProcessorNum, DWORD * const pdwNumThreads, const DWORD dwFlags) { HRESULT hr; #ifndef DPNBUILD_ONLYONEPROCESSOR
SYSTEM_INFO SystemInfo; #endif // ! DPNBUILD_ONLYONEPROCESSOR
if (! IsValidDirectPlay8ThreadPoolObject(pInterface)) { DPFX(DPFPREP, 0, "Invalid object specified!"); hr = DPNERR_INVALIDOBJECT; goto Exit; }
#ifdef DPNBUILD_ONLYONEPROCESSOR
if ((dwProcessorNum != 0) && (dwProcessorNum != -1)) { DPFX(DPFPREP, 0, "Invalid processor number!"); hr = DPNERR_INVALIDPARAM; goto Exit; } #else // ! DPNBUILD_ONLYONEPROCESSOR
GetSystemInfo(&SystemInfo); if ((dwProcessorNum > SystemInfo.dwNumberOfProcessors) && (dwProcessorNum != -1)) { DPFX(DPFPREP, 0, "Invalid processor number!"); hr = DPNERR_INVALIDPARAM; goto Exit; } #endif // ! DPNBUILD_ONLYONEPROCESSOR
if ((pdwNumThreads == NULL) || (! DNVALID_WRITEPTR(pdwNumThreads, sizeof(DWORD)))) { DPFX(DPFPREP, 0, "Invalid pointer specified for storing number of threads!"); hr = DPNERR_INVALIDPOINTER; goto Exit; }
if (dwFlags != 0) { DPFX(DPFPREP, 0, "Invalid flags!"); hr = DPNERR_INVALIDFLAGS; goto Exit; }
hr = DPN_OK;
Exit:
return hr; } // DPTPValidateGetThreadCount
#undef DPF_MODNAME
#define DPF_MODNAME "DPTPValidateSetThreadCount"
//=============================================================================
// DPTPValidateSetThreadCount
//-----------------------------------------------------------------------------
//
// Description: Validation for IDirectPlay8ThreadPool::SetThreadCount.
//
// Arguments: See DPTP_SetThreadCount.
//
// Returns: HRESULT
//=============================================================================
HRESULT DPTPValidateSetThreadCount(IDirectPlay8ThreadPool * pInterface, const DWORD dwProcessorNum, const DWORD dwNumThreads, const DWORD dwFlags) { HRESULT hr; #ifndef DPNBUILD_ONLYONEPROCESSOR
SYSTEM_INFO SystemInfo; #endif // ! DPNBUILD_ONLYONEPROCESSOR
if (! IsValidDirectPlay8ThreadPoolObject(pInterface)) { DPFX(DPFPREP, 0, "Invalid object specified!"); hr = DPNERR_INVALIDOBJECT; goto Exit; }
#ifdef DPNBUILD_ONLYONEPROCESSOR
if ((dwProcessorNum != 0) && (dwProcessorNum != -1)) { DPFX(DPFPREP, 0, "Invalid processor number!"); hr = DPNERR_INVALIDPARAM; goto Exit; } #else // ! DPNBUILD_ONLYONEPROCESSOR
GetSystemInfo(&SystemInfo); if ((dwProcessorNum > SystemInfo.dwNumberOfProcessors) && (dwProcessorNum != -1)) { DPFX(DPFPREP, 0, "Invalid processor number!"); hr = DPNERR_INVALIDPARAM; goto Exit; } #endif // ! DPNBUILD_ONLYONEPROCESSOR
//
// It doesn't make sense given current (or foreseeable) hardware, OSes, and
// DPlay behavior for anyone to start more than a handful of threads per
// processor, so we should prevent the user from hurting him/herself.
// We'll be generous and allow the user to request up to 5,000, but I
// imagine the system will be brought to its knees long before that.
//
// The only true requirement is that it not be the special -1 value, and
// that the total number of threads for all processors doesn't equal -1 or
// overflow the DWORD counter.
//
// The value of 0 is acceptable, it means the user wants to run in DoWork
// mode (or reset some parameters that require that no threads be running).
//
if ((dwNumThreads == -1) || (dwNumThreads > 5000)) { DPFX(DPFPREP, 0, "Invalid number of threads!"); hr = DPNERR_INVALIDPARAM; goto Exit; }
if (dwFlags != 0) { DPFX(DPFPREP, 0, "Invalid flags!"); hr = DPNERR_INVALIDFLAGS; goto Exit; }
hr = DPN_OK;
Exit:
return hr; } // DPTPValidateSetThreadCount
#endif // ! DPNBUILD_ONLYONETHREAD or ! DPNBUILD_LIBINTERFACE
#undef DPF_MODNAME
#define DPF_MODNAME "DPTPValidateDoWork"
//=============================================================================
// DPTPValidateDoWork
//-----------------------------------------------------------------------------
//
// Description: Validation for IDirectPlay8ThreadPool::DoWork.
//
// Arguments: See DPTP_DoWork.
//
// Returns: HRESULT
//=============================================================================
#ifdef DPNBUILD_LIBINTERFACE
HRESULT DPTPValidateDoWork(const DWORD dwAllowedTimeSlice, const DWORD dwFlags) #else // ! DPNBUILD_LIBINTERFACE
HRESULT DPTPValidateDoWork(IDirectPlay8ThreadPool * pInterface, const DWORD dwAllowedTimeSlice, const DWORD dwFlags) #endif // ! DPNBUILD_LIBINTERFACE
{ HRESULT hr;
#ifndef DPNBUILD_LIBINTERFACE
if (! IsValidDirectPlay8ThreadPoolObject(pInterface)) { DPFX(DPFPREP, 0, "Invalid object specified!"); hr = DPNERR_INVALIDOBJECT; goto Exit; } #endif // ! DPNBUILD_LIBINTERFACE
if ((dwAllowedTimeSlice != INFINITE) && (dwAllowedTimeSlice > 60000)) { DPFX(DPFPREP, 0, "Allowed time slice is too large!"); hr = DPNERR_INVALIDPARAM; goto Exit; }
if (dwFlags != 0) { DPFX(DPFPREP, 0, "Invalid flags!"); hr = DPNERR_INVALIDFLAGS; goto Exit; }
hr = DPN_OK;
Exit:
return hr; } // DPTPValidateDoWork
/*
#undef DPF_MODNAME
#define DPF_MODNAME "IsValidDirectPlay8ThreadPoolWorkObject"
//=============================================================================
// IsValidDirectPlay8ThreadPoolWorkObject
//-----------------------------------------------------------------------------
//
// Description: Ensures the given pointer is a valid
// IDirectPlay8ThreadPoolWork interface and object.
//
// Arguments:
// PVOID pvObject - Pointer to interface to validate.
//
// Returns: BOOL
// TRUE - The object is valid.
// FALSE - The object is not valid.
//=============================================================================
BOOL IsValidDirectPlay8ThreadPoolWorkObject(PVOID pvObject) #ifdef DPNBUILD_LIBINTERFACE
{ DPTHREADPOOLOBJECT * pDPTPObject;
pDPTPObject = (DPTHREADPOOLOBJECT*) GET_OBJECT_FROM_INTERFACE(pvObject);
if ((pDPTPObject == NULL) || (! DNVALID_READPTR(pDPTPObject, sizeof(DPTHREADPOOLOBJECT)))) { DPFX(DPFPREP, 0, "Invalid object!"); return FALSE; }
if (pDPTPObject->lpVtbl != &DPTPW_Vtbl) { DPFX(DPFPREP, 0, "Invalid object - bad vtable!"); return FALSE; }
return TRUE; } #else // ! DPNBUILD_LIBINTERFACE
{ INTERFACE_LIST * pIntList = (INTERFACE_LIST*) pvObject; DPTHREADPOOLOBJECT * pDPTPObject;
if (!DNVALID_READPTR(pvObject, sizeof(INTERFACE_LIST))) { DPFX(DPFPREP, 0, "Invalid object pointer!"); return FALSE; }
if (pIntList->lpVtbl != &DPTPW_Vtbl) { DPFX(DPFPREP, 0, "Invalid object - bad vtable!"); return FALSE; }
if (pIntList->iid != IID_IDirectPlay8ThreadPoolWork) { DPFX(DPFPREP, 0, "Invalid object - bad iid!"); return FALSE; }
if ((pIntList->pObject == NULL) || (! DNVALID_READPTR(pIntList->pObject, sizeof(OBJECT_DATA)))) { DPFX(DPFPREP, 0, "Invalid object data!"); return FALSE; }
pDPTPObject = (DPTHREADPOOLOBJECT*) GET_OBJECT_FROM_INTERFACE(pvObject);
if ((pDPTPObject == NULL) || (! DNVALID_READPTR(pDPTPObject, sizeof(DPTHREADPOOLOBJECT)))) { DPFX(DPFPREP, 0, "Invalid object!"); return FALSE; }
return TRUE; } // IsValidDirectPlay8ThreadPoolWorkObject
#endif // ! DPNBUILD_LIBINTERFACE
*/
#endif // ! DPNBUILD_NOPARAMVAL
|