mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
273 lines
5.1 KiB
273 lines
5.1 KiB
/*++ BUILD Version: 0001 // Increment this if a change has global effects
|
|
|
|
Copyright (c) 1994, 1995 Microsoft Corporation.
|
|
All rights reserved.
|
|
|
|
MODULE NAME:
|
|
|
|
request.c
|
|
|
|
ABSTRACT:
|
|
|
|
Request APIs to support the Microsoft LSAPI-compliant license service
|
|
provider (MSLSP32.DLL).
|
|
|
|
License requests track an instance of a specific application asking for a
|
|
license for a specific product. There is a one-to-one mapping between
|
|
the LS_HANDLE associated with a given caller and LS_REQUEST_INFO
|
|
structures.
|
|
|
|
CREATED:
|
|
|
|
1995-09-01 Jeff Parham (jeffparh)
|
|
|
|
REVISION HISTORY:
|
|
|
|
--*/
|
|
|
|
#include <windows.h>
|
|
#include <lsapi.h>
|
|
#include "debug.h"
|
|
#include "request.h"
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
// LOCAL VARIABLES //
|
|
///////////////////////
|
|
|
|
static HANDLE l_hRequestLock = NULL;
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
// IMPLEMENTATION //
|
|
//////////////////////
|
|
|
|
LS_STATUS_CODE
|
|
RequestListAdd( LS_REQUEST_INFO * plsriRequestInfo,
|
|
LS_HANDLE * plshProviderHandle )
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Adds a license request.
|
|
|
|
Arguments:
|
|
|
|
plsriRequestInfo (LS_REQUEST_INFO *)
|
|
New request info to remember.
|
|
plshProviderHandle (LS_HANDLE *)
|
|
On return, holds a handle for this request so that it may later be
|
|
retrieved.
|
|
|
|
Return Value:
|
|
|
|
(LS_STATUS_CODE)
|
|
LS_SUCCESS
|
|
Success.
|
|
LS_RESOURCES_UNAVAILABLE
|
|
No memory to satisfy the request.
|
|
|
|
--*/
|
|
{
|
|
LS_STATUS_CODE lsscError = LS_RESOURCES_UNAVAILABLE;
|
|
LS_REQUEST_INFO * plsriNewRequestInfo;
|
|
|
|
plsriNewRequestInfo = LocalAlloc( LMEM_FIXED, sizeof( *plsriRequestInfo ) );
|
|
|
|
if ( NULL != plsriNewRequestInfo )
|
|
{
|
|
MoveMemory( plsriNewRequestInfo, plsriRequestInfo, sizeof( *plsriRequestInfo ) );
|
|
|
|
*plshProviderHandle = (LS_HANDLE) plsriNewRequestInfo;
|
|
lsscError = LS_SUCCESS;
|
|
}
|
|
|
|
return lsscError;
|
|
}
|
|
|
|
LS_VOID
|
|
RequestListFree( LS_HANDLE lshProviderHandle )
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Removes a license request.
|
|
|
|
Arguments:
|
|
|
|
lshProviderHandle (LS_HANDLE)
|
|
The handle associated with the request to delete (as returned by a
|
|
prior call to RequestListAdd() ).
|
|
|
|
Return Value:
|
|
|
|
None.
|
|
|
|
--*/
|
|
{
|
|
if ( NULL != (LS_REQUEST_INFO *) lshProviderHandle )
|
|
{
|
|
LocalFree( (LS_REQUEST_INFO *) lshProviderHandle );
|
|
}
|
|
}
|
|
|
|
LS_STATUS_CODE
|
|
RequestListCreate( LS_VOID )
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Initializes the request list. This function must be called before
|
|
any other Request APIs (e.g., RequestListAdd()).
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Value:
|
|
|
|
(LS_STATUS_CODE)
|
|
LS_SUCCESS
|
|
Success.
|
|
LS_SYSTEM_INIT_FAILED
|
|
Unable to intialize the subsystem.
|
|
|
|
--*/
|
|
{
|
|
ASSERT( NULL == l_hRequestLock );
|
|
|
|
l_hRequestLock = CreateMutex( NULL, FALSE, NULL );
|
|
ASSERT( NULL != l_hRequestLock );
|
|
|
|
return ( NULL != l_hRequestLock ) ? LS_SUCCESS
|
|
: LS_SYSTEM_INIT_FAILED;
|
|
}
|
|
|
|
LS_VOID
|
|
RequestListDestroy( LS_VOID )
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Destroys the request list (the antithesis to RequestListAdd()). This
|
|
function must be the last Request API called.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Value:
|
|
|
|
None.
|
|
|
|
--*/
|
|
{
|
|
if ( NULL != l_hRequestLock )
|
|
{
|
|
CloseHandle( l_hRequestLock );
|
|
l_hRequestLock = NULL;
|
|
}
|
|
}
|
|
|
|
LS_STATUS_CODE
|
|
RequestListLock( LS_VOID )
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Acquire exclusive access to the request list.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Value:
|
|
|
|
(LS_STATUS_CODE)
|
|
LS_SUCCESS
|
|
Success.
|
|
LS_RESOURCES_UNAVAILABLE
|
|
Unable to acquire lock.
|
|
|
|
--*/
|
|
{
|
|
DWORD dwError;
|
|
|
|
ASSERT( NULL != l_hRequestLock );
|
|
|
|
dwError = WaitForSingleObject( l_hRequestLock, INFINITE );
|
|
ASSERT( WAIT_OBJECT_0 == dwError );
|
|
|
|
return ( WAIT_OBJECT_0 == dwError ) ? LS_SUCCESS
|
|
: LS_RESOURCES_UNAVAILABLE;
|
|
}
|
|
|
|
LS_STATUS_CODE
|
|
RequestListUnlock( LS_VOID )
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Release exclusive access to the request list.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Value:
|
|
|
|
(LS_STATUS_CODE)
|
|
LS_SUCCESS
|
|
Success.
|
|
LS_RESOURCES_UNAVAILABLE
|
|
Error releasing lock.
|
|
|
|
--*/
|
|
{
|
|
BOOL ok;
|
|
|
|
ASSERT( NULL != l_hRequestLock );
|
|
|
|
ok = ReleaseMutex( l_hRequestLock );
|
|
ASSERT( ok );
|
|
|
|
return ok ? LS_SUCCESS
|
|
: LS_RESOURCES_UNAVAILABLE;
|
|
}
|
|
|
|
|
|
LS_STATUS_CODE
|
|
RequestListGet( LS_HANDLE lshProviderHandle,
|
|
LS_REQUEST_INFO ** pplsriRequestInfo )
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Acquire a pointer to a previously saved request structure.
|
|
|
|
Arguments:
|
|
|
|
lshProviderHandle (LS_HANDLE)
|
|
Handle returned by a prior call to RequestListAdd().
|
|
pplsriRequestInfo (LS_REQUEST_INFO **)
|
|
On return, a pointer to the associated request structure.
|
|
|
|
Return Value:
|
|
|
|
(LS_STATUS_CODE)
|
|
LS_SUCCESS
|
|
Success.
|
|
LS_BAD_HANDLE
|
|
The given handle is invalid.
|
|
|
|
--*/
|
|
{
|
|
LS_STATUS_CODE lsscError = LS_BAD_HANDLE;
|
|
|
|
if ( (LS_HANDLE) NULL != lshProviderHandle )
|
|
{
|
|
*pplsriRequestInfo = (LS_REQUEST_INFO *) lshProviderHandle;
|
|
lsscError = LS_SUCCESS;
|
|
}
|
|
|
|
return lsscError;
|
|
}
|