319 lines
8.1 KiB
C++
319 lines
8.1 KiB
C++
/**********************************************************************/
|
|
/** Microsoft Windows NT **/
|
|
/** Copyright(c) Microsoft Corp., 1991 **/
|
|
/**********************************************************************/
|
|
|
|
/*
|
|
|
|
nwcfg.cxx
|
|
netware configuration source code.
|
|
|
|
history:
|
|
terryk 05/07/93 Created
|
|
*/
|
|
|
|
|
|
#if defined(DEBUG)
|
|
static const char szFileName[] = __FILE__;
|
|
#define _FILENAME_DEFINED_ONCE szFileName
|
|
#endif
|
|
|
|
#define APIERR LONG
|
|
|
|
extern "C"
|
|
{
|
|
|
|
#include <windows.h>
|
|
#include <port1632.h>
|
|
|
|
|
|
#include <winspool.h>
|
|
|
|
// exported functions
|
|
|
|
BOOL FAR PASCAL AddNetwarePrinterProvidor( DWORD nArgs, LPSTR apszArgs[], LPSTR * ppszResult );
|
|
BOOL FAR PASCAL DeleteNetwarePrinterProvidor( DWORD nArgs, LPSTR apszArgs[], LPSTR * ppszResult );
|
|
BOOL FAR PASCAL AppendSzToFile( DWORD nArgs, LPSTR apszArgs[], LPSTR * ppszResult );
|
|
BOOL FAR PASCAL GetKernelVersion( DWORD nArgs, LPSTR apszArgs[], LPSTR * ppszResult );
|
|
|
|
extern HINSTANCE ThisDLLHandle;
|
|
}
|
|
|
|
#define UNREFERENCED(x) ((void)(x))
|
|
#include <nwcfg.hxx>
|
|
#include <nwcfg.h>
|
|
|
|
|
|
/*******************************************************************
|
|
|
|
NAME: AddNetwarePrinterProvidor
|
|
|
|
SYNOPSIS: This is a wrapper routine for called AddPrintProvidor. It
|
|
should be called from inf file if the user installs netware.
|
|
|
|
ENTRY: NONE from inf file.
|
|
|
|
RETURN: BOOL - TRUE for success.
|
|
|
|
HISTORY:
|
|
terryk 07-May-1993 Created
|
|
|
|
********************************************************************/
|
|
|
|
#define PROVIDER_DLL_NAME "nwprovau.dll"
|
|
#define MAX_PROVIDER_NAME_LEN 512
|
|
typedef BOOL (WINAPI *T_AddPrintProvidor)(LPSTR pName,DWORD Level,LPBYTE pMonitors);
|
|
typedef BOOL (WINAPI *T_DeletePrintProvidor)(LPSTR pName,LPSTR pEnv, LPSTR pMon);
|
|
|
|
|
|
BOOL FAR PASCAL AddNetwarePrinterProvidor( DWORD nArgs, LPSTR apszArgs[], LPSTR * ppszResult )
|
|
{
|
|
UNREFERENCED( nArgs );
|
|
|
|
PROVIDOR_INFO_1 ProvidorInfo1;
|
|
|
|
ProvidorInfo1.pEnvironment = (LPSTR) NULL;
|
|
ProvidorInfo1.pDLLName = PROVIDER_DLL_NAME;
|
|
|
|
APIERR err = 0;
|
|
do {
|
|
CHAR buf[MAX_PROVIDER_NAME_LEN];
|
|
LPSTR lpProviderName = (LPSTR)buf;
|
|
if ( lpProviderName == NULL )
|
|
{
|
|
err = ERROR_NOT_ENOUGH_MEMORY;
|
|
break;
|
|
}
|
|
if ( !LoadString( ThisDLLHandle,
|
|
PROVIDER_NAME,
|
|
lpProviderName,
|
|
MAX_PROVIDER_NAME_LEN ) )
|
|
{
|
|
err = ::GetLastError();
|
|
break;
|
|
}
|
|
|
|
ProvidorInfo1.pName = lpProviderName;
|
|
|
|
|
|
|
|
HINSTANCE hDll = ::LoadLibraryA( "winspool.drv" );
|
|
if ( hDll == NULL )
|
|
{
|
|
err = ::GetLastError();
|
|
break;
|
|
}
|
|
|
|
FARPROC pAddPrintProvidor = ::GetProcAddress( hDll, "AddPrintProvidorA" );
|
|
|
|
if ( pAddPrintProvidor == NULL )
|
|
{
|
|
err = ::GetLastError();
|
|
} else if ( !(*(T_AddPrintProvidor)pAddPrintProvidor)((LPSTR) NULL,1,(LPBYTE)&ProvidorInfo1))
|
|
{
|
|
err = ::GetLastError();
|
|
}
|
|
|
|
if ( hDll )
|
|
::FreeLibrary( hDll );
|
|
|
|
} while (FALSE);
|
|
wsprintfA( achBuff, "{\"%d\"}", err );
|
|
*ppszResult = achBuff;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL FAR PASCAL DeleteNetwarePrinterProvidor( DWORD nArgs, LPSTR apszArgs[], LPSTR * ppszResult )
|
|
{
|
|
UNREFERENCED( nArgs );
|
|
UNREFERENCED( apszArgs );
|
|
|
|
APIERR err = 0;
|
|
|
|
do {
|
|
HINSTANCE hDll = ::LoadLibraryA( "winspool.drv" );
|
|
if ( hDll == NULL )
|
|
{
|
|
err = ::GetLastError();
|
|
break;
|
|
}
|
|
|
|
FARPROC pDeletePrintProvidor = ::GetProcAddress( hDll, "DeletePrintProvidorA" );
|
|
|
|
if ( pDeletePrintProvidor == NULL )
|
|
{
|
|
err = ::GetLastError();
|
|
}
|
|
else
|
|
{
|
|
CHAR buf[MAX_PROVIDER_NAME_LEN];
|
|
LPSTR lpProviderName = (LPSTR)buf;
|
|
if ( lpProviderName == NULL )
|
|
{
|
|
err = ERROR_NOT_ENOUGH_MEMORY;
|
|
break;
|
|
}
|
|
if ( nArgs == 1 )
|
|
{
|
|
lpProviderName = apszArgs[0];
|
|
} else
|
|
{
|
|
if ( !LoadString( ThisDLLHandle,
|
|
PROVIDER_NAME,
|
|
lpProviderName,
|
|
MAX_PROVIDER_NAME_LEN ) )
|
|
{
|
|
err = ::GetLastError();
|
|
}
|
|
}
|
|
if ( !(*(T_DeletePrintProvidor)pDeletePrintProvidor)( (LPSTR) NULL,
|
|
(LPSTR) NULL,
|
|
lpProviderName))
|
|
{
|
|
err = ::GetLastError();
|
|
}
|
|
}
|
|
|
|
if ( hDll )
|
|
::FreeLibrary ( hDll );
|
|
|
|
} while (FALSE);
|
|
wsprintfA( achBuff, "{\"%d\"}", err );
|
|
*ppszResult = achBuff;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/*******************************************************************
|
|
|
|
NAME: AppendSzToFile
|
|
|
|
SYNOPSIS: Append a string to a file.
|
|
|
|
ENTRY: Args[0] - FileName string
|
|
Args[1] - String to be added to the file
|
|
|
|
RETURN: BOOL - TRUE for success.
|
|
|
|
HISTORY:
|
|
terryk 07-May-1993 Created
|
|
|
|
********************************************************************/
|
|
|
|
BOOL FAR PASCAL
|
|
AppendSzToFile( DWORD nArgs, LPSTR apszArgs[], LPSTR * ppszResult )
|
|
{
|
|
UNREFERENCED( nArgs );
|
|
|
|
DWORD BytesWritten;
|
|
HANDLE hfile;
|
|
LPSTR szFileName = apszArgs[0];
|
|
LPSTR szAddOnSz = apszArgs[1];
|
|
|
|
//
|
|
// Open the file
|
|
//
|
|
|
|
hfile = CreateFile(
|
|
szFileName,
|
|
GENERIC_WRITE | GENERIC_READ,
|
|
FILE_SHARE_READ,
|
|
(struct _SECURITY_ATTRIBUTES *) NULL,
|
|
OPEN_ALWAYS,
|
|
FILE_ATTRIBUTE_NORMAL,
|
|
NULL
|
|
);
|
|
|
|
if (hfile == INVALID_HANDLE_VALUE) {
|
|
wsprintfA( achBuff, "{ Cannot Open File: \"%s\"}", szFileName );
|
|
*ppszResult = achBuff;
|
|
return FALSE;
|
|
}
|
|
|
|
//
|
|
// Go to end of file
|
|
//
|
|
|
|
SetFilePointer (
|
|
hfile,
|
|
0,
|
|
(PLONG) NULL,
|
|
FILE_END
|
|
);
|
|
|
|
//
|
|
// Append string passed in at the end of the file
|
|
//
|
|
|
|
WriteFile (
|
|
hfile,
|
|
szAddOnSz,
|
|
lstrlen( szAddOnSz ),
|
|
&BytesWritten,
|
|
(struct _OVERLAPPED *) NULL
|
|
);
|
|
|
|
CloseHandle (hfile);
|
|
wsprintfA( achBuff, "{\"%d\"}", 0 );
|
|
*ppszResult = achBuff;
|
|
return TRUE;
|
|
}
|
|
|
|
/*******************************************************************
|
|
|
|
NAME: GetKernelVersion
|
|
|
|
SYNOPSIS: Get the current kernel version number
|
|
|
|
ENTRY: NONE from inf file.
|
|
|
|
RETURN: BOOL - TRUE for success.
|
|
The return number is the kernel build number.
|
|
{"MajorVerion","MinorVersion","BuildNumber","PatchNumber"}
|
|
|
|
HISTORY:
|
|
terryk 24-Sept-1993 Created
|
|
|
|
********************************************************************/
|
|
|
|
BOOL FAR PASCAL
|
|
GetKernelVersion( DWORD nArgs, LPSTR apszArgs[], LPSTR * ppszResult )
|
|
{
|
|
UNREFERENCED( nArgs );
|
|
|
|
DWORD wVer;
|
|
LONG nSubVersion;
|
|
LONG nVersion;
|
|
|
|
LPCSTR lpszRegName = "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion";
|
|
HKEY hsubkey ;
|
|
DWORD dwZero = 0;
|
|
DWORD dwRegValueType;
|
|
DWORD dwRegValue;
|
|
DWORD cbRegValue;
|
|
|
|
wVer = GetVersion();
|
|
nSubVersion = GETMINORVERSION(wVer);
|
|
nVersion = GETMAJORVERSION(wVer);
|
|
|
|
cbRegValue = sizeof(dwRegValue);
|
|
|
|
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,
|
|
lpszRegName, dwZero, KEY_QUERY_VALUE, &hsubkey) ||
|
|
RegQueryValueEx(hsubkey, "CSDVersion", (LPDWORD)NULL,
|
|
&dwRegValueType, (LPBYTE)&dwRegValue, &cbRegValue) ||
|
|
dwRegValueType != REG_DWORD
|
|
) {
|
|
wsprintf(achBuff,"{\"%d\",\"%d\",\"%d\",\"%d\"}", nVersion, nSubVersion, wVer >> 16, 0);
|
|
} else {
|
|
wsprintf(achBuff,"{\"%d\",\"%d\",\"%d\",\"%d\"}", nVersion, nSubVersion, wVer >> 16, dwRegValue);
|
|
}
|
|
if (hsubkey != NULL) {
|
|
RegCloseKey (hsubkey);
|
|
}
|
|
*ppszResult = achBuff;
|
|
return TRUE;
|
|
}
|
|
|