Windows NT 4.0 source code leak
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.
 
 
 
 
 
 

359 lines
11 KiB

/*++ BUILD Version: 0001 // Increment this if a change has global effects
Copyright (c) 1994, 1995 Microsoft Corporation.
All rights reserved.
MODULE NAME:
lsapiex.c
ABSTRACT:
Microsoft application-level extensions to the standard LSAPI.
CREATED:
1995-09-01 Jeff Parham (jeffparh)
REVISION HISTORY:
--*/
#include <limits.h>
#include <windows.h>
#include <lsapi.h>
#include "debug.h"
#include "provider.h"
#include "license.h"
#include "request.h"
//////////////////////////////////////////////////////////////////////////////
// GLOBAL IMPLEMENTATIONS //
//////////////////////////////
LS_STATUS_CODE LS_API_ENTRY
LSLicenseUnitsSet( LS_STR * LicenseSystem,
LS_STR * PublisherName,
LS_STR * ProductName,
LS_STR * Version,
LS_LICENSE_TYPE LicenseType,
LS_STR * UserName,
LS_ULONG NumUnits,
LS_ULONG NumSecrets,
LS_ULONG * Secrets )
/*++
Routine Description:
Set the number of units for the given license to the designated value.
Arguments:
LicenseSystem (LS_STR *)
Ignored.
PublisherName (LS_STR *)
Publisher name for which to set the license info.
ProductName (LS_STR *)
Product name for which to set the license info.
Version (LS_STR *)
Product version for which to set the license info.
LicenseType (LS_LICENSE_TYPE)
Type of license for which to set the license info.
UserName (LS_STR *)
User for which to set the license info. If LS_NULL and the the license
type is LS_LICENSE_TYPE_USER, the license info will be set for the
user corresponding to the current thread.
NumUnits (LS_ULONG)
Units purchased for this license.
NumSecrets (LS_ULONG)
Number of application-specific secrets corresponding to this license.
Secrets (LS_ULONG *)
Array of application-specific secrets corresponding to this license.
Return Value:
(LS_STATUS_CODE)
LS_SUCCESS
License successfully installed.
LS_BAD_ARG
The parameters passed to the function were invalid.
other
An error occurred whil attempting to install the license.
--*/
{
LS_STATUS_CODE lsscError;
LS_LICENSE_HANDLE lslhLicenseHandle;
LS_LICENSE_UNITS lsluLicenseUnits;
DWORD i;
if ( IsBadStringPtr( PublisherName, UINT_MAX )
|| IsBadStringPtr( ProductName, UINT_MAX )
|| IsBadStringPtr( Version, UINT_MAX )
|| ( ( NULL != UserName )
&& IsBadStringPtr( UserName, UINT_MAX ) )
|| IsBadReadPtr( Secrets, NumSecrets * sizeof( LS_ULONG ) ) )
{
// bad app, bad!
lsscError = LS_BAD_ARG;
}
else
{
lsscError = LicenseListLock();
ASSERT( LS_SUCCESS == lsscError );
if ( LS_SUCCESS == lsscError )
{
// get license handle
lsscError = LicenseOpen( PublisherName, ProductName, Version, UserName, &lslhLicenseHandle );
ASSERT( LS_SUCCESS == lsscError );
if ( LS_SUCCESS == lsscError )
{
// set license type
lsscError = LicenseTypeSet( lslhLicenseHandle, LicenseType );
ASSERT( LS_SUCCESS == lsscError );
if ( LS_SUCCESS == lsscError )
{
// get current license units
lsscError = LicenseUnitsGet( lslhLicenseHandle, &lsluLicenseUnits );
ASSERT( LS_SUCCESS == lsscError );
if ( LS_SUCCESS == lsscError )
{
// change total units and save
lsluLicenseUnits.lsulTotalUnits = ( NumUnits == LS_DEFAULT_UNITS ) ? 1 : NumUnits;
lsscError = LicenseUnitsSet( lslhLicenseHandle, &lsluLicenseUnits );
ASSERT( LS_SUCCESS == lsscError );
if ( LS_SUCCESS == lsscError )
{
// set secrets
for ( i=0; ( LS_SUCCESS == lsscError ) && ( i < NumSecrets ); i++ )
{
lsscError = LicenseSecretSet( lslhLicenseHandle, i + 1, Secrets[i] );
}
}
}
}
LicenseClose( lslhLicenseHandle );
}
LicenseListUnlock();
}
}
return lsscError;
}
//////////////////////////////////////////////////////////////////////////////
LS_STATUS_CODE LS_API_ENTRY
LSLicenseUnitsGet( LS_STR * LicenseSystem,
LS_STR * PublisherName,
LS_STR * ProductName,
LS_STR * Version,
LS_STR * UserName,
LS_ULONG * NumUnits )
/*++
Routine Description:
Get the number of units for the given license.
Arguments:
LicenseSystem (LS_STR *)
Ignored.
PublisherName (LS_STR *)
Publisher name for which to get the license info.
ProductName (LS_STR *)
Product name for which to get the license info.
Version (LS_STR *)
Product version for which to get the license info.
UserName (LS_STR *)
User for which to get the license info. If LS_NULL and the the license
type is LS_LICENSE_TYPE_USER, license info will be retrieved for the
user corresponding to the current thread.
NumUnits (LS_ULONG *)
On return, the number of units purchased for this license.
Return Value:
(LS_STATUS_CODE)
LS_SUCCESS
Success.
LS_BAD_ARG
The parameters passed to the function were invalid.
other
An error occurred whil attempting to retrieve the license.
--*/
{
LS_STATUS_CODE lsscError;
LS_LICENSE_HANDLE lslhLicenseHandle;
LS_LICENSE_UNITS lsluLicenseUnits;
if ( IsBadStringPtr( LicenseSystem, UINT_MAX )
|| IsBadStringPtr( PublisherName, UINT_MAX )
|| IsBadStringPtr( ProductName, UINT_MAX )
|| IsBadStringPtr( Version, UINT_MAX )
|| ( ( NULL != UserName )
&& IsBadStringPtr( UserName, UINT_MAX ) )
|| IsBadWritePtr( NumUnits, sizeof( *NumUnits ) ) )
{
// bad app, bad!
lsscError = LS_BAD_ARG;
}
else
{
lsscError = LicenseListLock();
ASSERT( LS_SUCCESS == lsscError );
if ( LS_SUCCESS == lsscError )
{
// get license handle
lsscError = LicenseOpen( PublisherName, ProductName, Version, UserName, &lslhLicenseHandle );
ASSERT( LS_SUCCESS == lsscError );
if ( LS_SUCCESS == lsscError )
{
// get current license units
lsscError = LicenseUnitsGet( lslhLicenseHandle, &lsluLicenseUnits );
ASSERT( LS_SUCCESS == lsscError );
if ( LS_SUCCESS == lsscError )
{
// return total units
*NumUnits = lsluLicenseUnits.lsulTotalUnits;
}
LicenseClose( lslhLicenseHandle );
}
LicenseListUnlock();
}
}
return lsscError;
}
//////////////////////////////////////////////////////////////////////////////
LS_STATUS_CODE LS_API_ENTRY
LSInstall( LS_STR * ProviderPath )
/*++
Routine Description:
Initialize the license system. This API is called when the provider is
first configured as an LSAPI licence service provider.
Arguments:
ProviderPath (LS_STR *)
Path to our DLL.
Return Value:
(LS_STATUS_CODE)
LS_SUCCESS
Provider was successfully configured.
other
An error occurred while attempting to configure.
--*/
{
LS_STATUS_CODE lsscError;
LONG lError;
HKEY hKey;
DWORD dwDisposition;
TCHAR szDllPath[] = "%SystemRoot%\\System32\\MSLSP32.DLL";
DWORD dwData;
lsscError = RequestListLock();
ASSERT( LS_SUCCESS == lsscError );
if ( LS_SUCCESS == lsscError )
{
// set us up to use the event log, if applicable
lError = RegOpenKeyEx( HKEY_LOCAL_MACHINE,
TEXT( "SYSTEM\\CurrentControlSet\\Services\\EventLog" ),
0,
KEY_ALL_ACCESS,
&hKey );
if ( ERROR_SUCCESS != lError )
{
// no event log service, so skip it
lsscError = LS_SUCCESS;
}
else
{
// event log service is on this machine, so set up our source
RegCloseKey( hKey );
lError = RegCreateKeyEx( HKEY_LOCAL_MACHINE,
TEXT( "SYSTEM\\CurrentControlSet\\Services\\EventLog\\Application\\MSLSP32" ),
0,
NULL,
0,
KEY_ALL_ACCESS,
NULL,
&hKey,
&dwDisposition );
if ( ERROR_SUCCESS != lError )
{
lsscError = LogAddDword( LOG_ERROR, LS_SYSTEM_ERROR, lError );
}
else
{
lError = RegSetValueEx( hKey,
TEXT( "EventMessageFile" ),
0,
REG_EXPAND_SZ,
(LPBYTE) szDllPath,
sizeof( szDllPath ) );
if ( ERROR_SUCCESS != lError )
{
lsscError = LogAddDword( LOG_ERROR, LS_SYSTEM_ERROR, lError );
}
else
{
dwData = EVENTLOG_ERROR_TYPE | EVENTLOG_WARNING_TYPE | EVENTLOG_INFORMATION_TYPE;
lError = RegSetValueEx( hKey,
TEXT( "TypesSupported" ),
0,
REG_DWORD,
(LPBYTE) &dwData,
sizeof( dwData ) );
if ( ERROR_SUCCESS != lError )
{
lsscError = LogAddDword( LOG_ERROR, LS_SYSTEM_ERROR, lError );
}
else
{
lsscError = LS_SUCCESS;
// event log configured; bounce the log system so it will use it
LogDestroy();
LogCreate( "MSLSP32" );
}
}
RegCloseKey( hKey );
}
}
RequestListUnlock();
}
return LS_SUCCESS;
}