|
|
/*++
Copyright (c) 1991 Microsoft Corporation
Module Name:
winsstub.c
Abstract:
Client stubs of the WINS server service APIs.
Author:
Pradeep Bahl (pradeepb) Apr-1993
Environment:
User Mode - Win32
Revision History:
--*/
#include "windows.h"
#include "rpc.h"
#include "winsif.h"
#include "esent.h"
#include "winscnst.h"
//#include "winsintf.h"
//
// prototypes
//
DWORD WinsRestoreC( LPBYTE pBackupPath, DbVersion Version );
DWORD WinsRecordAction( WINSIF2_HANDLE ServerHdl, PWINSINTF_RECORD_ACTION_T *ppRecAction ) { DWORD status;
RpcTryExcept {
status = R_WinsRecordAction( ServerHdl, ppRecAction );
} RpcExcept( I_RpcExceptionFilter(RpcExceptionCode()) ) {
status = RpcExceptionCode();
} RpcEndExcept
return status; }
DWORD WinsStatus( WINSIF2_HANDLE ServerHdl, WINSINTF_CMD_E Cmd_e, PWINSINTF_RESULTS_T pResults ) { DWORD status;
RpcTryExcept {
status = R_WinsStatus( //pWinsAddStr,
ServerHdl, Cmd_e, pResults );
} RpcExcept( I_RpcExceptionFilter(RpcExceptionCode()) ) {
status = RpcExceptionCode();
} RpcEndExcept
return status; }
DWORD WinsStatusNew( WINSIF2_HANDLE ServerHdl, WINSINTF_CMD_E Cmd_e, PWINSINTF_RESULTS_NEW_T pResults ) { DWORD status;
RpcTryExcept {
status = R_WinsStatusNew( ServerHdl, Cmd_e, pResults );
} RpcExcept( I_RpcExceptionFilter(RpcExceptionCode()) ) {
status = RpcExceptionCode();
} RpcEndExcept
return status; }
DWORD WinsStatusWHdl( WINSIF_HANDLE ServerHdl, WINSINTF_CMD_E Cmd_e, PWINSINTF_RESULTS_NEW_T pResults ) { DWORD status;
RpcTryExcept {
status = R_WinsStatusWHdl( ServerHdl, Cmd_e, pResults );
} RpcExcept( I_RpcExceptionFilter(RpcExceptionCode()) ) {
status = RpcExceptionCode();
} RpcEndExcept
return status; }
DWORD WinsTrigger( WINSIF2_HANDLE ServerHdl, PWINSINTF_ADD_T pWinsAdd, WINSINTF_TRIG_TYPE_E TrigType_e ) { DWORD status; RpcTryExcept {
status = R_WinsTrigger( ServerHdl, pWinsAdd, TrigType_e );
} RpcExcept( I_RpcExceptionFilter(RpcExceptionCode()) ) {
status = RpcExceptionCode();
} RpcEndExcept
return status; } DWORD WinsDoStaticInit( WINSIF2_HANDLE ServerHdl, LPWSTR pDataFilePath, DWORD fDel ) { DWORD status; RpcTryExcept {
status = R_WinsDoStaticInit( ServerHdl, pDataFilePath, fDel);
} RpcExcept( I_RpcExceptionFilter(RpcExceptionCode()) ) {
status = RpcExceptionCode();
} RpcEndExcept
return status;
}
DWORD WinsDoScavenging( WINSIF2_HANDLE ServerHdl ) { DWORD status; RpcTryExcept {
status = R_WinsDoScavenging( ServerHdl );
} RpcExcept( I_RpcExceptionFilter(RpcExceptionCode()) ) {
status = RpcExceptionCode();
} RpcEndExcept
return status;
} DWORD WinsDoScavengingNew( WINSIF2_HANDLE ServerHdl, PWINSINTF_SCV_REQ_T pScvReq ) { DWORD status; RpcTryExcept {
status = R_WinsDoScavengingNew( ServerHdl, pScvReq);
} RpcExcept( I_RpcExceptionFilter(RpcExceptionCode()) ) {
status = RpcExceptionCode();
} RpcEndExcept
return status;
}
DWORD WinsGetDbRecs( WINSIF2_HANDLE ServerHdl, PWINSINTF_ADD_T pWinsAdd, WINSINTF_VERS_NO_T MinVersNo, WINSINTF_VERS_NO_T MaxVersNo, PWINSINTF_RECS_T pRecs ) { DWORD status; RpcTryExcept {
status = R_WinsGetDbRecs( ServerHdl, pWinsAdd, MinVersNo, MaxVersNo, pRecs);
} RpcExcept( I_RpcExceptionFilter(RpcExceptionCode()) ) {
status = RpcExceptionCode();
} RpcEndExcept
return status;
} DWORD WinsTerm( handle_t ServerHdl, short fAbruptTerm ) { DWORD status; RpcTryExcept {
status = R_WinsTerm( ServerHdl, fAbruptTerm);
} RpcExcept( I_RpcExceptionFilter(RpcExceptionCode()) ) {
status = RpcExceptionCode();
} RpcEndExcept
return status; }
DWORD WinsBackup( WINSIF2_HANDLE ServerHdl, LPBYTE pBackupPath, short fIncremental ) { DWORD status; RpcTryExcept {
status = R_WinsBackup( ServerHdl, pBackupPath, fIncremental);
} RpcExcept( I_RpcExceptionFilter(RpcExceptionCode()) ) {
status = RpcExceptionCode();
} RpcEndExcept
return status; }
DWORD WinsDelDbRecs( WINSIF2_HANDLE ServerHdl, PWINSINTF_ADD_T pWinsAdd, WINSINTF_VERS_NO_T MinVersNo, WINSINTF_VERS_NO_T MaxVersNo ) { DWORD status; RpcTryExcept {
status = R_WinsDelDbRecs( ServerHdl, pWinsAdd, MinVersNo, MaxVersNo);
} RpcExcept( I_RpcExceptionFilter(RpcExceptionCode()) ) {
status = RpcExceptionCode();
} RpcEndExcept
return status; }
DWORD WinsPullRange( WINSIF2_HANDLE ServerHdl, PWINSINTF_ADD_T pWinsAdd, PWINSINTF_ADD_T pOwnAdd, WINSINTF_VERS_NO_T MinVersNo, WINSINTF_VERS_NO_T MaxVersNo ) { DWORD status; RpcTryExcept {
status = R_WinsPullRange( ServerHdl, pWinsAdd, pOwnAdd, MinVersNo, MaxVersNo);
} RpcExcept( I_RpcExceptionFilter(RpcExceptionCode()) ) {
status = RpcExceptionCode();
} RpcEndExcept
return status; } DWORD WinsSetPriorityClass( WINSIF2_HANDLE ServerHdl, WINSINTF_PRIORITY_CLASS_E PrCls_e ) { DWORD status; RpcTryExcept {
status = R_WinsSetPriorityClass( ServerHdl, PrCls_e);
} RpcExcept( I_RpcExceptionFilter(RpcExceptionCode()) ) {
status = RpcExceptionCode();
} RpcEndExcept
return status; }
DWORD WinsResetCounters( WINSIF2_HANDLE ServerHdl ) { DWORD status; RpcTryExcept {
status = R_WinsResetCounters( ServerHdl );
} RpcExcept( I_RpcExceptionFilter(RpcExceptionCode()) ) {
status = RpcExceptionCode();
} RpcEndExcept
return status; }
DWORD WinsRestoreEx( LPBYTE pBackupPath, DbVersion Version ) { return(WinsRestoreC(pBackupPath, Version)); }
DWORD WinsRestore( LPBYTE pBackupPath ) { return(WinsRestoreC(pBackupPath, DbVersion5 )); }
DWORD ConvertUnicodeStringToAscii( LPWSTR pUnicodeString, LPBYTE pAsciiString, DWORD MaxSz ) { DWORD RetVal; RetVal = WideCharToMultiByte( CP_ACP, 0, pUnicodeString, -1, pAsciiString, MaxSz, NULL, NULL ); if (0 == RetVal ) { return GetLastError(); } else { return ERROR_SUCCESS; } }
DWORD WinsReadLogPath( PCHAR *pLogPath ) { DWORD Error; static TCHAR Buf[WINSINTF_MAX_NAME_SIZE]; static TCHAR ExpandBuf[WINSINTF_MAX_NAME_SIZE]; static char AsciiBuf[WINSINTF_MAX_NAME_SIZE]; WCHAR *pTempPath,*pExpandTempPath; HKEY sParamKey; DWORD ValTyp; DWORD Sz; #define WINS_PARAM_KEY TEXT("System\\CurrentControlSet\\Services\\Wins\\Parameters")
#define DEFAULT_LOG_FILE_PATH TEXT("%SystemRoot%\\System32\\wins")
Error = RegOpenKeyEx( HKEY_LOCAL_MACHINE, WINS_PARAM_KEY, 0 , KEY_READ, &sParamKey );
if (ERROR_SUCCESS != Error) { return Error; }
pTempPath = Buf; Error = RegQueryValueEx( sParamKey, WINSCNF_LOG_FILE_PATH_NM, NULL, //reserved; must be NULL
&ValTyp, (LPBYTE)pTempPath, &Sz );
if (ERROR_SUCCESS != Error || pTempPath[0] == L'\0') { pTempPath = DEFAULT_LOG_FILE_PATH; } pExpandTempPath = ExpandBuf; Error = ExpandEnvironmentStrings( pTempPath, pExpandTempPath, WINSINTF_MAX_NAME_SIZE); if (0 == Error || Error > WINSINTF_MAX_NAME_SIZE) { RegCloseKey(sParamKey); return GetLastError(); } *pLogPath = AsciiBuf; Error = ConvertUnicodeStringToAscii( pExpandTempPath, *pLogPath, WINSINTF_MAX_NAME_SIZE ); RegCloseKey(sParamKey); return Error; }
DWORD WinsDelLogFiles(LPCSTR pFilePattern, LPSTR pFilePath) { DWORD dwErr = ERROR_SUCCESS; WIN32_FIND_DATAA FileInfo; HANDLE SearchHandle; CHAR FullFilePath[MAX_PATH + WINSINTF_MAX_NAME_SIZE + 2];
// Construct the full file pattern
strcpy(FullFilePath, pFilePath); strcat(FullFilePath, "\\"); strcat(FullFilePath, pFilePattern);
SearchHandle = FindFirstFileA(FullFilePath, &FileInfo); if (SearchHandle == INVALID_HANDLE_VALUE) dwErr = GetLastError();
while(dwErr == ERROR_SUCCESS) { // construct the full file path
strcpy(FullFilePath, pFilePath); strcat(FullFilePath, "\\"); strcat(FullFilePath, FileInfo.cFileName);
if (!DeleteFileA(FullFilePath) || !FindNextFileA(SearchHandle, &FileInfo)) { dwErr = GetLastError(); } } if (dwErr == ERROR_NO_MORE_FILES) dwErr = ERROR_SUCCESS;
if (SearchHandle != INVALID_HANDLE_VALUE) FindClose(SearchHandle);
return dwErr; }
DWORD WinsRestoreC( LPBYTE pBackupPath, DbVersion Version )
/*++
Routine Description:
This is not an RPC function. It is provided to do a restore of the database. Arguments: pBackupPath - Path to the backup directory
Externals Used: None
Return Value:
Success status codes -- Error status codes --
Error Handling:
Called by:
Side Effects:
Comments: None --*/ { JET_ERR JetRetStat; HMODULE hExtension; FARPROC fRestoreFn; FARPROC fSetSystemParamFn; DWORD RetStat = WINSINTF_SUCCESS; DWORD ProcId = 0x9C; //ordinal value of JetRestore
LPCSTR RestoreProcName; LPCSTR SetSystemParamProcName; BYTE BackupPath[WINSINTF_MAX_NAME_SIZE + sizeof(WINS_BACKUP_DIR_ASCII)]; CHAR *pLogFilePath; DWORD Error; BOOL fDirCr; LPTSTR pDllName;
// static BOOL sLoaded = FALSE;
try { // if (!sLoaded)
{
switch ( Version ) { case DbVersion351: pDllName = TEXT("jet.dll"); RestoreProcName = (LPCSTR)0x9C; SetSystemParamProcName=(LPCSTR)165; break; case DbVersion4: pDllName = TEXT("jet500.dll"); RestoreProcName = "JetRestore"; SetSystemParamProcName="JetSetSystemParameter"; break; case DbVersion5: pDllName = TEXT("esent.dll"); RestoreProcName = "JetRestore"; SetSystemParamProcName="JetSetSystemParameter"; break; default: return WINSINTF_FAILURE; }
// load the extension agent dll and resolve the entry points...
if ((hExtension = GetModuleHandle(pDllName)) == NULL) { if ((hExtension = LoadLibrary(pDllName)) == NULL) { return(GetLastError()); } else { if ((fRestoreFn = GetProcAddress(hExtension,RestoreProcName)) == (FARPROC)NULL) { RetStat = GetLastError(); }
if ((RetStat == ERROR_SUCCESS) && (Version != DbVersion351) ) { if ((fSetSystemParamFn = GetProcAddress(hExtension, SetSystemParamProcName)) == (FARPROC)NULL) { RetStat = GetLastError(); } } } } } // sLoaded = TRUE;
//FUTURES("Change to lstrcpy and lstrcat when Jet starts supporting unicode")
if (RetStat == WINSINTF_SUCCESS) { strcpy(BackupPath, pBackupPath); strcat(BackupPath, WINS_BACKUP_DIR_ASCII); fDirCr = CreateDirectoryA(BackupPath, NULL);
if (!fDirCr && ((Error = GetLastError()) == ERROR_ALREADY_EXISTS)) { if (Version != DbVersion351) { JET_INSTANCE JetInstance=0; #define BASENAME "j50"
#define LOG_FILE_SUFFIX "*.log"
//
// first set the system parameter for basename
//
//
// Basename to use for jet*.log and jet.chk
//
// We should also specify the logfile path by checking WINS registry
// but it is not essential.
//
// When WINS comes up, if it gets an error indicating that there
// was a bad log signature or log version, it will delete all log
// files and restart again.
//
do { JetRetStat = (JET_ERR)(*fSetSystemParamFn)( &JetInstance, (JET_SESID)0, //SesId - ignored
JET_paramBaseName, 0, BASENAME ); if (JetRetStat != JET_errSuccess) break; JetRetStat = (JET_ERR)(*fSetSystemParamFn)( &JetInstance, (JET_SESID)0, //SesId - ignored
JET_paramLogFileSize, 1024, NULL );
JetRetStat = WinsReadLogPath( &pLogFilePath ); if (JetRetStat != JET_errSuccess) break;
JetRetStat = (JET_ERR)(*fSetSystemParamFn)( &JetInstance, (JET_SESID)0, //SesId - ignored
JET_paramLogFilePath, 0, pLogFilePath ); if (JetRetStat != JET_errSuccess) break;
if (Version == DbVersion5) { // only for esent, request to delete old logs to avoid
// having them played back upon restore (bug #277816)
JetRetStat = (JET_ERR)(*fSetSystemParamFn)( &JetInstance, (JET_SESID)0, JET_paramDeleteOutOfRangeLogs, 1, NULL); if (JetRetStat != JET_errSuccess) break;
// make sure Circular logging is enabled
JetRetStat = (JET_ERR)(*fSetSystemParamFn)( &JetInstance, (JET_SESID)0, JET_paramCircularLog, 1, NULL); } } while (FALSE); if (JetRetStat == JET_errSuccess) { JetRetStat = (JET_ERR)(*fRestoreFn)((const char *)BackupPath, NULL); if (JetRetStat == JET_errBadLogVersion || JetRetStat == JET_errBadLogSignature || JetRetStat == JET_errInvalidLogSequence || JetRetStat == JET_errExistingLogFileHasBadSignature) { WinsDelLogFiles(LOG_FILE_SUFFIX, pLogFilePath); JetRetStat = (JET_ERR)(*fRestoreFn)((const char *)BackupPath, NULL); } } } else { JetRetStat = (JET_ERR)(*fRestoreFn)((const char *)BackupPath, 0, NULL, (JET_PFNSTATUS)NULL); } if (JetRetStat != JET_errSuccess) { RetStat = WINSINTF_FAILURE; } } else { //
// If CreateDirectoryA was successful, renove the directory
//
if (fDirCr) { RemoveDirectoryA(BackupPath); RetStat = WINSINTF_FAILURE; } else { RetStat = Error; } } } } except(EXCEPTION_EXECUTE_HANDLER) { RetStat = WINSINTF_FAILURE; } if (!FreeLibrary(hExtension)) { RetStat = GetLastError(); } return(RetStat); }
DWORD WinsWorkerThdUpd( WINSIF2_HANDLE ServerHdl, DWORD NewNoOfNbtThds ) { DWORD status; RpcTryExcept {
status = R_WinsWorkerThdUpd( ServerHdl, NewNoOfNbtThds);
} RpcExcept( I_RpcExceptionFilter(RpcExceptionCode()) ) {
status = RpcExceptionCode();
} RpcEndExcept
return status; }
DWORD WinsSyncUp( WINSIF2_HANDLE ServerHdl, PWINSINTF_ADD_T pWinsAdd, PWINSINTF_ADD_T pOwnerAdd ) { DWORD status; WINSINTF_VERS_NO_T MinVersNo, MaxVersNo;
//
// Set both version numbers to zero
//
MinVersNo.LowPart = 0; MinVersNo.HighPart = 0; MaxVersNo = MinVersNo; RpcTryExcept {
status = R_WinsPullRange( ServerHdl, pWinsAdd, pOwnerAdd, MinVersNo, MaxVersNo);
} RpcExcept( I_RpcExceptionFilter(RpcExceptionCode()) ) {
status = RpcExceptionCode();
} RpcEndExcept
return status; }
DWORD WinsGetNameAndAdd( WINSIF2_HANDLE ServerHdl, PWINSINTF_ADD_T pWinsAdd, LPBYTE pUncName ) { DWORD status; RpcTryExcept {
status = R_WinsGetNameAndAdd( ServerHdl, pWinsAdd, pUncName);
} RpcExcept( I_RpcExceptionFilter(RpcExceptionCode()) ) {
status = RpcExceptionCode();
} RpcEndExcept
return status; }
DWORD WinsDeleteWins( WINSIF2_HANDLE ServerHdl, PWINSINTF_ADD_T pWinsAdd) { DWORD status; RpcTryExcept {
status = R_WinsDeleteWins( ServerHdl, pWinsAdd);
} RpcExcept( I_RpcExceptionFilter(RpcExceptionCode()) ) {
status = RpcExceptionCode();
} RpcEndExcept
return status; }
DWORD WinsSetFlags( WINSIF2_HANDLE ServerHdl, DWORD fFlags) { DWORD status; RpcTryExcept {
status = R_WinsSetFlags( ServerHdl, fFlags);
} RpcExcept( I_RpcExceptionFilter(RpcExceptionCode()) ) {
status = RpcExceptionCode();
} RpcEndExcept
return status; } DWORD WinsGetDbRecsByName( WINSIF2_HANDLE ServerHdl, PWINSINTF_ADD_T pWinsAdd, DWORD Location, LPBYTE pName, DWORD NameLen, DWORD NoOfRecsDesired, DWORD fOnlyStatic, PWINSINTF_RECS_T pRecs ) { DWORD status; RpcTryExcept {
status = R_WinsGetDbRecsByName( ServerHdl, pWinsAdd, Location, pName, NameLen, NoOfRecsDesired, fOnlyStatic, pRecs);
} RpcExcept( I_RpcExceptionFilter(RpcExceptionCode()) ) {
status = RpcExceptionCode();
} RpcEndExcept
return status; }
DWORD WinsTombstoneDbRecs( WINSIF2_HANDLE ServerHdl, PWINSINTF_ADD_T pWinsAdd, WINSINTF_VERS_NO_T MinVersNo, WINSINTF_VERS_NO_T MaxVersNo ) { DWORD status; RpcTryExcept {
status = R_WinsTombstoneDbRecs(ServerHdl, pWinsAdd, MinVersNo, MaxVersNo);
} RpcExcept( I_RpcExceptionFilter(RpcExceptionCode()) ) {
status = RpcExceptionCode();
} RpcEndExcept
return status; }
DWORD WinsCheckAccess( WINSIF2_HANDLE ServerHdl, DWORD *Access ) { DWORD status; RpcTryExcept {
status = R_WinsCheckAccess(ServerHdl, Access);
} RpcExcept( I_RpcExceptionFilter(RpcExceptionCode()) ) {
status = RpcExceptionCode();
} RpcEndExcept
return status; }
|